Fehler bei der Definition von Ackermann in Coq
Ich versuche die Ackermann-Peters-Funktion in Coq zu definieren und erhalte eine Fehlermeldung, die ich nicht verstehe. Wie Sie sehen, verpacke ich die Argumentea, b
von Ackermann zu zweitab
; Ich stelle eine Bestellung zur Verfügung, die eine Bestellfunktion für die Argumente definiert. Dann benutze ich dieFunction
Formular zur Definition von Ackermann selbst mit der Bestellfunktion für dasab
Streit.
<code>Require Import Recdef. Definition ack_ordering (ab1 ab2 : nat * nat) := match (ab1, ab2) with |((a1, b1), (a2, b2)) => (a1 > a2) \/ ((a1 = a2) /\ (b1 > b2)) end. Function ack (ab : nat * nat) {wf ack_ordering} : nat := match ab with | (0, b) => b + 1 | (a, 0) => ack (a-1, 1) | (a, b) => ack (a-1, ack (a, b-1)) end. </code>
Was ich bekomme, ist die folgende Fehlermeldung:
Fehler: Keine solche Abschnittsvariable oder Annahme:ack
.
Ich bin nicht sicher, was Coq stört, aber beim Durchsuchen des Internets habe ich einen Vorschlag gefunden, dass möglicherweise ein Problem mit der Verwendung einer rekursiven Funktion vorliegt, die mit einer Bestellung oder einer Kennzahl definiert wurde, bei der der rekursive Aufruf innerhalb einer Übereinstimmung auftritt. Allerdings mit den Projektionenfst
undsnd
und einif-then-else
hat eine andere Fehlermeldung generiert. Kann jemand bitte vorschlagen, wie man Ackermann in Coq definiert?