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
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 }
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 f
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 f
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.
quelle
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.
quelle