¿Cómo puedo convencer a Coq de que la función recursiva dada a continuación termina? La función toma dos argumentos inductivos. Intuitivamente, la recursión termina porque cualquiera de los argumentos se descompone.
Específicamente, la función toma dos árboles como entrada.
Inductive Tree :=
| Tip: Tree
| Bin: Tree -> Tree -> Tree.
En los árboles, me gusta hacer el siguiente estilo de inducción.
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.
Se acepta la definición de TreePair, pero la definición del par de funciones produce el mensaje de error:
Error: Cannot guess decreasing argument of fix.
Así que estoy interesado en cómo convencer a Coq de la terminación.
pair
esté bien definida. Coq es simplemente el vehículo.