Зависимый тип - Dependent type

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

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

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

История

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

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

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

Формальное определение

тип

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

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

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

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

тип

В двойной зависимого типа продукта - это тип зависимой пары, тип зависимой суммы, сигма-тип, или (сбивает с толку) зависимый тип продукта.[3] Сигма-типы также можно понимать как экзистенциальные кванторы. Продолжая приведенный выше пример, если во вселенной типов , есть тип и семейство типов , то существует зависимый тип пары

Тип зависимой пары отражает идею упорядоченной пары, в которой тип второго члена зависит от значения первого. Если

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

Пример как экзистенциальная количественная оценка

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

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

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

Системы лямбда-куба

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

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

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

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

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

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

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

Синхронный язык программирования и логика

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

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

ЯзыкАктивно развиваетсяПарадигма[fn 1]ТактикаУсловия доказательстваПроверка прекращенияТипы могут зависеть от[fn 2]ВселенныеДоказательство несоответствияИзвлечение программыИзвлечение удаляет нерелевантные термины
Ада 202xда[4]Императивда[5]Да (необязательно)[6]?Любой срок[fn 3]??Ада?
Агдада[7]Чисто функциональныйМало / ограничено[fn 4]даДа (необязательно)Любой срокДа (необязательно)[fn 5]Аргументы, не относящиеся к доказательству[9] Утверждения, не относящиеся к доказательству[10]Haskell, JavaScriptда[9]
ATSда[11]Функциональный / императивныйНет[12]дадаСтатические термины[13]?дадада
CayenneНетЧисто функциональныйНетдаНетЛюбой срокНетНет??
Галлина
(Coq )
да[14]Чисто функциональныйдададаЛюбой срокда[fn 6]НетHaskell, Схема и OCamlда
Зависимый MLНет[fn 7]??да?Натуральные числа????
F *да[15]Функциональный и императивныйда[16]даДа (необязательно)Любой чистый терминдадаOCaml, F #, и Cда
ГуруНет[17]Чисто функциональный[18]гипсоединение[19]да[18]даЛюбой срокНетдаCarrawayда
Идрисда[20]Чисто функциональный[21]да[22]даДа (необязательно)Любой срокдаНетдаДа, агрессивно[22]
ХудойдаЧисто функциональныйдададаЛюбой срокдададада
Матитада[23]Чисто функциональныйдададаЛюбой срокдадаOCamlда
NuPRLдаЧисто функциональныйдададаЛюбой срокда?да?
ПВСда?да???????
мудрецНет[fn 8]Чисто функциональныйНетНетНет?Нет???
ДвенадцатьдаЛогическое программирование?даДа (необязательно)Любой (LF) терминНетНет??
ЗанадуНет[24]Императив????????

Смотрите также

Сноски

  1. ^ Имеется в виду основной язык, а не какую-либо тактику (доказательство теорем процедура ) или подъязык генерации кода.
  2. ^ С учетом семантических ограничений, например ограничений юниверса
  3. ^ Static_Predicate для ограниченных терминов, Dynamic_Predicate для проверки типа Assert любого термина при приведении типа
  4. ^ Решатель колец[8]
  5. ^ Необязательные юниверсы, необязательный полиморфизм юниверсов и необязательные явно указанные юниверсы
  6. ^ Юниверсы, автоматически выводимые ограничения юниверса (не то же самое, что полиморфизм юниверса Agda) и необязательная явная печать ограничений юниверса
  7. ^ Был заменен ATS
  8. ^ Последний документ Sage и последний снимок кода датированы 2006 годом.

Рекомендации

  1. ^ Sørensen, Morten Heine B .; Павел Уржичин (1998). "Лекции об изоморфизме Карри-Ховарда". CiteSeerX  10.1.1.17.7385. Цитировать журнал требует | журнал = (помощь)
  2. ^ Бове, Ана; Питер Дибьер (2008). «Зависимые типы в действии» (PDF). Цитировать журнал требует | журнал = (помощь)
  3. ^ а б «ΠΣ: Зависимые типы без сахара» (PDF).
  4. ^ "Страница загрузки сообщества GNAT".
  5. ^ «Предикаты подтипа RM3.2.4».
  6. ^ ИСКРА является доказуемым подмножеством Ада
  7. ^ "Страница загрузки Агды".
  8. ^ "Agda Ring Solver".
  9. ^ а б "Анонс: Agda 2.2.8". Архивировано из оригинал на 2011-07-18. Получено 2010-09-28.
  10. ^ "История изменений Agda 2.6.0".
  11. ^ «Загрузки ATS2».
  12. ^ "электронное письмо от изобретателя ATS Хунвэя Си".
  13. ^ «Прикладная система типов: подход к практическому программированию с доказательством теорем» (PDF).
  14. ^ "Coq ИЗМЕНЕНИЯ в репозитории Subversion".
  15. ^ "F * изменения на GitHub".
  16. ^ "Примечания к выпуску F * v0.9.5.0 на GitHub".
  17. ^ "Гуру СВН".
  18. ^ а б Аарон Стамп (6 апреля 2009 г.). «Проверенное программирование в гуру» (PDF). Архивировано из оригинал (PDF) 29 декабря 2009 г.. Получено 28 сентября 2010.
  19. ^ Адам Петчер (1 апреля 2008 г.). «Решение объединяемости по модулю основных уравнений в теории операционных типов» (PDF). Получено 14 октября 2010.
  20. ^ "Репозиторий Idris git".
  21. ^ «Идрис, язык с зависимыми типами - расширенная аннотация» (PDF). Архивировано из оригинал (PDF) на 2011-07-16.
  22. ^ а б Эдвин Брэди. «Чем отличается Идрис от других языков программирования с зависимой типизацией?».
  23. ^ "Матита СВН". Архивировано из оригинал на 2006-05-08. Получено 2010-09-29.
  24. ^ "Домашняя страница Занаду".

дальнейшее чтение

внешняя ссылка