Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| kurse:ef05a-2021:turingmaschinen:universelle_turing_maschine [2021/09/02 06:31] – [Zeichen lesen und finden] Ivo Blöchliger | kurse:ef05a-2021:turingmaschinen:universelle_turing_maschine [2021/09/09 07:14] (current) – Ivo Blöchliger | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Universelle Turing Maschine ====== | ||
| + | Man kann eine Turingmaschine bauen, der man die Spezifikation einer anderen Maschine und deren Input liefern kann. Die Universelle Turingmaschine simuliert dann die im Input gegebene Maschine. | ||
| + | |||
| + | ===== Halbunendliches Band ===== | ||
| + | Um die Sache ein bisschen zu vereinfachen, | ||
| + | |||
| + | Diese Einschränkung könnte leicht umgangen werden, indem das Band links mit Markern versehen wird. Soll über den linken Marker geschrieben werden, wird erst das ganze Band um ein Feld nach rechts kopiert (dafür wird der rechte Marker benötigt, dass man weiss, wie weit der Inhalt zu kopieren ist). | ||
| + | |||
| + | Oder man benutzt nur jedes zweite Feld (für positive Positionen) und klappt die negativen Position dazwischen, also 0, | ||
| + | |||
| + | ===== Codierung vom Input ===== | ||
| + | Der Input der zu simulierenden Maschine wird nur in jede zweite Zelle geschrieben. Die Zellen dazwischen sind ' | ||
| + | . 1 . 2 ! 3 . 4 . . . . | ||
| + | Entspricht dem Band ' | ||
| + | |||
| + | Damit muss die zu simulierende TM so codiert werden, dass diese kein ' | ||
| + | |||
| + | ===== Codierung der Zustände ===== | ||
| + | ==== Codierung für ein gelesenes Symbol eines Zustandes ==== | ||
| + | Die Codierung, was in einem bestimmten Zustand zu ist, erfolgt so: | ||
| + | r w b $n$ . | ||
| + | wobei '' | ||
| + | Fehlt $n$ heisst das '' | ||
| + | |||
| + | Beispiele: | ||
| + | 1 1 R 1 1 0 . | ||
| + | read 1, write 1, go right, next state 6. | ||
| + | 1 0 L . | ||
| + | read 1, write 0, go left, stop | ||
| + | |||
| + | ==== Codierung eines ganzen Zustandes (mit allen Symbolen) ==== | ||
| + | Ein Zustand beginnt mit den zwei Zeichen | ||
| + | > . | ||
| + | Danach folgen die Definitionen wie oben für jedes Symbol. | ||
| + | |||
| + | Der ' | ||
| + | |||
| + | Beispiel: | ||
| + | |||
| + | > | ||
| + | |||
| + | Wird übersetzt mit | ||
| + | zustand0 | ||
| + | . 1 L zustand1 | ||
| + | 1 1 R zustand0 | ||
| + | | ||
| + | | ||
| + | ==== Codierung aller Zustände ==== | ||
| + | Sämtliche Zustände werden mit ''>'' | ||
| + | >> | ||
| + | steht für folgendes Programm: | ||
| + | start | ||
| + | . | ||
| + | 1 | ||
| + | fertig | ||
| + | . | ||
| + | 1 | ||
| + | |||
| + | ==== Komplette Codierung ==== | ||
| + | Das Band wird mit genügend Abstand rechts von den Zuständen eingefügt. Die komplette Codierung sieht dann wie folgt aus: | ||
| + | |||
| + | >> | ||
| + | | ||
| + | wobei hier schon der aktuelle Zustand und die Position des Lesekopfes jeweils mit einen ' | ||
| + | |||
| + | |||
| + | ===== Übersicht vom Program ===== | ||
| + | Voraussetzungen: | ||
| + | * Die aktuelle Position auf dem simulierten Band ist mit einem ' | ||
| + | * Der Aktuelle Zustand ist unmittelbar nach dem '>' | ||
| + | * Die Maschine befindet sich auf dem ersten '>' | ||
| + | |||
| + | ==== Ausführungs-Schleife ==== | ||
| + | - Symbol lesen | ||
| + | - Bis zum zweiten '' | ||
| + | - Zustandsdefinition für dieses Symbol finden. | ||
| + | - Zum ersten '' | ||
| + | - Symbol $s$ suchen: | ||
| + | - Wenn $s$ gefunden, weiter beim nächsten Schritt. | ||
| + | - Sonst 3 Schritte nach rechts | ||
| + | - Weiter nach rechts bis zum Punkt und einen Schritt weiter nach rechts. | ||
| + | - Wiederholen | ||
| + | - Wenn das Symbol $s$ gefunden ist, eins nach Links und den '' | ||
| + | - Symbol schreiben und Position anpassen | ||
| + | - Zwei nach links und das zu schreibende Symbol $w$ lesen. | ||
| + | - Eins nach links und die Richtung $r$ lesen. | ||
| + | - Rechts nach '' | ||
| + | - Ein Position rechts davon $w$ schreiben. | ||
| + | - Je nach $r$ eins nach rechts oder 3 nach links. | ||
| + | - '' | ||
| + | - Die Binärzahl des nächsten Zustands an den Anfang (vor ''> | ||
| + | - Wenn keine Binärzahl da, nach rechts zum '' | ||
| + | - Die Binärzahl 4 Stellen rechts vom '' | ||
| + | - Die ersetze Stelle links von ''> | ||
| + | - Wenn vollständig kopiert, die L/R wieder durch 0/1 ersetzen und das '' | ||
| + | - Zurück zum ''> | ||
| + | - Nächsten Zustand markieren. | ||
| + | - Zahl vor dem ''> | ||
| + | - Das '' | ||
| + | - Zum nächsten ''>'' | ||
| + | - Wiederholen | ||
| + | |||
| + | |||
| + | <hidden Lösungsvorschlag> | ||
| + | <code txt universelle-turing-maschine.txt> | ||
| + | #Binary counter | ||
| + | #tape >> | ||
| + | |||
| + | #Unary times two | ||
| + | #tape >> | ||
| + | |||
| + | #Unary plus one | ||
| + | #tape >> | ||
| + | |||
| + | |||
| + | |||
| + | symbolLesen R | ||
| + | ! ! R @findRR(!; | ||
| + | |||
| + | # Sucht das nächste Auftreten des Symbols | ||
| + | # ab der aktuellen Position und geht noch eine Position nach rechts | ||
| + | @findRR(1; | ||
| + | | ||
| + | @1 @1 R $1 | ||
| + | @end | ||
| + | @findLN(1; | ||
| + | | ||
| + | @1 @1 N $1 | ||
| + | @end | ||
| + | @findLR(1; | ||
| + | | ||
| + | @1 @1 R $1 | ||
| + | @end | ||
| + | |||
| + | |||
| + | # Position auf zu lesendem Symbol auf simulierten Band | ||
| + | symbolMerken | ||
| + | * * L @zustandFinden(*; | ||
| + | |||
| + | |||
| + | |||
| + | # Position auf !-Markierung auf simuliertem Band | ||
| + | @zustandFinden(1; | ||
| + | # auf der ' | ||
| + | onExBand L | ||
| + | * * L @findLN(!; | ||
| + | |||
| + | # auf der ' | ||
| + | onExZustand | ||
| + | ! . R sucheSymbol | ||
| + | |||
| + | # auf dem read-Symbol innerhalb ein Zustand/ | ||
| + | sucheSymbol R naechsteDef | ||
| + | @1 @1 L markiereZustand | ||
| + | |||
| + | # Position auf write Symbol | ||
| + | naechsteDef R | ||
| + | * {R R} bisPunkt | ||
| + | |||
| + | bisPunkt R | ||
| + | . . R sucheSymbol | ||
| + | |||
| + | # Position vor dem Lese-Symbol, | ||
| + | markiereZustand | ||
| + | . ! R symbolSchreiben | ||
| + | @end | ||
| + | |||
| + | # In der aktuellen Zustands/ | ||
| + | symbolSchreiben | ||
| + | * * R symbolSchreiben1 | ||
| + | |||
| + | # Auf dem Richtungssymbol | ||
| + | symbolSchreiben1 | ||
| + | * * R @richtungLesen(*; | ||
| + | |||
| + | @richtungLesen(1; | ||
| + | dummy | ||
| + | L L R @aufBandSchreiben(@1; | ||
| + | R R R @aufBandSchreiben(@1; | ||
| + | @end | ||
| + | |||
| + | @aufBandSchreiben(1; | ||
| + | suche | ||
| + | * * R @findRR(!; | ||
| + | |||
| + | schreibe | ||
| + | * @1 L $1 | ||
| + | |||
| + | @end | ||
| + | |||
| + | # Auf ' | ||
| + | rechts | ||
| + | * {P. R R P! L} @findLR(!; | ||
| + | |||
| + | links | ||
| + | * {P. L L P! L} @findLR(!; | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | # Position rechts von der ' | ||
| + | binaryCopy | ||
| + | * {R R} binaryCopy2 | ||
| + | |||
| + | # Position auf der ersten Binärziffer | ||
| + | binaryCopy2 | ||
| + | # Maschine halt! (davon noch auf die Position auf dem Band gehen) | ||
| + | . . R @findRR(!; | ||
| + | 0 o L @writeBinary(0; | ||
| + | 1 l L @writeBinary(1; | ||
| + | [ol] * R binaryCopy3 | ||
| + | |||
| + | # Position auf n-ter Binärziffer | ||
| + | binaryCopy3 | ||
| + | . . L binaryWiederherstellen | ||
| + | 0 o L @writeBinary(0; | ||
| + | 1 l L @writeBinary(1; | ||
| + | |||
| + | |||
| + | |||
| + | @writeBinary(1; | ||
| + | # '>' | ||
| + | | ||
| + | > > L findTwo | ||
| + | |||
| + | # das daneben auch '>'? | ||
| + | | ||
| + | * * L findOne | ||
| + | > > L findPos | ||
| + | |||
| + | findPos L | ||
| + | . @1 R @findRR(!; | ||
| + | @end | ||
| + | |||
| + | binaryWiederherstellen L | ||
| + | # auf dem Richtungssymbol | ||
| + | * {L L L P.} preFinalCountDown1 | ||
| + | l 1 L binaryWiederherstellen | ||
| + | o 0 L binaryWiederherstellen | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | # Doppeltes '>>' | ||
| + | preFinalCountDown1 L | ||
| + | > > L preFinalCountDown0 | ||
| + | |||
| + | # Wenn doppeltes '>>' | ||
| + | preFinalCountDown0 L | ||
| + | * * L preFinalCountDown1 | ||
| + | > {R R P!} finalCountDown | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | # rechts der '>>', | ||
| + | finalCountDown L | ||
| + | # '>>' | ||
| + | > > L second | ||
| + | |||
| + | second | ||
| + | * * L finalCountDown | ||
| + | > > L preMinusEins | ||
| + | |||
| + | |||
| + | preMinusEins L | ||
| + | . . R minusEins | ||
| + | |||
| + | |||
| + | # Position auf irgend einer Ziffer vor '<<' | ||
| + | minusEins | ||
| + | # oops, das ist -1, also fertig | ||
| + | > > L preCounterLoeschen | ||
| + | # Eins subtrahieren, | ||
| + | 1 0 R schieben | ||
| + | # Da gibt es einen Übertrag | ||
| + | 0 1 R minusEins | ||
| + | |||
| + | # !-Markierung suchen und löschen | ||
| + | schieben R | ||
| + | ! . R wo> | ||
| + | |||
| + | # Nächsten Zustand suchen, dahinter die Markierung setzen. | ||
| + | wo> | ||
| + | > > R setzen | ||
| + | |||
| + | setzen | ||
| + | . ! L finalCountDown | ||
| + | |||
| + | preCounterLoeschen L | ||
| + | . . R counterLoeschen | ||
| + | |||
| + | # Position vor der der -1 vor '<<', | ||
| + | counterLoeschen R | ||
| + | [01] . R counterLoeschen | ||
| + | > > R symbolLesen | ||
| + | |||
| + | |||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Aufgaben ===== | ||
| + | ==== Zeichen lesen und finden ==== | ||
| + | * Input: | ||
| + | <code txt> | ||
| + | #tape > | ||
| + | </ | ||
| + | * Die Maschine hält auf dem Zeichen im ersten String, das im zweiten String mit ! markiert ist. Die Maschine hält in diesem Fall auf der ersten 2, weil die 2 im zweiten String mit ! markiert ist. | ||
| + | |||
| + | |||
| + | <hidden Lösungsvorschlag> | ||
| + | <code txt> | ||
| + | #tape > | ||
| + | |||
| + | finde! R | ||
| + | ! ! R merke | ||
| + | |||
| + | merke | ||
| + | * * L @suche(*;) | ||
| + | |||
| + | @suche(1;0) | ||
| + | finde> L | ||
| + | > > R findeSymbol | ||
| + | |||
| + | findeSymbol R | ||
| + | @1 @1 N stop | ||
| + | @end | ||
| + | |||
| + | </ | ||
| + | </ | ||
| + | ==== Marker schieben ==== | ||
| + | * Input | ||
| + | <code txt> | ||
| + | #tape 011> | ||
| + | </ | ||
| + | * Output | ||
| + | <code txt> | ||
| + | ...> | ||
| + | </ | ||
| + | |||
| + | Die Maschine verschiebt das ' | ||
| + | |||
| + | <hidden Lösungsvorschlag> | ||
| + | <code txt> | ||
| + | #tape 011>!.. | ||
| + | |||
| + | minusEins | ||
| + | 0 1 R minusEins | ||
| + | 1 0 R schieben | ||
| + | > > L loeschen | ||
| + | |||
| + | schieben R | ||
| + | ! . R schreiben | ||
| + | |||
| + | schreiben L | ||
| + | . ! L back | ||
| + | |||
| + | back L | ||
| + | > > L back2 | ||
| + | |||
| + | back2 L | ||
| + | . . R minusEins | ||
| + | |||
| + | loeschen L | ||
| + | [01] . L loeschen | ||
| + | . . R fertig | ||
| + | |||
| + | fertig R | ||
| + | > > N stop | ||
| + | |||
| + | </ | ||
| + | </ | ||