Bagaimana saya bisa meyakinkan Coq bahwa fungsi rekursif yang diberikan di bawah ini berakhir? Fungsi ini mengambil dua argumen induktif. Secara intuitif, rekursi berakhir karena salah satu argumen terurai.
Secara khusus, fungsi mengambil dua pohon sebagai input.
Inductive Tree :=
| Tip: Tree
| Bin: Tree -> Tree -> Tree.
Di Pohon, saya suka melakukan gaya induksi berikut.
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.
Definisi TreePair diterima, tetapi definisi dari pasangan fungsi menghasilkan pesan kesalahan:
Error: Cannot guess decreasing argument of fix.
Jadi saya tertarik pada cara meyakinkan Coq tentang penghentian.
pair
didefinisikan dengan baik. Coq hanyalah kendaraan.