Błąd w definiowaniu Ackermanna w Coq

Próbuję zdefiniować funkcję Ackermanna-Petersa w Coq i otrzymuję komunikat o błędzie, którego nie rozumiem. Jak widać, pakuję argumentya, b Ackermanna w parzeab; Zapewniam porządek definiujący funkcję porządkowania argumentów. Następnie używamFunction formularz do zdefiniowania samego Ackermanna, udostępniając mu funkcję zamawianiaab argument.

<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>

Otrzymuję następujący komunikat o błędzie:

Błąd: brak takiej zmiennej sekcji lub założenia:ack.

Nie jestem pewien, co przeszkadza Coq, ale przeszukiwanie Internetu, znalazłem sugestię, że może istnieć problem z użyciem funkcji rekurencyjnej zdefiniowanej za pomocą porządku lub miary, gdzie wywołanie rekurencyjne występuje w dopasowaniu. Jednak używając projekcjifst isnd i anif-then-else wygenerował inny komunikat o błędzie. Czy ktoś może zasugerować, jak zdefiniować Ackermanna w Coq?

questionAnswers(3)

yourAnswerToTheQuestion