Realisierbarkeitstheorie: Leistungsunterschied zwischen Lambda-Kalkül und Turing-Maschinen


48

Ich habe drei verwandte Unterfragen, die unten durch Aufzählungszeichen hervorgehoben sind (nein, sie konnten nicht geteilt werden, wenn Sie sich fragen). Andrej Bauer schrieb hier , dass einige Funktionen durch eine Turing-Maschine realisierbar sind, aber nicht durch eine Lambda-Rechnung. Ein wichtiger Schritt seiner Überlegungen ist:

Wenn wir jedoch den Lambda-Kalkül verwenden, soll [das Programm] c aus einem Lambda-Term, der eine Funktion f darstellt, eine Ziffer berechnen, die eine Turing-Maschine darstellt. Dies ist nicht möglich (ich kann erklären, warum, wenn Sie es als separate Frage stellen).

  • Ich würde gerne eine Erklärung / einen informellen Beweis sehen.

Ich verstehe nicht, wie ich den Satz von Rice hier anwenden soll. es würde auf das Problem zutreffen "Sind diese Drehmaschine T und dieser Lambda-Term L äquivalent?", weil das Anwenden dieses Prädikats auf äquivalente Terme das gleiche Ergebnis ergibt. Die erforderliche Funktion kann jedoch unterschiedliche, aber äquivalente TMs für unterschiedliche, aber äquivalente Lambda-Terme berechnen.

  • Wenn das Problem in der Introspektion eines Lambda-Terms besteht, denke ich, dass es auch akzeptabel wäre, eine Gödel-Codierung eines Lambda-Terms zu übergeben, oder?

Einerseits bin ich nicht sehr überrascht, da sein Beispiel die Berechnung der Anzahl von Schritten in der Lambda-Rechnung beinhaltet, die eine Turing-Maschine benötigt, um eine gegebene Aufgabe zu erfüllen.

  • Aber da hier die Lambda-Rechnung ein Problem mit der Turingmaschine nicht lösen kann, frage ich mich, ob man ein ähnliches Problem für die Lambda-Rechnung definieren und es für Turingmaschinen als unlösbar beweisen kann, oder ob es tatsächlich einen Unterschied in der Leistung zugunsten von gibt Turing Machines (was mich überraschen würde).

Antworten:


56

John Longley hat einen sehr ausführlichen Umfrageartikel veröffentlicht, in dem die damit verbundenen Probleme "Vorstellungen von Berechenbarkeit bei höherem Typ" erörtert werden .

Die Grundidee ist, dass es in der Church-Turing-These nur um Funktionen von - und es gibt noch mehr zu rechnen! Insbesondere beim Schreiben von Programmen verwenden wir Funktionen eines höheren Typs (z. B. ).NN(NN)N

Um ein Modell höherer Berechnungsarten vollständig zu definieren, müssen wir die Aufrufkonvention für Funktionen angeben , damit eine Funktion eine andere Funktion aufrufen kann, die sie als Argument empfängt. In der Lambda-Rechnung ist die Standard-Aufrufkonvention, dass wir Funktionen durch Lambda-Terme repräsentieren, und das einzige, was Sie mit einem Lambda in der Lambda-Rechnung tun können, ist, es anzuwenden. In typischen Codierungen mit Turing-Maschinen übergeben wir Funktionen als Argumente, indem wir eine bestimmte Godel-Codierung festlegen und dann Zeichenfolgen, die den Index der Maschine darstellen, die Sie als Argument übergeben möchten.

Der Unterschied in der Codierung bedeutet, dass Sie die Syntax des Arguments mit einer TM-artigen Codierung analysieren können und nicht mit einer Standard-Lambda-Kalkül-Darstellung. Wenn Sie also einen Lambda-Term für eine Funktion vom Typ , können Sie ihr Verhalten nur testen, indem Sie bestimmte - Sie können die Struktur der nicht analysieren Begriff in irgendeiner Weise. Dies ist einfach nicht genug Information, um den Code des Lambda-Terms herauszufinden.NNn

Eine Sache , erwähnenswert ist , dass mit höheren Typen, wenn eine Sprache weniger ausdrucksvoll bei einem Auftrag, es ist mehr ausdruck eines Auftrag, denn Funktionen kontra sind. In ähnlicher Weise gibt es Funktionen, die Sie in LC schreiben können, die Sie mit einer TM-artigen Codierung nicht können (da sie auf der Tatsache beruhen, dass Sie funktionale Argumente übergeben können und wissen, dass der Empfänger nicht in die Funktion schauen kann, die Sie ihm geben). .

BEARBEITEN: Hier ist ein Beispiel für eine Funktion, die in PCF, aber nicht in TM + Goedel-Codierungen definiert werden kann. Ich werde die isAlwaysTrueFunktion deklarieren

 isAlwaysTrue : ((unit → bool) → bool) → bool

Dies sollte true zurückgeben, wenn sein Argument sein Argument ignoriert und immer true zurückgibt, false zurückgeben, wenn sein Argument bei Eingaben false zurückgibt, und in eine Schleife gehen, wenn sein Argument bei Eingaben in eine Schleife geht. Wir können diese Funktion ziemlich einfach wie folgt definieren:

isAlwaysTrue p = p (λ(). true) ∧ p (λ(). false) ∧ p (λ(). ⊥)

Wo ist die Schleifenberechnung und ist der Operator und auf Booleschen Werten. Das funktioniert, weil es unit → boolin PCF nur drei Einwohner gibt , und deshalb können wir sie erschöpfend aufzählen. In einem TM + Goedel-Codierungsstilmodell kann pjedoch getestet werden, wie lange das Zurückgeben einer Antwort durch das Argument dauert, und basierend darauf können verschiedene Antworten zurückgegeben werden. Daher würde die Implementierung von isAlwaysTruemit TMs die Spezifikation nicht erfüllen.


1
Dies ist eine hervorragende Umfrage. Danke für den Link !
Suresh Venkat

Mir wurde gerade klar, dass ich vergessen hatte, eine Antwort anzunehmen, obwohl ich beabsichtigte, Ihre anzunehmen. Es tut uns leid!
Blaisorblade

"Der Unterschied in der Codierung bedeutet, dass Sie die Syntax des Arguments mit einer TM-artigen Codierung analysieren können, und Sie können nicht mit einer Standard-Lambda-Kalkül-Darstellung.": Aber wenn Sie Darstellungen für die Funktionszusammensetzung haben? Außerdem scheint das, was Sie sagen, darauf hinzudeuten, dass HOL mehr als eine Theorie eines typisierten Lambda-Kalküls ist, es ist mehr als das?
Hibou57

Und was ist damit ? Cs.virginia.edu/~evans/cs150/classes/class39/lecture39.pdf . Ist das irgendwie falsch?
Hibou57

Lieber Neel, haben Sie ein Beispiel für eine Funktion, die im Lambda-Kalkül-Modell aber nicht im Turing-Modell realisiert werden kann?
Ingo Blechschmidt

29

Was Neel gesagt hat und auch folgendes.

Ich möchte (betonen erneut , wieder und wieder ) , dass die Darstellung von Eingangs- und Ausgangsfragen. Wenn wir Darstellungen ändern dürfen, können wir fast alles erreichen (zum Beispiel eine gegebene Funktion berechenbar machen). Es ist also nicht akzeptabel , von einer Repräsentation der Funktionen durch -terms zu einer Repräsentation durch Gödel-Zahlen zu gelangen, wenn unser Berechnungsmodell -calculus ist (weil dann die aktuelle Operation wird durch -calculus unberechenbar).NNλλλ

Eine Aussage, die im term-Modell, aber nicht im Turing-Maschinenmodell realisierbar ist, ist "nicht jede Funktion hat einen Gödel-Code", was irgendwie albern ist. Ich werde versuchen, eine bessere zu finden und diese Antwort zu bearbeiten.λNN


Edit on 2013-10-07: Hier ist, was ich mit "Currying wird unberechenbar" gemeint habe. Angenommen, wir verwenden das untypisierte -calculus als unser Rechenmodell, aber dann entscheiden wir, dass wir Maps mit Gödel-Codes darstellen sollen (von Turing-Maschinen, codiert als Church-Zahlen). Klingt harmlos, oder? Schließlich glauben wir, dass das Mantra "Turingmaschinen und Kalkül gleichwertig sind".λNNλ

Nun, damit diese neue Repräsentation tatsächlich eine gültige Repräsentation von , müssen wir auch die Anwendung und das Currying realisieren (weil "Funktionen darstellen" dasselbe bedeutet wie "eine repräsentieren" exponentielles Objekt "). Genauer gesagt, wir brauchen eine -term , so dass, wann immer der Kirche Zeichen steht dann dargestellt wird . (Hier schreibe ich für die Nummer der Kirche, die die Nummer .) Eine solcheNNλappn¯f:NNf(k)appn¯k¯n¯nappist leicht verfügbar, da es sich um einen Interpreter für Turing-Maschinen handelt, der im -calculus implementiert ist.λ

Aber wie wäre es mit Curry? Dafür brauchen wir folgendes. Angenommen, ist eine dargestellte Menge. Bei einer gegebenen Map die mit einem -term berechnet wurde , müssen wir zeigen, dass die Transposition wird auch von einigen berechnet -term . Betrachten Sie jedoch das Beispiel, in dem die Menge von die durch -terms dargestellt wird, und die Anwendung ist. Dann wäre eine Map, die als Identität fürXf:X×NNλtf~:X(NN)λsXNNλff~NN, aber sein Realisator ist ein Term, der Terms, die Maps in entsprechende Gödel-Codes umwandelt . Ein solches -term existiert nicht (zum Beispiel, weil es in einem topologischen semantischen Modell diskontinuierlich wäre).λλNNλ

Sie könnten einwenden, dass ich die spezifisch dargestellte Menge von Maps die durch -terms dargestellt werden, nicht hätte verwenden sollen, weil wir uns darauf geeinigt haben, dass diese durch Gödel-Codes dargestellt werden sollen . Aber du würdest dich irren. Zuallererst hätte ich ein anderes mit einem komplizierteren Beweis verwenden können, der sich Ihnen entziehen würde, aber dennoch das gleiche Ergebnis erzielen würde. Zweitens ist in der Kategorie vorhanden, und die Definition des Exponentials erfordert, dass das Currying in Bezug auf alle Objekte funktioniert . Sie müssen die Kategorie respektieren. Sie können es nicht einfach nach dem Zufallsprinzip schlachten und einige Gegenstände herausnehmen (na ja, Sie können es, aber dann sind Sie ein Metzger).XNNλXX


2
Ich warte immer noch auf dieses bessere Beispiel ...
Jacques Carette

1
Nun, ich kann mir viele Aussagen vorstellen, die mit Turing-Maschinen realisierbar sind, aber nicht mit Termen. Ich nehme an, Sie wollen das Gegenteil. Hmmm. λ
Andrej Bauer

Ich verstehe nicht, wie Currys unberechenbar werden können. Sie sollten in der Lage sein, den Satz von smn wiederzuverwenden, da sein Beweis eine Funktion auf Daten erster Ordnung (Naturals) aufbaut. Durch die Church-Turing-These kann dieses Verhalten auf Naturals als Lambda-Term implementiert werden (der native Funktionen intern verwendet, aber ich sehe nicht, wie das verboten ist). Man kann das utm-Theorem auf ähnliche Weise beweisen, also sollten wir gemäß Ihrem Beitrag fertig sein. Was vermisse ich?
Blaisorblade

1
Ich habe in der Antwort erklärt, was es bedeutet, dass das Currying unberechenbar wird, nämlich dass das vorgeschlagene Objekt in der Kategorie der dargestellten Mengen kein Exponential ist.
Andrej Bauer

Danke für die Erklärung! Leider kann ich nicht nochmal upvoten. Ich kann den meisten technischen Details folgen; Topologische Modelle kenne ich nicht, aber "Funktionen in der funktionalen Programmierung / λ-Rechnung können nicht untersucht werden". Ihr letzter Absatz erklärt auch, warum ich smn nicht durchgehen kann, weil das von smn gegebene Currying wieder Gödel-Codes erzeugt und nicht die Standardfunktionen, die Sie benötigen. Ich werde über diesen Absatz meditieren.
Blaisorblade
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.