Зависимый тип: различия между версиями
[отпатрулированная версия] | [отпатрулированная версия] |
Нет описания правки |
м →Литература: исключение rq/empty из статей >6К или >4K без карточек |
||
(не показано 10 промежуточных версий 8 участников) | |||
Строка 1: | Строка 1: | ||
{{Типизация данных}} |
{{Типизация данных}} |
||
'''Зависимый тип''' в [[Информатика|информатике]] и [[Логика|логике]] — [[Тип данных|тип]], который зависит от некоторого значения. Зависимые типы играют ключевую роль в |
'''Зависимый тип''' ({{lang-en|dependent type}}) в [[Информатика|информатике]] и [[Логика|логике]] — [[Тип данных|тип]], который зависит от некоторого значения. Зависимые типы играют ключевую роль в [[Интуиционистская теория типов|интуиционистской теории типов]] и построении [[Функциональное программирование|функциональных языков программирования]] таких как [[ATS (язык программирования)|ATS]], [[Agda]], {{нп5| Epigram (язык программирования)|Epigram|en|Epigram (programming language)}} и [[Idris (язык программирования)|Idris]]. |
||
К примеру, тип, описывающий ''n''-[[Кортеж (информатика)|кортежи]] действительных чисел является зависимым, так как он «зависит» от величины ''n''. |
К примеру, тип, описывающий ''n''-[[Кортеж (информатика)|кортежи]] действительных чисел, является зависимым, так как он «зависит» от величины ''n''. |
||
Решение о равенстве зависимых типов в программе может потребовать вычислений. Если в зависимых типах допущено использование произвольных значений, то решение о равенстве типов может включать в себя проверку равенства результата работы двух произвольных программ. Таким образом [[Система типов#Проверка согласования типов|проверка типа]] становится [[Алгоритмически неразрешимая задача|неразрешимой задачей]]. |
Решение о равенстве зависимых типов в программе может потребовать вычислений. Если в зависимых типах допущено использование произвольных значений, то решение о равенстве типов может включать в себя проверку равенства результата работы двух произвольных программ. Таким образом, [[Система типов#Проверка согласования типов|проверка типа]] становится [[Алгоритмически неразрешимая задача|неразрешимой задачей]]. |
||
[[Изоморфизм Карри — Ховарда]] позволяет строить типы для выражения сколь угодно сложных математических свойств. Если предоставлено [[конструктивная математика|конструктивное доказательство]] того, что тип «заселён» (то есть, существует хотя бы одно значение этого типа), компилятор сможет проверить это доказательство и превратить его в исполняемый код, вычисляющий значение. Наличие проверки доказательств делает зависимо-типизированные языки схожими с программным обеспечением автоматизации доказательств (например, интерактивный доказатель теорем [[Coq]]). |
[[Изоморфизм Карри — Ховарда]] позволяет строить типы для выражения сколь угодно сложных математических свойств. Если предоставлено [[конструктивная математика|конструктивное доказательство]] того, что тип «заселён» (то есть, существует хотя бы одно значение этого типа), компилятор сможет проверить это доказательство и превратить его в исполняемый код, вычисляющий значение. Наличие проверки доказательств делает зависимо-типизированные языки схожими с программным обеспечением автоматизации доказательств (например, интерактивный доказатель теорем [[Coq]]). |
||
== Системы лямбда-куба == |
== Системы лямбда-куба == |
||
[[Барендрегт, Хенк|Хенк Барендрегт]] разработал [[лямбда-куб]] в качестве средства классификации систем типов по |
[[Барендрегт, Хенк|Хенк Барендрегт]] разработал [[лямбда-куб]] в качестве средства классификации систем типов по трём осям. Каждый из восьми углов кубической диаграммы соответствует системе типов. В наиболее бедной вершине куба находится [[просто типизированное лямбда-исчисление]], а в наиболее богатой — [[исчисление конструкций]]. Трём осям куба соответствуют три различных дополнения к просто типизированному лямбда-исчислению: дополнение зависимых типов, дополнение полиморфизма и дополнение конструкторов типов высшего порядка. |
||
== Формальное определение == |
== Формальное определение == |
||
⚫ | Очень упрощённо зависимый тип можно представить как тип индексированного семейства множеств. Более формально, для типа <math>A:\mathcal{U}</math> (где <math>\mathcal{U}</math> — вселенная типов), можно определить семейство типов <math>B</math>, сопоставляющее каждому терму <math>a:A</math> тип <math>B(a):\mathcal{U}</math>, что записывается как <math>B:A\to\mathcal{U}</math>. Функция, чья область значений варьируется в зависимости от её аргумента, называется '''зависимой функцией'''. Тип этой функции называется '''зависимым произведением типов''', '''пи-типом''' или просто '''зависимым типом'''. Зависимый тип записывается для данного случая как |
||
⚫ | |||
⚫ | Очень упрощённо зависимый тип можно представить как тип индексированного семейства множеств. Более формально, для типа <math>A:\mathcal{U}</math> (где <math>\mathcal{U}</math> |
||
⚫ | |||
или |
или |
||
:<math>\Pi (x:A),B(x)</math> |
: <math>\Pi (x:A),B(x)</math> |
||
Если <math>B</math> является константой, то зависимый тип упрощается до обычной функции <math>A\to B</math>. Иначе говоря, <math>\Pi_{(x:A)}B</math> |
Если <math>B</math> является константой, то зависимый тип упрощается до обычной функции <math>A\to B</math>. Иначе говоря, <math>\Pi_{(x:A)}B</math> равнозначен [[функциональный тип|функциональному типу]] <math>A\to B</math>. Название «''пи-тип''» подчёркивает, что такой тип является [[Декартово произведение|декартовым произведением]] типов. Пи-типы также могут быть представлены как модели [[Квантор всеобщности|кванторов всеобщности]]. |
||
Например, если <math>\mbox{Vec}({\mathbb R},n)</math> |
Например, если <math>\mbox{Vec}({\mathbb R},n)</math> — кортеж из <math>n</math> [[вещественное число|вещественных чисел]], то <math>\Pi_{(n:{\mathbb N})} \mbox{Vec}({\mathbb R},n)</math> — тип функций, которые для всякого [[натуральное число|натурального]] <math>n</math> возвращают кортеж вещественных чисел размера <math>n</math>. Обычное {{нп5|Функциональное пространство||en|Function space}} является тем частным случаем, когда область значений не зависит от входного параметра: например, <math>\Pi_{(n:{\mathbb N})}\; {\mathbb R}</math> — тип функций из натуральных в вещественные, обозначаемых <math>{\mathbb N}\to{\mathbb R}</math> в [[просто типизированное лямбда-исчисление|просто типизированном лямбда-исчислении]]. |
||
'''[[Параметрический полиморфизм|Полиморфные функции]]''' являются важным примером зависимых функций, |
'''[[Параметрический полиморфизм|Полиморфные функции]]''' являются важным примером зависимых функций, то есть функций, имеющих зависимый тип. Для некоторого заданного типа такие функции обрабатывают значения этого типа, или значения типа, построенного на основе этого типа. Полиморфная функция, возвращающая значения типа <math>C</math>, будет иметь полиморфный тип, записываемый как |
||
:<math>\Pi_{(A:\mathcal{U})} A\to C</math> |
: <math>\Pi_{(A:\mathcal{U})} A\to C</math> |
||
== Литература == |
== Литература == |
||
Строка 29: | Строка 28: | ||
| автор = Chlipala, A. |
| автор = Chlipala, A. |
||
| заглавие = Certified Programming with Dependent Types: A Pragmatic Introduction to the Coq Proof Assistant |
| заглавие = Certified Programming with Dependent Types: A Pragmatic Introduction to the Coq Proof Assistant |
||
| ссылка = https://archive.org/details/CertifiedProgrammingWithDependentTypes |
|||
| издательство = MIT Press |
| издательство = MIT Press |
||
| год = 2013 |
| год = 2013 |
||
Строка 46: | Строка 46: | ||
}} |
}} |
||
{{нет ссылок|дата=11 декабря 2021}} |
|||
{{rq|source|stub}} |
|||
[[Категория:Теория типов]] |
[[Категория:Теория типов]] |
||
[[Категория:Программирование с зависимыми типами]] |
Текущая версия от 09:24, 11 декабря 2021
Зависимый тип (англ. dependent type) в информатике и логике — тип, который зависит от некоторого значения. Зависимые типы играют ключевую роль в интуиционистской теории типов и построении функциональных языков программирования таких как ATS, Agda, Epigram[англ.] и Idris.
К примеру, тип, описывающий n-кортежи действительных чисел, является зависимым, так как он «зависит» от величины n.
Решение о равенстве зависимых типов в программе может потребовать вычислений. Если в зависимых типах допущено использование произвольных значений, то решение о равенстве типов может включать в себя проверку равенства результата работы двух произвольных программ. Таким образом, проверка типа становится неразрешимой задачей.
Изоморфизм Карри — Ховарда позволяет строить типы для выражения сколь угодно сложных математических свойств. Если предоставлено конструктивное доказательство того, что тип «заселён» (то есть, существует хотя бы одно значение этого типа), компилятор сможет проверить это доказательство и превратить его в исполняемый код, вычисляющий значение. Наличие проверки доказательств делает зависимо-типизированные языки схожими с программным обеспечением автоматизации доказательств (например, интерактивный доказатель теорем Coq).
Системы лямбда-куба
[править | править код]Хенк Барендрегт разработал лямбда-куб в качестве средства классификации систем типов по трём осям. Каждый из восьми углов кубической диаграммы соответствует системе типов. В наиболее бедной вершине куба находится просто типизированное лямбда-исчисление, а в наиболее богатой — исчисление конструкций. Трём осям куба соответствуют три различных дополнения к просто типизированному лямбда-исчислению: дополнение зависимых типов, дополнение полиморфизма и дополнение конструкторов типов высшего порядка.
Формальное определение
[править | править код]Очень упрощённо зависимый тип можно представить как тип индексированного семейства множеств. Более формально, для типа (где — вселенная типов), можно определить семейство типов , сопоставляющее каждому терму тип , что записывается как . Функция, чья область значений варьируется в зависимости от её аргумента, называется зависимой функцией. Тип этой функции называется зависимым произведением типов, пи-типом или просто зависимым типом. Зависимый тип записывается для данного случая как
или
Если является константой, то зависимый тип упрощается до обычной функции . Иначе говоря, равнозначен функциональному типу . Название «пи-тип» подчёркивает, что такой тип является декартовым произведением типов. Пи-типы также могут быть представлены как модели кванторов всеобщности.
Например, если — кортеж из вещественных чисел, то — тип функций, которые для всякого натурального возвращают кортеж вещественных чисел размера . Обычное Функциональное пространство[англ.] является тем частным случаем, когда область значений не зависит от входного параметра: например, — тип функций из натуральных в вещественные, обозначаемых в просто типизированном лямбда-исчислении.
Полиморфные функции являются важным примером зависимых функций, то есть функций, имеющих зависимый тип. Для некоторого заданного типа такие функции обрабатывают значения этого типа, или значения типа, построенного на основе этого типа. Полиморфная функция, возвращающая значения типа , будет иметь полиморфный тип, записываемый как
Литература
[править | править код]- Chlipala, A. Certified Programming with Dependent Types: A Pragmatic Introduction to the Coq Proof Assistant. — MIT Press, 2013. — 440 p. — ISBN 9780262026659. (текст с сайта автора (англ.))
- Jeremy Paul Condit. Dependent Types for Safe Systems Software. — PhD dissertation. — University of California at Berkeley, 2007.
В статье не хватает ссылок на источники (см. рекомендации по поиску). |