Theoretische Informatik

Werbung
Theoretische Informatik
Wolfgang Ertel
28. Oktober 2008
Inhaltsverzeichnis
1 Formale Sprachen und Maschinenmodelle
1.1 Grundlagen . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Grammatiken . . . . . . . . . . . . . . . . . . . . . . .
1.3 Chomsky-Hierarchie . . . . . . . . . . . . . . . . . . .
1.4 Endliche Automaten . . . . . . . . . . . . . . . . . . .
1.5 Reguläre Ausdrücke . . . . . . . . . . . . . . . . . . . .
1.6 Der Lexical Analyzer Lex . . . . . . . . . . . . . . . .
1.7 Yacc: Yet Another Compiler Compiler . . . . . . . . .
1.8 Kellerautomaten . . . . . . . . . . . . . . . . . . . . .
1.9 Turingmaschinen . . . . . . . . . . . . . . . . . . . . .
1.10 Zusammenfassung zu Sprachen und Maschinenmodellen
1.11 Übungen . . . . . . . . . . . . . . . . . . . . . . . . . .
2 Berechenbarkeit und Komplexität
2.1 Berechenbarkeit . . . . . . . .
2.2 Komplexitätsklassen . . . . .
2.3 NP-Vollständigkeit . . . . . .
2.4 Übungen . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
3
7
11
14
17
19
20
21
24
28
29
.
.
.
.
34
34
41
42
44
Aussagenlogik
46
Prädikatenlogik
46
PROLOG
46
Grenzen der Logik
46
Literaturverzeichnis
48
Kapitel 1
Formale Sprachen und
Maschinenmodelle
1.1 Grundlagen
Man muss sich Sprachen vorstellen wie einen Legobaukasten. Die Buchstaben des Alphabets
entsprechen elementaren Bausteinen und die Worte, beziehungsweise Sätze entsprechen
gebauten Objekten. Solche Mengen lassen sich mehr oder weniger einfach beschreiben.
Zum Beispiel die Menge der Objekte, die nur aus roten Steinen gebaut sind. Oder die
Menge der Objekte bei denen auf einem Basisstein nur Steine oben draufgesetzt werden
dürfen, aber nicht daneben. Was ist, wenn ich das fertige Objekt auf den Kopf stelle? Muß
dann die Forderung immer noch erfüllt sein?
Um solche Unklarheiten auszuschließen, werden wir bei den Sprachen ganz formal vorgehen.
Wir werden Spielgregeln in Form von Grammatiken zum Aufbau von Sprachen angeben.
Mit diesen Spielregeln können dann nur noch Worte aus einer bestimmten Sprache erzeugt
(abgeleitet) werden.
Hier stellen sich sofort einige für den Informatiker sehr wichtige und interessante Fragen:
ˆ Läßt sich jede formale Sprache durch eine Grammatik beschreiben?
ˆ Wenn ich eine Grammatik G habe, die eine Sprache L definiert, wie kann ich erkennen,
ob ein Wort zu dieser Sprache gehört oder nicht?
ˆ Etwas konkreter: Ist es möglich, für eine konkrete Programmiersprache L in endlicher
Zeit zu entscheiden, ob ein vorgegebener Text ein Programm dieser Sprache darstellt
oder nicht. Diese Aufgabe ist der Syntaxcheck des Compliers.
ˆ Ist diese Entscheidung vielleicht sogar effizient möglich, das heißt, auch für große
Programme in kurzer Zeit?
ˆ Wenn ja, wie macht man das?
ˆ Kann man vielleicht sogar automatisch Fehler in Programmen erkennen, wie zum
Beispiel Endlosschleifen?
ˆ Kann man überprüfen, ob ein Programm korrekt ist?
Die Beantwortung dieser Fragen ist Bestandteil des Gebiets der formalen Sprachen und
Automaten. Um es vorweg zu nehmen, wir werden bis auf die erste und die letzten beiden
Fragen teilweise oder ganz positive Antworten liefern.
4
1 Formale Sprachen und Maschinenmodelle
Fangen wir bei den elementaren Bausteinen an.
Definition 1.1 Ein Alphabet Σ ist eine endliche nicht leere Menge von Zeichen.
Sprachen sind noch einfacher als Lego-Baukästen. Es gibt genau vier Möglichkeiten, zwei
Alphabetzeichen a und b miteinander zu verknüpfen, nämlich aa, ab, ba, oder bb. Diese
Verknüpfung heißt Konkatenation und ist nicht vertauschbar. Damit kann man beliebig
lange endliche Worte bauen, ähnlich wie bei den Legos.
Definition 1.2 Die Menge Σ∗ aller Worte ist wie folgt rekursiv definiert.
• Σ ⊂ Σ∗ und auch das leere Wort ε ist in Σ∗ enthalten.
• Für jedes Wort w ∈ Σ∗ und jedes Zeichen x ∈ Σ ist auch wx ∈ Σ∗ . wx ist die
Zeichenkette, die entsteht, wenn man das Zeichen x an das Wort w anhängt.
Jede Teilmenge von Σ∗ wird Sprache genannt.
Beispiel 1.1
Σ = {0, 1}
Σ∗ = {0, 1, ε, 00, 01, 10, 11, 001, 000, 011, 010, . . .}
Beispiel 1.2
Σ
Σ∗
T erme
T erme
=
=
=
⊂
{+, −, ·, /, (, ), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, x, y, a, b}
{. . . , ) + − · 567ax, . . .}
{x, y, a, b, (a), . . .}
Σ∗
Die Menge aller korrekten arithmetischen Terme ist eine kleine Teilmenge von Σ∗ . Ein Affe,
der zufällig auf einer entsprechenden Tastatur tippt würde viele Versuche benötigen, um
einen korrekten Term zu erzeugen. Die Wahrscheinlichkeit für das Zustandekommen eines
1
1
vorgegebenen Terms der Länge 40 wäre etwa 240 ·10
40 ≈ 1053 .
Definition 1.3 Sei w ∈ Σ∗ und n ∈ N0 . Dann ist wn das durch n-fache Wiederholung
von w entstandene Wort. w0 ist also das leere Wort ε.
Definition 1.4 Für eine endliche Zeichenmenge M ist M ∗ die Menge aller Zeichenketten
die aus Elementen in M gebildet werden können. Das leere Wort gehört zu M ∗ dazu.
Die Menge M + = M ∗ \ε enthält dagegen nur Worte mit mindestens einem Zeichen.
1.1 Grundlagen
5
Beispiel 1.3 Sei Σ = {a, b, c}. Dann sind
∅,
{aa, ab, aaa},
{an |n ∈ N0 } = {ε, a, aa, aaa, aaaa, . . .},
{(ab)n |n ∈ N0 } = {ε, ab, abab, ababab, abababab, . . .},
{an bn |n ∈ N0 } = {ε, ab, aabb, aaabbb, aaaabbbb, . . .}
Teilmengen von Σ∗ und somit Sprachen über dem Alphabet Σ.
1.1.1 Unendliche Mengen
Die kleinste” unendliche Menge ist die Menge der natürlichen Zahlen. Man könnte einfach
”
festlegen N := {1, 2, 3, ...}. Damit ist aber noch nicht festgelegt, was 1“, 2“, 3“, etc. be” ” ”
deuten soll. Daher hier die axiomatische Definition der natürlichen Zahlen.
Definition 1.5 Axiome der natürlichen Zahlen (Teil der Peano Axiome):
(i) 1 ist eine natürliche Zahl
(ii) jede natürliche Zahl n besitzt einen Nachfolger n+
(iii) Die Zahl 1 ist nicht Nachfolger einer natürlichen Zahl, d.h. ¬∃n ∈ N n+ = 1
(iv) ∀n, m ∈ N n+ = m+ ⇒ n = m, d.h. verschiedene natürliche Zahlen haben
verschiedene Nachfolger.
(v) Enthält eine Teilmenge A der natürlichen Zahlen die Zahl 1 und mit jeder
natürlichen Zahl auch deren Nachfolger n+ , so ist A = N.
(A ⊂ N ∧ 1 ∈ A ∧ (n ∈ A ⇒ n+ ∈ A)) ⇒ A = N.
(v) ist das sogenannte Induktionsaxiom.
Andere Formulierung: Gilt eine Aussage für die Zahl 1 und mit jeder Zahl auch für dessen
Nachfolger, so gilt sie für alle n ∈ N.
Definition 1.6 ∅ oder {} steht für die leere Menge. N0 = {0, 1, 2, 3, . . .}. R sei die Menge
der reellen Zahlen. Die Anzahl der Elemente einer Menge M nennt man Mächtigkeit
und man schreibt dafür |M |.
Beispiel: |{7, 2, 13}|
=
3,
|∅|
=
0
Definition 1.7 Die Anzahl der Elemente einer Menge M heißt endlich, wenn es eine
natürliche Zahl n gibt mit n = |M |.
6
1 Formale Sprachen und Maschinenmodelle
Definition 1.8 Zwei Mengen M und M 0 heißen gleich mächtig, wenn eine bijektive
Abbildung f : M → M 0 existiert.
Definition 1.9 Eine Menge M heißt abzählbar, wenn sie gleich mächtig wie die Mange
N der natürlichen Zahlen ist. Dann lassen sich also die Elemente von M durchnumerieren.
Nicht abzählbare unendliche Mengen heißen überabzählbar.
Bemerkung: Jede abzählbare Menge ist unendlich. Warum?
Satz 1.1 Die Mengen N, Z und Q sind abzählbar. R ist überabzählbar.
Beweis: Wir zeigendie Abzählbarkeit von Q, das heißt es gibt eine Bijektion Q ←→ N.
Weg: Q ←→ Z ←→ N
↑
Übung
1
2
3
4
5
. . .
1/2 2/2 3/2 4/2 5/2
1/3 2/3 3/3 4/3 5/3
1/4 2/4 3/4 4/4 5/4
.
.
.
Damit Bijektion von Q+ ←→ Z+ \ {0}
analog: Bijektion von Q− ←→ Z−
dadurch Bijektion von Q ←→ Z.
Satz 1.2 Die rationalen Zahlen sind dicht, d.h. zwischen je zwei rationalen Zahlen existiert eine weitere rationale Zahl.
Folgerung: Zwischen zwei beliebigen rationalen Zahlen liegen unendlich viele rationale
Zahlen.
Beweis: Idee: Mittelwert zweier rationaler Zahlen ist rationale Zahl.
Seien a, b ∈ Q a < b. Als Übungsaufgabe zu zeigen: a < a+b
< b und
2
a+b
2
ist rational!
1.2 Grammatiken
7
1.1.2 Mächtigkeit von Sprachen
Lemma 1.1 Für jedes endliche Alphabet Σ ist Σ∗ abzählbar. Die Menge aller Sprachen
über Σ ist überabzählbar.
Beweis: als Übung
Die interessanten Sprachen sind unendlich. Zum Beispiel sind alle Programmiersprachen
unendlich, denn wir wollen nicht die Länge von Programmen beschränken.
1.2 Grammatiken
Besonders interessant sind strukturierte Sprachen. Eine Sammlung von zufällig erzeugten
Wörtern ist für die meisten Anwendungen nicht sehr hilfreich. “Struktur” heißt hier, dass
sich die Sprache endlich beschreiben läßt. Wir werden Grammatiken verwenden um Sprachen zu beschreiben.
Aus dem Sprachunterricht in der Schule ist die Grammatik der deutschen Sprache bekannt.
Ein Satz der deutschen Sprache kann zum Beispiel bestehen aus < Subjekt > < Prädikat >
< Objekt > und < Subjekt > wiederum kann ersetzt werden durch < Artikel >< Substantiv >.
Damit ist also Die Studentin spielt Schach ein wohlgeformter Satz entsprechend der einfachen angegebenen Grammatik. Jede Programmiersprache besitzt eine Grammatik.
Beispiel 1.4 Die (unendliche) Menge der arithmetischen Terme wie zum Beispiel x · (x +
a · (b − 12)) läßt sich durch folgende Regelgrammatik charakterisieren:
< Term >
< Term >
< Term >
< Term >
< Term >
< Term >
< Term >
< Var >
< Konst >
< Zahl >
< Ziffer >
→
→
→
→
→
→
→
→
→
→
→
< Term > + < Term >
< Term > − < Term >
< Term > / < Term >
< Term > · < Term >
(< Term >)
< Var >
< Konst >
x|y
a | b | < Zahl >
< Zahl >< Ziffer > | < Ziffer >
0|1|2|3|4|5|6|7|8|9
Hier steht das Zeichen | für “oder”, das heißt, eine Regel S → u | v steht für die zwei Regeln
S → u und S → v.
8
1 Formale Sprachen und Maschinenmodelle
Definition 1.10 Eine Grammatik ist ein 4-Tupel
G = (V, Σ, P, S)
mit
• V als endliche nichtleere Menge der Variablen.
• Σ als Menge der Konstanten oder Terminalalphabet und V ∩ Σ = ∅.
• P ⊂ (V ∪ Σ)+ × (V ∪ Σ)∗ als endliche Menge der Produktionsregeln.
• S ∈ V ist die Startvariable.
Definition 1.11 Die in Beispiel 1.4 und im Folgenden verwendete Art der Darstellung
von Grammatikregeln wird nach ihren Erfindern Backus-Naur-Form oder kurz BNF
genannt.
Beispiel 1.5 Mit
G = ( {< Term >, < Var >, < Konst >, < Zahl >, < Ziffer >},
{x, y, a, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, (, ), +, −, ·, /},
P, < Term >)
und P als Menge der Regeln aus Beispiel 1.4 ergibt sich also eine Grammatik mit den
angegebenen Variablen, Konstanten und < Term > als Startsymbol.
Durch sukzessives Anwenden einer der Regeln aus P beginnend mit dem Startsymbol kann
1.2 Grammatiken
9
man den obigen Term x · (x + a · (b − 12)) ableiten:
< Term > ⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
⇒
< Term > · < Term >
< Var > · < Term >
x· < Term >
x · (< Term >)
x · (< Term > + < Term >)
x · (< Var > + < Term >)
x · (x+ < Term >)
x · (x+ < Term > · < Term >)
x · (x+ < Konst > · < Term >)
x · (x + a· < Term >)
x · (x + a · (< Term >))
x · (x + a · (< Term > − < Term >))
x · (x + a · (< Konst > − < Term >))
x · (x + a · (b− < Term >))
x · (x + a · (b− < Konst >))
x · (x + a · (b− < Zahl >))
x · (x + a · (b− < Zahl >< Ziffer >))
x · (x + a · (b− < Ziffer >< Ziffer >))
x · (x + a · (b − 1 < Ziffer >))
x · (x + a · (b − 12))
10
1 Formale Sprachen und Maschinenmodelle
Eine äquivalente Darstellung von Regelgrammatiken in grafischer Form bieten die Syntaxdiagramme, die wir hier nicht formal einführen. Ein Beispiel soll genügen:
Beispiel 1.6 Syntaxdiagramm für Terme
Var:
Term:
Term
+
Term
x
Term
_
Term
y
Term
/
Term
Term
*
Term
a
(
Term
)
b
Konst:
Zahl
Var
Konst
Zahl:
Ziffer:
Ziffer
0
1
2
3
4
5
6
7
8
9
Definition 1.12 Eine Folge von Wörtern (w0 , w1 , . . . , wn ) mit w0 = S und wn ∈ Σ∗
heißt Ableitung von wn , falls für i ≥ 1 jedes der Wörter wi aus wi−1 entstanden ist
durch Anwendung einer Regel aus P auf ein Teilwort von wi−1 . Für einen Teilschritt
schreibt man wi−1 ⇒ wi . Ist ein Wort w durch einen oder mehrere Teilschritte aus u
ableitbar, so schreibt man u ⇒∗ w.
Obige Grammatik erzeugt die (unendliche) Menge der Terme als Teilmenge von Σ∗ . Allgemein definiert man
Definition 1.13 Die durch G erzeugte bzw. definierte Sprache ist
L(G) = {w ∈ Σ∗ | S ⇒∗ w}.
Für kontextfreie Sprachen erhält man eine einfachere Darstellung der möglichen Ableitungen eines Wortes mit Hilfe von Syntaxbäumen.
Beispiel 1.7 Der Syntaxbaum zur Ableitung aus Beispiel 1.5 hat folgende Gestalt:
1.3 Chomsky-Hierarchie
11
(Q >
((<(Term
((((((
(
(
(
Q
(
(
(((
((
((
((((
Q
< Term > ·
< Var >
x
< Term >
((((hhhhhhhh
(((((
hhhhh
(
(
(
(
hhhhh
(((((
(
)
<(Term
(b >
(
(((
(
((
bb
(
(
(
(
(
(
(
(((
b
((((
< Term > +
<Term
(
Q >
(
(
(
(
(
(
( Q
((((
Q
< Var >
< Term > ·
< Term >
XXXXX
XXX
X
x
< Konst >
(
)
< Term
>
!
! bb
!!
bb
!!
a
< Term > −
< Term >
< Konst >
< Konst >
b
< Zahl >
e
ee
<Zahl> <Ziffer>
< Ziffer > 2
1
Definition 1.14 Eine Grammatik G heißt mehrdeutig, wenn es zu einem Wort ω ∈
L(G) mehrere verschiedene Syntaxbäume gibt. Sie heisst eindeutig, wenn es nur einen
Syntaxbaum gibt.
Wir werden nun die Grammatiken formaler Sprachen einteilen in verschiedene Klassen,
die sogenannte Chomsky-Hierarchie mit dem Ziel, zu verstehen, wie sich die Eigenschaften
der zugehörigen Sprachen verändern, wenn, ausgehend von den einfachsten (regulären)
Grammatiken, immer komplexere Regeln erlaubt sind.
1.3 Chomsky-Hierarchie
12
1 Formale Sprachen und Maschinenmodelle
Definition 1.15 Jede Grammatik G = (V, Σ, P, S) entsprechend Definition 1.10 ist vom
Typ 0. Die Menge der Typ-0-Grammatiken ist also gleich der Menge aller Grammatiken.
Typ
0
1
2
Bezeichnung
Grammatik
kontextsensitiv
kontextfrei
3
regulär
erlaubte Regeltypen, (w ∈ (V ∪ Σ)+ , u ∈ (V ∪ Σ)∗ )
w → u.
w → u mit |w| ≤ |u|.
A → u, A → ε, mit A ∈ V , d.h. auf der linken Seite aller Regeln
kommt genau eine Variable vor.
A → a, A → aB, A → ε, d.h. auf der rechten Seite der Regeln steht
entweder ein Terminalsymbol oder ein Terminalsymbol gefolgt von
einer Variablen.
Eine Sprache ist vom Typ t, wenn es eine Grammatik vom Typ t gibt mit L(G) = L.
Beispiel 1.8 Die Sprache aus Beispiel 1.4 ist offensichtlich eine kontextfreie Grammatik,
das heißt sie ist vom Typ 2. Sie ist aber keine Typ-3-Grammatik. (Warum?)
Beispiel 1.9 Die Sprache {an bn |n ∈ N} ist kontextfrei und läßt sich durch die Grammatik
G = ({S}, {a, b}, P, S) beschreiben mit
P = { S → aSb,
S → ab }.
Diese Sprache ist nicht regulär.
Beispiel 1.10 Die Sprache {an bm |n ∈ N, m ∈ N} ist regulär und läßt sich durch die
Grammatik G = ({S, T }, {a, b}, P, S) beschreiben mit
P ={ S
S
T
T
→ aS,
→ aT,
→ bT,
→ b }.
Die Chomsky-Hierarchie der verschiedenen Sprachklassen ist in folgendem Mengendiagramm dargestellt:
1.3 Chomsky-Hierarchie
13
alle Sprachen
überabzählbar weil P (Σ∗ )
durch Grammatiken beschreibbare Sprachen → Typ 0
abzählbar
Typ 1
Typ 2
Typ 3
alle endlichen Sprachen
Beispiel 1.11
Σ = {a, b}
G1 = ({S}, Σ, P, S)
P = {S → aS, S → bS, S → ε}
Offenbar läßt sich aus dieser Grammatik jedes Wort w ∈ Σ∗ ableiten, also gilt L(G1 ) = Σ∗ .
Diese Aussage läßt sich wie folgt verallgemeinern.
Satz 1.3 Sei Σ = {c1 , . . . , cn }. Dann ist Σ∗ eine Typ-3-Sprache und jede endliche Teilmenge von Σ∗ ist vom Typ 3.
Beweis:
1. Teil:
Σ = {c1 , . . . , cn }
G1 = ({S}, Σ, P, S)
P = {S → c1 S, S → c2 S, . . . , S → cn S, S → ε}
es folgt:
L(G1 ) = Σ∗
Weil alle Regeln aus P Typ 3 - Regeln sind ist Σ∗ vom Typ 3.
2. Teil:
14
1 Formale Sprachen und Maschinenmodelle
Sei die endliche Sprache L = {w1 , w2 , . . . , wm } gegeben. Die Grammatikregeln für das Wort
wi = ci1 ci2 . . . cili sind:
Pi
G
Σ
V
P
=
=
=
=
=
{S → ci1 Si1 , Si1 → ci2 Si2 , . . . , Sili → ε}
(V, Σ, P, S)
li
∪m
i=1 ∪j=1 {cij }
{S, S11 , . . . , S1l1 , . . . , Sm1 , . . . , Smlm }
∪m
i=1 Pi
1.4 Endliche Automaten
Nun kennen wir einige reguläre Sprachen und deren Regelgrammatik. Mit Hilfe der Grammatik lassen sich alle Worte der Sprache erzeugen. Wir stellen uns die Frage, ob es eine
möglichst einfache und effiziente Rechenmaschine gibt, mit der man für ein beliebiges Wort
w entscheiden kann, ob dieses zu einer vorgegebenen regulären Sprache gehört.
Definition 1.16 Die Aufgabe, zu entscheiden, ob ein Wort w zu einer Sprache L gehört,
heißt Wortproblem.
Grammatik
erzeugt
erkennt
−→
Sprache
←−
Automat
Das Wortproblem für reguläre Sprachen kann durch endliche Automaten effizient gelöst werden. Anschaulich ist ein endlicher Automat ein Rechenelement, welches auf einem
Eingabeband beginnend mit dem ersten Zeichen das eingegebene Wort Zeichen für Zeichen
liest.
Lesekopf
HAL LO
Z
Zustand
Hierbei kann er seinen internen Zustand entsprechend von Regeln abhängig vom Eingabezeichen wechseln. Die Zahl der Zustände ist endlich. Erreicht der Automat nach Lesen des
letzten Zeichens einen Endzustand, so hat er das Wort erkannt. Formal wird der Automat
wie folgt definiert:
1.4 Endliche Automaten
15
Definition 1.17 Ein endlicher Automat M besteht aus einem 5-, bzw. 7-Tupel
M = (Z, Σ, δ, z0 , E)
bzw.
M = (Z, Σ, δ, z0 , E, γ, Θ)
mit
Z
Σ
δ
z0
E
γ
Θ
:
:
:
:
:
:
:
endliche Zustandsmenge
endliches Eingabealphabet, Σ ∩ Z = φ
Z × Σ → P(Z), die Zustandsübergangsfunktion
Startzustand
Menge der Endzustände
Z × Σ → Θ, die Ausgabefunktion
Ausgabealphabet
Definition 1.18 Ein Wort w = w1 . . . wn mit wi ∈ Σ wird akzeptiert von dem
endlichen Automaten M genau dann wenn M gestartet im Startzustand auf w1 nach
n Anwendungen der Funktion δ, d.h. nach Lesen von wn , einen Endzustand z ∈ Σ
erreichen kann.
Die von M akzeptierte (erkannte) Sprache L(M ) ist
L(M ) = {w ∈ Σ∗ | M akzeptiert w}
Satz 1.4 Eine Sprache L wird von einem endlichen Automaten genau dann erkannt, wenn
sie regulär (Typ 3) ist.
Beispiel 1.12 Die reguläre Sprache L = {an bm | n ∈ N, m ∈ N} wird erzeugt durch
die Regelmenge
P = {S → aS, S → aT, T → bT, T → b}
Die Zustandsübergangsfunktion δ des zugehörigen Automaten M = ({S, T, e}, {a, b}, δ, S, {e})
ist gegeben durch die Zustandsübergangstabelle
δ S
T
e
a {S, T }
b
{T, e}
Man beachte, dass die Zustandsübergangsfunktion δ nicht eindeutig ist, denn zum Beispiel
kann der Automat nach Lesen eines a im Zustand S nach S oder nach T übergehen. Dies
zeichnet den nichtdeterministischen Automaten aus.
Der zugehörige Zustandsgraph ist
16
1 Formale Sprachen und Maschinenmodelle
a
S
b
a
T
b
e
Beispiel 1.13 Es soll ein Getränkeautomat mit Hilfe eines endlichen Automaten programmiert werden. Der Automat kann mit bis zu 4 Dosen Mineralwasser gefüllt werden. Wenn
eine 1-Euro-Münze eingegeben wird, soll er eine Dose Wasser ausgeben. Bei Eingabe einer
anderen Münze soll er die eingegebene Münze wieder ausgeben, aber kein Getränk. Wenn
der Automat leer ist soll er anhalten und per Funk den Service benachrichtigen.
Ein endlicher Automaten (mit Ausgabe) für diese Aufgabe ist
({z0 , z1 , z2 , z3 , z4 }, {e, f, m}, δ, z0 , {z0 }, γ, {e, f, m})
wobei δ und γ gegeben sind durch
δ, γ
m
e
f
z0
z1 , ε
z0 , e
z0 , f
z1
z2 , ε
z0 , m
z1 , f
z2
z3 , ε
z1 , m
z2 , f
z3
z4
z4 , ε
z2 , m z3 , m
z3 , f z4 , f
Das Zustandsdiagramm zu diesem Automaten sieht so aus:
Dieser Automat akzeptiert alle Eingabesequenzen (Worte), die zum leeren Automaten (d.h.
zu z0 ) führen.
Definition 1.19 Beim nichtdeterministischen endlichen Automaten (NFA) sind (im Gegensatz zum deterministischen endlichen Automaten (DFA)) für jeden Zustand Z und
Eingabezeichen a mehrere Regeln
z, a → z1
..
.
z, a → zn
erlaubt.
Bemerkung:
Aus der Zustandsübergangsfunktion δ wird eine Relation.
Beispiel 1.14 An der Sprache L = {an bm |n ∈ N, m ∈ N} erkennt man schön, wie die
Regelgrammatik in einfacher Weise in einen nichtdeterministischen Automaten übersetzt
werden kann:
1.5 Reguläre Ausdrücke
Regelgrammatik
P = {S → aS
S → aT
T → bT
T → b}
17
Automat
δ = {S, a →
S, a →
T, b →
T, b →
S
T
T
E}
Hier stellt sich die Frage, ob es vielleicht auch einen deterministischen Automaten gibt, der
diese Sprache erkennt. Allgemein lautet die Frage: Sind nichtdeterministische Automaten
mächtiger ist als deterministische. Der folgende Satz beantwortet beide Fragen.
Satz 1.5 NFAs und DFAs sind gleich mächtig, d.h. zu jedem NFA gibt es einen DFA, der
die gleiche Sprache erkennt.
1.5 Reguläre Ausdrücke
Reguläre Ausdrücke dienen wie reguläre Grammatiken der Beschreibung von Typ-3-Sprachen.
Definition 1.20 Reguläre Ausdrücke zum Alphabet Σ sind:
1.) ∅ = {}
2.) ε
3.) a, falls a ∈ Σ
4.) sind α, β reguläre Ausdrücke, so auch αβ, α|β und α∗
hierbei steht α|β für α oder β, α∗ für beliebig viele Wiederholungen von α (auch 0
Wiederholungen).
Beispiel 1.15 aa∗bb∗ beschreibt {an bm /n ∈ N, m ∈ N}. Für aa∗ schreibt man kürzer a+.
Der Operator + steht also für beliebig viele Wiederholungen, aber mindestens eine.
Beispiel 1.16 Sei Σ = {., 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. Der Ausdruck 0\.(0|1|2|3|4|5|6|7|8|9)+
beschreibt die Menge aller Dezimalzahlen mit 0 vor dem Dezimalpunkt.
Da wir im Folgenden das Werkzeug Lex bzw. Flex vorstellen werden, wird die Definition
der regulären Ausdrücke gekürzt entnommen aus der Linux-Manual-Page zu FLex. Die
Rangfolge der Operatoren entspricht deren Priorität.
18
1 Formale Sprachen und Maschinenmodelle
x
.
[xyz]
match the character ’x’
any character (byte) except newline
a "character class"; in this case, the pattern
matches either an ’x’, a ’y’, or a ’z’
[abj-oZ]
a "character class" with a range in it; matches
an ’a’, a ’b’, any letter from ’j’ through ’o’,
or a ’Z’
[^A-Z]
a "negated character class", i.e., any character
but those in the class. In this case, any
character EXCEPT an uppercase letter.
[^A-Z\n]
any character EXCEPT an uppercase letter or
a newline
r*
zero or more r’s, where r is any regular expression
r+
one or more r’s
r?
zero or one r’s (that is, "an optional r")
r{2,5}
anywhere from two to five r’s
r{2,}
two or more r’s
r{4}
exactly 4 r’s
{name}
the expansion of the "name" definition
(see above)
"[xyz]\"foo"
the literal string: [xyz]"foo
\X
if X is an ’a’, ’b’, ’f’, ’n’, ’r’, ’t’, or ’v’,
then the ANSI-C interpretation of \x.
Otherwise, a literal ’X’ (used to escape
operators such as ’*’)
\0
a NUL character (ASCII code 0)
\123
the character with octal value 123
\x2a
the character with hexadecimal value 2a
(r)
match an r; parentheses are used to override
precedence (see below)
rs
the regular expression r followed by the
regular expression s; called "concatenation"
r|s
either an r or an s
^r
an r, but only at the beginning of a line (i.e.,
which just starting to scan, or right after a
newline has been scanned).
r$
an r, but only at the end of a line (i.e., just
before a newline).
Mit dieser erweiterten Notation für reguläre Ausdrücke lassen sich Dezimalzahlen (siehe Beispiel 1.16) einfacher beschreiben mit 0\.[0123456789]+ oder noch einfacher durch
0\.[0-9]+.
Bevor wir mit der praktischen Anwendung von regulären Ausdrücken fortfahren noch ein
wichiger Satz.
Satz 1.6 Jede reguläre Sprache ist durch einen regulären Ausdruck beschreibbar. Umgekehrt definiert jeder reguläre Ausdruck eine reguläre Sprache.
1.6 Der Lexical Analyzer Lex
19
1.6 Der Lexical Analyzer Lex
Lex, bzw. FLEX ist ein sogenannter Lexical Analyzer. Er kann dazu verwendet werden,
für reguläre Sprachen das Wortproblem zu lösen, das heisst, zu entscheiden, ob ein vorgegebenes Wort zu einer Sprache L gehört. Lex kann daneben sogar noch erkannte Wörter
ersetzen entsprechend definierten Regeln.
Das Ersetzen von Ausdrücken der Form
Tel.: 0751/501-721
durch Ausdrücke der Form
Phone: ++49-751-501-721
kann durch folgendes Lex-Programm erfolgen.
Die Datei tel.x:
%option noyywrap
%%
Tel\.?:[ \t]+0
[0-9](\/|-)[0-9]
\n
printf("Phone: ++49-");
printf("%c-%c", yytext[0],yytext[2]);
printf("\n");
Anwendung des fertigen Programms tel liefert:
> tel
Tel.: 0751/501-9721
Phone: ++49-751-501-9721
Tel.: 075qt1/501-9721
Phone: ++49-75qt1-501-9721
quit
quit
^D
Aufruf von Lex mit Quelldatei tel.x:
flex -otel.c tel.x
cc -lfl tel.c -o tel
tel
der generelle Aufbau eines Lex-Programms (und auch eines Yacc-Programms) ist:
Definitionen
%%
Regeln
%%
Funktionen
20
1 Formale Sprachen und Maschinenmodelle
1.7 Yacc: Yet Another Compiler Compiler
Yacc ist ein Programmgenerator, der aus einer kontextfreien Grammatik ein Programm
generiert, das die Korrektheit der eingegebenen Worte prüft, das heisst das Wortproblem
entscheidet. Yacc wird hauptsächlich dazu verwendet, Parser für Programmiersprachen
automatisch zu erzeugen. Er kann also nicht nur die Syntax von Programmiersprachen
checken, sondern auch Code generieren. Dies führt jedoch hier zu weit.
1.7.1 Ein Beispiel mit Lex und Yacc
Die Datei term.x
#include "y.tab.h"
%%
\(
return(yytext[0]);
\)
return(yytext[0]);
[\+\-\*\/]
return(OP);
[ \t]+
;
[a-zA-Z][a-zA-Z0-9_]* return(BEZ);
[0-9]+
return(INTEGER);
[0-9]+\.[0-9]+
return(GLEITPKTZ);
\n
return(’\0’);
Die Bison-Eingabedatei term.y
%token BEZ OP INTEGER GLEITPKTZ
%%
term
: INTEGER
| GLEITPKTZ
| BEZ
| term OP term
| ’(’ term ’)’
| error {printf("Term nicht wohlgeformt!\n");}
%%
yyerror (s) /* Called by yyparse on error */
char *s;
{
printf ("%s\n", s);
}
#include "lex.yy.c"
main()
{
/* yydebug = 1;*/
yyparse();
}
1.8 Kellerautomaten
21
Die Datei makefile
term: lex.yy.c term.tab.c
cc term.tab.c -lfl -o term
term.tab.c: term.y
bison term.y
lex.yy.c: term.x
flex term.x
Ablauf und Zusammenspiel von Lex, Yacc und CC:
1.8 Kellerautomaten
Wir starten mit einem Beispiel an dem man erkennt, dass schon recht einfache Sprachen
von einem endlichen Automaten nicht erkannt werden können.
Beispiel 1.17
L = {an bn |nεN}
Grammatik für L:
P = {S → aSb, S → ab}
L ist eine Typ-2-Sprache. Daher gibt es keine reguläre Grammatik für L und auch keinen
endlichen Automaten, der L erkennt.
Beispiel 1.18 Beschränkt man allerdings die Zahl n der a-s und b-s, so gibt es einen
endlichen Automaten, der die Sprache erkennt. Sei also
L0 = {an bn |n = 1, . . . , 100}.
Diese Sprache wird erkannt von einem Automaten mit Endzustand E und folgenden Zustandsübergängen
22
1 Formale Sprachen und Maschinenmodelle
A0 , a → A1
A1 , a → A2
A2 , a → A 3
...
A98 , a → A99
B0 , b → E
B1 , b → B0
B2 , b → B1
...
B99 , b → B98
A1 , b → B1
A2 , b → B2
...
A99 , b → B99
Definition 1.21 Ein Kellerautomat K besteht aus einem 6-Tupel
K = (Z, Σ, Γ, δ, z0 , #)
mit
Z
Σ
Γ
δ
z0 ∈ Z
#∈Γ
:
:
:
:
:
:
endliche Zustandsmenge
endliches Eingabealphabet, Σ ∩ Z = ∅
endliches Kelleralphabet, Σ ∩ Γ = ∅
Z × (Σ ∪ {ε}) × Γ → Pe (Z × Γ∗ ), die Zustandsübergangsfunktion1
Startzustand
unterstes Kellerzeichen
Beispiel 1.19 Kellerautomat K für L = {an bn |n ∈ N}
K = {{z0 , z1 }, {a, b}, {A, #}, δ, z0 , #}
δ = {z0 , a, #
z0 , a, A
z0 , b, A
z1 , b, A
z1 , ε, #
→
→
→
→
→
z0 , A#;
z0 , AA;
z1 , ε;
z1 , ε;
z1 , ε}
Folgende Sequenz von Konfigurationen veranschaulicht die Arbeit von K:
a a b b
↑
z0
a a b b
↑
z0
#
A
#
a a b b
↑
z0
A
A
#
1.8 Kellerautomaten
a a b b
↑
z1
23
a a b b
a a b b
↑
z1
A
#
↑
z1
#
L = {an bn cm |n ∈ N, m ∈ N0 }
δ 0 = δ ∪ {z1 , c, # → z1 , #}
Beispiel 1.20 Palindrome sind Worte, die in der Mitte gespiegelt sind. Wir betrachten
nun die Sprache aller Palindrome über dem Alphabet {a, b}, wobei die Mitte des Wortes
jeweils durch ein $-Zeichen markiert ist. Sei also
Σ = {a, b, $} und L = {a1 . . . an $an . . . a1 |ai ∈ {a, b}, n ∈ N0 }
Die Sprache wird erzeugt durch die Typ-2-Grammatik G = (V, Σ, P, S) mit
P = {S → $|aSa|bSb}
L ist keine Typ 3 Sprache, denn wie oben gezeigt gibt es keinen endlichen Automaten zu
dieser Sprache. Folgender deterministischer Kellerautomat erkennt L:
Eingabezeichen
Kellerzeichen
a, #
b, #
$, #
a, A
a, B
b, A
b, B
$, A
$, B
ε, #
s0
s0 , A#
s0 , B#
s1 , #
s0 , AA
s0 , AB
s0 , BA
s0 , BB
s1 , A
s1 , B
s1
s1 , ε
s1 , ε
s1 , ε
Beispiel 1.21 Lassen wir die Mittenmarkierung weg, so ergibt sich
Σ = {a, b} und L = {a1 . . . an an . . . a1 |ai ∈ Σ, n ∈ N0 }
mit der Grammatik
P = {S → aSa|bSb|ε}.
Hier kann man nun die Mitte des Wortes nicht mehr in einem deterministischen Durchlauf
erkennen. Daher ist ein nichtdeterministischer Kellerautomat gefordert:
24
1 Formale Sprachen und Maschinenmodelle
Eingabezeichen,
Kellerzeichen
a, #
b, #
a, A
a, B
b, A
b, B
ε, #
s0
s0 , A#; s1 , A#
s0 , B#; s1 , B#
s0 , AA; s1 , AA
s0 AB; s1 AB
s0 , BA; s1 BA
s0 , BB; s1 , BB
s1 , ε
s1
s1 , ε
s1 , ε
s1 , ε
Die Semantik des Erkennens eines Wortes durch einen deterministischen Kellerautomaten
definieren wir wie folgt:
Definition 1.22 Ein (nichtdeterministischer) Kellerautomat K erkennt, bzw. akzeptiert ein Wort w = w1 . . . wn genau dann, wenn es eine Folge von Zustandsübergängen
gibt, so dass nach Lesen von wn der Keller ganz leer ist. Hierbei muß K gestartet werden
auf w1 .
An diesem Beispiel erkennt man, dass nichtdeterministische Kellerautomaten mächtiger
sind als deterministische, d.h. es gibt Sprachen, zum Beispiel die Palindrome, die von
nichtdeterministischen Kellerautomaten erkannt werden, aber nicht von deterministischen.
Satz 1.7 Nichtdeterministische Kellerautomaten erkennen genau die Menge der kontextfreien Sprachen (Chomsky Typ 2). Deterministische Kellerautomaten erkennen genau die
Menge der deterministisch kontextfreien Sprachen. Diese Sprachen werden von LR(k)Grammatiken erzeugt und liegen in der Chomsky-Hierarchie zwischen Typ 2 und 3.
1.9 Turingmaschinen
Eine der vielen großen Erfindungen des genialen britischen Mathematikers Alan Turing
(≈ 1940) war die Definition eines Modells für eine universelle Rechenmaschine, welche alle
Funktionen berechnen kann, die wir uns intuitiv als berechenbar vorstellen. Die sogenannte
Turingmaschine besitzt endliche viele Zustände und arbeitet auf einem beidseitig unendlichen Band. Ihre Mächtigkeit erhält sie durch die Möglichkeit Zeichen auf dem Band zu
überschreiben sowie den Schreib-Lesekopf nach rechts oder links zu bewegen.
Beispiel 1.22 Turingmaschine T , die eine Eingabe x ∈ {0, 1}∗ als Binärzahl interpretiert
und 1 hinzuaddiert. Ein leeres Bandfeld bezeichnen wir im Folgenden mit t.
T = ({z0 , z1 , z2 , ze }, {0, 1}, {0, 1, t}, δ, z0 , t, {ze })
1.9 Turingmaschinen
25
z0 , 0
z0 , 1
z0 , t
z1 , 0
z1 , 1
z1 , t
z2 , 0
z2 , 1
z2 , t
→
→
→
→
→
→
→
→
→
z0 , 0, R
z0 , 1, R
z1 , t, L
z2 , 1, L
z1 , 0, L
ze , 1, N
z2 , 0, L
z2 , 1, L
ze , t, R
Die Maschine bewegt sich zuerst nach rechts bis zum Ende der Binärzahl. Dann erfolgt die
eigentliche Addition im Zustand z1 mit Bewegung nach links. Bei der ersten null ist die
Addition abgeschlossen und im Zustand z2 läuft T zum Anfang der Zahl, wo sie terminiert.
Definition 1.23 Ein Turingmaschine besteht aus einem 7-Tupel
T = (Z, Σ, Γ, δ, z0 , t, E)
mit
Z
Σ
Γ
δ
:
:
:
:
δ :
z0 :
t :
E :
endliche Zustandsmenge
endliches Eingabealphabet, Σ ∩ Z = ∅
endliches Arbeitsalphabet, mit Σ ⊂ Γ
Z × Γ → Z × Γ × {L, R, N },
die Zustandsübergangsfunktion bei deterministischen Turingmaschinen
Z × Γ → P(Z × Γ × {L, R, N }),
die Zustandsübergangsfunktion bei nichtdeterministischen Turingmaschinen
Startzustand, z0 ∈ Z
Das Blank (Leerzeichen), wobei t ∈ Γ − Σ
Menge der Endzustände mit E ⊆ Z
Definition 1.24 Ein Wort w = w1 . . . wn wird von einer Turingmaschine T akzeptiert,
wenn sie, gestartet auf w1 in einem Endzustand hält.
L(T ) = {w ε Σ∗ |T akzeptiert w}
Satz 1.8 Turingmaschinen akzeptieren genau die Typ-0-Sprachen.
26
1 Formale Sprachen und Maschinenmodelle
Man könnte aufgrund dieses Satzes verleitet sein, zu glauben, dass Turingmaschinen das
Wortproblem (Definition 1.16) lösen. Dies ist aber falsch. Man vergleiche hierzu zum Beispiel den kleinen aber subtilen Unterschied in den Definitionen 1.22 und 1.24. Der Kellerautomat akzeptiert ein Wort “genau dann wenn . . . ”, die Turingmaschine hingegen akzeptiert
ein Wort “wenn . . . ”. Über den Fall, dass die Turingmaschine nicht in einem Endzustand
hält, macht die Definition keine Aussage. Warum?
Beispiel 1.23 Besonders einfach sind Turingmaschinen, die unendlich viele 1-en schreiben:
z0 , t → z0 , 1, R
Viel schwieriger ist es, möglichst viele, aber endlich viele Einsen zu schreiben.
1.9.1 Fleißige Biber
Die Turingmaschine ist extrem ineffektiv bei der Bearbeitung von konkreten Problemen.
Für die Theorie hat sie aber große Bedeutung. So kann mit ihrer Hilfe zum Beispiel das
Halteproblem, ein für die Informatik sehr wichttiges Problem (leider negativ) beantwortet
werden.
Der ungarische Mathematiker Tibor Rado definierte 1962 das busy-beaver-Problem:
Definition 1.25 Busy- Beaver- Problem:
Gesucht ist eine deterministische Turingmaschine mit dem Arbeitsalphabet {1, t} und
einer vorgegebenen Anzahl von Zuständen. Das Turingband ist leer. Wie viele Zeichen
kann sie maximal schreiben?
Bemerkung: Es ist kein Problem, eine Turingmaschine zu entwerfen, die unendliche viele
Zeichen schreibt (s.o.). Aber die Turingmaschine soll ja irgendwann anhalten. Das macht
das Problem so schwierig. Bei der Anzahl der Zustände der fleißigen Biber werden die
Endzustände nicht mitgezählt.
Beispiel 1.24 Dieser Busy Beaver mit 2 Zuständen schreibt 4 Einsen:
z0 , t
z0 , 1
z1 , t
z1 , 1
→
→
→
→
z1 , 1, R
z1 , 1, L
z0 , 1, L
ze , 1, R
Beispiel 1.25 Busy Beaver mit 3 Zuständen, der 6 Einsen schreibt:
z0
z1
z2
t
z1 , 1, R
z2 , 1, R
z0 , 1, L
1
z2 , 1, L
ze , 1, N
z1 , t, L
1.9 Turingmaschinen
27
Beispiel 1.26 Noch ein fleißiger Biber mit 3 Zuständen:
z0 , t
z0 , 1
z1 , t
z1 , 1
z2 , t
z2 , 1
→
→
→
→
→
→
z1 , 1, R
z2 , 1, L
z0 , 1, L
z1 , 1, R
z1 , 1, L
ze , 1, N
Der gleiche Biber als Automat dargestellt:
Man kann zeigen, dass eine Turingmaschine mit einem Zustand maximal ein Zeichen schreiben kann, eine mit zwei Zuständen maximal vier Zeichen, eine mit drei Zuständen maximal
sechs Zeichen, eine mit vier Zuständen maximal dreizehn Zeichen.
Es gibt viele Turingmaschinen
Satz 1.9 Für die Zahl T (n) der Turingmaschinen mit Arbeitsalphabet t, 1 und n Zuständen (ohne Endzustand) gilt
T (n) = (6n + 7)2n .
Beweis: Wir betrachten Regeln der Form
s, z −→ s0 , z 0 , m
und erkennen, dass es bei n Zuständen 2n linke Seiten gibt. Für jede mögliche linke Seite
gibt es auf der rechten Seite n + 1 Zustände s0 (inkl. Endzustand), 2 verschiedene Zeichen
z 0 und 3 Bewegungen (R,L,N). Dies ergibt 6(n + 1) rechte Seiten für jede linke Seite. Da
man zu jeder linken Seite aber auch gar keine Regel angeben kann, gibt es insgesamt zu
jeder linken Seite
6(n + 1) + 1 = 6n + 7
28
1 Formale Sprachen und Maschinenmodelle
Möglichkeiten. Bei 2n linken Seiten ergeben sich insgesamt
(6n + 7)2n
2
Turingmaschinen für das Arbeitsalphabet t, 1.
Folgende Tabelle aus [18] listet einige aktuelle bekannte Ergebnisse über fleißige Biber auf.
Hier ist n die Zahl der Zustände (ohne Endzustand), Σ(n) die maximale Zahl geschriebener
Einsen. Interessant ist offenbar auch folgende Frage: Welche Turingmaschine mit n Zuständen - ohne Endzustand - macht möglichst viele Arbeitschritte, stoppt dann und hinterlässt
ein leeres Band? Als S(n) bezeichnen wir die maximal mögliche Zahl von Rechenschritten
solch einer Maschine mit n Zuständen.
n
1
2
3
4
5
6
T (n)
169
130321
≈ 2.4 · 108
≈ 8.5 · 1011
≈ 4.8 · 1015
≈ 4.0 · 1019
Σ(n)
1
4
6
13
≥ 4098
> 4.6 · 101439
S(n)
1
6
21
107
≥ 47, 176, 870
> 2.5 · 102879
Quelle
Lin und Rado
Lin und Rado
Lin und Rado
Brady
Marxen und Buntrock
T.J. und S. Ligocki
Die Funktion Σ(n), die angibt, wie gross die maximale Zahl von Zeichen ist, die eine
Turingmaschine mit n Zuständen (ohne Endzustand) ausgeben kann, ist zwar wohldefiniert,
aber nicht durch eine Turingmaschine und somit überhaupt nicht berechenbar! Das Gleiche
gilt für die Funktion S(n). Beides werden wir im nächsten Kapitel zeigen.
1.10 Zusammenfassung zu Sprachen und
Maschinenmodellen
Vergleich von Sprachtypen und Maschinenmodellen:
Chomsky
-Typ
0
1
2
3
Beschreibung
Maschinen-Modell
Regelgrammatiken
kontextsensitive
Grammatik
kontextfreie Grammatik
Turingmaschine
linear beschränkter
Automat (TM)
Kellerautomat
(nichtdeterminist.)
endlicher Automat
reguläre Grammatiken /
reguläre Ausdrücke
Komplexität des
Wortproblems
halbentscheidbar
O(an ) (exponentiell)
O(n3 )
Θ(n)
Satz 1.10 Church’sche These: Die Menge, der durch Turingmaschinen berechenbaren
Funktionen entspricht genau der Menge aller intuitiv berechenbaren Funktionen.
1.11 Übungen
29
Die Church’sche These ist kein Satz im strengen Sinne, denn der Begriff intuitiv widersetzt
sich einem Beweis.
Satz 1.11 Die Turingmaschine ist gleich mächtig wie der von-Neumann-Rechner, das
heißt, dass jedes Problem, das ein von-Neumann-Rechner löst auch von einer Turingmaschine gelöst werden kann und umgekehrt.
Damit ist die Menge der Berechnungsprobleme, die von Turingmaschinen gelöst werden
können gleich der Menge der Berechnungsprobleme, die mit einer “klassischen” Programmiersprache (wie zum Beispiel C) gelöst werden können. Man nennt eine derartige Programmiersprache Turing-mächtig.
1.11 Übungen
Aufgabe 1 Wieviele Teilmengen besitzt eine endliche Menge mir n Elementen? Beweis!
Aufgabe 2 Zeigen Sie, dass die Menge der reellen Zahlen R überabzählbar ist. (Tipp:
Wenn Sie den Beweis nicht schaffen, suchen in der Bibliothek oder in meinem Analysis-1Skript auf meiner Webseite)
Aufgabe 3 Gegeben sei die Grammatik ([9], S. 15)
G
V
Σ
P
=
=
=
=
(V, Σ, P, S) , wobei:
{S, B, C}
{a, b, c}
{S → aSBC, S → aBC, CB → BC,
aB → ab, bB → bb, bC → bc, cC → cc}
Konstruieren Sie eine Ableitung für aabbcc. Welchen Chomski-Typ hat diese Grammatik?
Aufgabe 4 Geben sie eine möglichst einfache Grammatik an, die alle Zeichenketten der
Form ab, abab, ababab, . . . erzeugt. Welchen Chomski-Typ hat diese Grammatik?
Aufgabe 5 Geben sie eine möglichst einfache Grammatik an, die alle Zeichenketten der
Form ab, aabb, aaabbb, . . . erzeugt. Welchen Chomski-Typ hat diese Grammatik?
Aufgabe 6 Geben sie eine möglichst einfache Grammatik an, die alle Zeichenketten der
Form abba, ababbaba, abababbababa, . . . erzeugt. Zeichnen Sie den Syntaxbaum für das
Wort ababbaba. Welchen Chomski-Typ hat diese Grammatik?
Aufgabe 7 Definieren Sie eine Grammatik, die einfache Programme folgender Art beschreibt. Es gibt im Programmrumpf nur Wertzuweisungen, Terme sowie den print-Befehl
function plusplus(x,y,z)
var int u,v;
30
1 Formale Sprachen und Maschinenmodelle
var float w;
u = x + y;
v = x * (z+y);
w = x / z;
print(u,v,w)
end
Aufgabe 8
a) Zeigen Sie, dass die Menge aller C-Programme unendlich ist.
b) Geben sie eine obere Schranke für die Zahl der C-Programme der Länge n an.
Aufgabe 9 Gegeben sei die Grammatik G = (V, Σ, P, S) mit V = {S, A, B}, Σ = {a, b, c}
und
P = { S → aA, A → aA, B → bB,
S → bA, A → bB, B → c,
A→c
}
a) Geben Sie eine Ableitung an für abbbbc.
b) Geben Sie alle Worte der Länge 4 der zugehörigen Sprache L = L(G) an.
c) Geben Sie einen regulären Ausdruck für die Sprache L an.
d) Zeichnen Sie den Zustandsgraphen eines endlichen Automaten, der L akzeptiert.
e) Geben Sie den endlichen Automaten als Formel an.
f ) Welchen Chomsky Typ hat diese Sprache? (Begründung!)
Aufgabe 10 Geben Sie einen deterministischen endlichen Automaten an, der die Sprache
{an bm |n ∈ N, m ∈ N} erkennt.
Aufgabe 11 Geben Sie eine Grammatik an, welche die von dem Getränkeautomaten aus
Beispiel ?? erkannte Sprache erzeugt.
Aufgabe 12 Geben Sie eine Grammatik an für die Sprache L = {ai bj ck | i = j oder j = k}
Zeigen sie daß diese Grammatik mehrdeutig ist.
Aufgabe 13 Geben Sie reguläre Ausdrücke an für
a) groß geschriebene Worte wie z.B. Hallo, aber nicht HALLO.
b) groß geschriebene Worte mit mindestens 3 und höchstens 10 Buchstaben.
c) Gleitpunktzahlen mit beliebig vielen Stellen vor dem Komma und mindestens einer
Stelle nach dem Komma.
d) Datumsangaben der Form 21.10.1999 oder 1.1.2000 oder 1.1.‘00 oder 21.10.‘99.
Nicht erlaubt sind unzulässige Werte wie z.B. 33.44.‘99 oder 121.10.1999
1.11 Übungen
31
Aufgabe 14
Beschreiben Sie die durch folgende regulären Ausdrücke definierten Sprachen und geben
Sie Beispiele an.
a) \\(index|color|label|ref)\{[^\}]*\}
b) %.*$
c) \\section\*?\{.*\}
d) [A-Za-z0-9]+@[A-Za-z0-9]+(\.[A-Za-z0-9]+){1,6}
Aufgabe 15 Schreiben Sie ein Lex-Programm, das in einer Datei alle Datumsangaben
vom Format
< T ag > . < M on > . < Jahr > in das Format < M on > − < T ag > − < Jahr >
übersetzt. < T ag > und < M on > sind zu verstehen wie in Aufgabe 13.
Aufgabe 16 Konstruieren Sie mit Lex und Yacc einen Parser für die Grammatik in
Aufgabe 7.
Aufgabe 17 Es soll ein Getränkeautomat mit Hilfe eines endlichen Automaten programmiert werden. Der Automat kann mit bis zu 4 Dosen Mineralwasser, 4 Dosen Limo und 4
Dosen Bier gefüllt werden. Wenn eine 1-Euro-Münze eingegeben wird, soll er eine Dose des
gewählten Getränks ausgeben. Bei Eingabe einer anderen Münze soll er die eingegebene
Münze wieder ausgeben, aber kein Getränk. Wenn von einer Getränkesorte alle Dosen ausgegeben sind, soll er anhalten und per Funk den Service benachrichtigen. Geben Sie einen
endlichen Automaten (mit Ausgabe) für diese Aufgabe an. Überlegen Sie sich, wie Sie die
große Zahl von Regeln durch wenige (Meta-) Regeln beschreiben können.
Aufgabe 18 Es soll eine Fußgängerampel mit Hilfe eines endlichen Automaten programmiert werden. Die Ampel hat die zwei Zustände rot und grün (aus der Sicht des Fahrzeugs).
Im Zustand rot akzeptiert die Ampel Signale von der Kontaktschleife auf der Straße und
schaltet dann auf Grün. Im Zustand Grün akzeptiert die Ampel Signale vom Fußgängertaster und schaltet auf Rot. Alle anderen Eingaben ignoriert der Automat.
a) Geben Sie einen endlichen Automaten für diese Aufgabe an.
b) Zeichnen Sie ein Zustandsdiagramm zu diesem Automaten.
c) Geben Sie einen regulären Ausdruck für diese Sprache an.
d) Geben Sie eine reguläre Grammatik für diesen Automaten an.
e) Zeigen Sie, dass diese Ampelschaltung bei geringem Verkehrsaufkommen das Mehrheitsprinzip exakt erfüllt, das heisst, das Verhältnis aus rot- zu grün-Zuständen ist
gleich dem Verhältnis aus Fußgängerzahl zu Autofahrerzahl.
Aufgabe 19
Konstruieren sie (deterministische oder nichtdeterministische) endliche Automaten für folgende durch reguläre Ausdrücke gegebenen Sprachen:
a) [0-9]*\.[0-9]+
32
1 Formale Sprachen und Maschinenmodelle
b) \\section\*?\{.*\}
Aufgabe 20
a) Entwerfen sie für das Alphabet {a,b} einen Kellerautomaten, der alle Worte der
Form x1 , x2 , . . . xn $y1 , y2 , . . . ym erkennt, wobei die Zahl der a-s vor und nach dem
“$”-Zeichen gleich groß sein soll.
b) Geben Sie für diese Sprache eine BNF Grammatik an.
Aufgabe 21
a) Ändern Sie den Automaten aus Aufgabe 20 so ab, daß er nur Worte erkennt, für die
n = m ist.
b) Geben Sie für die geänderte Sprache auch eine BNF Grammatik an.
Aufgabe 22 Entwerfen Sie sie für das Alphabet {a,(,)} einen Kellerautomaten, der genau
die korrekt geklammerten Ausdrücke erkennt.
Aufgabe 23 Gegeben sei die BNF-Grammatik G = ({S, T, Z}, {a, [, ]}, P, T ) mit
P = { T → [S[ST S]S] | ε
S → ZS | Z | ε
Z→a
}
a) Geben Sie eine Linksableitung an für [a[a]a].
b) Geben Sie in einer Tabelle alle Worte der Längen 1 bis 6 der zugehörigen Sprache
L = L(G) an.
c) Beschreiben Sie die Sprache L in ein bis zwei Sätzen.
d) Geben Sie einen Kellerautomaten an, der L akzeptiert.
e) Welchen Chomsky Typ hat diese Sprache? (Begründung!)
Aufgabe 24 Konstruieren Sie eine Turingmaschine M zur Berechnung der Parität des
Eingabewortes w ∈ {0, 1}∗ . Die Parität p eines Wortes w ist Null wenn w eine gerade
Zahl von Einsen enthält und Eins sonst. M startet in der Konfiguration . . . 2z0 w2 . . . mit
Startzustand z0 und stoppt im Endzustand ze in der Konfiguration . . . 2w2ze p2 . . ..
Aufgabe 25 Entwerfen Sie für folgende Aufgaben je eine Turingmaschine:
a) Löschen des gesamten Bandes, d.h. alle Einsen und Nullen werden durch 2 ersetzt.
b) Invertieren der Eingabe, d.h. jede Null wird zur Eins und umgekehrt.
c) Multiplikation der Eingabe mit 2.
d) Kopieren der Eingabe, d.h. die Maschine erzeugt aus der Startkonfiguration
. . . 222z0 x1 x2 . . . xn 222 . . .
die Stopkonfiguration
. . . 222z0 x1 x2 . . . xn 2x1 x2 . . . xn 222 . . .
1.11 Übungen
33
Aufgabe 26 Suchen Sie im Internet nach Simulatoren für Turingmaschinen sowie nach
Online Beschreibungen, etc.
Aufgabe 27 Entwerfen Sie möglichst fleißige Biber mit 2, 3, und 4 Zuständen.
Aufgabe 28 Ziel dieser Aufgabe ist es, ein Programm zu schreiben, das die Funktion Σ(n)
berechnet.
a) Beschreiben Sie solch ein Programm.
b) Welches Problem tritt hier auf?
c) Warum ist es viel einfacher, ein Programm zu schreiben, das eine untere Schranke
für Σ(n) berechnet?
Kapitel 2
Berechenbarkeit und Komplexität
2.1 Berechenbarkeit
Aus der Komplexität von Algorithmen und auch aus dem Gebiet der formalen Sprachen
wissen wir, das es, abhängig vom jeweiligen Maschinenmodell unterschiedlich schwierige
Berechnungsaufgaben gibt. Zum Beispiel kann ein endlicher Automat das Wortproblem
für reguläre Sprachen lösen. Das Wortproblem für kontextfreie Sprachen dagegen können
endliche Automaten nicht (allgemein) lösen.
Wir wollen nun die Berechnungsprobleme einteilen in verschiedene Klassen entsprechend
ihrer Schwierigkeit, angefangen von den einfachen bis hin zu den unlösbaren Problemen. Als
Maschinenmodell werden wir deterministische und nichtdeterministische Turingmaschinen
betrachten.
Die Turingmaschine wird aus folgenden drei Gründen für unsere Betrachtungen gewählt:
•
Die Turingmaschine kann genau die intuitiv berechenbaren Probleme lösen (Churchsche These, unbewiesen).
•
Die Turingmaschine ist gleich mächtig wie der von-Neumann-Rechner, das heißt, dass
jedes Problem, das ein von-Neumann-Rechner löst auch von einer Turingmaschine
gelöst werden kann und umgekehrt.
•
Die Turingmaschine ist wesentlich einfacher aufgebaut als ein von-Neumann-Rechner
und daher für theoretische Analysen einfacher zu handhaben.
Zuerst wenden wir uns der Berechenbarkeit zu. Wir werden versuchen, zu verstehen, welche
Probleme für Turingmaschinen (und damit für Computer) lösbar und welche unlösbar sind.
Definition 2.1 Ein Berechnungsproblem (genauer: eine Funktion f : Nn 7→ N) heißt
(Turing)-berechenbar, wenn es eine Turingmaschine gibt, die für eine beliebige Instanz des Problems nach endlicher Zeit hält und eine korrekte Lösung berechnet.
Wegen dem oben gesagten sind alle berechenbaren Probleme durch ein Programm einer
(Turing-mächtigen) Programmiersprache lösbar.
Wir erinnern daran, daß Turingmaschinen genau die Typ-0-Sprachen erkennen, das heißt
die Turingmaschine löst das Wortproblem für Typ-0-Sprachen.
2.1 Berechenbarkeit
35
Ein Spezialfall der Berechenbarkeit für binäre Entscheidungsprobleme, wie zum Beispiel
die Frage ob eine boole’sche Formel erfüllbar ist oder nicht, ist die Entscheidbarkeit.
Definition 2.2 Ein Entscheidungsproblem (genauer: eine Funktion f : Nn 7→ {0, 1})
heißt entscheidbar, wenn es eine Turingmaschine gibt, die für eine beliebige Instanz
des Problems nach endlicher Zeit hält und eine korrekte Lösung berechnet.
Zu jedem Entscheidungsprobleme gibt es eine äquivalente Formulierung als Wortproblem
der Sprache aller Eingaben w mit f (w) = 1. In anderen Worten:
Das Entscheidungsproblem zu einer Funktion f : Nn 7→ {0, 1} ist die Sprache
L = {w ∈ Nn |f (w) = 1}.
Beispiel 2.1
Entscheidungsproblem
Ist eine Liste sortiert?
Erfüllbarkeit aussagenlogischer Formeln
Ist eine Zahl prim?
Sprache
sortierte Listen
erfüllbare aussagenlogische Formeln
Primzahlen
Die Lösung eines Entscheidungsproblems ist also äquivalent zur Lösung des Wortproblems
der zugehörigen Sprache.
Im Folgenden werden wir aufgrund dieser Äquivalenz bei Entscheidungsproblemen nicht
mehr zwischen Problem und Sprache unterscheiden.
Zunächst wollen wir einige Probleme angeben, die von Turingmaschinen nicht gelöst werden
können.
Besonders interessant ist die Tatsache, daß es formal wohl definierte praktisch relevante
Probleme gibt, die Turingmaschinen (prinzipiell) nicht lösen können. Wir werden nämlich
zeigen dass es viel mehr Funktionen gibt als es Turingmaschinen, bzw. Programme geben
kann. Daraus folgt dann, dass die überwiegende Anzahl von Funktionen nicht berechenbar
ist.
2.1.1 Das Halteproblem für Turingmaschinen
Formal ist eine Turingmaschine ein 7-Tupel aus endlichen Mengen. Das heißt jede Turingmaschine läßt sich (wie jedes Programm auch) durch eine endliche Zeichenkette (zum
Beispiel bestehend aus ASCII-Zeichen) beschreiben. Diese endliche Zeichenkette kann man
nun binär kodieren. Interpretiert man diesen Binärcode als natürliche Zahl, so erhält man
die eindeutige Nummer dieser Maschine.
Zu jeder Turingmaschine gibt es also deren eindeutige Nummer. Sicher gibt es eine Turingmaschine mit der kleinsten Nummer wmin . Also stellen die Zahlen 1 bis wmin − 1 (noch)
keine Turingmaschinen dar. Damit wir umgekehrt auch für jede natürliche Zahl eine Turingmaschine erhalten, definieren wir
die zu w gehörende Turingmaschine falls w eine Turingmaschine beschreibt
Mw =
Mw+1
falls w keine Turingmaschine beschreibt
36
2 Berechenbarkeit und Komplexität
Diese Funktion ordnet jeder natürlichen Zahl eine Turingmaschine zu.
Es gibt also abzählbar viele Turingmaschinen! Da die Zahl der Funktionen von natürlichen
Zahlen auf natürliche Zahlen aber überabzählbar ist (siehe unten), gibt es also mehr Funktionen als Turingmaschinen. Zwangsläufig sind also viele Funktionen (die weitaus überwiegende Anzahl) nicht berechenbar. Dies wollen wir festhalten.
Satz 2.1 Es gibt abzählbar viele Turingmaschinen. Die Zahl der Funktionen von natürlichen Zahlen auf natürliche Zahlen ist überabzählbar. Also sind viele Funktionen (die
weitaus überwiegende Anzahl) nicht berechenbar.
Beweis: Zu zeigen ist nur noch, dass die Menge aller Funktionen f : N 7→ N nicht
abzählbar ist. Das zeigen wir durch Widerspruchsbeweis. Der Beweis läuft analog zum
Beweis der Überabzählbarkeit der reellen Zahlen (Übung).
Wir nehmen an die Zahl der Funktionen von den natürlichen Zahlen auf die natürlichen Zahlen sei abzählbar. Die Funktionen lassen sich also durchnummerieren z.B. als
f1 , f2 , f3 , . . .. Eine Wertetabelle für alle Funktionen hat folgendes Aussehen:
x
f1 (x)
f2 (x)
f3 (x)
f4 (x)
f5 (x)
...
1
f1 (1)
f2 (1)
f3 (1)
f4 (1)
f5 (1)
...
2
f1 (2)
f2 (2)
f3 (2)
f4 (2)
f5 (2)
...
3
f1 (3)
f2 (3)
f3 (3)
f4 (3)
f5 (3)
...
4
f1 (4)
f2 (4)
f3 (4)
f4 (4)
f5 (4)
...
5
f1 (5)
f2 (5)
f3 (5)
f4 (5)
f5 (5)
...
...
...
...
...
...
...
...
Wir konstruieren nun eine Funktion g : N 7→ N, die in dieser Wertetabelle noch nicht
enthalten ist. g ist wie folgt definiert:
x
g(x)
1
2
3
4
5
...
f1 (1) + 1 f2 (2) + 1 f3 (3) + 1 f4 (4) + 1 f5 (5) + 1 . . .
g hat die Eigenschaft, sich von jeder der Funktionen an mindestens einer Stelle x ∈ N zu
unterscheiden. Dies ist jedoch ein Widerspruch zur Annahme, dass es nur abzählbar viele
Funktionen von N nach N gibt. Also ist die Behauptung bewiesen.
2
Wir wollen nun von einer speziellen Funktion zeigen, daß sie nicht entscheidbar ist. Das
sogenannte Halteproblem für Turingmaschinen besteht darin, eine ganz besondere Turingmaschine zu finden, die für eine beliebige Turingmaschine Mw und deren Eingabe x entscheiden soll, ob diese Maschine hält. w sei die binäre Kodierung von Mw .
Definition 2.3 Das (allgemeine) Halteproblem ist die Sprache
H = {w#x | Mw angesetzt auf x hält}.
2.1 Berechenbarkeit
37
Satz 2.2 Das Halteproblem H ist nicht entscheidbar.
Beweis: (einfache Variante) Angenommen, das Programm hält(w,x) löst das Halteproblem H(w, x), das heisst, bei Eingabe eines Programmes w und dessen Eingabe x gibt es
den Wert 1 aus, wenn w angesetzt auf x halten würde und 0 andernfalls. Nun bauen wir
folgendes neue Programm unmöglich:
unmöglich(int i)
{
if( hält(unmöglich,0))
while( TRUE ) printf(”das kann noch dauern ...”);
else
printf(”0”);
}
Dieses Programm kann es aber nicht geben, denn wenn (nach Voraussetzung) hält zum
Schluß kommt, dass es terminiert, dann hält es gerade nicht und umgekehrt. Schuld an diesem Widerspruch kann aber nur die Voraussetzung sein, dass hält das Halteproblem löst. 2
Beweis: (elegante, allgemeine Variante) Angenommen, H sei entscheidbar. Dann gibt es
eine Turingmaschine H(w, x), welche entscheidet, ob die Turingmaschine Mw bei Eingabe
von x hält. Wir betrachten die Tafel der berechneten Werte aller Turingmaschinen auf
allen Eingaben. In die Tafel wird überall dort, wo eine Maschine nicht anhält, oder nicht
in einem Endzustand hält, das Symbol ∞ eingetragen.1
Es sei
H(w, x) =
Mw (X)
Turing
masch.
Nr.
w
↓
1
2
3
4
5
..
.
1
∞
∞
1
2
1
..
.
1 falls Mw (x)hält
0 sonst
Eingabe x →
2
3
4
5
∞ ∞ ∞ ∞
1
0
2
7
∞ 1 ∞ 1
2
0
3
1
0
1
1
0
..
..
..
..
.
.
.
.
...
...
...
...
...
...
Nun wenden wir auf diese Tabelle die Turingmaschine H(w, x) an und bestimmen die
(Turing berechenbare) Funktion
0
falls H(w, x) = 0
Q(w, x) =
Mw (x) falls H(w, x) = 1
1
Die konkret eingetragenen Werte sind zufällig gewählt. Eine systematische Aufzählung der ersten n Zeilen
wäre möglich, wird jedoch der Einfachheit weggelassen.
38
2 Berechenbarkeit und Komplexität
Falls Mw (x) hält, verhält sich Q(w, x) gleich wie Mw (x). Andernfalls ist Q(w, x) = 0 .
Q(w, x)
w
↓
1
2
3
4
5
..
.
1
0
0
1
2
1
..
.
2
0
1
0
2
0
..
.
3
0
0
1
0
1
..
.
x
4
0
2
0
3
1
..
.
→
5
0
7
1
1
0
..
.
...
...
...
...
...
...
Nun nehmen wir alle Diagonalelemente von Q, d.h. Q(w, w) und addieren zu jedem 1. Die
resultierende Folge (1 + Q(w, w))w∈N ist offensichtlich Turing-berechenbar. Sie kommt
jedoch nicht in der Tabelle als Zeile vor, im Widerspruch zur Tatsache, daß in der Tabelle
jede Turingmaschine (und damit jede Turing-berechenbare Funktion) vorkommt.
2
Bemerkung: Die Zahl der Funktionen von N nach N ist überabzählbar. Die Zahl der
Turingmaschinen ist jedoch nur abzählbar. Daher kann nicht jede Funktion von N nach N
(Turing) berechnet werden. Das Halteproblem ist eine dieser nicht berechenbaren Funktionen.
Satz 2.3 Die Funktion S(n), die angibt, wie gross die maximale Zahl von Schritten ist, die
eine Turingmaschine mit n Zuständen (ohne Endzustand) und einem Bandalphabet mit
zwei Zeichen machen kann, bevor sie anhält, ist nicht berechenbar.
Beweis: Angenommen, S(n) wäre berechenbar. Dann wäre das Halteproblem entscheidbar. Um das Halteproblem für eine gegebene Turingmaschine M mit n Zuständen und
Eingabe x zu lösen, müsste man nur S(n) berechnen und dann M auf der Eingabe x
starten. Nach höchstens S(n) Schritten steht die Antwort fest. S(n) kann also nicht berechenbar sein.
2
Satz 2.4 Die Funktion Σ(n), die angibt, wie gross die maximale Zahl von Einsen ist, die ein
fleißiger Biber mit n Zuständen (ohne Endzustand) ausgeben kann, ist nicht berechenbar.
Beweis: Angenommen, Σ(n) wäre berechenbar und EvalΣ sei solch eine Turingmaschine,
welche gestartet auf einem Band mit n Einsen Σ(n) berechnet und am Ende Σ(n) Einsen
auf das Band schreibt. EvalΣ habe N Zustände. N ist konstant und n variabel.
Nun konstruieren wir eine neue Turingmaschine. Es sei Verdopple eine TM, die die Zahl
der Einsen auf dem Band verdoppelt. Diese Maschine benötigt wenige Zustände. Außerdem sei SchreibeEinsen eine TM, mit N Zuständen, die N Einsen auf das Band schreibt.
Nun betrachten wir die Komposition SchreibeEinsen | Verdopple | Verdopple | EvalΣ. Diese
Maschine kommt mit etwas mehr als 2N Zuständen aus, schreibt aber Σ(4N ) Einsen auf
das Band. Dies steht im Widerspruch zur Definition von Σ(n).
2
2.1 Berechenbarkeit
39
2.1.2 Die Ackermannfunktion
Definition 2.4 Eine Funktion, die nicht ganz so schnell wächst wie S(n) und Σ(n) ist
die wie folgt definierte Ackermannfunktion:
a(0, n) = n + 1
a(m, 0) = a(m − 1, 1)
für m > 0
a(m, n) = a(m − 1, a(m, n − 1))
für m > 0, n > 0
Wertetabelle:
n
m\n
0
1
2
3
0
1
2
3
5
0
1
1
2
3
5
13
2
3
4
7
29
2
3
4
5
9
61
4
5
6
11
125
3
5
6
7
13
253
6
7
8
15
509
7
8
9
17
1021
8
9
10
19
2045
4
9
10
11
21
4093
... n
a(4, n) 13 65533 265536 − 3 a(3, 265536 − 3) a(3, a(4, 3)) . . .
Schon die Berechnung von a(2, 1) ist nicht ganz einfach:
a(2, 1) =
=
=
=
=
=
=
=
=
=
=
=
=
=
a(1, a(2, 0))
a(1, a(1, 1))
a(1, a(0, a(1, 0)))
a(1, a(0, a(0, 1)))
a(1, a(0, 2))
a(1, 3)
a(0, a(1, 2))
a(0, a(0, a(1, 1)))
a(0, a(0, a(0, a(1, 0))))
a(0, a(0, a(0, a(0, 1))))
a(0, a(0, a(0, 2)))
a(0, a(0, 3))
a(0, 4)
5
Die Ackermannfunktion ist berechenbar (siehe Aufgabe ??).
10
11
12
23
8189
...2
2
2|{z}
−3
(n+3) mal
40
2 Berechenbarkeit und Komplexität
Definition 2.5 Eine Sprache L heißt halbentscheidbar, wenn es eine deterministische
Turingmaschine gibt, die für jedes Wort w ∈ L nach endlicher Zeit terminiert und mit
“ja” antwortet. Für Worte w ∈
/ L gibt die Maschine “nein” aus oder hält nicht.
Definition 2.6 Eine Sprache L heißt rekursiv aufzählbar, wenn gilt L =
{w1 , w2 , w3 , . . .} und wenn es eine deterministische Turingmaschine gibt, welche die Elemente der Folge {w1 , w2 , w3 , . . .} nacheinander berechnen (aufzählen) kann.
Satz 2.5 Eine Sprache ist rekursiv aufzählbar genau dann wenn sie halbentscheidbar ist.
Beweis: “⇒”: Sei L rekursiv aufzählbar. Da jedes Wort aus L nach endlicher Zeit erzeugt
wird, ist sie halbentscheidbar. Das Entscheidungsverfahren für ein vorgegebenes Wort w
muß nur zusätzlich bei jedem erzeugten Wort prüfen, ob es gleich w ist.
Die andere Richtung ist etwas schwieriger (siehe [9]).
2
Satz 2.6 Das Halteproblem für Turingmaschinen ist halbentscheidbar.
Beweis: Es ist nicht schwierig, einen Turingmaschinensimulator zu programmieren. Diesen verwenden wir um die zu überprüfende Turingmaschine Mw mit der Eingabe x zu
simulieren. Wenn die simulierte Maschine hält, wird “ja” ausgegeben.
2
2.1.3 Das Post’sche Korrespondenzproblem
Beim Post’schen Korrespondenzproblem ist eine endliche Folge von Wortpaaren (x1 , y1 ),
(x2 , y2 ), . . . (xk , yk ) mit xi , yi ∈ {0, 1}+ gegeben. Gesucht ist eine Folge von Indizes i1 , i2 , . . . , in
mit xi1 , xi2 , . . . xin = yi1 , yi2 , . . . yin .
Beispiel 2.2 Das Problem ((000, 000), (11, 110), (01, 100), (010, 10), (0001, 010)) besitzt die
Lösung (2, 3, 5, 1, 4), denn
x2 , x3 , x5 , x1 , x4 = 11010001000010 = y2 , y3 , y5 , y1 , y4 .
Satz 2.7 Das Post’sche Korrespondenzproblem ist halbentscheidbar.
Das Post’sche Korrespondenzproblem ist rekursiv aufzählbar, denn es gibt ein Programm,
das kombinatorisch alle Folgen von Indizes i1 , i2 , . . . , in aufzählen und deren Zugehörigkeit
zur Sprache des Post’sche Korrespondenzproblems testen kann (siehe Aufgabe 33).
2.2 Komplexitätsklassen
41
Satz 2.8 Das Post’sche Korrespondenzproblem ist nicht entscheidbar.
Ein Beweis kann z.B. in [9] nachgelesen werden. Die Aussage des Satzes ist anschaulich
sehr plausibel (siehe Übung 33).
2.2 Komplexitätsklassen
Eine nichtdeterministische Turingmaschine unterscheidet sich von einer deterministischen
darin, dass bei der nichtdeterministischen Turingmaschine für ein gelesenes Bandzeichen in
einem bestimmten Zustand mehrere verschiedene Aktionen möglich sind. Ein Problem gilt
als gelöst von einer derartigen Maschine, wenn es eine Folge von Aktionen gibt, die zur
Lösung des Problems führt. Nach unserem heutigen Wissen ist dies eine nicht besonders
praktische Maschine. Wer sagt ihr wie sie an den kritischen Stellen verzweigen soll? Ein
Orakel!?
Es wäre aber auch denkbar, dass an jeder Verzweigung die Maschine Kopien von sich
erzeugt und zwar so viele wie es Zweige gibt. Das funktioniert in der Praxis aber nur mit
unbeschränkten Ressourcen an Parallelität.
Definition 2.7 Die Klasse P umfaßt alle Berechnungsprobleme, die von einer deterministischen Turingmaschine in polynomieller Zeit gelöst werden können. Die Klasse N P
umfaßt alle Berechnungsprobleme, die von einer nichtdeterministischen Turingmaschine
in polynomieller Zeit gelöst werden können.
Es folgt sofort, dass
P ⊆ N P,
denn nichtdeterministische Turingmaschinen sind mächtiger. Nun wollen wir einige Probleme in N P betrachten.
Satz 2.9 Das aussagenlogische Erfüllbarkeitsproblem SAT für Formeln in konjunktiver
Normalform ist in N P .
Beispiel 2.3 (A ∨ B ∨ ¬C) ∧ (C ∨ D) ∧ (¬A ∨ ¬C) ist in konjunktiver Normalform.
Eine nichtdeterministische Turingmaschine rät für jede Aussagevariable einer Formel einen
Wahrheitswert, setzt diesen ein und überprüft die Gültigkeit in linearer Zeit.2
Eine deterministische Turingmaschine hätte hier (insbesondere beim Raten) ihre Probleme.
Dies glauben jedenfalls die Fachleute, denn es ist bis heute kein Programm bekannt, welches
SAT in polynomieller Zeit löst.
Neben vielen anderen sind folgende Probleme in N P .
2
Falls die Formel unerfüllbar ist, kann aufgrund der bekannten linearen Komplexität des Überprüfens nach
einer vorher festgelegten Zeit abgebrochen werden und “unerfüllbar” ausgegeben werden.
42
2 Berechenbarkeit und Komplexität
TSP: Die Entscheidungsvariante des Travelling-Salesman-Problems: Ist die kürzeste Rundreise durch n gegebene Städte mit Entfernungsmatrix M kürzer als k?
HC: Enthält ein ungerichteter Graph einen Hamiltonschen Kreis? Dies ist ein geschlossener Weg, der jeden Knoten genau einmal enthält.
CLIQUE: Die Entscheidungsvariante des Cliquenproblems. Enthält ein Graph mit n Knoten eine Clique mit k ≤ n Knoten? Eine Clique ist ein vollständig vernetzter Graph.
COMP: Gibt es für eine ganze Zahl k ganze Zahlen m, n > 1 mit k = mn? (Ist k
Primzahl?)
GISO: Sind zwei Graphen G = (V, E) und G0 = (V 0 , E 0 ) isomorph, d.h. gibt es eine
bijektive Funktion f : V → V 0 so dass (u, v) ∈ E genau dann wenn (f (u), f (v)) ∈ E 0 .
Da P ⊆ N P ist natürlich jedes der einfachen Entscheidungsprobleme aus P (zum Beispiel
das Wortproblem für reguläre Sprachen) auch in N P . Die hier genannten Probleme sind
allerdings als schwierig bekannt.
2.2.1 Platzkomplexität
Definition 2.8 PSPACE enthält genau die Sprachen L, für die es eine deterministische
Turingmaschine T gibt, die L entscheidet und für die die Zahl der maximal verwendeten
Bandstellen höchstens polynomiell mit der Eingabelänge n wächst. Analog ist NPSPACE
für nichtdeterministische Turingmaschinen definiert.
Beispiel 2.4 Das Problem SAT ist in PSPACE. Dies beweist man, indem man zeigt,
dass das Überprüfen aller Belegungen der Variablen einer SAT-Formel mittels Tiefensuche
durchgeführt werden kann (siehe [12], Aufgabe 2.5).
2.3 NP-Vollständigkeit
2.3.1 Polynomielle Transformation
Um Probleme bezüglich ihrer Schwierigkeit anordnen zu können, benötigen wir eine Möglichkeit, Probleme bezüglich ihrer Schwierigkeit zu vergleichen. Aussagen der Art
“Problem P2 ist mindestens so schwierig wie Problem P1 ”
sind gefordert. Informal bezeichnen wir ein Problem P2 als mindestens so schwierig wie P1 ,
wenn sich P1 mit wenig Aufwand auf P2 zurückführen läßt.
2.3 NP-Vollständigkeit
43
Definition 2.9 Eine polynomielle Transformation einer Sprache L1 ⊂ Σ∗1 auf eine
Sprache L2 ⊂ Σ∗2 ist eine mit polynomieller Komplexität berechenbare Funktion f :
Σ∗1 → Σ∗2 mit
∀w ∈ Σ∗1 w ∈ L1 ⇔ f (w) ∈ L2 .
Läßt sich L1 auf L2 polynomiell transformieren, so schreiben wir L1 L2 .
Beispiel 2.5 Das Problem HC läßt sich polynomiell transformieren auf das Problem TSP.
Wie?
Definition 2.10 Eine Sprache L ∈ N P heißt NP-vollständig, wenn für alle anderen
Sprachen L0 ∈ N P gilt L0 L, d.h. wenn sich alle anderen Sprachen polynomiell auf L
transformieren lassen.
Lemma 2.1 Wenn für ein NP-vollständiges Problem gezeigt wird, dass es in P ist, so gilt
P = NP.
Beweis: Sei L eine NP-vollständige Sprache für die gezeigt ist, dass sie sogar in P
ist. Das heißt, das Wortproblem für L ist polynomiell lösbar und für die Rechenzeit gilt
TL (n) = O(nk ) mit einer Konstante k. Da L NP-vollständig ist, sind alle L0 ∈ N P polynomiell transformierbar auf L. Die Transformation f für ein beliebiges L0 hat also auch
polynomielle Rechenzeit Tf (n) = O(nm ). Damit kann das Problem L0 gelöst mit einer
Gesamtkomplexität von
TL0 (n) = TL (n) + Tf (n) = O(nm ) + O(nk ) = O(nm + nk ) = O(nmax{m,k} ).
Das Wortproblem für L0 ist damit polynomiell lösbar. Also gilt für alle Sprachen L0 ∈ N P
auch L0 ∈ P und damit P = N P .
2
Die Wissenschaftler glauben heute, dass P 6= N P , denn die NP-vollständigen Probleme
sind so schwierig, dass man es für unmöglich hält auch nur eines (und damit alle!) polynomiell zu lösen. Dies ist aber nicht bewiesen. Daher:
Vermutung: P 6= N P .
Wir wollen nun die bisher bekannten Problemklassen grafisch veranschaulichen. Die folgende Abbildung beinhaltet die soeben formulierte Vermutung.
44
2 Berechenbarkeit und Komplexität
alle Berechnungsprobleme
rekursiv aufzählbare, bzw. halbentscheidbare Probleme (Typ-0Sprachen)
berechenbare, bzw. entscheidbare Probleme (Typ-1-Sprachen)
NP-harte Probleme
NP
NP-vollständige Probleme
P
Die oben genannten Probleme ordnen sich folgendermassen in das Bild ein [11]: TSP, HC
und CLIQUE sind NP-vollständig. GISO ist noch unbekannt. d.h. es ist noch nicht bekannt
ob es NP-vollständig ist. COMP ist in P. Alle Probleme sind in NP.
Da es durchaus noch schwierigere Probleme gibt als die NP-vollständigen Probleme, ist es
sinnvoll, sich zu fragen, ob sich ein Problem aus N P auf irgend ein Problem polynomiell
transformieren lassen.
Definition 2.11 Eine Sprache L heißt NP-hart, falls sich alle Sprachen aus N P polynomiell auf L transformieren lassen.
2.4 Übungen
Aufgabe 29
a) Wieviele verschiedene Funktionen gibt es von einer n-elementigen Menge auf sich
selbst?
b) Wieviele invertierbare Funktionen gibt es von einer n-elementigen Menge auf sich
selbst?
c) Wir betrachten Funktionen f : {0, 1}n 7→ {0, 1}m von Bit-Vektoren auf Bit-Vektoren.
Wieviele verschiedene Funktionen gibt es von diesem Typ?
d) Für welche Werte n, m aus Teilaufgabe c gibt es keine invertierbaren Funktionen?
Wieviele invertierbare Funktionen gibt es für festes n und m?
Aufgabe 30 Vervollständigen Sie folgende Tabelle:
2.4 Übungen
45
Entscheidungsproblem
Sprache
C-Programme
C-Programme die terminieren
aussagenlogische Formeln
wahre aussagenlogische Formeln
prädikatenlogische Formeln
wahre prädikatenlogische Formeln
gerade Zahlen
Post’sches Korrespondenzproblem
TSP
HC
CLIQUE
GISO
Aufgabe 31 Untersuchen Sie die folgenden Funktionen auf Berechenbarkeit:
a) f : {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}∗ → {0, 1} mit f (x) = 1 genau dann, wenn x das Anfangsstück der Dezimaldarstellung von π ist. Z.B. ist f (31415) = 1 und f (33333) = 0.
b) g : {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}∗ → {0, 1} mit g(x) = 1 genau dann, wenn x irgendwo in
der Dezimaldarstellung von π vorkommt.
c) h : {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}∗ → {0, 1} mit h(n) = 1 genau dann, wenn irgendwo in der
Dezimaldarstellung von π eine Folge von mit mindestens n mal der Ziffer 7 vorkommt.
Aufgabe 32 Ist für jede reelle Zahl r die Funktion fr berechenbar? Es sei fr (x) = 1 genau
dann, wenn x das Anfangsstück der Dezimaldarstellung von r ist.
Aufgabe 33 Post’sches Korrespondenzproblem
a) Lösen sie das Problem ((01, 11), (0, 010), (100, 00)).
b) Schreiben Sie ein Programm, das bei Eingabe einer Liste von Paaren über {0, 1}+
dieses Problem löst.
Aufgabe 34 Zeigen Sie: Wenn eine Sprache L halbentscheidbar ist und ihr Komplement
L̄ = Σ∗ \L auch halbentscheidbar ist, dann ist L entscheidbar.
Aufgabe 35 Geben sie für die Sprache der geraden Zahlen in Binärdarstellung, d.h. über
dem Alphabet {0, 1} eine reguläre Grammatik sowie einen regulären Ausdruck an.
Aufgabe 36
a) Zeigen Sie, daß die Programmverifikation – d.h. der Beweis der Korrektheit – für
beliebige C-Programme unentscheidbar ist. Zitieren Sie hierzu einen oder mehrere
Sätze aus der Vorlesung, bzw. aus dem Buch von U. Schöning.
46
2 Berechenbarkeit und Komplexität
b) Geben Sie eine unendliche Menge von C-Programmen an, die automatisch verifiziert
werden können (mit Begründung!).
Aufgabe 37 Beschreiben Sie die Menge aller Barbiere, die genau die Personen rasieren,
welche sich nicht selbst rasieren. (Tipp: Rasiert sich ein solcher Barbier selbst?)
Literaturverzeichnis
[1] A. Asteroth and C. Baier. Theoretische Informatik. Pearson Studium, 2003. Sehr
empfehlenswertes Buch.
[2] J.E. Hopcroft, R. Motwani, and J.D. Ullman. Einführung in die Automatentheorie,
Formale Sprachen und Komplexitätstheorie. Pearson Studium, 2002. Der Klassiker,
ausführlich, gute Erklärungen.
[3] J.D. Ullman, M.S. Lam, R. Sethi, and A.V. Aho. Compiler. Pearson Studium, 2002.
Für den, der es wirklich wissen will.
[4] G. Vossen and K.U. Witt. Grundkurs Theoretische Informatik. Vieweg, 2006.
[5] N. Blum. Theoretische Informatik. Oldenbourg, 1998. Gutes Buch, Berechenbarkeit
und Komplexität recht kurz, enthält auch noch Graphen und Algorithmen.
[6] J. Hromkovic. Theoretische Informatik. Teubner, 2007.
[7] I. Wegener. Theoretische Informatik – eine algorithmische Einführung. Teubner Verlag, 1993.
[8] I. Wegener. Kompendium Theoretische Informatik – eine Ideensammlung. Teubner
Verlag, 1996. Als Ergänzung zur Vorlesung und zum besseren Verständnis hervorragend geeignet. Ohne Formeln wird ein Überblick vermittelt.
[9] U. Schöning. Theoretische Informatik kurzgefasst. Spektrum Akademischer Verlag,
1992. Gutes Buch, aber etwas zu theoretisch für die FH.
[10] R. Socher. Theoretische Grundlagen der Informatik. Fachbuchverlag Leipzig, 2003.
Gutes Buch auf FH-Niveau über formale Sprachen.
[11] M. Garey and D. Johnson. Computers and Intractability. A Guide to the Theory of
NP-Completeness. Freeman, 1979. Umfassendes Werk zur NP-Theorie mit Tabelle
von NP-Problemen.
[12] W. Ertel. Grundkurs Künstliche Intelligenz. Vieweg-Verlag, 2007.
[13] M. Brill. Mathematik für Informatiker. Hanser Verlag, 2001. Sehr gutes Buch, das
auch diskrete Mathematik beinhaltet.
[14] P. Tittmann. Graphentheorie. Fachbuchverlag Leipzig, 2003. Sehr gutes Buch mit
vielen Beispielen. Leider fehlen die Wegesuchalgorithmen.
[15] T.H. Cormen, Ch.E. Leiserson, and R. L. Rivest. Introduction to Algorithms. MIT
Press, Cambridge, Mass, 1994. Sehr gute Einführung in die Analyse von Algorithmen.
[16] R. Sedgewick. Algorithmen. Addison-Wesley, Bonn, 1995. Übersetzung d. engl. Originals, empfehlenswert.
48
Literaturverzeichnis
[17] A. K. Dewdney. New Turing Omnibus. W.H. Freeman & Company, 1993.
[18] H. Marxen.
2001.
Busy beaver.
http://www.drb.insel.de/~heiner/BB/index.html,
Herunterladen