8.2 Beispiele
8.2 Beispiele
Beispiel 8.2.1 Betrachten wir die Sprache
ü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
Das Symbol $X$ heißt dann "hier stand mal $a$, $b$ oder $c$, wir haben es aber bereits gelesen". Als Zustandsmenge verwenden wir
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 $\square$ läufst, bist Du am linken Rand
und es gibt keine $a$ mehr; wechsle
nachnoA
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
nachfindC;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 $\square$
triffst, dann besteht das Wort nur noch aus
$X$.
Wechsel
nachaccept.
Wir können die Beschreibung jetzt formal als Funktion $\delta: Q \times \Gamma \rightarrow Q \times \Gamma \times \rls$ 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 $\delta(\texttt{findA}, b)$ nur
ein $\texttt{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
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
wobei $w^R$ das Kehrwort bedeutet, also
$aabba^R = abbaa$.
Unsere Maschine sucht das erste Zeichen, löscht es (ersetzt
es durch $\square$ 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
$\Gamma = \{a,b,\square\}$.
Als Zustandsmenge nehmen wir
next:
ist der Anfangszustand. Die Maschine steht am
linkesten Zeichen. Ist dieses
$\square$,
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
$\square$ 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 $\square$ ist, dann haben wir das ganze Wort
abgearbeitet und gehen
nachaccept.
return:
gehe nach links, bis Du ein $\square$ 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 \subseteq \{a,b,c\}$ entscheidet:
Übungsaufgabe 8.2.3 Schreiben Sie auf turingmachinesimulator.com eine Turingmaschine für die Sprache
Tip: gehen Sie durch das Band und ersetzen jede zweite $1$, die Sie sehen, durch ein $X$. 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.