Come posso convincere Coq che la funzione ricorsiva indicata di seguito termina? La funzione accetta due argomenti induttivi. Intuitivamente, la ricorsione termina perché uno dei due argomenti è decomposto.
In particolare, la funzione accetta due alberi come input.
Inductive Tree :=
| Tip: Tree
| Bin: Tree -> Tree -> Tree.
Su Trees, mi piace fare il seguente stile di induzione.
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 definizione di TreePair è accettata, ma la definizione della coppia di funzioni genera il messaggio di errore:
Error: Cannot guess decreasing argument of fix.
Quindi sono interessato a come convincere Coq della risoluzione.
pair
sia ben definita. Coq è semplicemente il veicolo.