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?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage