Coq включает в себя выражения let на своем основном языке. Мы можем переводить выражения let в приложения, подобные этому:
let x : t = v in b ~> (\(x:t). b) v
я понимаю, что это не всегда работает, потому что значение v
не будет доступно при проверке типов b
. Однако это можно легко исправить с помощью специального корпуса проверки типов приложений формы (\(x:t). b) v
. Это позволяет нам удалять выражения let за счет особого случая при проверке типов. Почему Coq include все еще включает выражения let? Есть ли у них другие преимущества (кроме необходимости в особом случае)?
type-theory
dependent-types
type-checking
coq
Labbekak
источник
источник
let
выражениях, но а) нет причин избегатьlet
выражений, и они также удобны, и б) добавление хаков в ваш основной язык не очень хорошая идея.Ответы:
Это распространенное заблуждение, что мы можем переводить
let
выражения-приложения. Разница междуlet x : t := b in v
и(fun x : t => v) b
заключается в томlet
, что в выражении -ex во время проверки типаv
мы знаем, чтоx
оно равноb
, но в приложении мы этого не делаем (подвыражениеfun x : t => v
должно иметь смысл само по себе).Вот пример:
Ваше предложение сделать заявку
(fun x : t => v) b
специальным случаем не работает. Давайте подумаем об этом более тщательно.Например, как бы вы справились с этим, продолжая приведенный выше пример?
Предположительно, это не сработает, потому что
a
не может быть напечатано, но если мы развернем его определение, мы получим хорошо напечатанное выражение. Как вы думаете, пользователи будут любить нас или ненавидят нас за наше дизайнерское решение?Вы должны тщательно продумать, что значит иметь «особый случай». Если у меня есть приложениеλ
e₁ e₂
, нужно ли нормализовать его,e₁
прежде чем я решу, является ли это -abstraction? Если да, это означает, что я буду нормализовать плохо напечатанные выражения, и они могут циклически повторяться. Если нет, удобство использования вашего предложения кажется сомнительным.Вы также нарушите фундаментальную теорему, которая гласит, что каждое подвыражение хорошо типизированного выражения хорошо типизировано. Это так же разумно, как знакомство
null
с Java.источник