Fehler beim Definieren von Ackermann in Coq

8

Ich versuche, die Ackermann-Peters-Funktion in Coq zu definieren, und ich bekomme eine Fehlermeldung, die ich nicht verstehe. Wie Sie sehen können, verpacke ich die Argumente a, b von Ackermann in ein Paar ab ; Ich stelle eine Ordnung bereit, die eine Ordnungsfunktion für die Argumente definiert. Dann benutze ich das Formular Function , um Ackermann selbst zu definieren und es mit der Sortierfunktion für das Argument ab zu versehen.

%Vor%

Was ich bekomme, ist die folgende Fehlermeldung:

  

Fehler: Keine solche Abschnittsvariable oder -annahme: ack .

Ich bin nicht sicher, was Coq stört, aber als ich im Internet suchte, fand ich einen Vorschlag, dass es ein Problem mit der Verwendung einer rekursiven Funktion gibt, die mit einer Ordnung oder einem Maß definiert ist, wobei der rekursive Aufruf innerhalb einer Übereinstimmung erfolgt. Bei Verwendung der Projektionen fst und snd und if-then-else wurde jedoch eine andere Fehlermeldung generiert. Kann jemand bitte vorschlagen, wie man Ackermann in Coq definiert?

    
Mayer Goldberg 24.04.2012, 05:53
quelle

3 Antworten

3

Es scheint, als ob Function dieses Problem nicht lösen kann. Allerdings kann sein Cousin Program Fixpoint .

Lassen Sie uns zuerst einige Lemmas definieren, die die Begründetheit behandeln:

%Vor%

Jetzt können wir die Ackermann-Péter-Funktion definieren:

%Vor%

Einige einfache Tests, die zeigen, dass wir mit ack :

rechnen können %Vor%     
Anton Trunov 29.06.2017, 18:53
quelle
1

Sie erhalten diesen Fehler, weil Sie auf die Funktion ack verweisen, während Sie sie definieren. Selbstreferenz ist nur in Fixpoint s erlaubt (dh rekursive Funktionen), aber das Problem ist, wie Sie wahrscheinlich wissen, dass die Ackermann-Funktion keine primitive rekursive Funktion ist.

Siehe Coq'Art Abschnitt 4.3.2.2 für weitere Informationen hierzu.

Eine andere Möglichkeit, sie zu definieren, besteht darin, eine zweite rekursive Funktion einzufügen, die für das zweite Argument strukturell rekursiv ist; so etwas wie

%Vor%     
wires 24.04.2012 18:04
quelle
1

Ich habe gerade Ihre Funktion mit Coq 8.4 versucht, und der Fehler ist etwas anders:

%Vor%

Ich schätze, der innere Ruf nach ack ist das Problem, aber ich weiß nicht warum.

Hoffe das hilft ein bisschen, V.

PS: Die übliche Art, wie ich Ack definiere, ist, was Drähte mit einem inneren Fixpunkt geschrieben haben.

    
Vinz 21.05.2012 07:57
quelle

Tags und Links