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.Antworten:
Die Fixpunktdefinitionen von Coq erfordern, dass induktive Anrufe ein strukturell kleineres Argument erhalten. Im Grunde genommen benötigt ein Fixpunktkonstrukt ein einziges Argument: Es gibt kein integriertes Konzept für eine rekursive Definition über zwei Argumente. Glücklicherweise enthält Coqs Definition von strukturell kleiner Typen höherer Ordnung, was äußerst leistungsfähig ist.
Ihre Fixpunktdefinition mit zwei Argumenten folgt einem einfachen Muster: Entweder wird das erste Argument kleiner, oder das erste Argument bleibt identisch, und das zweite Argument wird kleiner. Dieses recht häufige Muster kann durch ein einfaches Fix-in-Fix behandelt werden.
In komplexeren Fällen oder wenn Ihr Geschmack so ist, können Sie eine Rekursion verwenden, die der in Mathematikkursen gelehrten näher kommt, indem Sie den Fixpunkt aus einer Schrittberechnung und einem separaten Begründungsargument aufbauen , wobei häufig ein ganzzahliges Maß verwendet wird . Sie können auch festlegen, dass Ihre Definition eher wie ein klassisches Programm in einer nicht vollständigen Sprache mit einer separaten Terminierung in der
Program
Umgangssprache aussieht .quelle
fix pair1 r
in den zweiten Zweig der obersten Ebene schiebematch
(und natürlich den ersten Zweig anpasse, um einen Funktionstyp entsprechend zurückzugeben)?