Entspricht die Klasse der primitiven Rekursionsfunktionen der Klasse der Funktionen, deren Beendigung Fetus nachweist?


9

Fetus, wenn Sie nicht davon gehört haben, können bis zu lesen hier . Es verwendet ein System von 'Aufrufmatrizen' und 'Aufrufdiagrammen', um alle 'Rekursionsverhalten' von rekursiven Aufrufen in einer Funktion zu finden. Um zu zeigen, dass eine Funktion beendet wird, zeigt sie, dass alle Rekursionsverhalten von rekursiven Aufrufen einer Funktion einer bestimmten 'lexikografischen Reihenfolge' entsprechen. Der Terminierungsprüfer ermöglicht alle primitiven rekursiven Funktionen und Funktionen wie die Ackermann-Funktion. Grundsätzlich erlaubt es eine primitive Rekursion mit mehreren Argumenten. Dies ist im Grunde auch der Terminierungsprüfer von Agda; Ich glaube, dass Coq auch einige ähnliche Einrichtungen hat, wenn auch vielleicht allgemeiner.

Aus dem Artikel "Total Functional Programming" von DA Turner . Er erklärt, dass seine vorgeschlagene Sprache in der Lage sein würde, alle "primitiven rekursiven Funktionale" auszudrücken, wie sie in dem von Godel untersuchten System T zu sehen sind. Er fährt fort, dass dieses System "bekanntermaßen jede rekursive Funktion umfasst, deren Gesamtheit in der Logik erster Ordnung bewiesen werden kann".

Dosis Fötus alle primitiven rekursiven Funktionen zulassen? Wenn ja, erlaubt es Funktionen, die keine primitiven rekursiven Funktionale sind? Kann ein Zitat für die Antwort darauf gegeben werden? (Dies ist eigentlich nicht notwendig, da ich nur interessiert bin; es ist nur so, dass eine Leseehe in dieser Angelegenheit nett wäre)

Bonusfrage: Primitive rekursive Funktionale haben eine sehr präzise Definition in Bezug auf Kombinatoren: Typ S und K (die die Festkomma-Kombinatoren nicht ausdrücken können), Null, die Nachfolgerfunktion und die Iterationsfunktion; das ist es. Gibt es andere allgemeinere solche Sprachen, die eine so präzise Definition haben und in denen alle Ausdrücke enden?


Zu Agda vs Coq: Ich habe immer gelesen, dass Agdas Terminierungsprüfer fortgeschrittener ist und mehr Funktionen akzeptiert. Ihre Behauptung ist die erste gegenteilige (dies ist eine gute Faustregel beim Vergleich von Agda mit Coq, mit Ausnahme von Agdas mangelnder Taktik: Agda ist forschender und offen für Erweiterungen, deren Stabilität weniger etabliert ist). Andreas Abel hat an noch weiter fortgeschrittenen Terminierungsprüfern gearbeitet, die auf Größentypen basieren. Siehe seine Arbeit zu MiniAgda und auch dieses Papier .
Blaisorblade

Es gibt "mehr Funktionsdefinitionen akzeptieren" und "eine größere Klasse berechenbarer Funktionen haben". Die beiden sind unvergleichlich. Agda gewinnt bei der ersten Zählung, aber Coq gewinnt eindeutig bei der zweiten.
Cody

Ich sollte klarstellen, dass ich Coq und Agda überhaupt nicht verwendet habe. Es schien, dass Coq von dem Wenigen, das ich las, in der Lage war, eine breitere Klasse berechenbarer Funktionen zu definieren, aber ich wusste es nicht und sagte: "Ich glaube, dass Coq auch einige ähnliche Einrichtungen hat, wenn auch vielleicht allgemeiner." "glauben" und "vielleicht" wurden verwendet, um zu vermitteln, dass ich es nicht wusste.
Jake

Antworten:


7

Ja, der Fetus-Prüfer kann alles in Goedels T tippen. Sie können dies anzeigen, indem Sie mit dem Prüfer anzeigen, dass der Iterationsoperator in T beendet wird. Die folgende Definition funktioniert beispielsweise:

iter:A(AA)NAiterif0=iiterif(n+1)=f(iterifn)

Dies ist für den Fetus-Prüfer (oder die meisten anderen Terminierungsprüfer) sehr einfach zu überprüfen, da es sich um eine offensichtlich strukturell rekursive Definition handelt.

Agda und Coq erlauben beide den Nachweis der Beendigung von Funktionen, die weit über das hinausgehen, was in der Arithmetik erster Ordnung nachweislich insgesamt ist. Die Funktion, die dies ermöglicht, besteht darin, dass sie das Definieren von Typen durch Rekursion von Daten ermöglichen, was als "große Eliminierung" bezeichnet wird. (In der ZF-Mengenlehre dient das Axiomschema der Ersetzung in etwa demselben Zweck.)

Ein einfaches Beispiel für etwas, das über T hinausgeht, ist die Konsistenz von Goedels T selbst! Wir können die Syntax als Datentyp angeben:

data T : Set where 
   N : T 
   _⇒_ : T → T → T

data Term : T → Set where 
   zero : Term N
   succ : Term (N ⇒ N)
   k    : {A B : T} → Term (A ⇒ B ⇒ A)
   s    : {A B C : T} → Term ((A ⇒ B ⇒ C) ⇒ (A ⇒ B) ⇒ A ⇒ C)
   r    : {A : T} → Term (A ⇒ (A ⇒ A) ⇒ N ⇒ A)
   _·_  : {A B : T} → Term (A ⇒ B) → Term A → Term B

Beachten Sie, dass die Typabhängigkeit es uns ermöglicht, einen Datentyp von Begriffen zu definieren, der nur die gut typisierten Begriffe von T enthält. Wir können dann eine Interpretationsfunktion für die Typen angeben:

interp-T : T → Set 
interp-T N       = Nat 
interp-T (A ⇒ B) = (interp-T A) → (interp-T B)

Dies besagt, dass Ndies die natürlichen Agda-Zahlen sein sollten und der Pfeil von T als der Agda-Funktionsraum interpretiert werden sollte. Dies ist eine "große" Eliminierung, da wir eine Menge durch Rekursion auf die Struktur des Datentyps T definieren.

Wir können dann eine Interpretationsfunktion definieren, die zeigt, dass jeder Term von Goedels T durch einen Agda-Term interpretiert werden kann:

interp-term : {A : T} → Term A → interp-T A
interp-term zero    = 0 
interp-term succ    = \n → n + 1
interp-term k       = \x y → x
interp-term s       = \x y z → x z (y z)
interp-term r       = Data.Nat.fold 
interp-term (f · t) = (interp-term f) (interp-term t)

(Ich habe Agda nicht auf diesem Computer, daher fehlen zweifellos einige Importe, Fixitätserklärungen und Tippfehler. Das Beheben ist eine Übung für den Leser, der auch Redakteur sein kann, wenn er möchte.)

Ich weiß nicht, wie konsistent Agda ist, aber Benjamin Werner hat gezeigt, dass der Kalkül induktiver Konstruktionen (Coqs Kernelkalkül) mit ZFC plus zählbar vielen unzugänglichen Kardinälen übereinstimmt.


Beachten Sie, dass Sie in Ihrem Beispiel keine große Eliminierung verwendet haben. Eine große Eliminierung erhöht die Rechenleistung nicht wirklich. Unvorhergesehenheit tut: System F hat das erstere nicht, kann aber Funktionen ausdrücken, die in System T nicht ausdrückbar sind.
cody

@cody: Die Interp-T-Funktion berechnet eine Menge aus einem Term, was für mich wie eine große Eliminierung aussieht! Es ist definitiv der Fall, dass große Eliminierungen die Leistung erhöhen: Die Martin-Loef-Typentheorie kann ohne eine große Eliminierung nicht einmal Inkonsistenz von 0 = 1 ableiten. (Um dies zu sehen, beachten Sie, dass Sie ohne Universen / große Eliminierungen alle Abhängigkeiten löschen und einen einfach eingegebenen Begriff erhalten können: Dies haben Harper und Pfenning in ihrem Angemessenheitsnachweis für LF getan.)
Neel Krishnaswami

Es tut mir leid: Ja, die Interp-T-Funktion verwendet tatsächlich eine große Eliminierung. Ich stimme auch zu, dass der Nachweis von 0! = 1 dies tatsächlich erfordert. Das Definieren berechenbarer Funktionen ist jedoch nicht dasselbe wie das Beweisen mathematischer Aussagen . Meine Antwort verdeutlicht dies ein wenig. Die reine Konstruktionsrechnung kann beispielsweise nicht 0! = 1 beweisen. Sie kann jedoch die Ackermann-Funktion relativ einfach definieren.
Cody

Dies zeigt, dass Agda allgemeiner ist, dass es einen Interpreter für System T schreiben kann, aber kein Wetter anzeigt oder dass Fetus, eine Sprache, die nicht abhängig typisiert ist, allgemeiner ist. Kann Fötus das tun? Wäre Agda dazu noch in der Lage, wenn es keine "große Eliminierung" gäbe?
Jake

1
In der Dokumentation von Agda heißt es, dass der Terminierungsprüfer den Fetus-Algorithmus verwendet. Wenn Sie T nehmen und es mit von Fetus überprüften Mustervergleichs- und rekursiven Definitionen erweitern würden, könnten Sie keinen Interpreter für T darin schreiben. Tatsächlich würden Sie die von T berechenbaren Funktionen überhaupt nicht ändern - alle von Fetus berechneten Kündigungsaufträge sind in der Peano-Arithmetik nachweislich begründet. (Siehe die Antwort von cody.) Mit dem Fetus-Algorithmus können Sie weitere Definitionen schreiben , ohne die zu berechnenden Funktionen zu ändern . Die großen Eliminierungen von Agda erweitern tatsächlich den Funktionsumfang.
Neel Krishnaswami

3

Zur Verdeutlichung sollte ich beachten, dass Fetus von Andreas Abel entwickelt wurde , der auch den ursprünglichen Terminierungsprüfer für Agda entwickelt hat und seitdem an fortgeschritteneren Terminierungstechniken gearbeitet hat.

NNFPA2FPAT

PA

T


Wie kann eine Klasse von Funktionen, die nachweislich beendet werden (PA ^ 2), der Klasse von Funktionen in System F entsprechen, deren Beendigung meines Wissens nicht nachweisbar ist? Ich verstehe auch nicht, wie du mir die Frage beantwortest. Wollen Sie damit sagen, dass System T eine größere Klasse berechenbarer Funktionen hat, oder sagen Sie, dass dies der Fötus ist? Ich denke, es gab einen Sprung in Ihrer Logik, der erwartete, dass ich mehr Hintergrund hatte als ich tatsächlich habe. Außerdem scheint der von Ihnen angegebene Link zu einer fehlerhaften Seite zu führen, die nicht korrekt gerendert wird.
Jake

Funktionen in System F werden alle beendet. Fetus erfasst eine größere Klasse berechenbarer Funktionen als System T, aber "aus Versehen", wenn Sie Polymorphismus entfernen, erfasst Fetus nur genau System T. Können Sie mir sagen, welcher Link für Sie nicht funktioniert? (und welchen Browser Sie verwenden :)
Cody

1

Wenn durch primitive rekursive Funktionalen Sie bedeuten primitive rekursive Funktionen und Sie wissen , dass Fetus die Ackermann - Funktion enthält dann Fetus nicht fallen zusammen mit der Klasse von pr Funktionen wie die Funktion Ackermann ist nicht primitiv rekursiv. Dies wurde von Ackermann gezeigt und später von Rosza Peter in " Konstruktion nichtrekursiver Funktionen " 1935 ein vereinfachter Beweis erbracht ( meines Wissens leider nur in deutscher Sprache).

Wenn Sie nach größeren Klassen rekursiver Funktionen suchen, die garantiert enden und mit der von Fetus erfassten Funktionsklasse übereinstimmen, könnte Sie eine andere Arbeit von Rosza Peter interessieren.

f(a,b)f(a,b1)f(a1,b)

Eine stärkere Klasse bietet jedoch das Konzept der transfiniten Rekursion, das Rosza Peter in " Zusammenhang der mehr Rechte und transfiniten Rekursion " beschrieben hat. Für die transfinite Rekursion haben Sie eine rekursive Variable, die Vorgänger in einer speziellen Reihenfolge aufrufen kann<

(a,b)<(c,d)(a<cbd)(acb<d)
ω2,ω3piiz=p1np2x1p3x2nzxiωω

[Bearbeiten] Primitive rekursive Funktionen sind nicht dasselbe wie primitive rekursive Funktionen, wie im Kommentar unten angegeben. Ich denke jedoch, man könnte das Konzept der transfiniten Rekursion auf Funktionale übertragen. Es ist jedoch nicht klar, ob es für eine funktionale Einstellung noch leistungsfähiger ist.


2
Die Klasse der primitiven rekursiven Funktionen vom endlichen Typ ist allgemeiner als die Klasse der primitiven rekursiven Funktionen. Es kann zum Beispiel die Ackermann-Funktion ausdrücken und ist
Jake
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.