В лямбда-исчислении без констант с системой типов Хиндли-Милнера вы не можете получить такие типы, в которых результатом функции является нерешенная переменная типа. Все переменные типа должны иметь где-то «происхождение». Например, нет термина типа , но есть термин типа (тождественная функция ).∀α,β.α→β∀α.α→αλx.x
Интуитивно, термин типа требует возможности создания выражения типа∀α,β.α→ββ из воздуха. Легко видеть, что нет значения, имеющего такой тип. Точнее, если переменная типа не появляется в типе какой-либо переменной-переменной в среде, то не существует члена типа β, который находится в нормальной форме головы. Вы можете доказать это с помощью структурной индукции для термина: либо переменная в заголовке должна иметь тип β , либо один из аргументов должен иметь основной тип, включающий β , т. Е. Был бы меньший подходящий термин.ββββ
Тот факт, что нет значения определенного типа, не означает, что нет термина этого типа: может существовать термин без значения, то есть не заканчивающийся термин (точнее говоря, термин без нормальной формы). Причина, по которой нет лямбда-термина с такими типами, состоит в том, что все хорошо типизированные термины HM сильно нормализуются. Это обобщение результата, утверждающего, что простейшее лямбда-исчисление сильно нормализуется. Это является следствием того факта, что система F сильно нормализуется: система F подобна HM, но допускает квантификаторы типов везде в типах, а не только на верхнем уровне. Например, в Системе F имеет тип ( ∀ α . α ) → ( ∀ α . α ) - но ΔΔ = λ x . ИксИкс( ∀ α . Α ) → ( ∀ α . Α ) не хорошо напечатан.ΔΔ
HM и Система F являются примерами систем типов, которые имеют соответствие Карри-Говарда : хорошо типизированные термины соответствуют доказательствам в определенной логике, а типы соответствуют формуле. Если система типов соответствует непротиворечивой теории, то эта теория не позволяет доказывать теоремы, такие как ; следовательно, нет члена соответствующего типа ∀ α , β .∀ A , ∀ B , A ⇒ B∀ α , β,α → β
YY( λ х . х )∀ α . α∀ A , ∀ B , A ⇒ B
Найти тонкую грань между системами типов, которые обеспечивают строгую нормализацию, и системами типов, которые этого не делают, - сложная и интересная проблема. Это важная проблема, потому что она определяет, какие логики являются правильными, другими словами, какие программы воплощают доказательства теорем. Вы можете пойти намного дальше, чем System F, но правила становятся более сложными. Например, исчисление индуктивных конструкций, которое является основой ассистента доказательства Coq , сильно нормализуется, но способно описать общие индуктивные структуры данных и алгоритмы над ними и многое другое.
Как только вы попадаете на настоящие языки программирования, переписка нарушается. Реальные языки программирования имеют такие функции, как общие рекурсивные функции (которые могут не заканчиваться), исключения (выражение, которое всегда вызывает исключение, никогда не возвращает значение и, следовательно, может иметь любой тип в большинстве систем типов), рекурсивные типы (которые допускают не прекращение пробраться внутрь) и т. д.