「Certified Programming with Dependent Types」という本を読んで 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
しかし、それを適用するには、2 つのパラメーターを提供する必要があり、目標を 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)
ケース) に置き換えます。
つまり、実際には 3 つではなく 5 つのパラメーターを取得するようです。
しかし、このタイプについて考えると、この考えは失敗します。
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
ますか?
ありがとう、