8.2 Beispiele

Beispiel 8.2.1 Betrachten wir die Sprache {anbncn | n0} über dem Alphabet {a,b,c}. Wir wollen eine Turingmaschine entwerfen, die diese Sprache entscheidet.

Informelle Beschreibung. Unsere Turingmaschine arbeitet in Phasen. In jeder Phase sucht die Maschine ein a und löscht es (ersetzt es durch ein X). Dann geht sie nach rechts und sucht und markiert ein b; dann ein c. Sobald sie das c markiert hat, geht sie wieder nach links. Dies beendet die Phase.

Wenn die Maschine kein a mehr findet und auch kein b oder c mehr da ist, akzeptiert die Maschine. Wenn unterwegs ein "Fehler" geschieht, beispielsweise die Maschine ein b sucht aber keines findet, wechselt sie in den reject-Zustand.

Formellere Beschreibung. Als Bandalphabet verwenden wir Γ:={a,b,c,X,} .

Das Symbol X heißt dann "hier stand mal a, b oder c, wir haben es aber bereits gelesen". Als Zustandsmenge verwenden wir Q:={findA,findB,findC,noA,accept,reject} . Die "Bedeutung" dieser Zustände ist:
  • findA: gehe nach links, bis Du ein a findest, ersetze es durch X und wechsle dann in findB. Wenn Du allerdings in ein läufst, bist Du am linken Rand und es gibt keine a mehr; wechsle nach noA und gehe ein Feld nach rechts.
  • findB: gehe nach rechts, bis Du ein b gefunden hast; ignoriere auf dem Weg alle a und alle X; wenn Du b liest, ersetze es durch X und gehe nach findC;jedes andere Zeichen erzeugt einen Fehler.
  • findC: gehe nach rechts, bis Du ein c gefunden hast; ignoriere derweil alle b und X; wenn Du ein c liest, ersetze es durch X und gehe in Zustand findA.
  • noA: wir stehen nun am Anfang des Bandinhalts und wissen, dass es kein a mehr gibt. Wir müssen jetzt überprüfen, dass es auch keine b,c mehr gibt. Also: gehe nach rechts, ignoriere alle X. Wenn Du ein b oder c triffst, gehe nach reject. Wenn Du ein triffst, dann besteht das Wort nur noch aus X. Wechsel nach accept.

Wir können die Beschreibung jetzt formal als Funktion δ:Q×ΓQ×Γ×{L,S,R} niederschreiben.

Beachten Sie: manche Zellen sind leer. Damit meine ich, dass die Turingmaschine dort in den Zustand reject wechselt. Andere Zellen bestehen nur aus einem Buchstaben; so steht in der Zelle von δ(findA,b) nur ein R. Dies bedeutet, dass die Turingmaschine ihren Zustand nicht wechselt und einfach das gelesene Zeichen in die Zelle wieder reinschreibt. Dies ist reiner Syntaxzucker.

Auf der Webseite turingmachinesimulator.com können Sie Ihre Turingmaschine eingeben und simulieren. Den Text für die gerade beschriebene finden in aabbcc.txt. Generell können Sie Regeln der Form δ(q,a)=(r,b,D) auf turingmachinesimulator.com als

q, a 
r, b, D 
angeben, wobei die Richtung D mit den Symbolen <, -, > codiert wird.

Beispiel 8.2.2 Als zweites Beispiel nehmen wir die Palindromsprache L:={w{a,b} | w=wR} , wobei wR das Kehrwort bedeutet, also aabbaR=abbaa.

Unsere Maschine sucht das erste Zeichen, löscht es (ersetzt es durch und "merkt" es sich in ihrem Zustand. Dann geht sie zum rechten Rand und vergleicht es mit dem dortigen. Falls es passt, löscht sie es und geht wieder nach links zurück. Falls es nicht passt, wechselt sie in reject. Wenn unsere Maschine das erste Zeichen sucht aber keines findet, dann hat sie alle Zeichen erfolgreich gelöscht und es hat sich also um ein Palindrom von gerader Länge gehandelt. Wenn die Maschine allerdings nach dem Löschen des linkesten Zeichens sofort am rechten Rand steht, dann stand dort nur noch ein einziges Zeichen und es hat sich um ein Palindrom ungerader Länge gehandelt.

Als Bandalphabet brauchen wir hier nur Γ={a,b,}. Als Zustandsmenge nehmen wir Q={next,readA,readB,killA,killB,return,reject,accept}.

  • next: ist der Anfangszustand. Die Maschine steht am linkesten Zeichen. Ist dieses , so haben wir das "leere" Palindrom und wir wechseln nach accept. Ist es a, wechseln wir nach readA und gehen einen Schritt nach rechts; ist es b, wechseln wir nach readB und gehen nach rechts.
  • readA, readB: wir gehen nach rechts, bis wir ein lesen, also den rechten Rand erreicht haben, und wechseln dann nach killA bzw. killB und gehen einen Schritt nach links.
  • killA, killB: hier weiß die Turingmaschine, was das linkeste Zeichen war, und dass dieses bereits gelöscht worden ist. Sie muss nun überprüfen, was das rechteste Zeichen ist. Wenn es "passt", löschen wir es und wechseln nach return; wenn es "nicht passt", nach reject; wenn es ist, dann haben wir das ganze Wort abgearbeitet und gehen nach accept.
  • return: gehe nach links, bis Du ein findest. Wechsle dann nach next.
Übungsaufgabe 8.2.1 Implementieren Sie die Turingmaschine für die Palindromsprache auf turingmachinesimulator.com.

Jetzt sind Sie dran.

Übungsaufgabe 8.2.2 Schreiben Sie eine Turingmaschine (auf turingmachinesimulator.com), die die folgende Sprache L{a,b,c} entscheidet: L:={wcw | w{a,b}}
Übungsaufgabe 8.2.3 Schreiben Sie auf turingmachinesimulator.com eine Turingmaschine für die Sprache L:={1n | n=2d,d0} . Tip: gehen Sie durch das Band und ersetzen jede zweite , die Sie sehen, durch ein . Wenn Sie rechts ankommen und eine ungerade Anzahl von Einsen gelesen haben, lehnen Sie ab. Wenn die Anzahl gerade ist, gehen Sie wieder nach ganz links; sie haben nun die Anzahl der Einsen halbiert. Sie akzeptieren, wenn Sie von links nach rechts durchgehend genau eine 1 gelesen haben.