以下に示す再帰関数が終了することをCoqに納得させるにはどうすればよいですか?この関数は、2つの帰納的引数を取ります。直感的に、どちらかの引数が分解されるため、再帰は終了します。
具体的には、この関数は入力として2つのツリーを取ります。
Inductive Tree :=
| Tip: Tree
| Bin: Tree -> Tree -> Tree.
Treesでは、次のスタイルの誘導を行うのが好きです。
Inductive TreePair :=
| TipTip : TreePair
| TipBin : Tree -> Tree -> TreePair
| BinTip : Tree -> Tree -> TreePair
| BinBin : TreePair -> TreePair -> TreePair.
Fixpoint pair (l r: Tree): TreePair :=
match l with
| Tip =>
match r with
| Tip => TipTip
| Bin rl rr => TipBin rl rr
end
| Bin ll lr =>
match r with
| Tip => BinTip ll lr
| Bin rl rr => BinBin (pair l rl) (pair lr r)
end
end.
TreePairの定義は受け入れられますが、関数ペアの定義はエラーメッセージを生成します。
Error: Cannot guess decreasing argument of fix.
だから私はCoqに終了を納得させる方法に興味があります。
1
カレーを使用するのではなく、製品としてlとrを一緒に渡そうとしましたか?それが助けになるはずです。
—
ヴォーグセンごと10
この質問は、操作
—
デイブクラーク
pair
が明確に定義されていることを確認するために、データ構造の単調に減少する境界を指定することに関するものです。Coqは単なる乗り物です。