Damit eine imperative Sprache vollständig ist, muss sie Folgendes haben:
- Bedingte Schleife
- Beliebige Anzahl von Variablen
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
455 11 1 3 11 1
---, -, -, -, -, -
33 13 11 7 2 3
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 kommt 11/2
. Es wird dann die Zahl durch 2
dividieren und mit multiplizieren 11
(die Potenz in 11 ist eine Variable). Das gibt 396
. 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).
Der Grund, warum Fractran Turing-vollständig ist, liegt darin, dass es eine Registermaschine simuliert. Die Primfaktorisierung der Zahl speichert den Inhalt der Register, während die Division und Multiplikation eine Möglichkeit ist, die Register bedingt zu addieren und von ihnen zu subtrahieren.
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):
Gödel verwendete ein System, das auf Primfaktorisierung basiert. Zunächst wies er jedem Grundsymbol in der formalen Sprache der Arithmetik, mit der er sich befasste, eine eindeutige natürliche Zahl zu.
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:
LABEL: start
block1
block2
block3
...
END
In diesem Fall hat jeder Block die Form:
IF(registers X >= a, Y >= b) # or any combination of registers
THEN
X -= a
Y -= b
I += n
J += m
goto start
Die erste Aussage aus dem obigen Multiplikationsprogramm:
455
--- ---.
33
Würde in dieser Form geschrieben werden als:
IF(register `3` >= 1 && `11` >= 1)
THEN
`3` -= 1
`11` -= 1
`5` += 1
`7` += 1
`13` += 1
goto start
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:
2
α: - → α
3
In F 2 kann man 'Funktionen' einer Art angeben.
10 1
α: - → α, - → β
3 1
3
β: - → β
5
Um ein F 2 -Programm (P) in ein Standard-FRACTRAN-Programm umzuwandeln , gehen Sie wie folgt vor:
- Löschen Sie P von Schleifen der Länge 1
- Ersetzen Sie griechische Buchstaben (Funktionen) durch neue Primzahlen
- Ersetzen Sie die Übergänge:
As
p: - → q, - → r, - -> s, ...
bdf
wird:
aq cr es
-, -, -, ...
bp dp fp
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:
- inc (x i , m) - Inkrementiere das Register i und gehe zu Zeile m
- jzdec (x i , m 1 , m 2 ) - Wenn das Register i 0 ist, gehe zu Zeile m, andernfalls dekrementiere i und gehe zu Zeile m2.
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:
Pi)
inc (x (i), m) = ---- → m
1
1 1
jzdec (x (i), m1, m2) = ---- → m2, - → m1
p (i) 1
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.