Как я могу убедить 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.
Поэтому меня интересует, как убедить Coq в расторжении.
pair
четко определена. Coq это просто транспортное средство.