Я изучаю Coq, читая книгу «Сертифицированное программирование с зависимыми типами», и у меня возникают проблемы с синтаксисом forall
.Coq - понимание синтаксиса forall`
В качестве примера давайте подумаем это взаимно индуктивного типа данных: (код из книги)
Inductive even_list : Set :=
| ENil : even_list
| ECons : nat -> odd_list -> even_list
with odd_list : Set :=
| OCons : nat -> even_list -> odd_list.
и это взаимно рекурсивные определения функций:
Fixpoint elength (el : even_list) : nat :=
match el with
| ENil => O
| ECons _ ol => S (olength ol)
end
with olength (ol : odd_list) : nat :=
match ol with
| OCons _ el => S (elength el)
end.
Fixpoint eapp (el1 el2 : even_list) : even_list :=
match el1 with
| ENil => el2
| ECons n ol => ECons n (oapp ol el2)
end
with oapp (ol : odd_list) (el : even_list) : odd_list :=
match ol with
| OCons n el' => OCons n (eapp el' el)
end.
и мы имеем индукционные схемы генерироваться:
Scheme even_list_mut := Induction for even_list Sort Prop
with odd_list_mut := Induction for odd_list Sort Prop.
Теперь то, что я не понимаю, от типа even_list_mut
я могу увидеть его принимает 3 аргумента:
even_list_mut
: forall (P : even_list -> Prop) (P0 : odd_list -> Prop),
P ENil ->
(forall (n : nat) (o : odd_list), P0 o -> P (ECons n o)) ->
(forall (n : nat) (e : even_list), P e -> P0 (OCons n e)) ->
forall e : even_list, P e
Но для того, чтобы применить его, мы должны предоставить ему два параметра, и он заменяет цель с 3 помещениями (для P ENil
, forall (n : nat) (o : odd_list), P0 o -> P (ECons n o)
и forall (n : nat) (e : even_list), P e -> P0 (OCons n e)
).
Так что, как это на самом деле получает 5 параметров, а не 3.
Но тогда эта идея терпит неудачу, когда мы думаем, что этого типа:
fun el1 : even_list =>
forall el2 : even_list, elength (eapp el1 el2) = elength el1 + elength el2
: even_list -> Prop
и
fun el1 el2 : even_list => elength (eapp el1 el2) = elength el1 + elength el2
: even_list -> even_list -> Prop
Может ли кто-нибудь объяснить, как работает синтаксис forall
?
Спасибо,
Спасибо за ваш ответ, я все еще не понимаю, есть ли два типа ключевых слов 'forall'? Один, который будет использоваться в синтаксисе типа и один для использования в терминологическом синтаксисе? Примеры показывают, что это используется в синтаксисе типа, но в этом примере: 'fun el1: even_list => forall el2: even_list, elength (eapp el1 el2) = elength el1 + elength el2' используется в терминах синтаксиса? – sinan
Нет, это тот же самый 'forall'. Термин, который вы упоминаете, относится к типу построения шрифта: его тип - '... -> Type' (или, скорее,« Prop », который также является универсальным типом). Поэтому он использует 'forall' для построения типа, который он вычисляет. – Ptival
в моем оригинальном посте, почему последние два кода разные? – sinan