Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

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

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

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

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

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

тип [ редактировать ]

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

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

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

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

тип [ редактировать ]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Типизированное лямбда-исчисление
  • Интуиционистская теория типов

Сноски [ править ]

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

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

  1. ^ Соренсен, Мортен Хайне Б .; Павел Уржичин (1998). "Лекции об изоморфизме Карри-Ховарда". CiteSeerX  10.1.1.17.7385 . Cite journal requires |journal= (help)
  2. ^ Бове, Ана; Питер Дибьер (2008). «Зависимые типы в действии» (PDF) . Cite journal requires |journal= (help)
  3. ^ a b «ΠΣ: зависимые типы без сахара» (PDF) .
  4. ^ "Страница загрузки сообщества GNAT" .
  5. ^ «Предикаты подтипа RM3.2.4» .
  6. ^ SPARK - это доказуемое подмножество Ada
  7. ^ "Страница загрузки Агды" .
  8. ^ "Agda Ring Solver" .
  9. ^ a b "Объявление: Agda 2.2.8" . Архивировано из оригинала на 2011-07-18 . Проверено 28 сентября 2010 .
  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. ^ a b Аарон Стамп (6 апреля 2009 г.). «Проверенное программирование в гуру» (PDF) . Архивировано из оригинального (PDF) 29 декабря 2009 года . Проверено 28 сентября 2010 года .
  19. ^ Адам Petcher (1 апреля 2008). "Решение объединяемости по модулю основных уравнений в теории операционных типов" (PDF) . Проверено 14 октября 2010 года .
  20. ^ "Репозиторий Idris git" .
  21. ^ «Идрис, язык с зависимыми типами - расширенная аннотация» (PDF) . Архивировано из оригинального (PDF) 16 июля 2011 года.
  22. ^ а б Эдвин Брэди. «Чем отличается Идрис от других языков программирования с зависимой типизацией?» .
  23. ^ "Матита СВН" . Архивировано из оригинала на 2006-05-08 . Проверено 29 сентября 2010 .
  24. ^ "Домашняя страница Xanadu" .

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

  • Мартин-Лёф, Пер (1984). Интуиционистская теория типов (PDF) . Bibliopolis.
  • Нордстрём, Бенгт ; Петерссон, Кент; Смит, Ян М. (1990). Программирование в теории типов Мартина-Лёфа: введение . Издательство Оксфордского университета. ISBN 9780198538141.
  • Барендрегт, Х. (1992). «Лямбда-исчисления с типами» . По Абрамскому, С .; Gabbay, D .; Майбаум, Т. (ред.). Справочник по логике в компьютерных науках . Оксфордские научные публикации .
  • Макбрайд, Конор ; МакКинна, Джеймс (январь 2004 г.). «Вид слева» . Журнал функционального программирования . 14 (1): 69–111. DOI : 10.1017 / s0956796803004829 .
  • Альтенкирх, Торстен ; Макбрайд, Конор ; МакКинна, Джеймс (апрель 2005 г.). «Почему важны зависимые типы» (PDF) . Cite journal requires |journal= (help)
  • Норелл, Ульф (сентябрь 2007 г.). На пути к практическому языку программирования, основанному на теории зависимых типов (PDF) (PhD). Гётеборг, Швеция: Департамент компьютерных наук и инженерии, Технологический университет Чалмерса. ISBN 978-91-7291-996-9.
  • Ури, Николас; Свиерстра, Воутер (2008). «Сила Пи» (PDF) . ICFP '08: Материалы 13-й международной конференции ACM SIGPLAN по функциональному программированию . С. 39–50. DOI : 10.1145 / 1411204.1411213 . ISBN 9781595939197.
  • Норелл, Ульф (2009). «Зависимо типизированное программирование в Agda» (PDF) . В Koopman, P .; Plasmeijer, R .; Свиерстра, Д. (ред.). Расширенное функциональное программирование. AFP 2008 . Конспект лекций по информатике. 5832 . Springer. С. 230–266. DOI : 10.1007 / 978-3-642-04652-0_5 . ISBN 978-3-642-04651-3.
  • Ситниковский, Боро (2018). Нежное введение в зависимые типы с помощью Idris . Бережливое издательство. ISBN 978-1723139413.

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

  • Зависимо типизированное программирование 2008
  • Зависимо типизированное программирование 2010
  • Зависимо типизированное программирование 2011
  • "Зависимый тип" в Haskell Wiki
  • теория зависимых типов в nLab
  • зависимый тип в nLab
  • зависимый тип продукта в nLab
  • тип зависимой суммы в nLab
  • зависимый продукт в nLab
  • зависимая сумма в nLab