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?
Antworten:
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:
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:
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:
Dies besagt, dass
N
dies 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:
(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.
quelle
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.
quelle
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.
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<
[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.
quelle