Ich habe versucht, nach Erklärungen zu googeln, aber die meisten Links sagen nur Dinge wie "FRACTRAN ist vollständig. Als Beispiel betrachten wir die Multiplikation."
Ich erinnere mich, dass in einem xkcd-Forumsbeitrag gesagt wurde, FRACTRAN habe dem Poster geholfen, die Vollständigkeit von Turing zu verstehen. Ich suche nach einer intuitiven Erklärung, warum dieser Esolang vollständig ist, da es in Bezug auf die Sprachmechanik nicht sehr offensichtlich ist.
turing-completeness
Mücke
quelle
quelle
Antworten:
Damit eine imperative Sprache vollständig ist, muss sie Folgendes haben:
FRACTRAN ist eine Sprache, die aus einer Reihe von Brüchen besteht, die ihre Daten in den Exponenten von Primzahlen speichern.
Nehmen wir an, Sie möchten zwei Zahlen hinzufügen: 2 a 3 b wird zu 5 ab
Das ist ein FRACTRAN-Programm, um das oben genannte zu ändern.
Sie beginnen mit einer Zahl wie 72 (2 3 3 2 ). Das Programm geht 'vorwärts', bis es eine Zahl findet, die, wenn sie mit dem Befehl multipliziert wird, eine andere ganze Zahl ist (keine Reste erlaubt).
72
wird vorwärts laufen, bis es zu kommt11/2
. Es wird dann die Zahl durch2
dividieren und mit multiplizieren11
(die Potenz in 11 ist eine Variable). Das gibt396
.396
ist teilbar durch 33 (Reduzieren der 3 Potenz und der 11) und multiplizieren mit 455 (Inkrementieren von 5, 7 und 13 Variablen). Und so weiter. Die vollständige Beschreibung dieses Programms und seiner Statustabelle kann auf der Wikipedia-Seite von FRACTRAN gelesen werden , einschließlich eines wirklich schönen animierten Gifs des obigen Programms.Weitere FRACTRAN-Materialien auf Stack Exchange, die die Vollständigkeit von Turing berühren, finden Sie unter: Fractran in Brainfuck konvertieren (ok, das ist eine wirklich produktive Nutzung der eigenen Zeit).
Ein Teil des Tricks hier (und dies beginnt sich in die Theorie zu verirren) ist, dass dies hinter den Kulissen eine Minsky-Registermaschine ist, für die nachgewiesen wurde, dass bestimmte Bänder (Programme) Turingmaschinen sind, WENN das Band als Gödel-Zahl dargestellt wird genau wie die FRACTRAN-Nummer lautet (von der verlinkten Wikipedia-Seite):
Wir haben also bedingte Schleifen, beliebige Variablen, die als Gödel-Zahlen gespeichert sind, und eine Turing-Maschine.
Eine andere lustige Lektüre, die den Collatz wie die Natur von FRACTRAN berührt, kann unter Can't Decide gelesen werden . Entscheide dich! das bezieht die Collatz-Vermutung auf FRACTRAN und das Halteproblem.
FRACTRAN ist ein bisschen schwierig, den Kopf herumzukriegen.
Betrachten Sie das Programm wie folgt:
In diesem Fall hat jeder Block die Form:
Die erste Aussage aus dem obigen Multiplikationsprogramm:
Würde in dieser Form geschrieben werden als:
Auf diese Weise können Sie die Datenspeicherung und die Schleifenkonstrukte, die für die Vollständigkeit von Turing erforderlich sind, klar erkennen. Es ist sehr rudimentär, aber es existiert und läuft als einfache Registriermaschine - aber das ist alles, was Sie wirklich brauchen, um in der Lage zu sein.
Immer noch nicht überzeugt?
Dies geht weitgehend auf einen Vortrag von Dimitri Hendricks über Modelle der Berechnung zurück
Dies erfordert das sehr einfache Programm,
(2/3)
das ein Addierer ist (2 a 3 b -> 3 a + b ). Es ist jedoch destruktiv - der Wert in 2 wird als Teil des Prozesses gelöscht.Schreiben wir einen FRACTRAN auf höherer Ebene, der es einfach macht, eine solche Zerstörung nicht durchzuführen.
Das ursprüngliche Programm könnte wie folgt gedacht werden:
In F 2 kann man 'Funktionen' einer Art angeben.
Um ein F 2 -Programm (P) in ein Standard-FRACTRAN-Programm umzuwandeln , gehen Sie wie folgt vor:
wird:
Dies hat die Primzahlen p, q, r und s verwendet, um den Status des Programms zu speichern.
Und dann haben wir die Registermaschine ... sie hat eine endliche Anzahl von Registern, die beliebig große Zahlen und zwei Anweisungen speichern:
Es wurde gezeigt, dass diese Registermaschine vollständig ist.
Anschließend wird der Prozess über mehrere Folien zum Kompilieren eines Registermaschinenprogramms in ein FRACTRAN-Programm als Teil eines mechanischen Prozesses gezeigt.
Grundsätzlich:
Aufgrund der Gleichwertigkeit dieser beiden Computermodelle ist FRACTRAN somit vollständig.
Übrigens, wenn Sie wirklich begeistert sein möchten, lesen Sie Code Golf: Fractran, in dem einige Leute ein FRACTRAN-Programm geschrieben haben, um ein anderes FRACTRAN-Programm auszuführen.
quelle