8.4 Turing-Maschinen codieren
Wir haben mit der Turingmaschine ein einfaches aber doch sehr mächtiges Modell einer Rechenmaschine kennengelernt. Sie haben vielleicht mittlerweile - auch durch Ihre Programmiererfahrung - das Gefühl, das man im Prinzip alles, was man überhaupt programmieren kann, auch auf einer Turingmaschine hinkriegt. Versetzen Sie sich nun in die Lage der Menschen vor ungefähr 100 Jahren. Damals gab es durchaus Rechenmaschinen. Maschinen zum Addieren und sogar zum Multiplizieren gibt es schon seit dem 17. Jahrhunder (Wikipedia: Mechanical calculator). Leider musste man für jede Aufgabe eine neue Maschine erfinden und auch bauen. Zahlen addieren? Maschine bauen. Multiplizieren? Neue Maschine bauen. Verschlüsselung brechen? Neue Maschine bauen. Und so weiter.
Die Idee einer programmierbaren Maschine, die erstmals circa 1834 mit Charles Babbage aufkam, ist, dass man neben den Eingabedaten (z.B. die zu multiplizierenden Zahlen) auch die Rechenvorschrift (das Programm) als Eingabe übergibt. Hätte man so eine Maschine, dann müsste man nicht für jede neue Aufgabe eine neue Maschine entwerfen; man könnte eine Maschine bauen und sie für die jeweilige Aufgabe programmieren, indem ihr auf einem separaten Eingabeband die Rechenvorschrift überreicht. Von heute aus gesehen ist diese Idee nicht mehr allzu überraschend, weil diese Maschinen überall anzutreffen sind. Damals aber war es revolutionär. Um dies, zumindest auf dem Papier, in die Realität zu übersetzen, müssen wir zwei Fragen beantworten.
- Wie können wir eine Rechenvorschrift (d.h. ein Programm) so codifizieren, dass wir es im Prinzip als eine Zeichenkette aufschreiben und einer Maschine übergeben können?
- Welche Maschine könnte so eine Rechenvorschrift lesen und sie an gegebenen Eingabedaten dann auch ausführen?
Es stellt sich heraus, dass wir beide Antworten (beinahe) schon kennen. Eine beliebige
Rechenvorschrift können wir, da sind wir uns mittlerweile
recht sicher, als Turingmaschine
Punkt 2 ist schwieriger. Können wir eine Maschine bauen, die als eingabe (1) die Codierung
In diesem Teilkapitel werden wir sehen, wie wir eine Turingmaschine
-
ablehnt, falls
keine gültige Codierung einer Turingmaschine ist, - ansonsten, falls also
, dann- akzeptiert falls
akzeptiert; - ablehnt, falls
ablehnt - nicht terminiert, falls
nicht terminiert.
- akzeptiert falls
Die Codierung
Zuerst müssen wir uns auf ein EingabealphabetErster, zum scheitern verurteilter Versuch. Sei
Zweiter, erfolgreicher Versuch.
Wir müssen also die ZustandsmengeWenn wir dies nun als ein Wort in obigen Schema schreiben, können wir für eine
Tabellenzelle
00#100#00,a,01,1,S#00,b,L#00,c,L#00,1,L#00,0,11,0,R#01,a,R#01,b,10,1,S#01,1,R#10,b,R#10,c,00,1,S#10,1,R#11,1,R#11,0,100#;
In dieser Codierung behalten wir zwei Konventionen bei: wenn eine Regel
"fehlt", also beispielsweise für
Wir können nun jede Turingmaschine
über dem Alphabet
Definition/Beobachtung. 8.4.1 Zu einem Eingabealphabet