Зависимый тип

В информатике и логике зависимый тип это тип, определение которого зависит от значения. Это перекрывающаяся черта теории типов и систем типов . В интуиционистской теории типов зависимые типы используются для кодирования логических кванторов , таких как «для всех» и «существует». В языках функционального программирования, таких как Agda , ATS , Coq , F* , Epigram , Idris и Lean , зависимые типы помогают уменьшить количество ошибок, позволяя программисту назначать типы, которые дополнительно ограничивают набор возможных реализаций.

Двумя распространенными примерами зависимых типов являются зависимые функции и зависимые пары . Тип возвращаемого значения зависимой функции может зависеть от значения (а не только типа) одного из ее аргументов. Например, функция, принимающая положительное целое число может возвращать массив длины , где длина массива является частью типа массива. (Обратите внимание, что это отличается от полиморфизма и обобщенного программирования , оба из которых включают тип в качестве аргумента.) Зависимая пара может иметь второе значение, тип которого зависит от первого значения. Возвращаясь к примеру с массивом, можно использовать зависимую пару для объединения массива с его длиной типобезопасным способом.

Зависимые типы усложняют систему типов. Решение о равенстве зависимых типов в программе может потребовать вычислений. Если в зависимых типах разрешены произвольные значения, то решение о равенстве типов может включать в себя решение о том, дают ли две произвольные программы одинаковый результат; следовательно, разрешимость проверки типов может зависеть от семантики равенства данной теории типов, то есть от того, является ли теория типов интенсиональной или экстенсиональной . [1]

История [ править ]

В 1934 году Хаскелл Карри заметил, что типы, используемые в типизированном лямбда-исчислении и в его аналоге в комбинаторной логике , следуют той же схеме, что и аксиомы в логике высказываний . Идя дальше, для каждого доказательства в логике существовала соответствующая функция (терм) в языке программирования. Одним из примеров Карри было соответствие между просто типизированным лямбда-исчислением и интуиционистской логикой . [2]

Логика предикатов является расширением логики высказываний, добавляющим кванторы. Ховард и де Брейн расширили лямбда-исчисление, чтобы оно соответствовало этой более мощной логике, создав типы для зависимых функций, которые соответствуют «для всех», и зависимых пар, которые соответствуют «существует». [3]

(Благодаря этой и другим работам Говарда предложения как типы известны как соответствие Карри-Ховарда .)

Формальное определение [ править ]

Грубо говоря, зависимые типы аналогичны типу индексированного семейства множеств. Более формально, учитывая тип во вселенной типов , можно иметь семейство типов , который присваивает каждому члену тип . Мы говорим, что тип B ( a ) меняется с изменением a .

Πтип [ править ]

Функция, тип возвращаемого значения которой зависит от ее аргумента (т. е. нет фиксированного кодомена ), является зависимой функцией , и тип этой функции называется типом зависимого продукта , пи-типом ( Π тип ) или типом зависимой функции . [4] Из семейства типов мы можем построить тип зависимых функций , чьи члены являются функциями, принимающими член и вернуть термин в . В этом примере тип зависимой функции обычно записывается как или .

Если является постоянной функцией, соответствующий тип зависимого продукта эквивалентен обычному типу функции . То есть, оценочно равен когда B не зависит от x .

Название «П-тип» происходит от идеи, что их можно рассматривать как декартово произведение типов. П-типы также можно понимать как модели кванторов всеобщности .

Например, если мы напишем для n -кортежей действительных чисел , то будет типом функции, которая по натуральному числу n возвращает кортеж действительных чисел размера n . Обычное функциональное пространство возникает как особый случай, когда тип диапазона фактически не зависит от входных данных. Например — это тип функции преобразования натуральных чисел в действительные числа, который записывается как в типизированном лямбда-исчислении.

В качестве более конкретного примера возьмем A как тип целых чисел без знака от 0 до 255 (те, которые умещаются в 8 бит или 1 байт) и B ( a ) = X a для a : A , тогда превращается в произведение X 0 × X 1 × X 2 × ... × X 253 × X 254 × X 255 .

Σтип [ править ]

Двойником зависимый тип зависимого типа продукта является зависимый парный тип , суммы , сигма-тип или (что сбивает с толку) зависимый тип продукта . [4] Сигма-типы также можно понимать как кванторы существования . Продолжая приведенный выше пример, если во вселенной типов , есть тип и семейство типов , то существует зависимый тип пары . (Альтернативные обозначения аналогичны обозначениям типов Π .)

Тип зависимой пары отражает идею упорядоченной пары, в которой тип второго члена зависит от значения первого. Если затем и . Если B является постоянной функцией, то тип зависимой пары становится (оценочно равен) типу продукта , то есть обычному декартову произведению. . [4]

В качестве более конкретного примера возьмем A снова как тип целых чисел без знака от 0 до 255, а B ( a ) снова будет равным X a для 256 более произвольных X a , тогда складывается в сумму X 0 + X 1 + X 2 + ... + X 253 + X 254 + X 255 .

Пример как экзистенциальная квантификация [ править ]

Позволять быть каким-то типом, и пусть . Согласно соответствию Карри-Ховарда, можно интерпретировать как логический предикат в терминах A. B Для данного ли тип B ( a ), , обитаем указывает, удовлетворяет ли a этому предикату. Соответствие можно распространить на квантификацию существования и зависимые пары: предложение истинно тогда и только тогда, когда тип населен.

Например, меньше или равно тогда и только тогда, когда существует другое натуральное число такой, что m + k = n . В логике это утверждение кодифицируется экзистенциальной количественной оценкой:

Это предложение соответствует типу зависимой пары:

То есть доказательством утверждения о том, что m меньше или равно n, является пара, содержащая как неотрицательное число k , которое является разницей между m и n , так и доказательство равенства m + k = n .

Системы лямбда-куба [ править ]

Хенк Барендрегт разработал лямбда-куб как средство классификации систем типов по трем осям. Каждый из восьми углов получившейся диаграммы в форме куба соответствует системе типов с просто типизированным лямбда-исчислением в наименее выразительном углу и исчислением конструкций в наиболее выразительном. Три оси куба соответствуют трем различным расширениям просто типизированного лямбда-исчисления: добавлению зависимых типов, добавлению полиморфизма и добавлению конструкторов типов более высокого типа (например, функций от типов к типам). Лямбда-куб далее обобщается системами чистых типов .

Теория зависимого первого порядка типа

Система чистых зависимых типов первого порядка, соответствующих логической структуре LF , получается путем обобщения типа функционального пространства просто типизированного лямбда-исчисления на тип зависимого продукта.

второго типа порядка Теория зависимого

Система зависимых типов второго порядка получается из позволяя количественную оценку конструкторов типов. В этой теории оператор зависимого произведения включает в себя как оператор просто типизированного лямбда-исчисления и связующее системы F.

порядка с типизацией зависимой Полиморфное лямбда-исчисление высшего

Система высшего порядка простирается ко всем четырем формам абстракции из лямбда-куба : функции от термов к термосам, от типов к типам, от термов к типам и от типов к термосам. Система соответствует исчислению конструкций, производная которого, исчисление индуктивных конструкций, является базовой системой помощника доказательства Coq .

Язык одновременного программирования и логика [ править ]

Соответствие Карри-Ховарда подразумевает, что можно создавать типы, выражающие сколь угодно сложные математические свойства. Если пользователь может предоставить конструктивное доказательство того, что тип является обитаемым (т. е. что значение этого типа существует), то компилятор может проверить это доказательство и преобразовать его в исполняемый компьютерный код, который вычисляет значение путем выполнения конструкции. Функция проверки корректуры делает зависимо типизированные языки тесно связанными с помощниками по корректуре . Аспект генерации кода обеспечивает мощный подход к формальной проверке программы и коду, несущему доказательство , поскольку код получается непосредственно из механически проверенного математического доказательства.

Сравнение языков с зависимыми типами [ править ]

Язык Активно развивается Парадигма [а] Тактика Условия доказательства Проверка завершения Типы могут зависеть от [б] Вселенные Доказательство неуместно Извлечение программы Извлечение стирает ненужные термины
Был 2012 год Да [5] Императив Да [6] Нет ? Любой срок [с] ? ? Есть ?
приглашенный Да [7] Чисто функциональный Мало/ограничено [д] Да Да (необязательно) Любой срок Да (необязательно) [и] Аргументы, не имеющие значения для доказательства [9] Предложения, не имеющие отношения к доказательству [10] Хаскелл , JavaScript Да [9]
АТС Да [11] Функциональный/императивный Нет [12] Да Да Статические условия [13] ? Да Да Да
Кайенна Нет Чисто функциональный Нет Да Нет Любой срок Нет Нет ? ?
курица
( Кок )
Да [14] Чисто функциональный Да Да Да Любой срок Да [ф] Да [15] Haskell , Scheme и OCaml Да
Зависимый ОД Нет [г] ? ? Да ? Натуральные числа ? ? ? ?
Ф* Да [16] Функциональный и императивный Да [17] Да Да (необязательно) Любой чистый термин Да Да OCaml , F# и C Да
Учитель Нет [18] Чисто функциональный [19] Гип-соединение [20] Да [19] Да Любой срок Нет Да Каррауэй Да
Идрис Да [21] Чисто функциональный [22] Да [23] Да Да (необязательно) Любой срок Да Нет Да Да [23]
Наклонять Да Чисто функциональный Да Да Да Любой срок Да Да Да Да
Карандаш Да [24] Чисто функциональный Да Да Да Любой срок Да Да OCaml Да
НуПРЛ Да Чисто функциональный Да Да Да Любой срок Да ? Да ?
ПВС Да ? Да ? ? ? ? ? ? ?
Sage. Архивировано 9 ноября 2020 г. в Wayback Machine. Нет [час] Чисто функциональный Нет Нет Нет ? Нет ? ? ?
Двенадцать Да Логическое программирование ? Да Да (необязательно) Любой (LF) термин Нет Нет ? ?
  1. ^ Это относится к основному языку, а не к какой-либо тактике ( процедуре доказательства теорем ) или подъязыку генерации кода.
  2. ^ С учетом семантических ограничений, таких как ограничения юниверса.
  3. ^ Static_Predicate для ограниченных терминов, Dynamic_Predicate для проверки любого термина при приведении типа в стиле Assert.
  4. ^ Решатель колец [8]
  5. ^ Необязательные юниверсы, необязательный полиморфизм юниверсов и необязательные явно указанные юниверсы.
  6. ^ Вселенные, автоматически выведенные ограничения юниверсов (не то же самое, что полиморфизм юниверсов Agda) и необязательная явная печать ограничений юниверсов.
  7. ^ Был заменен ATS.
  8. ^ Последняя статья Sage и последний снимок кода датированы 2006 годом.

См. также [ править ]

Ссылки [ править ]

  1. ^ Хофманн, Мартин (1995), Экстенсиональные концепции в теории интенсиональных типов (PDF)
  2. ^ Соренсен, Мортен Хейне Б.; Уржичин, Павел (1998), Лекции по изоморфизму Карри-Ховарда , CiteSeerX   10.1.1.17.7385
  3. ^ Бове, Ана; Дибьер, Питер (2008), Зависимые типы на работе (PDF) , Технологический университет Чалмерса
  4. ^ Jump up to: Перейти обратно: а б с Альтенкирх, Торстен; Даниэльссон, Нильс Андерс; Лё, Андрес; Ури, Николя (2010). «ΠΣ: Зависимые типы без сахара» (PDF) . В Блюме, Матиас; Кобаяши, Наоки; Видаль, Герман (ред.). Функциональное и логическое программирование, 10-й Международный симпозиум, FLOPS 2010, Сендай, Япония, 19-21 апреля 2010 г. Труды . Конспекты лекций по информатике. Том. 6009. Спрингер. стр. 40–55. дои : 10.1007/978-3-642-12251-4_5 .
  5. ^ «Страница загрузки сообщества GNAT» .
  6. ^ «§3.2.4 Предикаты подтипа» . Справочное руководство по Ada (изд. 2012 г.).
  7. ^ «Страница загрузки Агда» .
  8. ^ «Решатель колец Агда» .
  9. ^ Jump up to: Перейти обратно: а б «Анонс: Агда 2.2.8» . Архивировано из оригинала 18 июля 2011 г. Проверено 28 сентября 2010 г.
  10. ^ «Журнал изменений Agda 2.6.0» .
  11. ^ «Загрузки ATS2» .
  12. ^ «электронное письмо от изобретателя ATS Хунвэя Си» .
  13. ^ Си Цзиньпин, Хунвэй (март 2017 г.). «Система прикладных типов: подход к практическому программированию с доказательством теорем» (PDF) . arXiv : 1703.08683 .
  14. ^ «ИЗМЕНЕНИЯ Coq в репозитории Subversion» .
  15. ^ «Внедрение SProp в Coq 8.10» .
  16. ^ «F* изменения на GitHub» . Гитхаб .
  17. ^ «Примечания к выпуску F* v0.9.5.0 на GitHub» . Гитхаб .
  18. ^ «Гуру СВН» .
  19. ^ Jump up to: Перейти обратно: а б Аарон Стамп (6 апреля 2009 г.). «Проверенное программирование в Guru» (PDF) . Архивировано из оригинала (PDF) 29 декабря 2009 года . Проверено 28 сентября 2010 г.
  20. ^ Петчер, Адам (май 2008 г.). Решение основных уравнений соединяемости по модулю в теории операционных типов (PDF) (MSc). Вашингтонский университет . Проверено 14 октября 2010 г.
  21. ^ «Гит-репозиторий Идриса» . Гитхаб . 17 мая 2022 г.
  22. ^ Брэди, Эдвин. «Идрис, язык с зависимыми типами — расширенная аннотация» (PDF) . CiteSeerX   10.1.1.150.9442 .
  23. ^ Jump up to: Перейти обратно: а б Брэди, Эдвин. «Чем Idris отличается от других языков программирования с зависимой типизацией?» .
  24. ^ «Матита СВН» . Архивировано из оригинала 8 мая 2006 г. Проверено 29 сентября 2010 г.

Дальнейшее чтение [ править ]

Внешние ссылки [ править ]