Як я можу переконати Coq, що рекурсивна функція, наведена нижче, припиняється? Функція бере два індуктивних аргументи. Інтуїтивно рекурсія припиняється, оскільки будь-який аргумент розкладається.
Зокрема, функція приймає два дерева як вхідні дані.
Inductive Tree :=
| Tip: Tree
| Bin: Tree -> Tree -> Tree.
На Деревах мені подобається робити наступний стиль індукції.
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.
Тож мені цікаво, як переконати Кока в припиненні.
pair
чітко визначеної операції . Coq - просто транспортний засіб.