Eine Turingmaschine besteht aus einem Band, das in Zellen unterteilt ist und
in beide Richtungen unbegrenzt ist,
und einem Schreib-Lese-Kopf.
Dieser befindet sich in jedem Schritt auf einer
Zelle. Wie auch der endliche Automat oder der
Kellerautomat hat die Turingmaschine einen internen Zustand.
In jedem Schritt liest die Maschine das Zeichen, das sich in der aktuellen
Zelle des Bandes befindet (dort, wo der Kopf steht). Abhängig vom gelesenen Zeichen
und dem internen Zustand schreibt die Turingmaschine ein neues Symbol
in die Zelle, wechselt in einen neuen Zustand und bewegt
den Kopf um maximal eine Zelle, also nach link, rechts, oder gar nicht.
Sie können sich das Band auch als Magnetband vorstellen, das nach vorn oder nach hinten gespult
wird, anstatt dass der Kopf sich bewegt. Am Anfang steht auf dem Band das
Eingabewort und der Kopf auf dem ersten Symbol dieses Wortes. Die Turingmaschine
wendet
nun ihre Regeln an, bis Sie einen
Endzustand erreicht. Bei Entscheidungsproblemen, wo uns nur
eine Ja/Nein-Antwort interessiert, wird die Antwort durch den Entzustand angegeben:
der Zustand entspricht einem Ja, der Zustand
entspricht einem Nein. Diese zwei Endzustände reichen im Allgemeinen
aus. Wenn wir von der Maschine eine komplexere Ausgabe als Ja/Nein erwarten, so
betrachten wir als Ausgabe der Turingmaschine den Inhalt des Bandes zu dem
Zeitpunkt, da die Maschine den Zustand erreicht.
Was brauchen wir also, um so eine Turingmaschine
und ihre Arbeitsweise zu beschreiben?
Definition 8.1.1(Turingmaschine). Eine
Turingmaschine besteht aus folgenden Elementen:
Einem endlichen Eingabe-Alphabet . Dies sind die Symbole, die für das
Eingabewort in
Frage kommen.
Einem endlichen Bandalphabet ; das sind die Symbole, die auf dem Band
stehen dürfen. Offensichtlich muss gelten. Jede
Zelle kann genau ein Zeichen aus enthalten. Darüberhinaus
gibt es noch das sogenannte Blanksymbol . Dies
zeigt an, dass die Zelle im Moment leer ist. Im obigen Beispiel ist
die Zelle links vom ersten beispielsweise leer.
Am Anfang steht auf dem Band also ein Eingabewort und
rechts und links davon unendlich viele -Symbole.
Einer endliche Menge an inneren Zuständen. Dies entspricht in etwa
den Prozessor-Registern eines Computers. Ein Zustand
ist der Startzustand, in welchem sich die Maschine zu Beginn befindet.
Einer Zustandsübergangsfunktion , die sagt, was die Turingmaschine tun soll,
wenn Sie im Zustand ist und Zeichen liest. Formal:
wobei L für gehe eine Zelle nach links steht,
R für rechts und S für stay, also die Anweisung, den Kopf
nicht zu bewegen.
Zwei besonderen Zuständen und .
Für die Turingmaschine in dem obigen Beispiel haben wir zwei Regeln gesehen:
Was macht eine Turingmaschine?
Sie haben nun wohl bereits eine vage Vorstellung, was eine Turingmaschine macht.
Versuchen wir, es noch weiter zu formalisieren. Um den Gesamtzustand der
Turingmaschine zu beschreiben, also eine vollständige Momentaufnahme, reicht
nicht der aktuelle innere Zustand ; wir brauchen auch den Bandinhalt und insbesondere
die Position, an der sich der Kopf befindet. Das alles zusammen nennt
man die Konfiguration der Turingmaschine. Wir wollen sie mit
uns bereits bekannten mathematischen Begriffen beschreiben.
Definition 8.1.2
Die Konfiguration einer Turingmaschine ist ein Element in
, also
wobei der Bandinhalt ist, der
Schreib-Lese-Kopf auf dem ersten Zeichen von steht und der
innere Zustand der Turingmaschine ist. Das in
kennzeichnet also sowohl die Position des Schreib-Lese-Kopfes auf dem Band
sowie den inneren Zustand
Die Menge aller Konfigurationen ist
Der Zustand einer Konfiguration ist , also der innere
Zustand, in dem sich die Maschine gerade befindet.
Wir bezeichnen mit . Formal:
Eine Konfiguration ist
eine akzeptierende Endkonfiguration wenn ist;
eine ablehnende Endkonfiguration , wenn ist.
In beiden Fällen ist eine Endkonfiguration.
Wenn also das Eingabewort und der Startzustand ist, dann ist
die Startkonfiguration.
Die Rolle des -Symbols. Das Band der Turingmaschine ist ja
unendlich.
Um eine Momentaufnahme dennoch als endliches Objekt beschreiben zu können,
lassen wir die -Symbole links und rechts vom "eigentlichen" Bandinhalt weg.
Bei einer Konfiguration stehen also links vom und rechts vom unendlich
viele -Symbole auf dem Band. Nach der formalen Definition
ist es nicht verboten, dass auch mit
einem -Symbol beginnt oder mit einem aufhört. Allerdings wären die
Konfiguration
und genauso gut mit
beschrieben. Wir können uns also auf die Konvention einigen, dass
nie am Rande einer Konfiguration steht.
Beachten Sie auch, dass die Zellen nicht "numeriert" sind. Die beiden folgenden
Momentaufnahmen
können also beide mit der Konfiguration beschrieben werden, obwohl
die Zellen nun andere Inhalte haben, weil die Turingmaschine es irgendwie geschafft
hat, den ganzen Bandinhalt um eins nach rechts zu kopieren. Es sollte klar
sein, dass die Turingmaschine keine Möglichkeit hat, die obere von der unteren
Situation zu unterscheiden, und dass es somit nur recht und billig ist, beide
als eine identische Konfiguration aufzufassen.
All diese Schwierigkeiten verschwinden, wenn wir uns den Speicher einer Turingmaschine
nicht
als unendliches Band vorstellen, sondern als zwei Stapel, einer links vom Kopf und einer
rechts vom Kopf. Allerdings hat sich die Vorstellung vom Band irgendwie als
Standard durchgesetzt. Hier sehen Sie die gleiche Konfiguration in dem Modell
mit zwei Stapeln:
Alternativ können wir auch der Turingmaschine verbieten, das Blank-Symbol jemals
zu schreiben. Dann wäre also
.
All diese Betrachtungsweisen unterscheiden sich nicht wesentlich. Wir bleiben
bei unserem "alten" , erlauben also, zu schreiben, und
leben damit, dass und formal zwei verschiedene Konfigurationen
sind, auch wenn beide irgendwie das selbe beschreiben.
Formal definiert nun auch
eine Funktion auf der Menge der Konfigurationen:
Definition 8.1.3(erweiterte Zustandsübergangsfunktion)
Die erweiterte Zustandsübergangsfunktion einer Turingmaschine ist
Sie beschreibt für eine Konfiguration , welches die Konfiguration
im nächsten Schritt ist.
Per Konvention
legen wir fest, dass
gilt, wenn eine Endkonfiguration ist.
Unsere obige Turingmaschine hat beispielsweise die Regeln
und
, und somit würden
gelten. Sie sehen:
Die Definition von ist nichts wirklich Tiefgründiges, sondern einfach
eine Implementierung der Turingmaschinen-Momentaufnahme mit uns bereits
geläufigen mathematischen "Datenstrukturen" (hier: der Menge ).
Stellen Sie sich einfach
vor, Sie müssten eine Turingmaschine in Java implementieren. Dann würden Sie es wahrscheilich
irgendwie so ähnlich machen.
Ausgabekonfiguration einer Turingmaschine
Die Funktion bildet aus einer Konfiguration die
Folgekonfiguration. Wir definieren nun
also die Konfiguration, die die Turingmaschine nach Rechenschritten erreicht hat.
Weiterhin definieren wir
als die Endkonfiguration, die bei wiederholter
Anwendung von schlussendlich erreicht wird.
Hier taucht ein Problem auf: es ist nicht gesagt, dass die Turingmaschine,
von Konfiguration beginnend, überhaupt irgendwann in einer Endkonfiguration landen
wird. Daher kann auch undefined sein:
Nochmal zur Verdeutlichung: wenn eine Endkonfiguration ist,
dann ist auch eine, für jedes , weil
wir für jede Endkonfiguration definiert haben.
Es spielt also in der obigen Formulierung
wenn es ein gibt keine Rolle, welches solche wir wählen.
Für ein Eingabewort können wir nun das Ergebnis der Berechnung
von Turingmaschine auf definieren:
Wir beginnen also mit der Startkonfiguration und lassen die Turingmaschine dann
laufen, bis sie einen Endzustand erreicht. Die erreichte Konfiguration bezeichnen
wir mit . Falls nie ein Endzustand erreicht wird (die Turingmaschine also
endlos läuft),
ist undefined.
Sprachen entscheiden
Ein Entscheidungsproblem ist eine Funktion , beispielsweise: gegeben ein Wort,
stellt dieses Wort ein korrektes Java-Programm dar?
oder gegeben eine Zahl in Dezimalschreibweise, ist dies
eine Primzahl? Eine äquivalente Sichtweise ist die
eines Entscheidungsproblems als Sprache.
Wir identifizieren hier mit der Menge aller Wörter mit
. Wenn wir es mit einem Entscheidungsproblem
zu tun haben und dieses mit einer Turingmaschine lösen wollen,
so interessiert uns am Endergebnis (also der erreichten Endkonfiguration)
nicht der Bandinhalt, sondern nur, ob der Zustand accept oder
reject ist. Wir definieren daher
Definition 8.1.4(Turingmaschine entscheidet eine Sprache)
Eine Turingmaschine entscheidet die Sprache wenn
für alle ,
für alle .
Insbesondere heißt das, dass auf jedem Eingabewort terminiert.
Eine Sprache heißt entscheidbar, wenn
es eine Turingmaschine gibt, die sie entscheidet.
Definition 8.1.5(Turingmaschine akzeptiert eine Sprache)
Eine Turingmaschine akzeptiert die Sprache
wenn
für alle gilt. Das heißt, dass für
entweder irgendwann den Endzustand erreicht oder
nie einen Endzustand erreicht.
Eine Sprache heißt semi-entscheidbar,
wenn es eine Turingmaschine gibt, die akzeptiert.
In beiden Definition verlangen wir natürlich, dass
das Eingabealphabet der Turingmaschine ist.
Funktionen berechnen
Oft wollen wir nicht nur eine Sprache
entscheiden, sondern eine Funktion
berechnen. Mit einer Turingmaschine heißt das einfach, dass
bei Eingabe die Turingmaschine in einer
akzeptierenden Endkonfiguration landet, und in steht
dann auf dem Band. Formal müssen wir noch klären, was steht
auf dem Band bedeutet.
Definition 8.1.6(Turingmaschine berechnet eine Funktion)
Seien zwei endliche Alphabete und
eine Funktion. Eine Turingmaschine berechnet die Funktion , wenn
das Eingabealphabet von ist,
gilt und
; das Blank-Symbol
ist also weder Teil das Eingabealphabets noch des Ausgabealphabets.
terminiert für jedes .
In der Endkonfiguration steht auf dem Arbeitsband das
Wort und der Kopf steht ganz links, also
.
Turingmaschinen und formale Grammatiken
Da Turingmaschinen sowohl in dem Kurs
Berechenbarkeit und Kreativität
als auch
Theoretische Informatik
vorkommen, teilen sich die beiden Kurse diese Seiten.
Für Berechenbarkeit und Kreativität ist der Rest dieses Teilkapitels
allerdings weniger relevant, da formale Grammatiken nicht Teil des Kurses waren.
Theorem 8.1.7
Sei eine Turingmaschine und die von ihr akzeptierte Sprache.
Dann gibt es eine formale Grammatik mit . In anderen Worten:
formale Grammatiken sind mindestens so mächtig wie Turingmaschinen.
Beweis.
Die Idee ist, dass wir eine Grammatik schreiben, die
"in umgekehrter Reihenfolge" läuft, also
ableiten kann genau dann, wenn gilt. Wir brauchen
und als Randmarkierungen. Wir lassen hier
temporär zu, dass die linke Seite ausschließlich aus Terminalsymbolen bestehen kann.
Hierfür definieren wir für jede Regel der Turingmaschine eine Grammatik-Regel:
ü
Die Asymmetrie zwischen den Regeln, die den Kopf nach rechts verschieben und denen, die ihn
nach links verschieben, ergibt sich aus unserer Konvention, die Konfigurationen so
zu
interpretieren, dass der Kopf auf dem ersten Symbol von
und nicht etwa auf dem letzten von steht.
Ein Problem ergibt sich, wenn am Rand steht. Hierfür erlauben wir,
an den Rändern der Konfiguration -Symbole zu erzeugen:
Wenn der Kopf also vor dem stehen sollte,
dann können wir
anwenden und dann die Produktion, die der Regel von entspricht.
Es sollte nun klar sein, dass folgendes gilt:
Beobachtung 8.1.8
Wenn gilt, die Turingmaschine also in
Schritten von Konfiguration nach übergeht, dann gilt in der gerade
entwickelten Grammatik auch
Als nächstes definieren wir Aufräumregeln: wenn , dann
können wir jedes Zeichen löschen:
wobei ein Nichtterminal der Grammatik ist.
Und somit gilt auch
Als letzte Regel definieren wir:
Wir haben nun eine Grammatik mit den folgenden Eigenschaften:
Wir bauen nun eine weitere Grammatik , in der wir jede Produktion
umdrehen, also durch ersetzen. Zusätzlich definieren wir
Abschlussregeln
die die Randmarkierungen ersetzen. In dieser Grammatik gilt nun für
alle Wörter :
und somit gilt . Zusammenfassend besitzt also die Produktionen
üü
Um also ein Wort abzuleiten, müssen wir
die akzeptierende Endkonfiguration von "erraten" und dann
per Produktionen 1 und 2 die Wortform ableiten. Von da
an verwenden wir die Produktionen 3, 4, 5, 6, 7, um die Berechnung der Turingmaschine
von hinten nach vorne zu simulieren, bis wir bei
angelangt sind. Dann
lassen wir mit den Produktionen 8, 9, 10
verschwinden und haben abgeleitet.