Почему алгоритм Хиндли-Милнера никогда не даст такой тип, как t1 -> t2?


14

Я читал об алгоритме типизации Хиндли-Милнере при написании реализации, и видят , что, до тех пор , как каждый переменная связана, вы всегда будете получать либо атомарные тип или типов , где аргументы будут определять окончательный тип, например, t1 -> t1или (t1 -> t2) -> (t1 -> t2)где t1и t2являются переменными типа.

Я не могу придумать, как вы могли бы получить что-то подобное t1 -> t2или просто t1, что, как я понимаю, означало бы, что алгоритм нарушен, поскольку не было бы никакого способа определить фактический тип выражения. Откуда вы знаете, что вы никогда не получите такой тип, как эти «сломанные», если каждая переменная связана?

Я знаю, что алгоритм выдает типы с переменными, но они всегда разрешаются, как только вы передаете аргументы функции, чего не происходит в функции с типом t1 -> t2. Вот почему я хочу знать, как мы точно знаем, что алгоритм никогда не даст таких типов.

(Кажется, что вы можете получить эти "сломанные" типы в ML , но я спрашиваю о лямбда-исчислении.)

Ответы:


16

В лямбда-исчислении без констант с системой типов Хиндли-Милнера вы не можете получить такие типы, в которых результатом функции является нерешенная переменная типа. Все переменные типа должны иметь где-то «происхождение». Например, нет термина типа , но есть термин типа (тождественная функция ).α,β.αβα.ααλx.x

Интуитивно, термин типа требует возможности создания выражения типаα,β.αββ из воздуха. Легко видеть, что нет значения, имеющего такой тип. Точнее, если переменная типа не появляется в типе какой-либо переменной-переменной в среде, то не существует члена типа β, который находится в нормальной форме головы. Вы можете доказать это с помощью структурной индукции для термина: либо переменная в заголовке должна иметь тип β , либо один из аргументов должен иметь основной тип, включающий β , т. Е. Был бы меньший подходящий термин.ββββ

Тот факт, что нет значения определенного типа, не означает, что нет термина этого типа: может существовать термин без значения, то есть не заканчивающийся термин (точнее говоря, термин без нормальной формы). Причина, по которой нет лямбда-термина с такими типами, состоит в том, что все хорошо типизированные термины HM сильно нормализуются. Это обобщение результата, утверждающего, что простейшее лямбда-исчисление сильно нормализуется. Это является следствием того факта, что система F сильно нормализуется: система F подобна HM, но допускает квантификаторы типов везде в типах, а не только на верхнем уровне. Например, в Системе F имеет тип ( α . α ) ( α . α ) - но ΔΔзнак равноλИкс,ИксИкс(α,α)(α,α) не хорошо напечатан.ΔΔ

HM и Система F являются примерами систем типов, которые имеют соответствие Карри-Говарда : хорошо типизированные термины соответствуют доказательствам в определенной логике, а типы соответствуют формуле. Если система типов соответствует непротиворечивой теории, то эта теория не позволяет доказывать теоремы, такие как ; следовательно, нет члена соответствующего типа α , β .A,В,AВα,β,αβ

YY(λИкс,Икс)α,αA,В,AВ

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

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


«Это является следствием того факта, что система F сильно нормализуется». Как можно показать, что HM сильно нормализует, является следствием того, что система F сильно нормализует?
Рафаэль Кастро

1
@RafaelCastro Каждый термин, который хорошо напечатан в HM, хорошо напечатан в Системе F. Каждый хорошо типизированный термин в Системе F - это SN. Следовательно, каждый термин, хорошо типизированный в HM, является SN.
Жиль "ТАК - перестань быть злым"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.