Используя язык, похожий на Morte/CoC, я пытаюсь доказать простое заявление there are lists of arbitrary lengths
. Для этого я написал следующий вид:Обычно ли обертывать переменную в бесполезный вызов `id`, чтобы избежать проблем с преобразованием eta на доказательствах?
∀ n:Nat ->
(ThereIs (List Nat)
(Equal Nat
(List.length Nat l)
n)))
ThereIs
является зависимой пара (Sigma). Все закодировано в церкви. Чтобы доказать это, я написал следующее доказательство:
λ n:Nat ->
(ThereIs.this (List Nat)
(λ l:(List Nat) -> (Equal Nat (List.length Nat l) n))
(List.replicate Nat n Nat.Zero)
(Equal.refl Nat n))
Жутко, я получаю ошибку несоответствия типов между d
(т.е. свободным переменным типом Nat) и λ c:* -> λ b:(c -> c) -> λ a:c -> (d c b a)
. Но этот более поздний термин, когда eta-reduced, равен d
! Так как я не имею ETA-редуктор готов, вместо этого я сделал эту следующую функцию «бесполезной идентифицировать»:
λ n: Nat ->
λ Nat:* ->
λ Succ: (Nat -> Nat) ->
λ Zero: Nat ->
(n Nat Succ Zero)
Теперь, применяя этот бесполезный идентификатор для каждого вхождения n
, я «не-эта» это , в результате чего доказательство проверяется. Я хотел бы получить представление о том, что здесь происходит. Является ли эта «бесполезная функция id» известной/используемой моделью при написании доказательств? Почему не может быть исчисление конструкций, способное набрать это доказательство без этой небольшой помощи? Есть ли какие-либо глубокие аргументы в пользу этого явления или это просто то, что происходит по какой-то особой причине?
Вы имеете в виду eta не альфа, не так ли? –
Да, извините @ReidBarton – MaiaVictor
Я думаю, что специально разработанные 'идентификаторы всех разновидностей - не только эти равенства - очень распространены в системах доказательств. Половина тактик в Coq заканчивается переводом на 'id', написанным особенно захватывающим образом. –