Gibt es eine klare Definition von „berechenbar“ für Berechnungsmodelle, die nicht vollständig sind?

9

Dies ist ein Follow-up von einer anderen Frage hier , und ich hoffe , dass es nicht zu philosophisch ist. Wie Raphael in einem Kommentar zu meiner vorherigen Frage betonte, verstehe ich die Definition von "berechenbar" nicht wirklich, aber nach einigen von mir gelesenen Artikeln ist die Definition auch nicht wirklich klar, wenn es um Rechenmodelle geht, die schwächer sind als Turing Maschinen wegen der Kodierung der Ein- und Ausgabe.

Die typische Definition von turing computable lautet wie folgt:

Definition 1: Eine Funktion heißt turing berechenbar, wenn es eine turingmaschine , die Verwendung einer geeigneten Codierung der natürlichen Zahlen als Zeichenfolgen berechnet .f:NkNfMf

Die Definitionen unterscheiden sich darin, was genau eine geeignete Codierung ist, aber die meisten beziehen sich auf Binärcodierung , unäre Codierung oder Dezimalcodierung als die eine feste und geeignete Codierung. Es kann auch gezeigt werden, dass das Festlegen einer Codierung für die Definition der Berechenbarkeit erforderlich ist. Aber was macht beispielsweise die binäre Codierung natürlicher Zahlen so besonders, dass wir sie als die geeignete Codierung axiomatisieren können? Wahrscheinlich, weil es der intuitiven Vorstellung entspricht, was Berechenbarkeit zufällig bedeutet .

Was ist nun, wenn wir schwächere Rechenmodelle betrachten als Maschinen? Betrachten wir zum Beispiel die Menge von "verkrüppelten" Turingmaschinen mit dem Alphabet die sich möglicherweise nur nach rechts bewegen, und eine Definition der verkrüppelten Turing-Berechenbarkeit, die mit der der Turing-Berechenbarkeit übereinstimmt: { 0 , 1 }Mc{0,1}

Definition 2: Eine Funktion wird in als verkrüppelte Turing-Berechenbare oder berechenbare wenn es eine verkrüppelte Turing-Maschine , die Verwendung einer geeigneten Codierung der natürlichen Zahlen als berechnet ein Faden.M c M ff:NkNMcMf

Wenn wir "geeignete Codierung" als "binäre Codierung" zu definieren, dann ist die Funktion ist nicht berechenbar in . Wenn wir „geeignete Codierung“ als „einstellige Codierung“ axiomatisieren, dann ist berechenbar in . Dies erscheint unangenehm, da jeder eine der unendlich vielen intuitiven Codierungen nach Belieben korrigieren kann. Es sollte klar sein, ob ein Rechenmodell berechnen kann oder nicht, ohne auf eine bestimmte Codierung Bezug zu nehmen - zumindest habe ich noch nie jemanden gesehen, der erwähnt, welche Codierung verwendet wird, wenn angegeben wird, dass "Schleifenprogramme schwächer sind als Turing-Maschinen".M c f M c ff:NN,nn+1Mcf Mcf


Nach dieser Einführung kann ich endlich meine Frage formulieren: Wie würde man "geeignete Codierungen" und "Berechenbarkeit" für beliebige Berechnungsmodelle definieren, die nicht mit dem intuitiven Begriff der Berechenbarkeit übereinstimmen? Ist dies im Rahmen der Berechenbarkeit möglich?

Bearbeiten: Ich habe die Einführung gekürzt, sie hat die Frage nicht ergänzt.

Stefan Lutz
quelle

Antworten:

6

Eine grundlegende Tatsache, die Sie hier vermissen, ist, dass alle von Ihnen erwähnten Codierungen aus Sicht der Berechenbarkeit äquivalent sind: Es gibt eine berechenbare Funktion, die die binäre Codierung einer Zahl auf ihre unäre Codierung abbildet oder umgekehrt. Um die Berechenbarkeit zu definieren, spielt es daher keine Rolle, welche dieser Codierungen Sie für Zahlen auswählen. Korrigieren Sie einfach Ihre Lieblingscodierung.

Berechenbarkeit ist in seinem Kern eine Eigenschaft von String - Funktionen . Wenn Sie die Berechenbarkeit in einer anderen Domäne definieren, müssen Sie eine Codierung korrigieren. In der Praxis sind alle "vernünftigen" Codierungen im Sinne des vorhergehenden Absatzes gleichwertig, sodass die genaue Codierung keine Rolle spielt.f:ΣΣ

Die Codierung spielt jedoch in eingeschränkten Rechenmodellen eine Rolle. Nehmen wir als extremes Beispiel an, Sie betrachten zeitlich begrenzte Turing-Maschinen: Angenommen, Ihre Maschine soll für einige c in der Zeit enden , wobei n die Länge der Eingabe (als Zeichenfolge) ist. Wir können nicht mehr zwischen binärer und unärer Codierung wechseln, da die binäre Codierung viel kompakter ist. Wenn wir über eine polynomialzeitberechnbare Funktion von ganzen Zahlen sprechen, geben wir an, dass ganze Zahlen binär codiert sind. Auch dies ist eine etwas willkürliche Wahl, da die Dezimalcodierung zu demselben Begriff der Polynomzeitberechnbarkeit führen würde.O(nc)cn

Um Ihre Frage zu beantworten: Die Codierung wird als Teil der Definition des eingeschränkten Modells angegeben.

Yuval Filmus
quelle
"Eine grundlegende Tatsache, die Sie hier vermissen, ist, dass alle von Ihnen erwähnten Codierungen aus Sicht der Berechenbarkeit gleichwertig sind: Es gibt eine berechenbare Funktion, die die binäre Codierung einer Zahl auf ihre unäre Codierung abbildet oder umgekehrt" - ja, ich hatte das in der Originalversion meiner Frage, aber ich kann nicht sehen, wie es für die Frage nach schwächeren Modellen relevant ist. Es ist auch klar, dass die Codierung als Teil der Modelldefinition angegeben werden muss, aber die Frage ist, wie man zu einer solch vernünftigen Definition gelangen kann.
Stefan Lutz
1
Man zieht diese Definition aus dem Hut. Da unterschiedliche Definitionen in der Regel gleichwertig sind, spielt die genaue Definition keine Rolle. Wenn dies der Fall ist, gibt es verschiedene Begriffe von Komplexität. Bei einigen Diagrammalgorithmen macht es beispielsweise einen Unterschied, ob Sie eine Adjazenzmatrix oder eine Liste von Kanten erhalten.
Yuval Filmus
Zusammenfassend: a) Die Definition jedes einzelnen Berechnungsmodells muss Syntax, Semantik UND eine geeignete Codierung enthalten. b) Die Definition der "geeigneten Codierung" ist völlig unabhängig von der Syntax und Semantik des Modells. c) Es gibt keine Möglichkeit, eine Definition der "geeigneten Codierung" anzugeben, die für alle Berechnungsmodelle gültig ist. Ist das korrekt?
Stefan Lutz
Ich stimme a) und b) zu, aber mit c) nur teilweise. Sie können eine geeignete Codierung definieren, die als "Standardcodierung" dient und verwendet wird, sofern dies nicht ausdrücklich erwähnt wird. Bei Zahlen gibt es eine solche Standardcodierung - die Binärcodierung.
Yuval Filmus
M
4

Erstens können Sie "geeignete Codierung" nicht als Binärzeichenfolgen oder eine andere Codierung festlegen. Dies liegt daran, dass Sie zu viele Berechnungsmodelle verlieren würden, da unterschiedliche Berechnungsmodelle möglicherweise sehr unterschiedliche Ein- und Ausgabemodelle haben. Mit anderen Worten, sie "sprechen" möglicherweise keine Zeichenfolgen.

Zum Beispiel sind Terme des untypisierten Lambda-Kalküls entweder Variablen oder die Anwendung eines Terms auf einen anderen oder eine Abstraktion eines Lambda-Terms. Eingabe und Ausgabe sind Begriffe, beliebige Zeichenfolgen. Dennoch ist der untypisierte Lambda-Kalkül Turing-vollständig, da es eine "geeignete Codierung" gibt, die natürliche Zahlen als Lambda-Terme einer bestimmten Form codiert, und unter dieser Codierung für jede berechenbare Funktion gibt es einen Lambda-Term, der sie berechnet.

Sie können "geeignete Codierung" formalisieren, wenn Sie Turing-Maschinen als Referenzmodell für die Berechnung festlegen und dann verlangen, dass die Codierung und Decodierung von und zu binären Zeichenfolgen von einer Turing-Maschine ausgeführt wird, die immer anhält. Beispielsweise könnte eine Turing-Maschine eine natürliche Zahl als Binärzeichenfolge in einen Lambda-Term übersetzen, der diese Zahl ausdrückt, die Reduzierung der Lambda-Rechnung simulieren und das Ergebnis zurück in eine Binärzeichenfolge übersetzen.

Für einfachere Berechnungsmodelle würde ich den gleichen Ansatz erwarten: Nehmen Sie ein Referenzmodell für die Berechnung und korrigieren Sie eine Codierung der natürlichen Zahlen. Stellen Sie dann sicher, dass die Codierung und Decodierung durch Instanzen dieses einfachen Modells erfolgt. Wie Sie bereits bemerkt haben, würde die Verwendung von unären und binär codierten Zahlen für verkrüppelte Turing-Maschinen kein äquivalentes Berechnungsmodell ergeben.

Hoopje
quelle
Ist es möglich, dass sich im letzten Absatz etwas geändert hat? Sie schreiben, dass die Codierung durch das einfache Modell und nicht durch das Referenzmodell erfolgt. Im vorherigen Absatz möchten Sie, dass die Codierung durch das Referenzmodell und nicht durch das andere Modell (Lambda-Kalkül) erfolgt.
Stefan Lutz
Wenn Sie schwächere Rechenmodelle untersuchen, möchten Sie Turing-Maschinen nirgendwo verwenden, auch nicht in der Codierungs- / Decodierungsphase. Dann könnten Sie einfach alle Berechnungen in der Codierungsphase durchführen und über jedes Berechnungsmodell wäre Turing vollständig. Sie müssen also das einfachere Referenzmodell zum Codieren / Decodieren verwenden.
Hoopje
1
nNchurch:Nlambdatermchurch(n)toBinary:lambdatermlambdatermwΣ