パターン マッチングに直接頼らずに帰納型を使用することは可能ですが、これは表面的には正しいだけです。Coq によって生成される_rec
、_rect
および_ind
コンビネータはすべてmatch
. 例えば:
Print nat_rect.
nat_rect =
fun (P : nat -> Type) (f : P 0) (f0 : forall n : nat, P n -> P (S n)) =>
fix F (n : nat) : P n :=
match n as n0 return (P n0) with
| 0 => f
| S n0 => f0 n0 (F n0)
end
: forall P : nat -> Type,
P 0 -> (forall n : nat, P n -> P (S n)) -> forall n : nat, P n
さらに、パターン マッチングをエリミネータに置き換えると、計算上の動作が異なる項になる場合が多くあります。nat
aを 2で除算する次の関数を考えてみましょう。
Fixpoint div2 (n : nat) :=
match n with
| 0 | 1 => 0
| S (S n') => S (div2 n')
end.
を使用してこの関数を書き換えることはnat_rec
可能ですが、再帰呼び出しn - 2
により少し複雑になります (試してみてください!)。
さて、あなたの主な質問に戻りますが、Coq は誘導型に対して同様の消去原理を自動的に生成しません。Pacoライブラリは、共導データについて推論するためのより有用な原則を導き出すのに役立ちます。しかし、私が知る限り、単純な関数を書くのに似たものはありません。
あなたの提案するアプローチは、Coq が帰納的なデータ型に対して行うこととは異なることを指摘する価値があります。つまり、nat_rect
帰納法によって再帰関数と証明を書くことができます。これらのコンビネータを提供する理由の 1 つは、それらがinduction
タクティックによって使用されることです。nat -> unit + nat
あなたが提案したものに多かれ少なかれ対応するtype の何かは、十分ではありません。