Что мы получаем, имея «зависимые типы»?

13

Я думал, что правильно понял зависимую типизацию (DT), но ответ на этот вопрос: /cstheory/30651/why-was-there-a-need-for-martin-l%C3% Теория типа «создать творческий интуиционизм» заставила меня думать иначе.

После прочтения DT и попыток понять, что они из себя представляют, я пытаюсь задаться вопросом, что мы получаем от этого понятия DT? Они кажутся более гибкими и мощными, чем просто типизированное лямбда-исчисление (STLC), хотя я не могу точно понять, «как / почему».

Что мы можем сделать с DT, что нельзя сделать с STLC? Похоже, добавление DT делает теорию более сложной, но в чем выгода?

Из ответа на поставленный выше вопрос:

Зависимые типы были предложены де Брюйном и Говардом, которые хотели расширить соответствие Карри-Говарда от логики высказываний до логики первого порядка.

Кажется, на каком-то уровне это имеет смысл, но я все еще не могу понять общую картину «как / почему»? Может быть, пример, явно показывающий, что это расширение соответствия CH логике FO могло бы помочь понять, в чем заключается проблема с DT? Я не уверен, что понимаю это так же хорошо, как должен.

кандидат наук
источник
1
Вы гуглили их? Вы слышали о Coq, доказательстве теорем, построенном на зависимых типах? Знаете ли вы, что теорема о 4 цветах доказала использование Coq?
Дейв Кларк
2
Я сделал на самом деле. Что тяжело для Google, так это то, что является той «мощью» (из-за отсутствия лучшего слова), которую DT дают теории типов, интуитивно говоря?
кандидат наук
1
Почему? Зависимые типы позволяют печатать больше программ, в то же время сохраняя безопасность типов. Как? Путем параметризации типов с программами.
Мартин Бергер
@MartinBerger - Не могли бы вы рассказать о «большем количестве программ»? Что «больше» я могу сделать или нуждаться с теоретической точки зрения?
кандидат наук
2
@DaveClarke То, что Coq с его причудливыми типами использовался для создания причудливых вещей, не означает, что эти причудливые вещи требуют этих причудливых типов. Например, Twelf добился больших успехов (например, доказательство правильности SML), и это только второй, а не высший порядок. Я видел несколько довольно больших систем, доказанных только с помощью логики первого порядка.
Жиль "ТАК - перестань быть злым"

Ответы:

22

Расширяю мой комментарий: Зависимые типы могут набирать больше программ. «Больше» просто означает, что набор программ, типизируемых с зависимыми типами, является правильным надмножеством программ, типизируемых в простом типе калькуляции (STLC). Примером может быть L i s t 2 3 + 4 ( α ) , списки длиной 10 , содержащие элементы типа α . Выражение 2 3 + 4 является одновременно программой и частью типа. Вы не можете сделать это в STLC.λList23+4(α)10α23+4

Ключевое правило, которое отличает зависимые от не зависимых типов - это приложение:

ΓM:ABΓN:AΓMN:BΓM:ΠxA.BΓN:AΓMN:B{N/x}

Слева у вас есть STLC, где программы в помещении «перетекают» только в программу заключения. Напротив, в правиле зависимого приложения справа программа из правой предпосылки «перетекает» в тип в заключении .1N1

Чтобы иметь возможность параметризовать типы с помощью программ, синтаксис зависимых типов должен быть более богатым, и чтобы гарантировать, что типы правильно сформированы, мы используем вторую «систему типизации», называемую видами, которая ограничивает типы. Эта система сортировки по сути является STLC, но «на один уровень выше».

Есть много объяснений зависимых типов. Несколько примеров.


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

Мартин Бергер
источник
Теперь, это имеет большой смысл. Возможно, это было очевидно, но по какой-то причине я не мог это понять. Цените переход от комментария к ответу. К сожалению, вопрос был закрыт для закрытия, но я рад за ответ :)
PhD
1
Я не в восторге от вашего примера, поскольку длина списка - это просто то, что вы можете стереть в типах и заставить программы говорить об обычных (неиндексированных) списках. Может быть полезно отметить, что есть типы, которые не остаются хорошо типизированными после такого стирания, например, программа типа , где и . A r r 0 = n a t A r r ( n + 1 ) =Arr nArr 0=natArr (n+1)=natArr n
cody
@ Коди, я не уверен, что ты имеешь в виду. Зависимые типы имеют (или могут быть установлены, чтобы иметь) стирание типов в следующем смысле: для всех печатаемых типов P: iff , где - отношение сокращения времени выполнения , (Это упрощенное описание, где функция стирания отображает программы с аннотацией типа на «одинаковые» программы без аннотации.) Может быть, вы имеете в виду что-то другое? е R A сек е ( Р ) е гPVerase(P)erase(V)
Мартин Бергер
@MartinBerger: да, в данном случае я говорю об удалении зависимостей в зависимых типах для получения простых типов. Единственный пример, на который я могу указать прямо сейчас, - это доказательство того, что нормализует, если нормализует (например, в книге Барендрегта ). C o CFωCoC
cody
@ Коди, я думаю, это необычно называть этот тип стирания. Какое имя лучше? Может быть, упрощение типа?
Мартин Бергер
2

Думайте о объявлениях типа как о не более чем утверждениях. В настоящее время все, что вы можете сказать, это такие вещи, как isInt32 (), isCharPtr () и т. Д. Эти различные утверждения выбираются для проверки во время компиляции. Но эта концепция может быть расширена до таких вещей, как: isCharPtr () && isNotNull (). Обнуляемые указатели - огромная проблема. Указатели не должны быть обнуляемыми в качестве позиции по умолчанию, причем обнуляемые указатели являются типом, который не может быть разыменован, не зная, является ли он нулевым или нет. Подобные проблемы, такие как: isPositiveInteger () или isEvenNaturalNumber ().

обкрадывать
источник