動作するもの
ツリー上のフィックスポイントの定義内のリストにフィックスポイントの定義をネストすると、結果は適切に型付けされます。これは、帰納的型で再帰をネストしている場合、つまり再帰がのようなコンストラクターを通過する場合の一般的な原則ですlist
。
Fixpoint size (t : LTree) : nat :=
let size_l := (fix size_l (l : list LTree) : nat :=
match l with
| nil => 0
| h::r => size h + size_l r
end) in
match t with Node l =>
1 + size_l l
end.
または、もっと簡潔に記述したい場合:
Fixpoint size (t : LTree) : nat :=
match t with Node l =>
1 + (fix size_l (l : list LTree) : nat :=
match l with
| nil => 0
| h::r => size h + size_l r
end) l
end.
(最初に誰から聞いたかわからない;これは確かに何度も独立して発見された。)
一般的な再帰述語
より一般的には、「適切な」誘導原理をLTree
手動で定義できます。自動的に生成された誘導原理LTree_rect
は、リスト上の仮説を省略します。これは、誘導原理ジェネレータが、誘導型のネストされていない厳密に正の出現のみを理解するためです。
LTree_rect =
fun (P : LTree -> Type) (f : forall l : list LTree, P (Node l)) (l : LTree) =>
match l as l0 return (P l0) with
| Node x => f x
end
: forall P : LTree -> Type,
(forall l : list LTree, P (Node l)) -> forall l : LTree, P l
リストに帰納仮説を追加しましょう。再帰呼び出しでそれを実現するために、リスト誘導の原理を呼び出し、リスト内の小さなツリーでツリー誘導の原理を渡します。
Fixpoint LTree_rect_nest (P : LTree -> Type) (Q : list LTree -> Type)
(f : forall l, Q l -> P (Node l))
(g : Q nil) (h : forall t l, P t -> Q l -> Q (cons t l))
(t : LTree) :=
match t as t0 return (P t0) with
| Node l => f l (list_rect Q g (fun u r => h u r (LTree_rect_nest P Q f g h u)) l)
end.
なぜ
理由の答えは、再帰関数を受け入れるための正確なルールにあります。これらのルールは、複雑な場合(データ型にネストされた再帰がある場合など)と不健全さの間に微妙なバランスがあるため、微妙です。Coqのリファレンスマニュアル紹介言語ほとんどが正式に正確な定義で、しかし、(コックの証明言語である誘導構造の微積分、)あなたは研究論文に行く必要があります誘導とcoinductionに関する正確な規則が必要な場合は、このトピックについては、EduardoGiménezの[1]。
Coqマニュアルから始めて、Fix
ルールの表記では、不動点定義があります。F i x f私{ f1:A1:= t1;f2:A2:=t2}
Γ1Γ2= (x :L T r e e)= (l :l i s tL T r e e)A1A2= n a t= n a tt1t2= c a s e(x 、L T r e e、λ Y。g1(f2y))= c a s e(l 、l i s tLのTをR E E、λHR 。g2(f1h )(f2r ))
fjt私f私
- i = 1j = 2
l
t
size
- i = 2j = 1
h
l
size_l
- i = 2j = 2
r
l
size_l
Coqインタープリターによるh
よりも構造的に小さくない理由はl
、私には明らかではありません。Coq-clubリスト[1] [2]の議論から理解できる限り、これは通訳者の制限であり、原則として解除することができますが、矛盾の導入を避けるために非常に慎重です。
参照資料
Cocorico、非終了Coq wiki:相互誘導
Coq-Clubメーリングリスト:
Coq開発チーム。Coq Proof Assistant:リファレンスマニュアル。バージョン8.3(2010)。[ web ] ch。4。
エドゥアルド・ギメネス。再帰スキームを使用した保護された定義の体系化。では証明とプログラムのタイプ:Types'94、LNCS 996シュプリンガー・フェアラーク、1994 DOI:10.1007 / 3-540-60579-7_3 [ スプリンガー ]
エドゥアルド・ギメネス。型理論における構造的再帰的定義。でICALP'98:オートマトンの第25回国際コロキアムの議事録、言語とプログラミング。スプリンガー出版、1998年。 [ PDF ]