Wie kann ich Coq davon überzeugen, dass die unten angegebene rekursive Funktion endet? Die Funktion akzeptiert zwei induktive Argumente. Intuitiv wird die Rekursion abgebrochen, weil eines der beiden Argumente zerlegt wird.
Insbesondere nimmt die Funktion zwei Bäume als Eingabe.
Inductive Tree :=
| Tip: Tree
| Bin: Tree -> Tree -> Tree.
Auf Bäumen mache ich gerne den folgenden Induktionsstil.
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.
Die Definition von TreePair wird akzeptiert, aber die Definition des Funktionspaares liefert die Fehlermeldung:
Error: Cannot guess decreasing argument of fix.
Ich bin also daran interessiert, wie ich Coq von der Kündigung überzeugen kann.
pair
festzulegen , um sicherzustellen, dass die Operation genau definiert ist. Coq ist nur das Fahrzeug.