Comment puis-je convaincre Coq que la fonction récursive donnée ci-dessous se termine? La fonction prend deux arguments inductifs. Intuitivement, la récursivité se termine car l'un ou l'autre argument est décomposé.
Plus précisément, la fonction prend deux arbres en entrée.
Inductive Tree :=
| Tip: Tree
| Bin: Tree -> Tree -> Tree.
Sur Trees, j'aime faire le style d'induction suivant.
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.
La définition de TreePair est acceptée, mais la définition de la paire de fonctions génère le message d'erreur:
Error: Cannot guess decreasing argument of fix.
Je suis donc intéressé à savoir comment convaincre Coq de la résiliation.
pair
est bien définie. Coq n'est que le véhicule.