Theoretische Informatik - Deduktion und Korrekte Software

Werbung
Theoretische Informatik
Skript zur Vorlesung
Prof. Dr. Uwe Petermann
FB IMN, HTWK Leipzig
Gustav-Freytag-Str. 42A, Leipzig
[email protected]
4. Juni 2006
c Uwe Petermann
Vortrag oder anderweitige Verwertung, Reproduktion, Vervielfältigung, Mikroverfilmung,
Speicherung in und Bearbeitung mit elektronischen Systemen sowie Übersetzung auch von
Bestandteilen dieses Lehrmaterials bedürfen der Genehmigung des Autors, falls sie nicht mit der im
Titel genannten Vorlesung in Verbindung stehen.
Zur Beachtung: Dieser Text wird weiter ergänzt und u.U. modifiziert.
1
Komplexität von Algorithmen und Problemen
1.1
Ressourcenbedarf von Programmen
Die wesentlichen Ressourcen, die von Programmen beansprucht werden, sind
Speicherplatz und Rechenzeit.
Nachfolgend wird vor allem der Bedarf an Rechenzeit untersucht.
Dabei wird stillschweigend angenommen, daß genügend Speicher zur Verfügung
steht, um die Probleme zu lösen, die in der verfügbaren Zeit überhaupt bearbeitbar sind. Andererseits besteht ein Zusammenhang zwischen Speicherbedarf und
Zeitaufwand, da der Aufwand für das Beschreiben von (neuen) Speicherzellen
ebenfalls im Zeitaufwand widergespiegelt wird.
1.2
Algorithmenmodelle
Um über den Zeitbedarf von Algorithmen sprechen zu können, muß zunächst eine Formalisierung des Algorithmenbegriffs angegeben werden. Nach der Churchschen These sind alle bekannten universellen Algorithmenmodelle gleichwertig
hinsichtlich der Klasse der durch sie beschreibbaren Funktionen. Deshalb ist es
gerechtfertigt, jeweils das Algorithmenmodell zu benutzen, welches die für die
jeweilige Untersuchung am geeignetsten ist.
Für prinzipielle Abschätzungen der Schwere von Problemen ist es oft zweckmäßig,
abstraktere Algorithmusmodelle zu benutzen. Andernfalls sind die entstehenden mathematischen Probleme zu schwierig. Die Verwendung sehr abstrakter
Modelle kann auch formal gerechtfertigt werden, indem nachgewiesen werden
kann, daß sich die Komplexität der Algorithmen beim Übergang von der Formulierung in einem Modell zu einem anderen nicht wesentlich ändert. Nicht
wesentlich heißt hier, daß der Übergang innerhalb der gleichen Größenordnung
erfolgt.
1.2.1
Programmiersprachen
Um die Zeitkomplexität von Algorithmen zu beurteilen, die in realen Programmiersprachen formuliert sind, ist es zweckmäßig folgende Operationen zu zählen:
(1) Ausführung von arithmetischen, Vergleichs- oder logischen Operationen,
(2) Wertzuweisung auf einfache Variablen oder Zeigervariablen,
(3) Berechnung des Werts von indizierten Variablen, Zeigervariablen oder Feldern von Datenstrukturen oder Klassen,
(4) Initialisierung von Prozedur- oder Funktionsaufrufen,
(5) Übergabe der Werte von Aktualparametern sowie
2
(6) Ausführung der leeren Anweisung, eines Sprungbefehls oder einer (einfachen) Ein- oder Ausgabe.
Bei dieser Zählweise wird vorausgesetzt, daß eine gemeinsame Obergrenze der
Kosten dieser Operationen angenommen werden kann.
Diese Voraussetzung schließt ein, daß die Größe der bearbeiteten elementaren Daten durch einen endlichen Wert sinnvoll nach oben abgeschätzt werden
kann. Dies ist bei Implementierungen auf üblichen Rechnerarchitekturen der
Fall, wenn zur Darstellung der elementaren Datentypen die rechnerinternen
Repräsentationen benutzt werden.
Kann letztere Voraussetzung nicht gemacht werden, müssen für die Elementaroperationen Kosten veranschlagt werden, die proportional zum Logarithmus
der Argumentewerte sind. Dies wäre beispielsweise beim Rechnen mit Zahlen
der Fall, die durch Objekte der Java-Klasse java.math.BigInteger dargestellt
werden.
1.2.2
Turing-Maschinen
Der Begriff der Turing-Maschine (kurz: TM) geht auf Alan M. Turing zurück
[Tur36] zurück. Dieser Algorithmenbegriff ist durch das Rechnen mit Bleistift
und Papier inspiriert. Die TM ist dadurch etwas weiter als die RM von der
heutigen Hardware entfernt. Jedoch zeichnet sie sich durch große Einfachheit
der Definition aus. Die TM modelliert ein in zwei Richtungen unendliches Band
{ci }i∈Z von gleichartigen Feldern, in die Zeichen aus einem endlichen Bandalphabet Γ geschrieben werden können. Ein Schreib-Lese-Mechanismus kann in
Einerschritten über dem Band positioniert werden. Die Maschine befindet sich
stets in einem internen Zustand, welcher Element einer endlichen Menge Q ist.
In einem Takt wird
(1) der Inhalt des aktuellen Feldes gelesen und
(2) in Abhängigkeit vom gelesenen Symbol und vom internen Zustand der
TM wird
(a) ein Zeichen in das aktuelle Feld geschrieben sowie
(b) die Position des Schreib-Lese-Mechanismus um ein Feld verschoben
oder konstant gehalten und schließlich
(c) eventuell der interne Zustand verändert.
Nehmen wir an, daß die Bewegungsrichtungen des Schreib-Lese-Kopfes durch
R, L und N dargestellt werden, kann man ein Programm für eine TM als eine
Abbildung
Q × Γ → Q × Γ × {R, L, N }
auffassen.
Turing-Maschinen werden detailierter in Abschnitt 2 behandelt.
3
1.2.3
Registermaschinen
Definition 1.1 (vgl. [Weg93] S. 9 ff)
Eine Registermaschine (kurz: RM, engl. RAM, d.h. random access machine)
besteht aus folgenden Komponenten:
Speicher: unendliche Folge c = {ci }i∈N natürlicher Zahlen, das Element c0
heißt Akkumulator,
Befehlszähler: natürliche Zahl, nachfolgend als b notiert.
Programm: endliche Folge {ai }i∈N von Befehlen. Zulässige Befehle sind in
folgender Tabelle dargestellt.
Befehl
storei
loadi
cloadi
addi
caddi
subi
csubi
multi
cmulti
gotoj
if c0 sl gotoj , s bedeutet eines der binären Relationssymbole
=, <, >, ≥, ≤.
neuer Wert eines Registers neuer Wert des Befehlzählers
falls verändert, dann wie folgt:
c(i) := c(0)
b:=b+1
c(0) := c(i)
b:=b+1
c(0) := i
b:=b+1
c(0) := c(0) + c(i)
b:=b+1
c(0) := c(0) + i
b:=b+1
c(0) := max(c(0) − c(i), 0) b:=b+1
c(0) := max(c(0) − i, 0)
b:=b+1
c(0) := c(0) ∗ c(i)
b:=b+1
c(0) := c(0) ∗ i
b:=b+1
b := j
j
. . . c0 sl erfüllt
b :=
b + 1 . . . sonst
end
Abarbeitung: Folge von Zuständen {(b, c)k }k∈n , wobei jeder Zustand (außer
dem null-ten) durch eine Befehlsausführung aus seinem Vorgänger hervorgeht.
2
Die RM spiegelt die realen Rechner hinreichend gut wider. Die Zahl der Rechenschritte auf der RM unterscheidet sich nur um einen konstanten Faktor
von der Schrittzahl auf realen Rechnern. Dies gilt zumindest solange nur mit
Zahlen einer festen Maximalgröße gerechnet wird. Es kann dann das uniforme
Kostenmaß verwendet werden. D.h. jeder Befehl der RM wird mit einer Kosteneinheit veranschlagt. Muß diese Annahme fallengelassen werden, so muß
mit dem logarithmischen Kostenmaß gerechnet werden. Dann geht die Länge
der Darstellung der verarbeiteten Zahlen in die Kosten ein.
4
1.2.4
Nichtdeterministische Registermaschinen
Definition 1.2
Eine nichtdeterministische Registermaschine hat im Vergleich zur (deterministischen) Registermaschine folgenden zusätzlichen Befehl:
• choosei - lege einen der Werte 0 oder 1 in der i-ten Speicherzelle ab.
2
Ein Zustand (b, c) hat zwei mögliche Nachfolger, wenn der nach dem Wert des
Befehlszählers auszuführende Befehl choosei ist. Der Begriff der Abarbeitung
in einer nichtdeterministischen RM wird analog zu Definition 1.1 eingeführt.
1.2.5
while-Programme
while-Programme arbeiten ähnlich den Registermasschinen mit Speicherzellen,
die natürliche Zahlen aufnehmen können.
Es werden Mengen von Funktionsanweisungen F M = {vor, nach} und Testanweisungen T M = {null} angenommen. Diese Anweisungen beziehen sich jeweils
auf eine Speicherzelle i (Notation nachi , vori , nulli ).
nachi ersetzt den Inhalt der i-ten Speicherzelle durch dessen Nachfolger, vori
berechnet den Vorgänger, soweit er existiert, und läßt den Wert unverändert
andernfalls. nulli prüft, ob der Inhalt der i-ten Speicherzelle 0 ist oder nicht,
und liefert 1 oder 0 als Wert bei Erfülltheit bzw. Nichterfülltheit der Bedingung.
ΦF M,T M bezeichnet die Menge der mit diesen Anweisungen formulierbaren
while-Programme.
5
1.3
Begriffe zur Komplexität
• Sei F : E → A eine berechenbare Funktion für Mengen E und A von
Eingabe- bzw. Ausgabewerten .
• g, k : E → N sind Funktionen,
die die Größe einer Eingabe (Größenmaß) und den Aufwand zur Berechnung des Funktionswertes für eine Eingabe (Kostenfunktion) angeben.
• Die Mengen E und A sind als Teilmengen von N kodiert.
• Die Funktion F ist mit Register- oder Turingmaschinen berechenbar.
• Die Kostenfunktion kann z.B. durch Zählen der Ausführungen von Tests
und Elementaranweisungen definiert werden.
• Die Größe eines Eingabewertes e kann als konstant angesehen werden,
wenn seine Größe sinnvoll von ober abgeschätzt werden kann.
Sonst ist seine Größe durch die Länge der Binärdarstellung seiner Kodierung als natürliche Zahl anzusetzen.
• Definitionen für Größenmaß und Kostenfunktion werden so gewählt, daß
die Problemstellung adäquat widergespiegelt wird.
• Bei gegebenen Größenmaß und Kostenfunktion können folgende Komplexitätsmaße definiert werden:
1.3.1
Kosten im schlimmsten Fall (worst case cost)
KF (n) = sup {k(e) | e ∈ E, g(e) = n}
1.3.2
Kosten im mittleren Fall (average case cost)
Wenn
• für n ∈ N die Menge En = {e ∈ E | g(e) = n} endlich ist,
• und eine Verteilungsfunktion Wn : En → [0, 1] mit Σg(e)=n Wn (e) = 1
gegeben ist,
dann
KFav (n) = Σg(e)=n Wn (e) ∗ k(e)
• Bei der Angabe der Kostenfunktionen muß oftmals auf deren genaue Angabe verzichtet werden,
da häufig keine geschlossene Darstellung möglich ist.
6
• Es wird angegeben, wie sich die Funktionen für große Eingabewerte verhalten.
• Es ist folgende Notation für dieses asymptotische Verhalten üblich (vgl.
[CLRS01, HMU02, Weg93]):
Definition 1.3 Sei f : N → N eine Funktion. Es werden folgende Mengen von
Funktionen definiert:
Angabe einer oberen Schranke:
O(f ) = g ∈ NN | ∃c > 0∃n0 ∀n ≥ n0 : g(n) ≤ f (n)
Angabe einer unteren Schranke:
Ω(f ) = g ∈ NN | ∃c > 0∃n0 ∀n ≥ n0 : g(n) ≥ f (n)
Angabe einer oberen und unteren Schranke:
Θ(f ) = g ∈ NN | ∃c, d > 0∃n0 ∀n ≥ n0 : 1/c ∗ f (n) ≤ g(n) ≤ d ∗ f (n)
2
1.3.3
Beispiel zur Anwendung der Notation
Beispiel 1.1
max(4, 2 ∗ n2 − 7) = O(n2 )
c = 2, n0 = 3
1.3.4
Einige Rechenregeln für Größenordnungen
f = O(g), g = O(h)
→ f = O(h)
(1)
f = Θ(g), g = Θ(h)
→
f = Θ(h)
(2)
f = O(g), g = O(f )
→
f = Θ(g)
(3)
f = Θ(g)
→
g = Θ(f )
(4)
g = O(f )
→
k ∗ g = O(f )
(5)
g = O(f ), h = O(f )
→
g + h = O(f )
(6)
g = O(f1 ), h = O(f2 )
→
g ∗ h = O(f1 ∗ f2 )
(7)
7
2
Turing-Maschinen
Der Begriff der Turing-Maschine geht auf Alan M. Turing zurück [Tur36].
Dieser Algorithmenbegriff erscheint wie durch das Rechnen mit Bleistift und
Papier inspiriert.
Er wirkt dadurch etwas von der heutigen Hardware entfernt.
Jedoch zeichnet er sich durch große Einfachheit der Definition aus.
Dadurch ist dieser Maschinentyp vor allem geeignet, wenn sehr grundlegende
Aussagen bewiesen werden sollen.
Die Turing-Maschine modelliert ein unendliches Band von gleichartigen Feldern,
in die Zeichen aus einem endlichen Alphabet geschrieben werden können.
Ein Schreib-Lese-Mechanismus kann in Einerschritten über dem Band positioniert werden.
In einem Takt wird der Inhalt eines Feldes gelesen und geschrieben und die
Position des Schreib-Lese-Kopfs neu bestimmt.
Außerdem erfolgt ein Zustandsübergang.
2.1
Formalisierung der Turing-Maschine
Definition 2.1 Turing-Maschine
Eine Turing-Maschine M = (Q, Γ, δ, q0 , F ) hat folgende Komponenten
• Q, die endliche Zustandsmenge,
• q0 ∈ Q, einen Anfangszustand,
• F ⊆ Q, eine Menge von akzeptierenden oder Endzuständen,
• Σ, ein endliches Eingabealphabet,
• Γ, ein endliches Bandalphabet, Γ enthält immer auch das Zeichen B, B 6∈ Σ
und umfaßt das Eingabealphabet,
• δ : Q × Γ → 2Q×Γ×{−1,0,+1} , eine Übergangsfunktion.
M heißt deterministisch (kurz: DTM), wenn |δ(q, a)| = 1 für alle (q, a) ∈ Q × Γ.
Anderenfalls heißt M nichtdeterministisch (kurz: NTM).
Ein Wort uqv mit u, v ∈ Γ∗ , q ∈ Q heißt Konfiguration. Dabei wird angenommen, daß das erste und letzte Alphabetssymbol in uqv die auf dem Band am
weitesten links bzw. rechts stehenden vom Blank-Symbol verschiedenen Zeichnen sind.
Eine Konfiguration uqv beschreibt also eine Situation, in der der Lese-SchreibKopf der Turing-Maschine über dem ersten Symbol des Wortes v steht und im
Zustand q ist.
8
Für Konfigurationen k, k 0 schreiben wir k ` k 0 falls k 0 aus k durch eine Aktion der TM hervorgeht. Die Relation ` ist wie folgt definiert, wobei u, v ∈
Γ∗ , a, b, c ∈ Γ und q, q 0 ∈ Q gelten.

 uq 0 acv . . . (q 0 , c, −1) ∈ δ(q, b)
uaq 0 cv . . . (q 0 , c, 0) ∈ δ(q, b)
uaqbv `

uacq 0 v . . . (q 0 , c, +1) ∈ δ(q, b)
 0
 q Bcv . . . (q 0 , c, −1) ∈ δ(q, b)
q 0 cv
. . . (q 0 , c, 0) ∈ δ(q, b)
qbv `
 0
cq v
. . . (q 0 , c, +1) ∈ δ(q, b)

 uq 0 ac . . . (q 0 , c, −1) ∈ δ(q, B)
uaq 0 c . . . (q 0 , c, 0) ∈ δ(q, B)
uaq `

uacq 0 . . . (q 0 , c, +1) ∈ δ(q, B)
 0
 q Bc . . . (q 0 , c, −1) ∈ δ(q, B)
q0c
. . . (q 0 , c, 0) ∈ δ(q, B)
q `
 0
cq
. . . (q 0 , c, +1) ∈ δ(q, B)
2
Turingmaschinen können durch ihre Turing-Tafeln angegeben werden. Dies sind
Tabellen, die die Übergangsfunktion widerspiegeln.
Beispiel 2.1
Beispiel einer Maschine, die einen beliebigen Bandinhalt löscht.
Sei Q = {s, e} , Γ = {0, 1, B} , q0 = s, F = {e}.
Q
s
s
s
Γ
0
1
B
Q
s
s
e
δ
Γ Richtung
B +1
B +1
B N
Beispiel 2.2
Beispiel einer Maschine, die zu einer binärkodierten Zahl den Nachfolger bildet.
Eine binärkodierte Zahl ist entweder die Zeichenkette der Länge 1, deren einziges Zeichen 0 ist, oder sie hat die Form 1w, wobei w eine beliebige Zeichenkette
über dem Alphabet bestehend aus den beiden Symbolen 0 und 1 ist.
Sei Q = {s, a, l, e} , Γ = {0, 1, B} , q0 = s.
9
Q
s
s
s
a
a
a
l
l
l
Γ
0
1
B
0
1
B
0
1
B
Q
s
s
a
l
a
e
l
l
e
Γ
0
1
B
1
0
1
0
1
B
δ
Richtung
+1
+1
-1
-1
-1
N
-1
-1
+1
Erläuterung
suche
rechtes
Wortende
addiere 1
und propagiere
Übertrag
suche
linkes
Wortende
2.2
Abarbeitungsbegriff für Turing-Maschinen
Definition 2.2 Endzustand und Terminierende Berechnung
(vgl. [Weg93, AHU74, HMU02])
(1) Eine Konfiguration uqv ist genau dann eine Endkonfiguration,
wenn δ(q, a) = {(q, a, 0)} und q ∈ F gilt.
(2) Eine Folge von Konfigurationen {ki }m
i=0 heißt terminierende Berechnung
für ND-TM M = (Q, Γ, δ, q0 , F ), falls
(a) k0 = q0 w
(b) ki ` ki+1 für i = 0, . . . , m − 1
(c) km ist Endkonfiguration.
2
Definition 2.3 Von Turing-Maschine berechnete semantische Funktion, akzeptierte Sprache
(1) Eine (i.A. partielle) Funktion f : Γ∗ → Γ∗ heißt semantische Funktion für
die TM M = (Q, Γ, δ, q0 , F ), falls

v ist Bandinschrift nach



v
. . . terminierender Berechnung,
f (w) =
(8)
die mit w startet



undefiniert . . . sonst
10
(2) Mit bin(n) bezeichnen wir die Binärkodierung einer natürlichen Zahl n,
mit bin−1 die Umkehrfunktion der Funktion bin.
Eine Funktion g : Nn → N heißt von TM M = (Q, Γ, δ, q0 , F ) berechnet,
falls
bin−1 (v)
. . . v = f (bin(m1 )# . . . #bin(mn ))
g(m1 , . . . , mn ) =
undefiniert . . . sonst
(9)
gilt, wobei f die semantische Funktion für M ist. Die Funktion g heißt
dann Turing-berechenbar.
(3) Eine terminierende Berechnung, die von einer Konfiguration mit Bandinschrift x ∈ Γ∗ startet, heißt akzeptierende Berechnung für x.
L(M ) = {x ∈ Γ∗ | es gibt eine akzeptierende Berechnung für x}
L(M ) heißt die von Turing-Maschine M akzeptierte Sprache.
2
Satz 2.1
Eine Funktion ist Turing-berechenbar gdw. sie RM-berechenbar ist.
Definition 2.4 (Zeitkomplexität einer Turing-Maschine)
Sei M = (Q, Γ, δ, q0 , F ) eine Turing-Maschine.
(1) Angenommen, M ist nichtdeterministisch. L(M ) ⊆ N ist die von M akzeptierte Sprache. Dann heißt die Funktion
k ist Länge einer
inf k |
TM (n) =
max
akzeptierenden Berechnung für x
x ∈ L(M )
|x| = n
Zeitkomplexität der ND-TM M .
(2) Angenommen, M ist deterministisch. Dann heißt die Funktion
k ist Länge einer
TM (n) =
max
inf k |
akzeptierenden Berechnung für x
x ∈ L(M )
|x| = n
Zeitkomplexität der TM M .
2
Man beachte sorgfältig den Unterschied zwischen den Definitionen der Zeitkomplexität von deterministischen und nichtdeterministischen TM. Bei der Zeitkomplexität einer nichtdeterministischen TM werden nur die Längen der terminierenden Berechnungen berücksichtigt. Bei einer deterministischen TM werden jedoch auch die Längen der nichtterminierenden Berechnungen beachtet,
die durch die Infimumbildung mit ∞ veranschlagt wird.
11
Beispiel 2.3 Die Zeitkomplexität der Maschine in Beispiel 2.2 ist O(log n).
Beispiel 2.4 Die Zeitkomplexität einer nichtdeterministischen Maschine, die
das Cliquenproblem nach dem naiven Algorithmus löst, ist polynomiell in der
Zahl der Knoten des betrachteten Graphen.
2.3
Eigenschaften von Abarbeitungen von Turing-Maschinen
Satz 2.2 ([Weg93], Satz 2.3.1)
Jede für das logarithmische Kostenmaß t(n)-zeitbeschränkte RM kann für ein
Polynom q durch eine O(q(n + t(n)))-zeitbeschränkte TM simuliert werden.
Satz 2.3 ([Weg93], Satz 2.3.2)
Jede t(n)-zeitbeschränkte TM kann durch eine uniform O(n+t(n))-zeitbeschränkte und für das logarithmische Kostenmaß O((n+t(n)) log(n+t(n)))-zeitbeschränkte RM simuliert werden.
RM und TM (und analog ihre nichtdeterministischen Varianten) können einander in Polynomzeit simulieren, vorausgesetzt, daß bei den RM ein für beliebig
große Zahlen realistisches Kostenmaß angesetzt wurde. Dieses realistische Kostenmaß ist das logarithmische.
12
3
Schwierige Probleme und ihre Lösung
• schwierig heißt hier: es existieren keine Algorithmen polynomieller Komplexität oder es sind keine solchen bekannt.
• Für viele schwierige Problemen kann man zeigen:
Aus der Existenz eines solchen Algorithmus würde folgen, daß für alle
polynomiell in nichtdeterministischer Zeit lösbaren Probleme polynomielle
Algorithmen existieren würden.
• Dies gilt als starker Hinweis darauf, daß es für diese Probleme keine polynomiellen Algorithmen gibt.
3.1
Fallstudie: Cliquenproblem in ungerichteten Graphen
Eine Clique in einem ungerichteten Graphen ist ein vollständiger Teilgraph.
Cliquenproblem in ungerichteten Graphen: Zu entscheiden, ob für gegebenes k ∈ N in einem Graphen eine Clique mit k Knoten existiert.
Formalisierung: Graph sei als G = (V, E) mit E ⊆ V × V gegeben.
Problem: Entscheiden, ob V 0 ⊆ V mit |V 0 | = k und V 0 × V 0 ⊆ E existiert.
Kodierung des Problems: Die Kantenmenge E wird als Adjazenzmatrix
dargestellt. Bei einer n-elementigen Knotenmenge wird dazu ein Bitvektor
der Länge n2 benutzt. Die Größe der gesuchten Clique wird ebenfalls als
Bitvektor, und zwar der Länge blog2 nc + 1, dargestellt1 . Es seien G(w)
der durch Bitvektor w dargestellte Graph und W (v) die durch Binärzahl
v dargestellte natürliche Zahl.
w, v ∈ {0, 1}∗ , |w| = n2 , |v| = blog2 nc + 1
Clique = (w, v) |
G(w) enthält Clique der Größe W (v)
Für das Cliquenproblem
gibt es eine naive Lösung, die darauf beruht, daß
n
einfach alle
k-elementigen Teilmengen der n-elementigen Knotenmenk
ge daraufhin geprüft werden, ob sie eine Clique sind. Man sieht, daß die Kosten
für den Test, ob eine ausgewählte Teilmenge Clique ist, quadratisch in deren
Mächtigkeit sind. Damit ist die pessimistische Komplexität des Algorithmus
exponentiell.
Diese hohe Komplexität ergibt sich aus der Notwendigkeit der Konstruktion
aller Teilmengen einer bestimmten Größe. Dagegen sind die Kosten für die
Überprüfung der Cliqueneigenschaft einer gegeben Menge relativ gering.
Dies führt zur Betrachtung nichtdeterministischer Maschinen und ihrer Komplexität. Man stellt sich vor, daß ein Kandidat für eine Clique nichtdeterministisch
1
Zur Notation: brc = supn∈N {n | n ≤ r}. dre = infn∈N {n | n ≥ r}.
13
rate_teilmenge_mit_k_elementen;
pruefe_ob_teilmenge_eine_Clique_ist
Abbildung 1: Grobstruktur einer Lösung des Cliquenproblems
ausgewählt wird. Nach der Auswahl erfolgt der Test deterministisch. Zur Definition einer nichtdeterministischen Kostenfunktion für die Entscheidung der
Existenz einer Clique in einem Graphen setzt man die Länge der kürzesteten
möglichen Abarbeitung an, die zur Bejahung der Existenz einer Clique führt.
knd (e) = min {k | es gibt Berechnung der Länge k für f (e)}
Die pessimistische und die mittlere Komplexität bildet man nun analog zu den
Definitionen 1.3.1 und 1.3.2.
Wir diskutieren nun den erwähnten nichtdeterministischen Algorithmus. Er hat
die in Abbildung 1 dargestellte Grobstruktur.
Die erste Anweisung wird in Abbildung 2 als C-Programm skizziert.
Darin tritt die nichtdeterministische Anweisung choosej auf.
Im Feld candidate wird als Bitvektor eine Kodierung der auszuwählenden
Kandidatin, die daraufhin getestet wird, ob sie Clique ist, gehalten.
Die Zahl in der Variablen j ist die Nummer des Knotens über dessen Zugehörigkeit zur Kandidatenmenge gerade entschieden wird.
Über die Zugehörigkeit wird mittels der Anweisung choosej eine nichtdeterministische Entscheidung getroffen.
In i steht die Anzahl der Knoten, die noch in die Kandidatenmenge aufgenommen werden müssen.
Die zweite Anweisung des Programms in Abbildung 1 kann einfach durch zwei
verschachtelte for-Schleifen realisiert werden.
Die angebene Lösung ist eine sehr einfache Variante des Prinzips Generieren”
und-Testen“.
Eine Verbesserung ist durch sinnvolleres Koppeln von Testen und Generieren
möglich:
• für einen neu zu einem Cliquenkandidaten hinzugenommenen Knoten wird
sofort getestet, ob er mit allen anderen Knoten des Kandidaten durch eine
Kante verbunden ist.
Diese Verbesserung verbleibt jedoch innerhalb der exponentiellen Komplexität.
14
int m=n; /* Initialisierung von m mit der Groesse des Graphen */
int i=k; /* Initialisierung von k mit der Groesse der Clique.
* Es wird k=<n vorausgesetzt.
*/
int j;
while (j=0; i!==0; j++)
{
/* Invariante:
*
fuer m Knoten wurde noch nicht entschieden
*
i Knoten werden noch fuer den Kandidaten gebraucht
*/
if (i<m)
{
choose(candidate[j]);
if (candidate[j]==1)
{
/* j-ter Knoten in Kandidatenmenge aufgenommen
*/
i=i-1;
}
}
else
{
/* Es gilt i=m.
* j-ter Knoten automatisch in Kandidatenmenge aufgenommen,
* da diese aufgefuellt werden muss.
*/
candidate[j]=1;
i=i-1;
}
m=m-1;
}
Abbildung 2: Nichtdeterministische Auswahl eines Cliquen-Kandidaten
15
3.2
Eine Auswahl schwieriger Probleme
Es werden jetzt weitere schwierige Probleme beschrieben. Für einige werden
Lösungsalgorithmen diskutiert. Für andere wird ihre gegenseitige Reduzierbarkeit gezeigt. Die NP-Vollständigkeitstheorie zeigt, daß alle hier vorgestellten
Probleme alle nichtdeterministisch in polynomieller Zeit lösbaren Probleme repräsentieren. Zunächst werden die Entscheidungsvarianten der Probleme diskutiert.
3.2.1
Das Erfüllbarkeitsproblem in der Aussagenlogik
Name: Sat
Eingabe: Eine aussagenlogische Formel F in CNF (d.h. konjunktiver Klauselnormalform).
Frage: Ist F erfüllbar?
Bereits das Problem der Erfüllbarkeit von Mengen von Klauseln der Länge von
maximal 3 ist NP-vollständig.
Name: Sat(3)
Eingabe: Eine aussagenlogische Formel F in CNF mit Klauseln von maximal
3 Literalen.
Frage: Ist F erfüllbar?
3.2.2
Cliquenproblem
Name: Clique (Entscheidbarkeitsvariante)
Eingabe: Paar, bestehend aus einem Graph und einer natürlichen Zahl k.
Frage: Enthält der Graph eine Clique der Größe k?
3.2.3
Das symmetrische Problem des Handelsreisenden
Name: T SP (Entscheidbarkeitsvariante)
Eingabe: Geordnetes Paar, bestehend aus einer symmetrischen Distanzmatrix
dist : {0, . . . , n − 1} × {0, . . . , n − 1} → N,
und einer natürlichen Zahl k.
Frage: Enthält der Graph eine Rundreise der Länge ≤ k?
16
3.2.4
Das symmetrische Problem des Handelsreisenden mit Dreiecksungleichung
Name: ∆T SP (Entscheidbarkeitsvariante)
Eingabe: Geordnetes Paar, bestehend aus einer symmetrischen Distanzmatrix
dist : {0, . . . , n − 1} × {0, . . . , n − 1} → N,
die der Dreiecksungleichung
dist(i, j) + dist(j, l) ≥ dist(i, l)
genügt, und einer natürlichen Zahl k.
Frage: Enthält der Graph eine Rundreise der Länge ≤ k?
3.2.5
Das Rucksackproblem
Name: Knapsack (Entscheidbarkeitsvariante)
Eingabe: Folgen natürlicher Zahlen {gi }ni=1 (die Größen von n Objekten) und
{ai }ni=1 (die Werte der n Objekte) sowie natürliche Zahlen G (Größenlimit
des Rucksacks) und N (gewünschter Gesamtwert).
Frage: Gibt es eine Teilmenge J ⊆ {1, . . . , n}
mit Σj∈J aj = N und Σj∈J gj ≤ G?
3.3
Zusammenhang zwischen Entscheidungs- und Optimierungsproblemen
Für die Praxis ist oft nicht nur die Frage der Existenz einer Lösung wichtig,
sondern auch die Existenz einer möglichst guten Lösung bzw. auch die beste
Lösung selbst wird gebraucht. Die erstgenannte Variante ist ein Entscheidungsproblem, die beiden weiteren sind Optierungsvarianten.
3.3.1
Optimierungsvarianten des Cliquenproblems
Name: Clique2
Eingabe: Ein Graph.
Frage: Welche ist die größte natürliche Zahl k, für die der Graph eine Clique
der Größe k enthält?
Wenn die Entscheidungsvariante des Cliquenproblems in polynomieller Zeit
lösbar ist, dann ist es auch die Optimierungsvariante Clique 2“. Begründung:
”
Wenn ein polynomieller Algorithmus für die Entscheidungsvariante gegeben ist,
kann dieser als Unterprogramm in der linearen Suche nach der maximalen Cliquengröße aufgerufen werden.
17
Name: Clique3
Eingabe: Ein Graph G.
Aufgabe: Finde eine in G eine Clique der maximaler Größe.
Wenn die Optimierungsvariante Clique 2“ in polynomieller Zeit lösbar ist,
”
dann ist es auch die Optimierungsvariante Clique 3“.
”
Begründung: Übungsaufgabe
3.3.2
Optimierungsvarianten des Rucksackproblems
Name: Knapsack2
Eingabe: Folgen natürlicher Zahlen {gi }ni=1 und {ai }ni=1 sowie eine natürliche
Zahl G.
Aufgabe: Bestimme die größte Zahl N , für die es eine Teilmenge J ⊆ {1, . . . , n}
mit N = Σj∈J aj und Σj∈J gj ≤ G gibt.
Name: Knapsack3
Eingabe: Folgen natürlicher Zahlen {gi }ni=1 und {ai }ni=1 sowie eine natürliche
Zahl G.
Aufgabe: Bestimme eine Teilmenge J ⊆ {1, . . . , n} derart, daß N = Σj∈J aj
gilt und die Zahl Σj∈J aj maximal wird.
3.3.3
Optierungsvarianten des Problems des Handlungsreisenden
Name: T SP 2
Eingabe: Symmetrische Distanzmatrix
dist : {0, . . . , n − 1} × {0, . . . , n − 1} → N
Frage: Welche Länge hat die kürzeste Rundreise?
Name: T SP 3
Eingabe: Symmetrische Distanzmatrix
dist : {0, . . . , n − 1} × {0, . . . , n − 1} → N
Aufgabe: Bestimme eine Rundreise kürzester Länge.
18
3.3.4
Optierungsvarianten des Problems des Handlungsreisenden
mit Dreiecksungleichung
Name: ∆T SP 2
Eingabe: Symmetrische Distanzmatrix
dist : {0, . . . , n − 1} × {0, . . . , n − 1} → N,
die der Dreiecksungleichung
dist(i, j) + dist(j, l) ≥ dist(i, l)
genügt.
Frage: Welche Länge hat die kürzeste Rundreise?
Name: ∆T SP 3
Eingabe: Symmetrische Distanzmatrix
dist : {0, . . . , n − 1} × {0, . . . , n − 1} → N,
die der Dreiecksungleichung
dist(i, j) + dist(j, l) ≥ dist(i, l)
genügt.
Aufgabe: Bestimme eine Rundreise kürzester Länge.
3.4
Überblick über Lösungsmethoden für schwierige Probleme
Spezialfälle: Ist die Problemlösung in voller Allgemeinheit nötig? Manchmal
existieren effiziente Algorithmen für Teilklassen. So für Planungsprobleme
mit Vorrangeinschränkungen: Teilklasse 1: mit 2 Prozessoren, Teilklasse
2: wenn die Vorrangeinschränkungen baumförmig sind.
Bessere Organisation der Suche: Z.B. Dynamische Programmierung und
Branch and Bound als geschickte Suchmethoden.
Untersuchung der Wahrscheinlichkeit verschiedener Eingaben:
Bei manchen Problemen sind die wirklich harten Eingaben selten und sporadisch auftretende lange Berechnungen können toleriert werden. Beispiel:
Unifikation von Termen.
Approximationsalgorithmen: Für manche Optimierungsprobleme existieren schnelle Algorithmen, die hinreichend gute Annäherungen der optimalen Lösungen liefern. Beispiel: Rundreiseproblem.
Probabilistische Algorithmen: Es gibt schnelle Algorithmen, die hinreich
oft richtige Lösungen liefern. Beispiel: Primzahltest.
Heuristiken: Heuristiken können helfen, bei der Lösung eines schweren Problems zumindest nicht ungeschickt vorzugehen.
19
4
Die Komplexitätsklassen P und NP
Zur Klasse der NP-vollständigen Probleme gehören viele praktisch bedeutsame
Probleme. Außer den bereits genannten seien Stundenplanprobleme, Optimierungsprobleme und Datenbankprobleme erwähnt.
In diesem Kapitel wird dargelegt, daß das Cliquenproblem in gewissem Sinne
stellvertretend für alle Probleme ist, die nichtdeterministisch in polynomieller
Zeit gelöst werden können, für die aber keine in polynomieller Zeit arbeitenden
deterministischen Lösungsalgorithmen bekannt sind.
Wenn nämlich das Cliquenproblem auch deterministisch in polynomieller Zeit
gelöst werden könnte, dann würde das auf alle nichtdeterministisch in polynomieller Zeit lösbaren Probleme zutreffen.
Gegenwärtig sind über 2000 Probleme bekannt, für die diese als NP-Vollständigkeit bezeichnete Eigenschaft nachgewiesen wurde.
Um derart globale Aussagen formulieren und nachweisen zu könnnen, braucht
man einen möglichst allgemeinen und einfachen Begriff der Berechenbarkeit, auf
den verschiedenste Problemstellungen formal zurückgeführt werden können.
4.1
Grundlagen
Definition 4.1 Die Komplexitätsklassen P und NP
es gibt TM M = (Z, Γ, δ, z0 , F ) , Polynom p mit
P= L |
L ⊆ Γ∗ , L = L(M ), ∀n ∈ N : TM (n) ≤ p(n)
es gibt ND TM M = (Z, Γ, δ, z0 , F ) , Polynom p mit
NP = L |
L ⊆ Γ∗ , L = L(M ), ∀n ∈ N : TM (n) ≤ p(n)
2
Da eine deterministische TM als Spezialfall der ND TM betrachtet werden kann,
bei dem für jede Eingabe genau eine Abarbeitung existiert, gilt: P ⊆ NP.
Definition 4.2
(1) Es seien Σ und Γ endliche Alphabete. Eine totale Abbildung f : Σ∗ → Γ∗
heißt (in polynomieller Zeit) berechenbare Transformation, falls f in (polynomieller Zeit) TM-berechenbar ist.
(2) Seien L ⊆ Σ∗ und K ⊆ Γ∗ Sprachen. L heißt auf K reduzierbar (Notation: L ≤ K (L ≤p K)), falls es eine (polynomielle) Transformation
f : Σ∗ → Γ∗ gibt, mit
∀x ∈ Σ∗ : x ∈ L gdw. f (x) ∈ K
20
(3) Eine Sprache L heißt NP-vollständig, wenn
(a) L ∈ NP und
(b) ∀K ∈ NP : K ≤p L gelten.
(4) Eine Sprache L heißt NP-hart, wenn ∀K ∈ NP : K ≤p L gilt.
2
4.2
NP-Vollständigkeit wichtiger Probleme
Satz 4.1 (Cook, vgl. [Weg93] S. 47-50)
SAT ist NP-vollständig.
Beweis.
Beweisskizze:
(1) Behauptung: SAT ist NP. Um diese Behauptung nachzuweisen, konstruiert man eine TM, welche für eine auf dem Band kodierte Formel nichtdeterministisch eine Belegung wählt und danach deterministisch prüft, ob
die gewählte Belegung die Formel erfüllt.
(2) Behauptung: Für jedes Problem P , welches zu NP gehört, gilt P ≤p Sat.
Da das betrachtete Problem zu NP gehört, existieren ein Polynom p
und eine ND TM M , welche jede Instanz des Problems P der Größe n
nichtdeterministisch in der Zeit p(n) löst.
Das Verhalten dieser ND TM gilt es, als aussagenlogischen Ausdruck zu
kodieren.
Dazu werden die Abarbeitungen von M bei den einzelnen Probleminstanzen durch aussagenlogische Ausdrücke kodiert.
Wichtig ist, daß die modellierte ND TM für jede Probleminstanz der
Größe n in jedem Zweig höchsten p(n) viele Schritte macht und damit
auch nur höchstens p(n) viele Zeichen auf das Band schreiben kann. Damit kann die Abarbeitung von M bei einer Eingabe der Größe n jeweils
mit einer Folge von Wörtern c0 , . . . , cp(n) beschrieben werden. Jedes der
Wörter hat p(n) Zeichen2 .
Zum Abschluß des Beweises modelliert man nun die TM als aussagenlogischen Ausdruck, indem man ihre Abarbeitungen, d.h. Folgen von Wörtern
der Form vqw (Notation: siehe Definition der TM und nachfolgende Ausführungen), durch eine Konjunktion von Teilausdrücke modelliert, deren
nachfolgend angegeben wird. Die Form der Teilausdrücke ist durch die
zu modellierende ND TM M bestimmt und widerspiegelt generisch deren
Abarbeitungen.
2
Zur Vereinheitlichung der Darstellung wird links und rechts der eigentlichen“ Bandin”
schrift mit Blank-Symbolen aufgefüllt.
21
ND TM M startet richtig: vqw beschreibt die Startkonfiguration, d.h.
alle Zeichen in v sind Blanks, q ist der Startzustand, w enthält als
Präfix die Eingabe und ansonsten Blanks (vgl. Fußnote 2).
Jeder Schritt von M ist richtig: Übergang vqw ` v 0 q 0 w0 ist korrekt.
ND TM M endet richtig: vqw ist korrekt und wird nicht mehr verändert.
q.e.d.
Satz 4.2
Für NP-vollständige Probleme L gilt:
(1) L ∈ P gdw. P = NP
(2) Wenn L ≤p K und K ∈ NP, dann ist K NP-vollständig.
Für die in Unterabschnitt 3.2 vorgestellten Probleme sind folgende Reduktionsbeziehungen bekannt (vgl. [Weg93]).
Da diese Probleme sämtlich in NP sind, sind sie damit NP-vollständig.
Sat ≤p Sat(3) ≤p Clique (vgl. [Weg93] S. 51ff)
Sat(3) ≤p Knapsack (vgl. [Weg93] S. 53f)
Sat(3) ≤p DHC ≤p HC ≤p ∆T SP (vgl. [Weg93] S. 56ff)
Um die Beziehung Sat(3) ≤p Clique nachzuweisen, betrachten wir eine Klauselmenge F = {ci }ki=1 mit ci = {Ki , Li , Mi }.
Der Klauselmenge wird ein Graph (V, E) wie folgt zugeordnet:
Sk
S
( ist als Vereinigung von Multimengen aufzufassen)
gehören zu verschiedenen Klauseln
E = (v, w) ∈ V × V | v, w
und sind nicht komplementär
V =
i=1 ci
Man sieht leicht: F ist erfüllbar gdw. (V, E) enthält Clique der Größe k.
4.3
Pseudopolynomielle Algorithmen
An dieser Stelle wird noch einmal auf die Lösung des Rucksackproblems 3.2.5
eingegangen.
Für dieses Problem werden Algorithmen angegeben, die polynomiell in der
Rucksackgröße G und der Anzahl der Objekte n sind, unter der Voraussetzung,
daß der Wert der Objekte höchstens polynomiell in n ist.
22
Bei der Reduktion von Sat(3) ≤p Knapsack wurde aber gerade in den Gewichten und der Anzahl der Objekte die Schwierigkeit des Problems versteckt“.
”
Solche Algorithmen heißen pseudopolynomiell.
Beim Cliquenproblem ist diese Differenzierung gegenstandslos, da in der Kodierung des Problems keine großen Zahlen vorkommen.
Im Gegensatz zum Rucksackproblem existiert für das Problem des Handelsreisenden kein pseudopolynomieller Algorithmus.
23
5
Beispiele von Problemtransformationen (Reduktionen)
Hinweis: Bei jeder der nachfolgend angegebenen Konstruktionen ist zu beachten, daß die angegebenen Zeitkosten als Kosten der Arbeit einer Turingmaschine auf den in der Turingmaschine dargestellten Daten der Transformationen zu
verstehen sind.
5.1
Reduktion Sat ≤p Clique
Instanzen des Problems Sat seien als endliche Mengen von Klauseln dargestellt. Klauseln seien als endliche Mengen von aussagenlogischen Literalen dargestellt. Ein aussagenlogisches Literal ist eine aussagenlogische Variable oder
deren Negation. Eine Klausel wird als Disjunktion ihrer Literale interpretiert.
Eine Menge von Klauseln wird als Konjunktion ihrer Elemente interpretiert.
Definition: Als aufspannende Paarung für eine Menge F aussagenlogischer
Klauseln bezeichnet man eine Menge von Mengen {L, ¬L} von Literalen
mit folgender Eigenschaft:
(1) L und ¬L kommen in verschiedenen Klauseln vor ( Paarung“).
”
(2) Stellt man sich die Klauselmenge ausmultipliziert“ vor, d.h. als Dis”
junktion von Konjunktionen von Literalen, kann man feststellen, daß
jede dieser Konjunktionen ein Literal gemeinsam mit seiner Negation
enthält.
Zwei Literale, von denen eines die Negation des anderen ist, werden als
komplementär bezeichnet.
Beobachtung 1: Eine endliche Menge aussagenlogischer Klauseln ist genau
dann erfüllbar, wenn für sie keine aufspannende Paarung existiert.
Konstruktion der Reduktion: Gegeben sei eine Klauselmenge
M = {C0 , . . . , Cn−1 }. Für diese Klauselmenge wird ein Graph G(M ) mit
der Knotenmenge
C0 × {0} ∪ . . . ∪ Cn−1 × {n − 1}
konstruiert. Ein Paar {(L, l), (K, m)} gehört zur Kantenmenge von G(M )
gdw. L und K nicht komplementär sind und l 6= m gilt.
Beobachtung 2: In G(M ) existiert eine Clique der Größe n genau dann,
wenn für die Klauselmenge M keine aufspannende Paarung existiert.
Beobachtung 3: Die Kosten für die Konstruktion des Graphen G(M ) sind
polynomial.
Aus den Beobachtungen 1, 2 und 3 folgt, daß mit der Konstruktion von G die
behauptete Reduzierbarkeit nachgewiesen ist.
24
5.2
Reduktion Sat ≤p Sat(3)
Es wird eine Konstruktion angegeben, die jeder Menge M von aussagenlogischen
Klauseln eine Menge aussagenlogischer Klauseln T (M ) zuordnet, die folgende
Eigenschaften hat:
(1) T (M ) ist genau dann erfüllbar, wenn M erfüllbar ist.
(2) Jede Klausel in T (M ) besteht aus höchstens 3 Literalen.
(3) Die Kosten für die Konstruktion von T (M ) sind polynomial in der Größe
von M .
Um T (M ) für eine Klauselmenge M zu konstruieren, wird folgender Transformationsschritt solange wiederholt, bis eine Instanz des Problems Sat(3) erhalten wurde:
Wenn die zu betrachtende Klauselmenge M eine Klausel enthält, die mehr als
3 Elemente enthält, wird folgende Ersetzung durchgeführt:
Es sei n die maximale Länge von Klauseln in M . Es wird eine Klausel C der
Länge n ausgewählt. Seien L und K zwei Literale in C und J eine Aussagenvariable, die in keiner der Klauseln in M vorkommt.
Dann ersetzt man in M die Klausel C durch die Klauseln (C \ {L, K}) ∪ {J}
und {L, K, ¬J}.
Die Ersetzung hat keinen Einfluß auf die Erfüllbarkeit.
Für jedes n ∈ N mit 3 < n gilt, daß nach endlich vielen Ersetzungsschritten
alle Klauseln der Länge n durch kürzere ersetzt sind.
Nach endlich vielen Ersetzungsschritten ist die maximale Länge von Klauseln
nicht größer als 3.
Damit hat die Transformation T die geforderten Eigenschaften.
5.3
Reduktion Sat(3) ≤p Knapsack
Sei C eine Menge von Klauseln {C1 , . . . , Cm }, in denen jeweils höchstens 3 Aussagenvariablen vorkommen. Die Menge der in Klauseln von C vorkommenden
Aussagenvariablen sei {V1 , . . . , Vn }.
Es wird in Polynomialzeit folgende Instanz K(C) des Rucksackproblems konstruiert, die die erforderlichen Eigenschaften hat:
Anzahl der Objekte: Das Problem K(C) hat 2m + 2n Objekte.
Gewichte und Nutzwerte: Gewicht und Nutzwert eines jeden Objekts sind
gleich. Sie werden durch eine m + n-stellige Dezimalzahl dargestellt. Vereinfachend wird zugelassen, daß in der Notation dieser Zahl führende Nullen vorkommen.
25
Die Wahl der letzten n Stellen des Nutzwerts der Objekte und des zu
erzielenden Gesamtwerts sichern die Konsistenz und die Definiertheit der
Belegung.
Die Wahl der ersten m Stellen des Nutzwerts der Objekte und des zu erzielenden Gesamtwerts sichern die Erfülltheit der Formel durch die durch
die gewählten Objekte kodierte Belegung.
Es werden vier Arten von Objekten unterschieden. Es gibt je m der ersten
und der zweiten Art sowie je n der dritten und der vierten Art.
Das Gewicht des i-ten Objektes der ersten Art kodiert das nichtnegierte
Vorkommen der i-ten Aussagenvariablen in der k-ten Klausel durch eine
1 an der k-ten Stelle der Zahldarstellung des Gewichts. An den restlichen
der m ersten Stellen steht eine 0.
Das Gewicht des i-ten der m Objekte der zweiten Art kodiert das negierte
Vorkommen der i-ten Aussagenvariablen in der k-ten Klausel durch eine
1 an der k-ten Stelle der Zahldarstellung des Gewichts. An den restlichen
der m ersten Stellen steht eine 0.
Bei beiden genannten Objektarten wird in der Stelle m + j in der Darstellung des Gewichts des j-ten Objekts der betreffenden Art mit einer 1 die
Nummer der Variablen (also xj ) dargestellt, deren Vorkommen repräsentiert wird. Die übrigen der n letzten Ziffern sind null.
Die Zahldarstellung des Gewichts des i-ten der m Objekte der dritten
Art hat eine 1 an der i-ten Stelle und sonst Nullen.
Die Zahldarstellung des Gewichts des i-ten der m Objekte der vierten
Art hat eine 2 an der i-ten Stelle und sonst Nullen.
Gesamtwert: Der zu erzielende Gesamtwert wird durch eine m + n-stellige
Dezimalzahl A mit folgender Form ausgedrückt:
Jede der m ersten Ziffern von A ist eine 4.
Jede der n restlichen Ziffern von A ist eine 1.
5.4
Reduktion Sat(3) ≤p DHC
Sei C eine Menge von Klauseln {C1 , . . . , Cm }, in denen jeweils höchstens 3 Aussagenvariablen vorkommen. Die Menge der in Klauseln von C vorkommenden
Aussagenvariablen sei {V1 , . . . , Vn }.
Nachfolgend wird eine Instanz D(C) des Problems des Hamiltonkreises im gerichteten Graphen konstruiert. Die Kosten der Konstruktion sind polynomial.
Knotenmenge: Der Graph hat n Knoten, die die Variablen widerspiegeln
(kurz: Variablenknoten), sowie die jeweils 6 Knoten von m Teilgraphen
( Komponenten“), die die Klauseln widerspiegeln.
”
Kantenmenge: Jeder der genannten Teilgraphen hat 3 Knoten ( Eingangs”
knoten“), in die je 1 Kante von außerhalb des Teilgraphen hineinführt,
26
und 3 weitere Knoten ( Ausgangsknoten“), aus denen je 1 Kante nach
”
außerhalb des Teilgraphen führt.
Die Eingangsknoten sind durch weitere Kanten zu einem Zyklus verknüpft, analog die Ausgangsknoten, allerdings mit gegenläufiger Orientierung. Außerdem führt von jedem Eingangsknoten eine Kante zu genau
einem Ausgangsknoten.
Diese Konstruktion widerspiegelt, daß die dargestellte Klausel durch 1, 2
oder 3 ihrer Literale erfüllt werden kann.
Ein Hamilton-Kreis kann 1, 2 oder 3 mal in den Teilgraphen ein- und
wieder austreten.
Widerspiegelung der Literale in Klauseln: In den die Klauseln darstellenden Komponenten widerspiegelt jedes Paar bestehend aus einem Eintrittsund einem mit ihm direkt verbundenem Austrittsknoten ein Literal der
Klausel.
Widerspiegelung der Konsistenz der Belegung: Von jedem der Variablenknoten führen genau zwei Kanten heraus. Diese sind Beginn je eines
Kantenzugs, der die nichtnegierten bzw. die negierten Vorkommen der
betreffenden Variablen in Klauseln widerspiegelt.
Hier wird der Kantenzug für die nichtnegierten Variablenvorkommen besprochen.
Analog können die negierten Vorkommen von Variablen widergespiegelt
werden.
Beginn des Kantenzugs: Eine der genannten Kanten führt zum entsprechenden Eingangsknoten des die erste Klausel darstellenden Teilgraphen, in der die betreffende Variable nichtnegiert vorkommt, soweit diese Variable nichtnegiert vorkommt.
Kommt sie nicht nichtnegiert vor, führt die genannte Kante zum die
nächste Variable darstellenden Knoten, soweit es sich nicht um die
letzte Variable handelt.
In letzterem Fall führt die Kante zum die erste Variable darstellenden
Knoten.
Fortsetzung des Kantenzugs: Der Kantenzug wird von einem Eingangsknoten einer Komponente über den entsprechenden Ausgangsknoten fortgesetzt. Von jenem führt eine Kante zum der betreffenden
Variablen zugeordneten Eingangsknoten der nächsten, noch nicht
von dem Kantenzug berührten Komponente.
Sollte eine solche Komponente nicht existieren, führt die Kante zum
die nächste Variable darstellenden Knoten.
Sollte die Variable die letzte sein, führt die Kante zum die erste
Variable darstellenden Knoten.
Interpretation eines Hamiltonkreises in D(C) als Belegung in C:
27
Abhängig von der Kante, über die ein Hamiltonkreis einen Variablenknoten verläßt, wird die darstellte Variable mit 0 oder 1 belegt.
Übungsbeispiel: (x1 ∨ ¬x2 ∨ x3 ) ∧ (¬x1 ∨ x2 ∨ ¬x4 ) ∧ (¬x1 ∨ ¬x2 ∨ ¬x3 )
5.5
Reduktion DHC ≤p HC
Gegeben sei ein gerichteter Graph G = (V, E) mit Knotenmenge V und Kantenmenge E. Es wird ein ungerichteter Graph U (G) = (V × {0, 1, 2} , D) definiert:
Für jede Kante (v, w) ∈ E gilt {(v, 1), (w, 2)} ∈ D.
Für jeden Knoten v ∈ V gilt {{(v, 1), (v, 0)} , {(v, 2), (v, 0)}} ⊆ D.
Für jede Kante {(v, n), (w, m)} ∈ D gilt eine der folgenden Bedingungen:
(1) v = w, n = 1, m = 0 und v ∈ V ,
(2) v = w, n = 2, m = 0 und v ∈ V oder
(3) n = 1, m = 2 und (v, w) ∈ E.
Man kann nachweisen, daß in U (G) genau dann ein ungerichteter Hamiltonkreis existiert, wenn G einen gerichteten Hamiltonkreis hat. Die Kosten der
Transformation U sind polynomial.
5.6
Reduktion HC ≤p ∆T SP
Die Reduktion beruht darauf, für einen gegebenen gerichteten Graphen eine
Kantenbewertung zu definieren, die jeder Kante die Länge 1 zuordnet.
Dann existiert in einem Graphen mit n Knoten ein Hamiltonkreis genau dann,
wenn es eine Rundreise der Länge n gibt.
28
6
Quantencomputer
Die in den vorstehenden Kapiteln besprochen Modelle der Berechenbarkeit beruhen auf der Vorstellung, daß während der Ausführung eines Algorithmus von
einem diskreten Zustand zum anderen übergegangen wird.
Dies entspricht der Vorstellung vom Rechnen mit Papier und Bleistift, von
der Argumentation in einem Beweis wie der Abarbeitung mit einem üblichen
Rechner.
Betrachtet man die physikalischen Grundlagen heutiger Rechentechnik, so stellt
man fest, daß die bei deren Realisierung ausgenutzten physikalischen Prinzipien viel komplexere Zusammenhänge kennen. Im Quantencomputing wird der
spannende Versuch unternommen, diese Prinzipien direkt für in Algorithmen
einzusetzen.
Interessenten werden auf [KSV02] verwiesen. Hier wird dem klassischen Algorithmusmodell ein Berechnungsmodell für Quantencomputer gegenübergestellt.
29
7
7.1
Berechenbarkeit und Aufzählbarkeit
These von Church
Alle bislang bekannten Formalisierungen der intuitiven Begriffe der Berechenbarkeit und Entscheidbarkeit führen zur gleichen Klasse von Funktionen bzw.
Sprachen. Nach dem Logiker Alonzo Church ist die (nicht beweisbare, da informale) These benannt, daß alle Präzisierungen der Begriffe Berechenbarkeit und
Entscheidbarkeit gleich mächtig sind.
Mit der Definition der while-Programme in Abschnitt 1.2.5 kann also folgende
Präzisierung der intuitiven Begriffe der Berechenbarkeit und Entscheidbarkeit
vorgenommen werden.
Eine Präzisierung der Begriffe berechenbar“ und entscheidbar“
”
”
Eine Funktion ist genau dann intuitiv berechenbar, wenn sie mit einem whileProgramm (vgl. Abschnitt 1.2.5) berechenbar ist.
Eine Menge X natürlicher Zahlen ist genau dann intuitiv entscheidbar, wenn
sie while-Programmen entscheidbar ist.
7.2
Unentscheidbarkeitsresultate
In diesem Abschnitt werden wichtige Eigenschaften von Programmen hinsichtlich ihrer Entscheidbarkeit betrachtet.
Es wird sich zeigen, daß die dynamischen Eigenschaften von Programmen nicht
entscheidbar sind.
Als Algorithmenmodell werden while-Programme betrachtet. Diese lassen sich
die anderen betrachteten Algorithmenmodelle simulieren und umgekehrt.
Um den Umfang der Definition klein zu halten, werden nur einfachste Anweisungen betrachtet. Als Übung kann man ebenfalls zeigen, daß die in Definition
1.1 eingeführten Anweisungen von Registermaschinen durch while-Programme
simuliert werden können. Man beachte, daß anders als in Kapitel 2 keine Beschränkungen hinsichtlich der Kosten der Simulation bestehen.
Zunächst wird als technisches Hilfsmittel eine berechenbare Kodierungsfunktion
eingeführt, die while-Programmen eineindeutig natürliche Zahlen zuordnet.
Durch diese Kodierung können while-Programme (genauer: ihre Kodierung als
natürliche Zahlen) selbst als Argumente von Funktionen über natürlichen Zahlen aufgefaßt werden.
Bei der Kodierung wird die Eindeutigkeit der Darstellung natürlicher Zahlen
durch Produkte von Primzahlpotenzen ausgenutzt.
Diese Art der Kodierung geht auf Kurt Gödel zurück. Er benutzte eine derartige Kodierung in seinem Nachweis der Nichtaxiomatisierbarkeit der Arithmetik.
Aus dieser folgt der Satz von Church über die Unentscheidbarkeit der Prädikatenlogik erster Stufe (vgl. [Lyn66]).
30
Definition 7.1 (Gödelisierung von while-Programmen)
Es wird eine Basis mit Mengen von Funktionsanweisungen F M = {vor, nach}
und von Testanweisungen T M = {null} angenommen. Diese Anweisungen beziehen sich jeweils auf eine Speicherzelle. nachi ersetzt den Inhalt der i-ten
Speicherzelle durch dessen Nachfolger, vori berechnet den Vorgänger, soweit er
existiert, und läßt den Wert unverändert andernfalls. nulli prüft, ob der Inhalt
der i-ten Speicherzelle 0 ist oder nicht, und liefert 1 oder 0 als Wert bei Erfülltheit bzw. Nichterfülltheit der Bedingung. ΦF M,T M bezeichnet die Menge der
mit diesen Anweisungen formulierbaren while-Programme.
Die Funktion
code : ΦF M,T M → N wird wie folgt definiert. Für alle P ∈ ΦF M,T M sei


20




21 ∗ 3i



2
i

 2 ∗3
0
00
23 ∗ 3i ∗ 5code(P ) ∗ 7code(P )
code(P ) =
0


24 ∗ 3i ∗ 5code(P )



0


25 ∗ 3i ∗ 5code(P )


 26 ∗ 3code(P 0 ) ∗ 5code(P 00 )
...
...
...
...
...
...
...
P
P
P
P
P
P
P
=
= nachi
= vori
= if nulli then P 0 else P 00 fi
= while nulli do P 0 od
= while not nulli do P 0 od
= P 0 ; P 00
2
Beispiel 7.1
6
18
12
code(while not null1 do nach2 ; vor1 od) = 25 ∗ 31 ∗ 52 ∗3 ∗5
code−1 (241) ist nicht definiert.
Die in Definition 7.1 eingeführte Funktion code ist injektiv aber nicht surjektiv.
Für die folgenden Überlegungen ist es notwendig, eine bijektive Kodierfunktion
zu haben.
Diese und ihre Umkehrfunktion werden nun konstruiert.
Da für natürliche Zahlen der Primzahltest und die Zerlegung in Produkte von
Primzahlpotenzen berechenbar sind, kann auch entschieden werden, ob eine
natürliche Zahl Kod eines Programms ist.
Man kann damit voraussetzen:
Die Menge code(Φ(F M,T M ) ) ist entscheidbar.
Das Programm, welches
die charakteristische Funktion der Menge code(Φ(F M,T M ) ) berechnet,
wird mit
R(i) := iscode(R(j))
notiert.
Es wird nun eine bijektive Nummerierung der Programme in ΦF M,T M definiert.
Die Idee beruht darauf, daß man sich die Elemente aus ΦF M,T M nach der Größe
ihrer Gödelnummer in einer Folge angeordnet vorstellen kann.
31
Einem Programm P wird nun als Wert der Funktion surcode(P ) seine Position
in dieser Folge zugeordnet.
surcode(P ) wird unter Verwendung der Hilfsfnktion ncode : N → N durch die
folgenden Gleichungen definiert3 :
∀n ∈ N : ncode(n) = | m | m ∈ code(Φ(F M,T M ) ), m < n |
∀P ∈ ΦF M,T M : surcode(P ) = ncode(code(P ))
(10)
(11)
Die Funktion surcode hat damit die folgende Eigenschaft.
∀P ∈ ΦF M,T M : surcode(P ) =
| m | m ∈ code(Φ(F M,T M ) ), m < code(P ) |
(12)
Ein Programm zur Berechnung der Hilfsfunktion ncode kann aus dem in Abbildung 3 dargestellten Programm konstruiert werden. Dieses erwartet in Speicherzelle 0 das Argument und legt das Ergebnis in Speicherzelle 1 ab. Startet
das Programm in Abbildung 3 unter der Annahme, daß 0 der Inhalt der Speicherzelle 1 ist, hat die Schleife die Invariante: Die Summe des Inhalts von Speicherzelle 1 und der Anzahl der Programme, deren Code kleiner als der Inhalt
von Speicherzelle 0 ist, gleicht dem zu berechnenden Wert.
while not null0 do
R(2) := iscode(R(0));
if null2 then else nach1 fi;
vor0
od
Abbildung 3: Ein Programm zur Berechnung der Funktion ncode
Die zu ncode inverse Funktion ncode−1 kann durch das in Abbildung 4 dargestellte Programm berechnet werden. Es arbeitet nach dem Prinzip Generieren
”
und Testen“. Nach der Initialisierung mit den ersten 3 Anweisungen generiert
es mit der Anweisung nach3 in der zweiten Schleife fortlaufend Zahlen und prüft
mit den restlichen Anweisungen des Körpers dieser Schleife, ob die jeweils zuletzt generierte Zahl Code eines Programm ist. Ist n der Inhalt des Registers 0
bei Aufruf des Programms, dann gilt nach der Initialisierung jeweils im Moment
der Testauswertung der zweiten Schleife die folgende Bedingung:
In der Speicherzelle 2 ist die Anzahl der Programme gespeichert, deren Gödelnummer größer als der Inhalt von R(3) und nicht größer als die des n-ten
Programms in der nach Gödelnummern geordneten Folge der Programme ist.
3
|M | bezeichnet die Mächtigkeit der Menge M .
32
Gewissermaßen wird in der Testbedingung der zweiten Schleifenanweisung gefragt: Wieviele Programmcodes haben wir noch zu generieren?“ Der jeweils
”
nächste Testkandidat wird in der nachfolgenden Anweisung nach3 generiert.
R(2):=R(0);
nach2 ;
while not null3 do vor3 od;
while not null2 do
nach3
R(0):=R(3)
R(1) := iscode(R(0));
if null1 then else vor2 fi;
od;
R(1):=R(3)
Abbildung 4: Ein Programm zur Berechnung der Funktion ncode−1
7.2.1
Das Selbstanwendbarkeitsproblem
Das Selbstanwendbarkeitsproblem (SAP) besteht darin zu entscheiden, ob ein
Programm terminiert, wenn es auf seine Kodnummer als Eingabe angewendet
wird.
Formal wird das Selbstanwendbarkeitsproblem durch die Menge SAP derjenigen natürlichen Zahlen definiert,
die Kodnummer eines Programmes sind, welches terminert,
wenn es auf seine Kodnummer als Eingabe angewendet wird.
Definition 7.2
SAP = p | QM (p) ist definiert für Q = surcode−1 (p)
2
Satz 7.1
Das Selbstanwendbarkeitsproblem ist nicht entscheidbar.
Beweis.
Indirekter Beweis.
Die Annahme, daß das Selbstanwendbarkeitsproblems entscheidbar ist, also ein
Programm Q existiert,
33
dessen semantische Funktion χSAP ist, wird zum Widerspruch geführt.
Für die charakteristische Funktion χSAP des Selbstanwendbarkeitsproblems gilt
nach Definition 7.2:
χSAP (p) =
1 . . . QM (p) ist definiert für Q = surcode−1 (p)
0 . . . sonst
Angenommen Q sei ein Programm Q ∈ ΦF M,T M , welches χSAP berechnet, d.h.
1 . . . QM (p) ist definiert für Q = surcode−1 (p)
QM (p) =
0 . . . sonst
Weiter sei R das Programm
Q; while not null1 do
od
Die semantische Funktion des Programms R erfüllt die Gleichung
nicht def. . . . QM (p) ist definiert für Q = surcode−1 (p)
RM (p) =
0
. . . sonst
(13)
Es wird nun die Selbstanwendung von R auf das Argument surcode(R) betrachtet und die folgende Fallunterscheidung durchgeführt:
Fall 1: RM (surcode(R)) ist nicht definiert.
Wegen surcode(R) = ncode(code(R)) (11) und Gleichung (13) müßte
RM (surcode(R)) dann definiert sein. Widerspruch.
Fall 2: RM (surcode(R)) ist definiert.
Wegen surcode(R) = ncode(code(R)) (11) und Gleichung (13) müßte
RM (surcode(R)) dann nicht definiert sein. Widerspruch.
q.e.d.
7.2.2
Auf das Selbstanwendbarkeitsproblem reduzierbare Probleme
Weitere Probleme sind auf das Selbstanwendbarkeitsproblem reduzierbar. Die
Bedeutung dieser Aussage wird zunächst prazisiert.
Definition 7.3
Sind M1 , M2 ⊆ N und
ist f eine totale und berechenbare Funktion f : N → N mit
34
∀n ∈ N : n ∈ M1 ↔ f (n) ∈ M2 ,
(14)
dann heißt M1 mittels f auf M2 reduzierbar.
2
(Notation: M1 ≤f M2 )
Satz 7.2 Sind f : N → N und g : N → N totale und berechenbare Funktionen,
dann gilt dies auch für ihre Verkettung g ◦ f .
Beweis. Angenommen f und g seien semantische Funktion von Programmen
P und Q.
Dann können P und Q leicht so zu P 0 und Q0 modifiziert werden,
daß sie keine gemeinsamen Hilfsregister benutzen und Q0 seine Eingabe dem
Register entnimmt, in das P 0 seine Ausgabe schreibt.
g ◦ f ist dann semantische Funktion des Programms P ; Q.
q.e.d.
Satz 7.3 Sind M1 , M2 ⊆ N, gilt M1 ≤f M2 und ist M2 entscheidbar, dann ist
auch M1 entscheidbar.
Beweis. Angenommen χM2 sei total und berechenbar. Wegen Gleichung (14)
in Definition 7.3 gilt χM1 = χM2 ◦ f . Mit Satz 7.2 ist χM1 ebenfalls total und
berechenbar.
q.e.d.
Mit dem vorstehenden Satz beweist man leicht, daß die Relation der Reduzierbarkeit transitiv ist.
Satz 7.4 Sind M1 , M2 , M3 ⊆ N, f und g totale und berechenbare Funktionen
und gelten M1 ≤f M2 und M2 ≤g M3 , dann gilt auch M1 ≤g◦f M3 .
Satz 7.5 Für M ⊆ N ist M entscheidbar, gdw. auch M entscheidbar ist.
35
Der Satz von Rice sagt verallgemeinernd, daß alle nichttrivialen Eigenschaften
von while-Programmen, die auf Registermaschinen interpretiert werden, unentscheidbar sind.
Satz 7.6 (Rice)
Es sei F die Menge der berechenbaren Funktionen. Für jede Menge F ⊂ F mit
∅ 6= F 6= F ist unentscheidbar, ob für ein gegebenes P ∈ ΦF M,T M für dessen
semantische Funktion PM ∈ F gilt.
Beweis.
Seien F und F wie in der Voraussetzung des Satzes gegeben. Es sei
RICE(F ) = p | für Q = surcode−1 (p) gilt : QM ∈ F .
Fall 1: Wenn ∅ ∈ F , dann sei T (F ) = RICE(G) und G = F .
Fall 2: Wenn ∅ 6∈ F , dann sei T (F ) = RICE(F ) und G = F .
Dann gilt ∅ 6∈ G und T (F ) ist entscheidbar gdw. RICE(F ) entschiedbar ist. Es
genügt also, die Entscheidbarkeit von T (F ) zu widerlegen.
Widerspruchsbeweis. Konstruktion einer Reduktionsfunktion.
Sei Q ein Programm mit einer von der leeren Funktion verschiedenen semantischen Funktion h ∈ G.
Für jedes Programm P ∈ ΦF M,T M sei R(0):=p das Programm, welches den
Kod p = surcode(P) in das Register 0 schreibt. Es sei nun das Programm R(P)
wie folgt definiert:
R(i):=R(0);
R(0):=p;
P;
R(0):=R(i);
R(i):=0;
Q
Man sieht, daß R(P)M = QM genau dann gilt, wenn p ∈ SAP . Damit gilt
SAP ≤f T (F ) für die Funktion f : N → N mit
∀p : f (p) = surcode(R(surcode−1 (p)))
q.e.d.
Die Tabelle 7.2.2 gibt einen Überblick über weitere unentscheidbare Probleme
und die entsprechenden Reduktionen, mit deren Hilfe die Unentscheidbarkeit
bewiesen werden kann.
36
Name
Reduktion
HP
SAP ≤f HP
Beschreibung
Halteproblem: Terminiert Programm P bei Eingabe?
HP = m | m = b2 (p, n), für P = surcode−1 (p) : PM (n)ist definiert
∀n ∈ N : f (p) = b2 (p, p)
NHP
SAP ≤g N HP
UDP
SAP ≤g U DP
TP
SAP ≤g T P
Null-Halteproblem: Terminiert Programm P bei Eingabe 0?
N HP = p | für P = surcode−1 (p) : PM (0)ist definiert
Undefiniertheitsproblem: Terminiert Programm P für keine Eingabe?
U DP = p | für P = surcode−1 (p) : (¬∃n : PM (n)ist definiert)
Totalitätsproblem: Ist Programm P total?
T P = p | für P = surcode−1 (p) : (∀n : PM (n)ist definiert)
∀p ∈ N : g(p) = surcode(R(0) := p; surcode−1 (p))
Äquivalenzproblem: Sind semantische Funktionen von P und Q gleich?
für P = surcode−1 (p), Q = surcode−1 (q) :
2
U DP ≤h EQP EQP = b (p, q) |
PM = QM
∀n ∈ N : h(p) = b2 (p, surcode(R))
EQP
für R= while null0 do
od; while not null0 do
od
Tabelle 1: Unentscheidbare Problem und ihre Reduktionsfunktionen
37
7.3
Rekursive Aufzählbarkeit
Am Ende des letzten Abschnitts wurden mehrere interessante unentscheidbare
Mengen beschrieben. Wir wenden uns nun der rekursiven Aufzählbarkeit von
Mengen zu. Diese Eigenschaft ist schwächer als die Entscheidbarkeit, erlaubt
aber zumindest, daß alle Elemente einer rekursiv aufzählbaren Menge effektiv
konstruiert werden können. Die folgenden Begriffe werden auf den Begriff der
Berechenbarkeit gestützt. Dabei wird jedoch nicht mehr auf ein bestimmtes
Maschinenmodell abgezielt.
Definition 7.4
Eine Menge M natürlicher Zahlen heißt genau dann rekursiv aufzählbar, wenn
es eine berechenbare totale Funktion f : N → N gibt, so daß M = f (N) gilt.
2
Der Zusammenhang von rekursiver Aufzählbarkeit und Entscheidbarkeit wird
durch den nachfolgend definierten Begriff der Semi-Entscheidbarkeit (Definition 7.5) und dessen Äquivalenz mit dem Begriff der rekursiven Aufzählbarkeit
(Definition 7.4) deutlich.
Definition 7.5
Eine Menge M natürlicher Zahlen ist genau dann semi-entscheidbar, wenn es
eine (nicht notwendig überall definierte) berechenbare Funktion f : N → N
gibt, so daß ∀x ∈ N : f (x) = 1 ↔ x ∈ M gilt.
2
Lemma 7.1
Eine Menge M natürlicher Zahlen ist genau dann semi-entscheidbar, wenn sie
rekursiv aufzählbar ist.
Beweis.
→:
Angenommen, Menge M sei rekursiv aufzählbar.
Sei f : N → N Funktion mit f (N) = M . Sei Q Programm, dessen semantische Funktion f ist. Das nachfolgend angegebene Programm P implementiert die Funktion gemäß Definition 7.5.
R(3) := R(0);
R(0) := 0; //Initialisiere Nummer des Testkandidaten
R(2) := 0; //Initialisiere Register fuer Testergebnis
whilenull2 do
Q; //Erzeuge neuen Kandidaten, Ergebnis in R(1)
if R(3) = R(1) then R(2) := 1 else fi;
nach0
od;
R(1) := 1;
R(3 := 0;
R(2) := 0
38
←: Angenommen, M ist semi-entscheidbar.
P sei Programm, dessen semantische Funktion f ist mit
∀x ∈ N : f (x) = 1 ↔ x ∈ M.
Problem: Die Termination von P ist nicht gesichert.
Aus P wird ein Programm Q konstruiert, welches terminiert und dessen
semantische Funktion die Elemente von M rekursiv aufzählt.
Dazu wird eine neue Variable eingeführt, die als Befehlszähler genutzt
wird. Dieser wird durch zusätzliche Anweisungen bei jedem Schleifentest
geprüft. Ist er größer als Null, wird er verringert. Ist er kleiner, wird der
Schleifenkörper nicht mehr ausgeführt.
Das modifizierte Programm wird in den Körper einer äußeren while-Schleife
eingebettet, in der systematisch alle Paare von Argumenten für die Funktion f und zulässigen Schrittzahlen probiert werden.
q.e.d.
Satz 7.7
Eine Menge M natürlicher Zahlen ist genau dann entscheidbar, wenn M und
N \ M semi-entscheidbar sind.
7.4
Universelle Funktionen
Definition 7.6
Eine berechenbare Funktion F : Nn+1 → N heißt universell für eine Klasse
von n-stelligen berechenbaren Funtionen F ⊆ Rn , falls es für jede Funktion
f ∈ F eine Zahl k ∈ N gibt, so daß
λx1 , . . . , xn .F (x1 , . . . , xn , k) = f
gilt.
Ein while-Programm heißt universell für eine Klasse von berechenbaren Funktionen F ⊆ Rn , wenn seine semantische Funktion universell für die Klasse F ⊆
Rn ist.
2
Satz 7.8
Es sei n positive ganze Zahl. Es gibt keine totale Funktion, die für die Klasse
der n-stelligen totalen berechenbaren (d.h. rekursiven) Funktionen universell ist.
Beweis.
Durch Diagonalverfahren: Angenommen, f : Nn+1 → N wäre eine universelle
Funktion für die Klasse der n-stelligen totalen berechenbaren Funktionen. f
39
ist total und berechenbar und P sei ein Programm, dessen semantische Funktion f ist. Man kann P zu einem Programm Q erweitern, welches die folgende
semantische Funktion hat
g(x1 , . . . , xn ) = f (x1 , . . . , xn , xn ) + 1
(15)
g ist ebenfalls total. Da f universell für die Klasse der n-stelligen totalen berechenbaren Funktionen ist, gibt es ein i ∈ N, so daß λx1 , . . . , xn .f (x1 , . . . , xn , i) =
g. Das führt für xn = i zum Widerspruch zu 15.
q.e.d.
Satz 7.9
Für jede positive ganze Zahl n gibt es eine universelle Funktion für die Klasse
der n-stelligen berechenbaren (d.h. partiell rekursiven) Funktionen.
Beweis.
Skizze zur Konstruktion des universellen Programms: Programme seien durch
ihre Gödelnummer kodiert. Diese wird als das (n + 1)-te Argument einer universellen Funktion aufgefaßt, die semantische Funktion der zu konstruierenden
universellen Maschine ist. Die Konstruktion der universellen Maschine erfolgt
in folgenden Schritten.
(1) Primzahltest.
(2) Zerlegung natürlicher Zahlen in Produkte von Primzahlpotenzen.
(3) Dekodierfunktion; ermöglicht die Dekodierung der aktuellen Anweisung.
(4) Interpreter.
q.e.d.
40
8
Endliche Automaten
Die Verarbeitung von Texten ist ein wichtiger Teil der Informatik. Ein zentraler Begriff ist der der formalen Sprache. Programmmiersprachen können als
anschauliches Beispiel dienen. Überwiegend erfolgt Kommunikation zwischen
Mensch und Maschine bzw. zwischen Maschinen über Ausdrücke, die Wörter
einer formalen Sprache sind.
Formale Sprachen sind meist unendlich, es ist daher wichtig, endliche Beschreibungsmittel für formale Sprachen bereitzustellen. Wichtige algorithmische Probleme sind das Erkennen der Zugehörigkeit von Wörtern zu einer Sprache, das
Erzeugen von Wörtern einer Sprache und die Interpretation der Wörter einer
Sprache.
Hier werden zu diesem Zweck endliche Automaten bereitgestellt und die mit
diesem Ausdrucksmittel beschreibbaren Sprachen charakterisiert.
8.1
Formale Sprachen
Definition 8.1 Sei eine nichtleere Menge Σ gegeben. Nachfolgend werden die
Menge Σ Alphabet und ihre Elemente Zeichen genannt. Eine endliche Folge von
Zeichen eines Alphabets Σ heißt Wort über Σ. Die Menge aller Wörter über Σ
wird mit Σ∗ notiert. Eine Teilmenge von Σ∗ heißt Sprache über Σ.
2
Für eine kompakte Notation werden folgende Abkürzungen eingeführt: Wörter
werden als Folgen ihrer Zeichen ohne Trennzeichen notiert. Gegeben sei ein
Alphabet Σ, ein Zeichen a ∈ Σ und eine natürliche Zahl n ∈ N. Dann bedeuten
a0 die leere Zeichenreihe (auch ε notiert) und an die Zeichenreihe a
. . a}. Mit
| .{z
n-fach
Σ+ wird die Menger der nichtleeren Wörter bezeichnet, d.h. Σ+ = Σ∗ \ {ε}.
Weitere Notationen:
Zeichen eines Alphabets
Wörter über einem Alphabet
Sprachen
a, b, c, . . .
x, y, z, . . .
A, B, C, . . .
Für Wörter sind folgende Operationen und Relationen erklärt.
Verkettung der Wörter x = a1 . . . an und y = b1 . . . bm ist das Wort xy =
a1 . . . an b1 . . . bm .
Teilwort. x ist Teilwort des Wortes y, wenn es Wörter z1 und z2 gibt mit
y = z1 xz2 . In Zeichen x v y.
Präfix. x ist Präfix des Wortes y, wenn es ein Wort z mit y = xz gibt.
Suffix. x ist Suffix des Wortes y, wenn es ein Wort z mit y = zx gibt.
41
Anmerkung: x v y genau dann, wenn es z1 und z2 gibt mit x Suf f ix z1 und
z1 P raef ix y sowie x P raef ix z2 und z2 Suf f ix y.
Beispiel 8.1 Sei Σ = {a, b, c, d, e, f, g}. Folgende Mengen dienen als Beispiele für Sprachen. Sie sind nach aufsteigender Komplexität ihrer Beschreibung
geordnet.
(1) L1 = {ab, ba}
(2) L2 = {abn a | n ∈ N}
(3) L3 = cx1 cx2 . . . cxn dn | n ∈ N, 0 < n, x1 , x2 , . . . , xn ∈ {a}+
(4) L4 = {x1 ayx2 bx3 yx4 | y ∈ Σ+ , x1 , x2 , x3 , x4 ∈ Σ∗ , ay 6v x1 x2 }
8.2
Endliche Automaten
Zur Motivation bzw. betreffs Anwendungen von endlichen Automaten:
• Beschreibung von Schaltwerken: vgl. [Weg93] S. 86.
Mit dieser Anwendung ist der weiter unten definierte Begriff des MealyAutomaten motiviert.
• Als Akzeptoren von formalen Sprachen: vgl. [Weg93] S. 90-92
Mit dieser Anwendung wird der nachfolgend eingeführte deterministische
endliche Automat (DEA) motiviert. In dieser Vorlesung werden wir vorwiegend an Mechanismen zur Beschreibung von formalen Sprachen interessiert sein. Deshalb wird vor allem mit DEA gearbeitet.
42
Beispiel: endlicher Automat A1 = (Q, Σ, q0 , δ, F ):
a
- 0 1
b @
a
b@
Zustandsmenge:
R @
2
a,b
6
Q = {0, 1, 2}
Eingabealphabet:
Σ = {a, b}
Startzustand:
q0 = 0
Zustandsüberführungsfunktion:
δ:
0
1
2
Endzustandsmenge:
a
1
2
2
b
2
0
2
F = {0}
von A akzeptierte Wörter: , ab, abab, ababab, ...
von A nicht akzeptierte Wörter: a, aba, aab, abbb, ...
es gilt: δ ∗ (0, abab) = 0, δ ∗ (0, a) = 1, δ ∗ (1, ab) = 2, ...
Definition 8.2
(1) Ein Tupel A = (Q, Σ, q0 , δ, F ) heißt deterministischer endlicher Automat
(DEA), falls
(a) Q und Σ endliche, paarweise disjunkte Mengen (genannt: Zustandsmenge und Eingabealphabet) sind,
(b) q0 ∈ Q heißt Startzustand.
(c) F ⊆ Q für die Endzustandsmenge F gilt und
(d) δ eine Abbildung δ : Q × Σ → Q ist. Sie heißt Zustandsüberführungsfunktion.
(2) Die erweiterte Zustandsüberführungsfunktion δ ∗ : Q × Σ∗ → Q ist wie
folgt definiert:
(a) δ ∗ (q, ε) = q und
(b) δ ∗ (q, wx) = δ(δ ∗ (q, w), x).
(3) Die von A akzeptierte Sprache ist {x ∈ Σ∗ | δ ∗ (q0 , x) ∈ F } und wird mit
L(A) notiert. A wird auch Akzeptor für L(A) genannt.
2
43
Beispiel 8.2 vgl. 4.1.1, 4.1.2, 4.1.3 in [Weg93]
Definition 8.3
(1) Ein Tupel A = (Q, Σ, Ω, q0 , δ, γ, F ) heißt deterministischer Mealy-Automat,
falls
(a) Q, Σ und Ω endliche, paarweise disjunkte Mengen (genannt: Zustandsmenge, Eingabe- und Ausgabealphabet) sind,
(b) q0 ∈ Q heißt Startzustand.
(c) F ⊆ Q für die EndzustandsmengeF gilt und
(d) δ, γ Abbildungen δ : Q × Σ → Q bzw. γ : Q × Σ → Ω sind. Sie
heißen Zustandsüberführungs- bzw. Ausgabefunktion.
(2) Die erweiterte Zustandsüberführungsfunktion und die akzeptierte Sprache
sind wie beim deterministischen endlichen Automaten definiert.
(3) Die vom Mealy-Automaten A berechnete Funktion ist die wie folgt definierte f : Σ∗ → Ω∗ :
(a) Zunächst wird die Funktion γ zu γ ∗ : Q × Σ∗ → Ω∗ erweitert.
i. γ ∗ (q, ε) = ε und
ii. γ ∗ (q, wx) = γ ∗ (q, w)γ(δ ∗ (q, w), x).
(b) Nun wird f durch γ ∗ definiert: f (w) = γ ∗ (q0 , w),
2
8.3
Minimale deterministische endliche Automaten
Minimalität bzgl. der Anzahl der Zustände wird als Gütemaß für Automaten
angenommen.
Für einen gegebenen Automaten ist man an einem Automaten interessiert, der
das gleiche leistet, d.h. die gleiche Sprache akzeptiert, aber möglichst wenige
Zustände hat.
Es gilt, zwei Ursachen für zu große Zustandsmengen auszuschalten:
(1) Zustände, die nichts zur Arbeit des Automaten beitragen, weil sie niemals
aktiv werden.
(2) Paare von Zuständen, die sich in ihrer Wirkung nicht unterscheiden.
Die ersten Quelle von Ineffizienz wird mit der Konstruktion nach Satz 8.1 beseitigt. Äquivalente Zustände werden mit dem in Definition 8.7 angebenen Algorithmus erkannt. Durch das Zusammenfassen von äquivalenten Zuständen
kommt man zum Äquivalenzklassenautomat (vgl. Definition 8.6).
44
Mit der Betrachtung der Nerode-Relation wird schließlich im Satz 8.4 die Grundlage für den Nachweis gelegt, daß man mit den genannten beiden Schritten zu
einem minimalen Automaten kommt.
Definition 8.4 ([Weg93], Df. 4.2.1)
Ein Zustand q eines DEA A = (Q, Σ, q0 , δ, F ), der vom Anfangszustand nicht
errreicht wird (d.h. für den es kein w ∈ Σ∗ gibt mit δ ∗ (q0 , w) = q), heißt
überflüssig.
2
Satz 8.1 ([Weg93], Satz. 4.2.2)
Die Menge der überflüssigen Zustände eines DEA kann in Zeit O(|Q||Σ|) berechnet werden.
Beweis.
Beweisidee: Tiefe-zuerst-Suche im Graphen, der den DEA darstellt.
q.e.d.
Beipiel: endlicher Automat A2 = (Q, Σ, q0 , δ, F ):
a
- 0 1
b Zustandsmenge:
@
a
b@
a R @
Eingabealphabet:
a,b
- 2
Startzustand:
3
b
6
Zustandsüber-
Q = {0, 1, 2, 3}
Σ = {a, b}
q0 = 0
führungsfunktion:
δ:
0
1
2
3
a b
1 2
2 0
2 2
0 2
Endzustandsmenge: F = {0}
Genau ein unerreichbarer Zustand: 3
Definition 8.5 ([Weg93], Df. 4.2.3)
Zustände p und q eines DEA A = (Q, Σ, q0 , δ, F ) heißen äquivalent gdw.
∀w ∈ Σ∗ : δ ∗ (p, w) ∈ F ⇔ δ ∗ (q, w) ∈ F
Notation: p ≡ q. Anmerkung: p und q sind von außen“ nicht unterscheidbar.
”
Ein Wort w ∈ Σ∗ heißt Zeuge für die Inäquivalenz von Zuständen p und q eines
DEA A = (Q, Σ, q0 , δ, F ) gdw. die Äquivalenz δ ∗ (p, w) ∈ F ⇔ δ ∗ (q, w) ∈ F
nicht gilt.
2
45
Beispiel: endlicher Automat A3 = (Q, Σ, q0 , δ, F ):
b - 0 1
b I
@
o
@ @a
S
S
Zustandsmenge:
b a b
a@ @
S
@
R
a
Eingabealphabet:
3
2 4 b
Startzustand:
6
Zustandsüber-
Q = {0, 1, 2, 3, 4}
Σ = {a, b}
q0 = 0
führungsfunktion:
a
δ:
0
1
2
3
4
a b
4 1
3 0
4 0
1 2
4 0
Endzustandsmenge: F = {0}
Zwei äquivalente Zustände: 2 und 4
Definition 8.6 ([Weg93], Df. 4.2.3)
Äquivalenzklassenautomat: sei ≡ die in Definition 8.5 eingeführte Äquivalenzrelation auf der Menge der Zustände eines DEA A = (Q, Σ, q0 , δ, F ).
Dann sei A0 = (Q0 , Σ0 , q00 , δ 0 , F 0 ) wie folgt definiert:
(1) Q0 = [Q]/≡
(2) Σ0 = Σ
(3) q00 = [q0 ]≡
(4) F 0 = {[q]≡ | q ∈ F }
2
(5) δ 0 ([q]≡ , x) = [δ(q, x)]≡
Satz 8.2 ([Weg93], Df. 4.2.5)
Äquivalenzklassenautomat A0 ist wohldefiniert und akzeptiert die gleiche Sprache wie A.
Idee für Minimierung: Versuche
statt der Allaussage für äquivalente Zustände (aus der Definition)
eine Existenzaussage (betreffs Zeugen) für nichtäquivalente Zustände beweisen.
46
Beipiel: endlicher Automat A3 = (Q, Σ, q0 , δ, F ):
b - 0 1
b I
@
o
S
@ @a
b a bS
a@ @
Zeuge
S
@
R
a
3
2 4
b
6
ab
b
ab
b
b
a
Zustandspaar
0
1
0
2
0
3
0
4
1
2
1
3
1
4
2
3
2
4
3
4
Symbole
a
Wartelisten
b
3
4
3
4
4
0 2
4 0 0
2 0
0
2
{1, 2} , {1, 4}
Zwei äquivalente Zustände: 2 und 4 — Nachweis
Definition 8.7 (vgl. Algorithmus in Df. 4.2.6 [Weg93])
Zur Vereinfachung der Notation wird angenommen, das die Zustandsmenge Q
des DEA A = (Q, Σ, q0 , δ, F ) die Menge der natürlichen Zahlen von {0, 1, . . . , n − 1}
für ein gewisses n ∈ N ist.
Eingabe:
DEA A = (Q, Σ, q0 , δ, F )
Ausgabe:
Markierung aller Paare4 {i, j} mit i, j ∈ Q und i 6≡ j
Datenstruktur: Für alle i, j mit 1 ≤ i < j ≤ n wird eine Liste von Paaren
von Zuständen gehalten mit folgender Eigenschaft:
∀ {k, l} : {k, l} ∈ Li,j → (i 6≡ j→k 6≡ l)
Erläuteung: Im Algorithmus wird es in manchen Situationen für ein Zustandspaar {k, l} anhand der bereits angesammelten Information möglich
sein, deren Inäquivalenz sofort festzustellen. In anderen Situationen wird
man dies nicht können.
Dann aber wird man zumindest wissen, daß die Inäquivalenz von k und l
aus der eines anderen Paares {i, j} folgt. Man fügt dann {k, l} in die mit
{i, j} verbundene Warteliste Li,j ein, in der Hoffnung, später die Inäquivalenz von k und l aus der von i und j folgern zu können.
4
Im Kontext dieses Algorithmus werden Paare als ungeordnet angesehen.
47
Initialisierung bewirkt:
Algorithmusschritt 1:
Für alle i, j: Li,j = ∅
Markiere alle Paare {i, j} mit
(i ∈ F ∧ j 6∈ F ) ∨ (i 6∈ F ∧ j ∈ F )
Die Inäquivalenz der Zustände in den markierten Paaren wird durch das
leere Wort bezeugt.
Algorithmusschritt 2:
Für alle nicht markierten Paare {i, j}:
Algorithmusschritt 2a:
Für alle a ∈ Σ: wenn {δ(i, a), δ(j, a)} markiert, dann
(1) markiere {i, j}
(2) markiere alle {k, l} ∈ Li,j
(3) entleere Li,j .
Algorithmusschritt 2b:
War für kein a ∈ Σ das Paar {δ(i, a), δ(j, a)} markiert, dann für alle
a ∈ Σ: füge {i, j} zu Lδ(i,a),δ(j,a) hinzu, falls δ(i, a) 6= δ(j, a).
2
Zur Korrektheit des Algorithmus aus Definition 8.7:
Zunächst ist nachvollziehbar, daß nur Paare von solchen Zuständen markiert
werden, für deren Inäquivalenz Zeugen existieren.
Die Annahme, daß umgekehrt Paare inäquivalenter Zustände unentdeckt bleiben, kann wie folgt zum Widerspruch geführt werden: Man betrachte von allen
Paaren inäquivalenter Zustände, welche durch den Algorithmus nicht entdeckt
wurden, ein Paar {i, j}, welches einen Zeugen kleinster Länge hat. Dieser Zeuge
kann nicht das Leerwort sein, da die Paare von Zuständen, deren Inäquivalenz
durch das Leerwort bezeugt wird, in der Initialisierung gefunden und markiert
werden. Der Zeuge hat also die Form aw für gewisse a ∈ Σ und w ∈ Σ∗ . Wir
betrachten nun die Zustände δ(i, a) und δ(j, a), deren Inäquivalenz durch w
bezeugt wird. Da der Zeuge w kürzer als aw ist, wird dieser laut Annahme
über die Minimalität von aw vom Algorithmus gefunden. Nach dem betrachteten Algorithmus war aber im Moment der Behandlung von {i, j} entweder
{δ(i, a), δ(j, a)} schon als inäquivalent erkannt gewesen oder es wäre in die Warteliste L{δ(i,a),δ(j,a)} eingefügt und beim Feststellen der Inäquivalenz von δ(i, a)
und δ(j, a) erkannt worden. Widerspruch.
Satz 8.3 ([Weg93], Df. 4.2.7)
Algorithmus 8.7 markiert alle Zustandspaare {i, j} mit i 6≡ j in O(|Q|2 |Σ|)
Schritten.
48
Zum Nachweis, daß Entfernen überflüssiger Zustände und nachfolgende Äquivalenzklassenbildung wirklich minimale DEA liefern, ist ein Satz von Nerode
über die Struktur regulärer Sprachen nötig.
Zu dessen Formulierung brauchen wir den Begriff der rechtsinvarianten Äquivalenzrelation in Sprachen. Es wird sich herausstellen, daß sich von DEA akzeptierte Sprachen stets als Vereinigung endlich vielen Äquivalenzklassen einer
solchen Äquivalenzrelation darstellen lassen.
Definition 8.8 ([Weg93], Df. 4.2.8)
Eine Äquivalenzrelation R auf Σ∗ heißt rechtsinvariant gdw.
∀ x, y ∈ Σ∗ : (xRy→∀ w ∈ Σ∗ : xwRyw)
Die Anzahl der Äquivalenzklassen bzgl. R heißt Index von R (Notation: Ind(R)).
2
Beispiel 8.3 ([Weg93], Beispiel 4.2.9)
Für DEA A sei Relation xRA y wie folgt definiert:
xRA y gdw. δ ∗ (q0 , x) = δ ∗ (q0 , y).
Dann ist RA rechtsinvariant.
Der Index von RA ist gleich der Zahl nichtüberflüssiger Zustände.
Definition 8.9 (Nerode-Relation, [Weg93], Beispiel 4.2.10)
Für L ⊆ Σ∗ sei Binärrelation RL in Σ∗ × Σ∗ wie folgt erklärt:
xRL y gdw.
∀ w ∈ Σ∗ : (xw ∈ L ∧ yw ∈ L) ∨ ( xw 6∈ L ∧ yw 6∈ L)
2
RL ist rechtsinvariante Äquivalenz.
Satz 8.4 (Satz von Nerode, [Weg93], Df. 4.2.11)
Für L ⊆ Σ∗ sind äquivalent:
(1) L wird von einem DEA A akzeptiert (d.h. L = L(A)).
(2) L ist Vereinigung einiger Äquivalenzklassen einer rechtsinvarianten Äquivalenzrelation mit endlichem Index.
(3) RL hat endlichen Index.
49
Beweis:
(1) impliziert (2): Als Relation dient die in Beispiel 8.3 definierte.
(2) impliziert (3): Sei R die nach (2) gegebene Relation. Man zeigt R ⊆ RL .
(3) impliziert (1): Als Zustände nimmt man die Äquivalenzklassen nach RL
d.h. die Elemente aus L/RL . Automatenkonstruktion in Anlehnung an die
Konstruktion in Definition 8.6.
Satz 8.5 (Folgerung aus Satz von Nerode, [Weg93], Korollar. 4.2.12)
Hat für eine Sprache L die Relation RL einen endlichen Index, so gibt dieser
die Anzahl der Zustände eines minimalen DEA A mit L(A) = L an.
Beweis. Der im Beweisschritt (3) impliziert (1)“ von Satz 8.4 konstruierte
”
DEA ist minimal.
q.e.d.
Satz 8.6 ([Weg93], Satz 4.2.13)
Entfernen überflüssiger Zustände und nachfolgende Äquivalenzklassenbildung
liefern minimale DEA.
Beispiel 8.4 (Minimierung eines DEA, [Weg93], Ex. 4.2.14)
Seite 99,100
8.4
Konstruktions- und Entscheidungsalgorithmen für Automaten
Satz 8.7 ([Weg93], Satz 4.6.1)
Für einen DEA A kann in linearer Zeit entschieden werden, ob L(A) leer ist.
Beweis. Der Automat A = (Q, Σ, q0 , δ, F ) kann als kantenbewerteter Graph
aufgefaßt werden. Dessen Knotenmenge ist die Zustandsmenge, die Kantenmenge ist {(q, δ(q, a)) | q ∈ Q, a ∈ Σ}
Mittels Tiefe-zuerst-Suche entscheiden, ob in diesem Graph kein akzeptierender
Zustand vom Startzustand aus erreichbar ist.
q.e.d.
50
Satz 8.8 ([Weg93], Satz 4.6.2)
Für einen DEA A mit Alphabet Σ kann in linearer Zeit entschieden werden, ob
L(A) = Σ∗ gilt.
Beweis. Mittels Tiefe-zuerst-Suche kann man entscheiden, ob alle nichtakzeptierenden Zustände unerreichbar sind.
q.e.d.
Satz 8.9 ([Weg93], Satz 4.6.3)
Für einen DEA A kann in linearer Zeit entschieden werden, ob L(A) unendlich
ist.
Beweis.
(1) Alle überflüssigen Zustände entfernen, ergibt DEA A0 .
(2) L(A) unendlich gdw. A0 enthält, als Graph aufgefaßt, einen Kreis, von
dem aus ein akzeptierender Zustand erreichbar ist.
(3) Richtung der Kanten umkehren. Mit Tiefe-zuerst-Suche entscheiden, ob
von den akzeptierenden Zuständen ausgehend Rückkanten auftreten.
q.e.d.
Satz 8.10 ([Weg93], Satz 4.6.4)
Für einen DEA A = (Q, Σ, q0 , δ, F ) kann in linearer Zeit ein DEA A0 konstruiert werden, der das Komplement L zu akzeptiert.
Beweis.
F durch Q \ F ersetzen.
q.e.d.
Satz 8.11 ([Weg93], Satz 4.6.5)
Für DEA A1 = (Q1 , Σ, q1 , δ1 , F1 ) und A2 = (Q2 , Σ, q20 , δ2 , F2 ) kann in der Zeit
O(|Q1 ||Q2 ||Σ|) ein DEA konstruiert werden, der die Vereinigung L(A1 )∪L(A2 )
akzeptiert.
Beweis.
Konstruktionsidee für den Automaten A = (Q, Σ, q0 , δ, F ):
Q = Q1 × Q2 ,
q0 = (q1 , q2 ),
∀(q, q 0 ) ∈ Q, a ∈ Σ : δ((q, q 0 ), a) = (δ1 (q, a), δ2 (q 0 , a))
51
F = Q1 × F2 ∪ F1 × Q2 .
q.e.d.
Anmerkung: Der L(A1 )∪L(A2 ) akzeptierende Automat kann unter Vermeidung
überflüssiger Zustände konstruiert werden. Bei der Konstruktion wird in einer
Matrix für Q1 × Q2 eingetragen, welche Zustände erreichbar sind.
Satz 8.12 ([Weg93], Satz 4.6.6)
Für DEA A1 = (Q1 , Σ, q1 , δ1 , F1 ) und A2 = (Q2 , Σ, q20 , δ2 , F2 ) kann in der Zeit
O(|Q1 ||Q2 ||Σ|) entschieden werden, ob L(A1 ) = L(A2 ) gilt.
Beweis.
(1) L(A1 ) = L(A2 ) gdw. L(A1 ) ∩ L(A2 ) = ∅ und L(A1 ) ∩ L(A2 ) = ∅.
(2) Automaten, die L(A1 ) ∩ L(A2 ) bzw. L(A1 ) ∩ L(A2 ) akzeptieren, können
in der Zeit O(|Q1 ||Q2 ||Σ|) konstruiert werden.
(3) Die Probleme L(A1 ) ∩ L(A2 ) = ∅ und L(A1 ) ∩ L(A2 ) = ∅ sind in linearer
Zeit entscheidbar.
q.e.d.
Für Sprachen werden folgende Operationen erklärt.
Definition 8.10
Die Verkettung (auch: die Produktsprache, die Konkatenation) der Sprachen L
und L0 ist die Sprache LL0 = {xy | x ∈ L, y ∈ L0 }.
2
Definition 8.11
Der Kleenesche
Abschluß (kurz: der Abschluß) der Sprache L ist die Sprache
S
L∗ = i∈N Li . Dabei gelten L0 = {ε} und für alle i ∈ N : Li+1 = L(Li ).
2
Oft wird auch die Abkürzung L+ für LL∗ benutzt (genannt positiver Abschluß).
Mit Hilfe der eben eingeführten Operationen und der Vereinigung von Mengen
können Sprachen einer einfachen Sprachklasse definiert werden (vgl. Definition
9.1).
Beispiel 8.5
(1) Die Sprachen 1 und 2 in Beispiel 8.1 sind regulär, die Sprachen 3 und 4
in jenem Beispiel sind es nicht.
52
(2) Über dem Alphabet {a, . . . , z, 0, . . . , 9} beschreibt die Sprache
L5 = {a, . . . , z} {a, . . . , z, 0, . . . , 9}∗
die Menge der Namen in (Standard-)Pascal.
(3) Über dem Alphabet {−, +, 0, 1} beschreibt die Sprache
L6 = {−1, +1, 1} {0, 1}∗ ∪ {0}
alle Darstellungen ganzer Zahlen im Dualsystem.
(4) Über dem Alphabet {−, +, ., 0, 1, E} beschreibt die Sprache
L7 = {−1, +1, 1} {.} {0, 1}∗ {E} {−1, +1} {0, 1}+
alle Darstellungen reeller Zahlen im Dualsystem.
8.5
Nichtdeterministische endliche Automaten
Können für gegebene Sprachen A1 und A2 Automaten A3 und A4 konstruiert
werden, die L(A1 )L(A2 ) bzw. L(A1 )∗ akzeptieren?
Idee: Hintereinanderschalten“ der Automaten A1 und A2 .
”
Problem: Es entsteht i.A. zunächst keine Übergangsfunktion sondern eine Übergangsrelation. Das führt zum Begriff des nichtdeterministischen endlichen Automaten NEA. Erst mit einer u.U. aufwendigen Konstruktion kommt man wieder
zu einem DEA.
Beispiel 8.6 (nach Satz 4.4.3 aus [Weg93])
Für natürliche Zahl n sei Ln Menge aller Wörter über {0, 1}, bei denen 1 der
n-letzte Buchstabe ist.
DEA für Erkennen von Ln hat mindestens 2n Zustände.
Beweisidee: Betrachtung der Nerode-Relation (vgl. Beispiel 8.9) zeigt, daß alle
Wörter aus {0, 1}n paarweise inäquivalent sind.
Definition 8.12
(1) Ein Tupel A = (Q, Σ, q0 , δ, F ) heißt nichtdeterministischer endlicher Automat (NEA), falls
(a) Q und Σ endliche, paarweise disjunkte Mengen (genannt: Zustandsmenge und Eingabealphabet) sind,
(b) q0 ∈ Q heißt Startzustand.
(c) F ⊆ Q für die Endzustandsmenge F gilt und
53
(d) δ eine Abbildung δ : Q × Σ → P (Q) ist. Sie heißt Zustandsüberführungsfunktion.
(2) Die erweiterte Zustandsüberführungsfunktion δ ∗ : Q × Σ∗ → P (Q) ist wie
folgt definiert:
(a) δ ∗ (q, ε) = {q} und
S
(b) δ ∗ (q, wx) = q0 ∈δ∗ (q,w) δ(q 0 , x).
(3) Die von A akzeptierte Sprache ist {x ∈ Σ∗ | δ ∗ (q0 , x) ∩ F 6= ∅} und wird
mit L(A) notiert. A wird auch Akzeptor für L(A) genannt.
2
Beispiel 4.4.2 aus [Weg93]: NEA für String Matching Problem (Erkennen von
Zeichenketten).
Beispiel 8.7 (nach Satz 4.4.3 aus [Weg93])
Für natürliche Zahl n sei Ln Menge aller Wörter über {0, 1}, bei denen 1 der
n-letzte Buchstabe ist.
Es gibt einen NEA für Erkennen von Ln mit n + 1 Zuständen.
Satz 8.13 ([Weg93], Satz 4.6.10)
Für DEA A1 = (Q1 , Σ, q1 , δ1 , F1 ) und A2 = (Q2 , Σ, q2 , δ2 , F2 ) kann in der Zeit
O((|Q1 | + |Q2 |)|Σ|) ein NEA konstruiert werden, der L(A1 )L(A2 ) akzeptiert.
Beweis.
Konstruktionsidee für den Automaten A = (Q, Σ, q0 , δ, F ):
Q = Q1 ∪ Q2 ,
q0 = q1 ,

. . . q ∈ Q1 \ F1
 {δ1 (q, a)}
{δ1 (q, a), δ2 (q2 , a)} . . . q ∈ F1
∀q ∈ Q, a ∈ Σ : δ(q, a) =

{δ2 (q, a)}
. . . q ∈ Q2
F1 ∪ F2 . . . ε ∈ L(A2 )
F =
.
F2
. . . ε 6∈ L(A2 )
q.e.d.
Satz 8.14 ([Weg93], Satz 4.6.12)
Für DEA A = (Q, Σ, q0 , δ, F ) kann in der Zeit O(|Q||Σ|) ein NEA konstruiert
werden, der L(A)∗ akzeptiert.
Beweis.
Konstruktionsidee für den Automaten A0 = (Q0 , Σ, q00 , δ 0 , F 0 ):
Schritt 1: Konstruktion eines L(A)+ akzeptierenden DEA.
Q0 = Q,
54
q00 = q0 ,
∀q ∈ Q, a ∈ Σ :
δ 0 (q, a)
=
{δ(q, a)}
... q ∈ Q \ F
{δ(q, a), δ(q0 , a)} . . . q ∈ F
F0 = F.
In zwei weiteren Schritten wird ein Automat A00 konstruiert, der genau das
leere Wort akzeptiert. Aus beiden kann ein Automat konstruiert werden, der
die Vereinigung L(A)∗ = L(A)+ ∪ {ε} akzeptiert.
q.e.d.
Es bleibt die Frage, wie man für einen NEA einen äquivalenten DEA konstruiert.
Satz 8.15 ([Weg93], Satz 4.4.5) Zu jedem NEA mit n Zuständen gibt es einen
äquivalenten DEA mit 2n Zuständen.
Beweis.
Schritt 1: Es wird in einem ersten Schritt die Potenzmengenkonstruktion (vgl.
[Weg93], Algorithmus 4.4.4) verwendet. Konstruktion des Automaten A0 =
(Q0 , Σ, q00 , δ 0 , F 0 ):
Q0 = P(Q),
q00 = {q0 },
∀q 0 ∈ P(Q), a ∈ Σ : δ 0 (q 0 , a) =
F0
=
{q 0
∈
Q0
|
q0
S
q∈q 0
δ(q, a)
∩ F 6= ∅}.
Danach können uberflüssige Zustände beseitigt (Schritt 2) und der DEA minimiert werden (Schritt 3).
q.e.d.
Diskussion: In der Praxis ist es notwendig, die Schritte 1 und 2 zu integrieren.
Dies ist zumindest theoretisch möglich. Jedoch kann der entstehende nichtminimale DEA ohne überflüssige Zustände immer noch sehr groß sein.
55
9
Reguläre Sprachen
9.1
Reguläre Ausdrücke
Mit Hilfe der Vereinigung, Konkatenation und Iteration von Sprachen können
Sprachen einer einfachen Sprachklasse definiert werden.
Definition 9.1 Eine Sprache, die durch endlich viele Anwendungen der Operationen Verkettung, Vereinigung und Iteration aus endlichen Sprachen über
einem Alphabet Σ gebildet werden kann, heißt reguläre Sprache über Σ.
2
Zur Vereinfachung der Schreibweise für reguläre Mengen werden reguläre Ausdrücke eingeführt:
Definition 9.2
Die Menge der regulären Ausdrücke über einem Alphabet Σ ist
• die kleinste Menge, die alle Elemente aus Σ enthält und
• bezüglich der folgenden Konstruktionsregeln abgeschlossen ist: Wenn A
und B reguläre Ausdrücke sind, dann auch (AB) (Verkettung), (A|B)
(Vereinigung) und (A)∗ (Iteration).
2
Die Bedeutung (Interpretation) eines reguläre Ausdruck A über einem Alphabet
Σ ist die folgende Sprache I(A) (über dem gleichen Alphabet):
I(a) = {a} für a ∈ Σ.
I(A|B) = I(A) ∪ I(B).
I(AB) = I(A)I(B) und
I(A∗ ) = (I(A))∗ .
Beispiel 9.1
Wir betrachten das Alphabet Σ = {a, b, c}.
regulärer Ausdruck
ab
a|b
a∗ b∗
(ab)∗
Interpretation als reguläre Menge
{ab}
{a, b}
{an bm | n, m ∈ N }
{(ab)m | m ∈ N }
56
Um möglichst wenige Klammern schreiben zu müssen, führt man folgende Vorrangregeln ein. Die Iteration ∗ bindet stärker als die Verkettung und diese stärker
als die Vereinigung.
Die Zusammenhänge zwischen den Klassen von durch Automaten akzeptierten Sprachen, regulären Sprachen und durch reguläre Ausdrücke beschriebene
Sprachen beschreibt der folgende Satz.
Satz 9.1
(1) Eine Sprache ist dann und nur dann regulär, wenn sie die Interpretation
eines regulären Ausdrucks ist.
(2) Eine Sprache ist dann und nur dann regulär, wenn sie durch einen endlichen deterministischen Automaten akzeptiert wird.
Beweis.
Ein Alphabet Σ sei beliebig aber fest vorgegeben.
zu 1. Es genügt zu beobachten, daß jedes Wort w einer endliches Sprache auch
einen regulären Ausdruck darstellt, dessen Interpretation die Einermenge
{w} ist. Damit läßt sich eine endliche Sprache {w1 , . . . , wn } als Interpretation des regulären Ausdrucks w1 | . . . | wn darstellen.
Der weitere Beweis kann nun durch Induktion über die Struktur der regulären Ausdrücke geführt werden.
zu 2. Zunächst skizzieren wir, wie für eine beliebige reguläre Sprache L über Σ
ein DEA konstruiert werden kann, der L akzeptiert. Der Nachweis erfolgt
durch Induktion über die Struktur der regulären Sprache.
Induktionsanfang: Für eine beliebige endliche Sprache L = {w1 , . . . , wn }
genügt es festzustellen, daß
L = {a1,1 } . . . {a1,m1 } ∪ . . . ∪ {an,1 } . . . {an,mn }
gilt, falls das Wort wi für i = 1, . . . , n die Form ai,1 . . . ai,ni hat. Damit
kann ausgehend von DEA die Sprachen der Form {ai,j } akzeptieren, mittels der Konstruktionen nach den Sätzen 8.11, 8.13 und 8.15 ein DEA
konstruiert werden, der L akzeptiert.
Induktionsschritt: Unter Verwendung der Sätze 8.11, 8.13, 8.14 und 8.15
können DEA konstruiert werden, die Sprachen akzeptieren, die aus einfacheren Sprachen durch eine Anwendung von Vereinigung, Verkettung
bzw. Iteration entstanden sind.
Nun zeigen wir für einen beliebigen DEA A = (Q, Σ, q0 , F, δ), wie die
durch A akzeptierte Sprache durch endlich viele Anwendungen der Operationen Vereinigung, Verkettung und Iteration aus endlichen Sprachen
konstruiert werden kann.
O.B.d.A. nehmen wir an, daß {1, . . . , n} für eine positive ganze Zahl n die
Menge der Zustände des DEA A und 1 dessen Anfangszustand ist. Mit
k bezeichnen wir die Menge der Wörter w für die gilt:
Ri,j
57
(1) δ ∗ (i, w) = j und
(2) für alle nichtleeren und von w verschiedenen Anfangsstücke w0 gilt:
δ ∗ (i, w0 ) ≤ k
k konstruiert. AchNun wird rekursiv eine Familie regulärer Mengen Ri,j
k bedeutet hier ausnahmsweise einen oberen Index und
tung: Das k in Ri,j
nicht eine Potenz der betreffenden regulären Menge.
0 =∪Σ
Grundfall: Ri,j
k = Rk−1 ∪ Rk−1 (Rk−1 )∗ Rk−1
rekursiver Fall: Ri,j
i,j
i,k
k,k
k,j
S
n
Man kann nun zeigen, daß L(A) = i∈F R1,i gilt.
q.e.d.
9.2
Beschreibung von Textmustern mitttels regulärer Ausdrücke
In verschiedenen Computersystemen steht das Programm grep (engl.: global
regular expression print) zur Verfügung, mit dem in Textdateien nach Mustern gesucht werden kann, die durch reguläre Ausdrücke beschrieben sind. Die
vom Programm grep benutzte Syntax wird auch in Editoren (z.B. im Editor
des Turbo-Pascal) verwendet, um Textmuster für Such- und andere Funktionen anzugeben. Die Zeichen * und + bedeuten die oben definierten Formen
der Iteration. Allerdings beziehen sie sich nur auf das vor ihnen stehende Zeichen. ^ bezeichnet den Zeilenanfang, $ das Zeilenende, . ein beliebiges Zeichen.
Die eckigen Klammern dienen als Mengenklammern. Mit dem Minuszeichen können Aufzählungen abgekürzt werden. Mit [a-z0-9] werden beispielsweise
alle Kleinbuchstaben und Ziffern beschrieben. [^a-z0-9] bezeichnet das Komplement dieser Zeichenmenge. Ein am Anfang einer Auflistung stehender Zirkumflex bewirkt, daß das Komplement der Menge gebildet wird.
Beispiel: grep -r ^alpha.*$ text sucht in der Datei text alle Zeilen, in denen
am Zeilenanfang das Wort alpha steht.
Bei der Angabe eines Dateinamens können die Ersetzungszeichen * und ? verwendet werden. Die Suche ist nicht notwendig auf das aktuelle Verzeichnis beschränkt.
grep -r "[a-z][a-z0-9 ]* *: *real" ex.pas sucht in dem Programm ex.pas
alle Vereinbarungen einer Variablen oder eines Parameters vom Typ real. Das
Suchmuster muß in diesem Fall in Anführungsstriche eingeschlossen werden,
weil das Leerzeichen sonst als Trennzeichen zwischen verschiedenen Parametern für das Programm aufgefaßt würde.
Auf analoge Weise werden reguläre Ausdrücke in Editoren eingesetzt, um komplexe Such- und Ersetzungfunktionen auszuführen (z.B. Emacs oder der Editor
im Turbo-Pascal)
58
Beispielsweise kann man im Editor Emacs mit der Funktion replace-regexp
(für vorsichtige Naturen ist query-replace-regexp besser geeignet) alle Kommentare in einem Pascal-Programm in C-Kommentare übersetzen. Dazu wird
das zu ersetzende Textmuster durch {\([^{}]*\)} beschrieben. Die mit dem
Rückstrich versehenen runden Klammern schließen hier einen regulären Ausdruck als Teilausdruck, auf dem man sich bei der Angabe des ersetzenden Textmusters beziehen kann (hier mittels \1). Das ersetzende Textmuster ist nun
/*\1*/.
Analog kann man Vereinbarungen von integer-Variablen in Pascal in Vereinbarungen von integer-Variablen in C umwandeln. Vereinfachend setzen wir
zunächst voraus, daß keine Leerzeichen auftreten. Dann kann
\([a-z][a-z0-9]*\(,[a-z][a-z0-9]*\)*\):integer;
zur Beschreibung des zu ersetzenden Teilausdrucks verwendet werden. Das ersetzende Textmuster wird mittels int \1; beschrieben. Würden Leerzeichen
zugelassen, würde sich der reguläre Ausdruck nicht wesentlich komplizierter
gestalten.
9.3
Lexikalische Analyse
Bei der Übersetzung von Programmierungsprachen ist das Problem der lexalischen Analyse zu lösen. Dabei ist der Eingabestrom, eine Folge von Zeichen,
in eine Folge von Terminalsymbolen der Grammatik, nutzerdefinierten Namen
und Zahlkonstanten der Sprache zu zerlegen (englisch: scanning). Es muß also
eine Teilsprache erkannt werden, deren Elemente zum Aufbau der eigentlichen
Sprache dient. Diese Teilsprache ist oft regulär. Zu ihrer Beschreibung werden
reguläre Ausdrücke benutzt.
Beispiel 9.2
(1) Über dem Alphabet {a, . . . , z, 0, . . . , 9} beschreibt der Ausdruck
[a − z] [a − z0 − 9]∗
die Sprache L5 , d.h. die Menge der Namen in (Standard-)Pascal.
(2) Über dem Alphabet {−, +, 0, 1} beschreibt der Ausdruck
(−1| + 1|1)(0|1)∗ + 0
die Sprache L6 , d.h. alle Darstellungen ganzer Zahlen im Dualsystem.
(3) Über dem Alphabet {−, +, ., 0, 1, E} beschreibt der Ausdruck
(−1| + 1|1).(0|1)∗ E(−1| + 1)(0|1)+
die Sprache L7 , d.h. alle Darstellungen reeller Zahlen im Dualsystem.
59
Für die Konstruktion von Übersetzern bzw. Interpretern ist ein Unterprogramm
notwendig, welches die lexalischen Analyse ausführt.
Mit den Konstruktionen aus den Sätzen ?? ist man prinzipiell in der Lage,
aus regulären Ausdrücken äquivalente DEA zu konstruieren. Diese wiederum
kann in ausführbare Programme übersetzen. Dieses Verfahren ist in Werkzeugen
wie lex (kommerziell) oder flex (freie Software) realisiert. Diese Werkzeuge
übersetzen reguläre Ausdrücke in C-Programme.
9.4
Konstruktion von Akzeptoren für reguläre Sprachen
Algorithmen (Programme), mit deren Hilfe die Zugehörigkeit von Wörtern zu
einer Sprache entschieden werden kann, werden als Akzeptoren bezeichnet. Hier
wird die automatische Konstruktion von Akzeptoren für reguläre Sprachen behandelt.
In Abbildung 5 ist ein Eingabedatei für das Programm lex dargestellt.
9.5
Grenzen der Ausdruckfähigkeit regulärer Sprachen
Der folgende als Pumping-Lemma bezeichnete Satz markiert eine prinzipielle
Schranke der Ausdrucksfähigkeit von regulären Sprachen. Der Satz sagt aus,
daß es für jede reguläre Sprache L eine natürliche Zahl n gibt, so daß es für
jedes Wort z, welches wenigstens die Länge n hat, eine Darstellung von z als
uvw mit nichtleerem v gibt, so daß auch alle Wörter der Form uv i w in die
Sprache hineingepumpt“ werden.
”
Satz 9.2
Es sei L eine reguläre Sprache über einem Alphabet Σ. Dann gibt es eine natürliche Zahl n, so daß es für jedes Wort z ∈ Σ∗ mit |z| ≥ n Wörter u, v, w ∈ Σ∗
gibt mit
(1) z = uvw,
(2) v 6= ε,
(3) |uv| ≤ n und
(4) ∀i ∈ N : uv i w ∈ L
Beweis. Der Beweis beruht auf folgender Idee: Es sei n die Anzahl der Zustände
eines L akzeptierenden DEA. Dann wird beim Akzeptieren eines Wortes z mit
einer Länge größer oder gleich n ein Weg mit mindestens n + 1 Zuständen
durchlaufen. Das heißt, betrachtet man den Automaten wieder als Graphen,
muß dieser Weg einen Zyklus enthalten. Es sei u das Präfix von z, welches bis
zum ersten Erreichen des Zyklus gelesen wird. Es sei w das Suffix von z, welches
nach dem ersten Durchlaufen des Zyklus gelesen wird. Schließlich sei v derart,
daß z = uvw. Man zeigt leicht, daß ∀i ∈ N : uv i w ∈ L.
q.e.d.
60
Der Beweis macht deutlich, daß die Endlichkeit der Speichermöglichkeiten des
Automaten der Grund für die beschriebene Ausdrucksschwäche ist.
Beispiel 9.3 Wir betrachten die Sprache
L3 = cx1 cx2 . . . cxn dn | n ∈ N, 0 < n, x1 , x2 , . . . , xn ∈ {a}+
aus Beispiel 8.1. Angenommen, L3 sei regulär. Dann sei n die natürliche Zahl,
die nach dem Pumping-Lemma existiert. Es sei z das Wort aus L3 mit der Form
caca . . . cadn+1
und
uvw
seine Zerlegung, die nach dem Pumping-Lemma existiert.
Zunächst kann ausgeschlossen werden, daß v Teilwort eines Wortes a ist. Denn
dann wäre ein Wort der Form
caca . . . cc . . . cadn+1
oder
caca . . . cacdn+1
in L3 in Widerspruch zur Definition.
Da |uv| ≤ n ist, kann v außerdem das Alphabetssymbol d nicht enthalten. Es
muß demnach das Symbol c enthalten.
Dann gilt aber bereits
uvvw 6∈ L3
Widerspruch. Folglich ist L3 nicht regulär.
Man kann weitere Beispiele konstruieren, die zeigen, daß reguläre Sprachen
insbesondere nicht ausreichen, um Klammerstrukturen korrekt zu beschreiben.
61
ID
[a-z][a-z0-9]*
%%
{ID}
{ID}[,]{ID}
{ID}(","{ID})*
a(-(c|d))*e
.
{
{
{
{
{
printf("1 Name:
printf("2 Namen:
printf("viele Namen:
printf("gefunden:
printf("*** falsch:
%s\n",yytext);
%s\n",yytext);
%s\n",yytext);
%s\n",yytext);
%s\n",yytext);
}
}
}
}
}
%%
/*-----------------------------------------------------------------------** Hauptprogramm:
main()
** Zweck:
Versucht, ein Wort der Spraches einzulesen,
**
solange Dateiende nicht erreicht ist.
------------------------------------------------------------------------*/
int main()
{
while ( yylex() ) {}
return 0;
}
/*-----------------------------------------------------------------------** Prozedur:
yywrap()
** Zweck:
sagt lex dass nach EOF kein Fortsetzung moeglich.
** Argumente:
keine
** Rueckgabewert:
TRUE
------------------------------------------------------------------------*/
int yywrap()
{
return 1;
}
Abbildung 5: Eingabedatei für automatische Konstruktion eines Scanners
62
10
Kontextfreie Sprachen
Am Beispiel der Sprache L3 wurde demonstriert, daß es Sprachen gibt, die nicht
regulär sind. Auf ähnliche Weise kann man zeigen, daß eine Programmiersprache wie Pascal ebenfalls nicht regulär ist. Dazu genügt es zu beobachten, daß in
Programmiersprachen vielfältige Klammerstrukturen auftreten, z.B. verschachtelte begin - end Klammerungen.
Im folgenden werden Grammatiken als ein weiteres Bescheibungsmittel eingeführt. Es werden danach in Abschnitt 11 die Syntaxdefinition und die Syntaxanalyse für Programmiersprachen genauer betrachtet. Insbesondere die sogenannten kontextfreien Grammatiken sind dabei ein wichtiges Hilfsmittel.
Definition 10.1
(1) Ein Quatrupel G = (T, H, s, R) heißt Grammatik, falls folgende Eigenschaften erfüllt sind.
(a) T , H und R sind endliche Mengen. T und H heißen Terminal- bzw.
Nichtterminalalphabet und ihre Elemente Terminal- bzw. Nichtterminalsymbole, die Elemente von R Regeln.
(b) H ∩ T = ∅.
(c) R ⊆ ((H ∪ T )∗ \ T ∗ ) × (H ∪ T )∗ .
(d) s ∈ H. Das Nichtterminalsymbol s heißt Startsymbol der Grammatik.
(2) (a) Ein Wort y über T ∪ H heißt direkt ableitbar aus einem Wort x ∈
(T ∪H)∗ , falls es eine Regel (l, r) ∈ R und Wörter u, v ∈ (T ∪H)∗ gibt
mit x = ulv und y = urv. In Zeichen x →R y.
(b) Ein Wort y über T ∪ H heißt ableitbar aus x ∈ (T ∪ H)∗ , falls es eine
endliche Folge von Wörtern z1 , . . . , zn gibt, so daß z1 = x, zn = y
und für alle i = 1, . . . , n − 1 gilt zi →R zi+1 . In Zeichen x →∗G y.
(c) Die Menge L(G) = {x | x ∈ T ∗ , s →∗G x} heißt von G erzeugte Sprache.
(3) Eine Grammatik G = (T, H, s, R) heißt kontextfrei, falls R ⊆ H ×(H ∪T )∗ .
2
Grammatiken werden in der sogenannten Chomsky-Hierarchie klassifiziert.
Typ 0-Grammatiken heißen alle Grammatiken im Sinne von Definition 10.1,
die keinen weiteren Einschränkungen unterliegen.
Typ 1- oder kontextsenstive Grammatiken sind durch folgende Bedingung
charakterisiert: Für alle Regeln (u, v) ∈ R gelten entweder u ∈ V + ,
v ∈ ((H ∪ T ) \ {s})+ und |u| ≤ |v| oder aber u = s und v = ε.
63
Typ 2-Grammatiken sind die kontextfreien Grammatiken.
Typ 3- oder rechtslineare oder reguläre Grammatiken sind die kontextfreien Grammatiken die folgende Bedingung erfüllen: Für alle (u, v) ∈ R
gelten entweder v = ε oder v ist ein Wort der Form aB mit a ∈ T und
B ∈ H. Die von regulären Grammatiken erzeugten Sprachen sind genau
die regulären Sprachen.
Beispiel 10.1 Es werden die Bezeichnungen wie in Beispiel 8.1 verwendet.
(1) L1 = L(G1 ) mit G1 = (Al, {s} , s, {(s, ab), (s, ba)}) .
(2) L2 = L(G2 ) mit G2 = (Al, {s, t} , s, {(s, at), (t, bt), (t, a)}) .
(3) L3 = L(G3 ) mit G3 = (Al, {s, t} , s, {(s, ctsd), (s, ctd), (t, at), (t, a)}) .
Wir bezeichnen die Familien von durch Grammatiken der Typen 0, 1, 2 und 3
definierbaren Sprachen mit L0 , L1 , L2 bzw. L3 . Dann gelten folgende Inklusionsrelationen.
⊂
⊂
⊂
L3 6= L1 6= L2 6= L0
Besonders wichtig ist die Anwendung kontextfreier Sprachen bei der Definition
von Programmiersprachen. Man geht dabei oft in zwei Schritten vor:
(1) Man definiert mit einer kontextfreien Grammatik zunächst eine Obermenge der betrachteten Sprache.
(2) Mit Hilfe von Kontextbedingungen wählt man daraus die eigentliche Programmiersprache aus. Typische Kontextbedingungen betreffen die Definiertheit von Variablen und anderen Sprachkonstrukten sowie deren Eigenschaften. Alle verwendeten Namen müssen vereinbart oder vordefiniert
sein. Die Vereinbarungen müssen der Verwendung entsprechen.
Für die weiteren Betrachtungen führen noch wir eine bequemere Notation für
die Grammatiken ein, die sogenannte Backus-Naur-Notation (BNF). Es sei eine
Grammatik G = (T, H, s, R) gegeben.
Backus-Naur-Notation (BNF) :
Regeln (r, w1 ),. . . , (r, wn ), deren linke Seite das gleiche Nichtterminalsymbol r
ist, können in folgender Schreibweise zusammengefaßt werden:
r ::= w1 | . . . |wn
64
14
Übungsaufgaben
Aufgabe 14.1
(1) Definieren Sie den Begriff deterministische Turingmaschine!
(2) Konstruieren Sie eine deterministische Turingmaschine, welche für eine auf deren Band binärkodiert geschriebene positive ganze Zahl den
Vorgänger berechnet!
(3) Konstruieren Sie eine deterministische Turingmaschine, welche für eine
auf deren Band geschriebene Zeichenkette feststellt, ob diese ein Palindrom ist.
Aufgabe 14.2
(1) Definieren Sie den Begriff nichtdeterministische Turingmaschine!
(2) (a) Problemdefinition:
Als Partitionsproblem bezeichnet man das folgende Problem:
gegeben: Eine Folge positiver ganzer Zahlen b1 , b2 , . . . , bn .
gesucht:
Eine Zerlegung der Indexmenge {1, 2, . . . , n} in zwei disjunkte
Teilmengen {n1 , . . . , nk } und {m1 , . . . , ml } mit
k+l =n
und
bn1 + . . . + bnk = bm1 + . . . + bml
.
(b) Skizzieren Sie eine nichtdeterministische Turingmaschine, welche mit
polynomiellem Zeitaufwand eine Lösung für eine auf deren Band
geschriebene Instanz des Partitionsproblems findet, soweit es eine
Lösung gibt!
Hinweis: Stellen Sie sich die Gleichung bn1 + . . . + bnk = bm1 + . . . +
bml durch eine Bandinschrift dargestellt vor, die über Abarbeitungsschritte aus einer Bandinschrift entsteht, die die Aufgabenstellung
repräsentiert.
134
Aufgabe 14.3
(1) Geben Sie unter Verwendung deterministischer Turing-Maschinen als Algorithmenmodell eine Definition für den Begriff Problem A ist in poly”
nomieller Zeit auf Problem B reduzierbar“ an!
(2) Beispielprobleme (Hinweis: Stellen Sie sich die zu den folgenden Problemen formulierten Fragen auch zu den anderen behandelten Problemen!)
(a) Zeigen Sie, daß sich das Erfüllbarkeitsproblem (SAT) der Aussagenlogik auf das auf Mengen von aus höchstens 3 Literalen bestehenden Klauseln eingeschränkte Erfüllbarkeitsproblem der Aussagenlogik (SAT(3)) mit polynomiellem Zeitaufwand zurückführen läßt!
(b) Zeigen Sie, daß sich das Problem der Existenz eines Hamiltonkreises in einem gerichteten Graphen (DHC) auf das der Existenz eines
Hamiltonkreises in einem ungerichteten Graphen (HC) mit polynomiellem Zeitaufwand zurückführen läßt!
(3) Geben Sie dazu jeweils das Prinzip der Reduktion an!
(4) Begründen Sie die Korrektheit der Reduktion!
(5) Welche Kosten verursacht der Reduktionsalgorithmus?
(6) In welchem Zusammenhang steht die Zugehörigkeit der beiden in (2) genannten Probleme zur Klasse P?
(7) In welchem Zusammenhang steht die NP-Vollständigkeit der beiden in (2)
genannten Probleme?
Aufgabe 14.4
(1) Definieren Sie den Begriff deterministische Turingmaschine!
(2) Problemdefinition: Als Cliquenproblem bezeichnet man das folgende
Problem:
gegeben: Ein ungerichteter Graph G und eine nichtnegative ganze Zahl
n.
gesucht:
Eine Clique der Größe n in G.
Skizzieren Sie eine nichtdeterministische Turingmaschine, welche mit polynomiellem Zeitaufwand eine Lösung für eine auf deren Band geschriebene Instanz des Cliquenproblems findet, soweit es eine Lösung gibt!
135
Aufgabe 14.5
(1) Definieren Sie den Begriff Entscheidbarkeit, indem Sie als Algorithmenmodell while-Programme benutzen!
(2) Erläutern Sie unter Verwendung der vorstehenden Definition die Formalisierung der folgenden Probleme:
(3) Beispielprobleme (Hinweis: Stellen Sie sich die zu den folgenden Problemen formulierten Fragen auch zu den anderen behandelten Problemen!)
(a)
i. Das Undefiniertheitsproblem.
ii. Das Äquivalenzproblem.
(b)
i. Das Selbstanwendbarkeitsproblem.
ii. Das Halteproblem.
Gehen Sie dabei auf der Methode der Gödelisierung ein!
(4) Geben Sie eine Reduktion des Undefiniertheitsproblems auf das Äquivalenzproblem an!
(5) Angenommen, Ihre vorstehende Reduktion wurde korrekt definiert.
In welchem Zusammenhang stehen dann die Entscheidbarkeit von Undefiniertheitsproblem und Äquivalenzproblem?
Aufgabe 14.6
Die interne Steuerung eines Bankautomaten verarbeitet Zeichenketten, die über
dem aus den Zeichen
a,b,k,l,v,w,s,q,0,1
bestehenden Alphabet gebildet werden und folgende Struktur haben:
Sie sind in die Zeichen s und q eingeschlossene Folgen von zumindest einem
Fragment. Ein Fragment ist ein Wort, welches mit einem der Buchstaben a, k
oder v beginnt. Darauf folgt eine von 0 verschiedene Binärzahl. Den Abschluß
eines Fragments bildet jeweils in Abhängigkeit vom Anfangszeichen des Fragments das Zeichen b, l oder w.
(1) Konstruieren Sie einen deterministischen, endlichen Automaten, der die
Menge der nach dieser Beschreibung gebildeten Zeichenketten akzeptiert!
136
(2) Auf Kundenwunsch soll die Funktionalität des Automaten komfortabler
werden. Es sollen jetzt Schachtelungen der Fragmente möglich sein, wie
man sie von Programmiersprachen her kennt.
Vor dem ein Fragment abschließenden Zeichen b, l oder w soll es jetzt
möglich sein, ein neues Fragment zu eröffnen und zu schließen.
Ist diese Aufgabe mit endlichen Automaten als Ausdrucksmittel zu lösen?
(3) Geben Sie das im Zusammenhang mit Teilaufgabe (2) wichtige Ergebnis
der theoretischen Informatik zur Ausdruckskraft bestimmter Formalisierungsmittel wieder!
Aufgabe 14.7 Das Alphabet sei Σ = {a, b}.
Zeigen Sie, daß die Sprache L2 = {an bm | n, m ∈ N } regulär ist.
(1) indem Sie L2 durch einen regulären Ausdruck beschreiben,
(2) indem Sie für L2 einen DEA konstruieren, welcher L2 akzeptiert.
(3) Ist der von Ihnen konstruierte Automat A minimal? Begründen Sie Ihre
Antwort.
(4) Sollte der von Ihnen konstruierte Automat A nicht minimal sein, geben
Sie einen minimalen DEA A0 mit L(A0 ) = L2 an.
Aufgabe 14.8 Das Alphabet sei Σ = {+, −, 0, 1}. Geben Sie zum nachfolgend
beschriebenen DEA A = (Q, Σ, q0 , δ, F ) einen minimalen DEA an, welcher die
gleiche Sprache akzeptiert wie A.
(1) Q = {0, 1, 2, 3, 4, 5, 6, 7, 8}.
(2) q0 = 0.
(3) F = {1, 4, 5, 6}.
(4) Die Zustandsüberführungsfunktion δ wird durch folgende Tabelle angegeben.
δ(q, a) für a =
1
q + − 0
0 3 2 6
1
1 7 7 1
1
2 7 7 7
4
3 7 7 7
5
4 7 7 4
4
5 7 7 5
5
7
6 7 7 7
7 7 7 7
7
8 7 6 1
2
137
Welche Zustände in A sind überflüssig, welche äquivalent? Nutzen Sie den Algorithmus aus Definition 1.7 und das entsprechende Programm.
Aufgabe 14.9
(1) Gegeben sei das Alphabet Σ = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ., E, +, −} .
Beschreiben Sie die Menge der Wörter über diesem Alphabet, die in Pascal
reelle Zahlen darstellen, durch einen regulären Ausdruck.
(2) Schreiben Sie eine Eingabedatei für das Programm lex (bzw. flex), welches reelle Zahlen erkennt und diese ausgibt.
(3) Beschreiben Sie mit einem regulären Ausdruck die Menge der Wörter
über dem Alphabet Σ = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ., E, +, −, i}, die komplexe Zahlen in der Form A + Bi darstellen, wobei A und B Darstellungen
reeller Zahlen wie in Teilaufgabe 1 sind.
Aufgabe 14.10 Gegeben sei die Sprache L1 =
Alphabet Σ = {a, b}.
an b2n | n ∈ N
über dem
(1) Geben Sie je 3 Wörter über dem Alphabet Σ an, die zu L1 gehören bzw.
nicht gehören.
(2) Ist die Sprache L1 eine reguläre Sprache? Begründen Sie Ihre Antwort.
Aufgabe 14.11 Das Alphabet sei Σ = {a, b}.
Zeigen Sie, daß die Sprache L2 = {xn ay m | x = ab, y = ba, n, m ∈ N } regulär
ist.
(1) indem Sie L2 durch einen regulären Ausdruck beschreiben,
(2) indem Sie für L2 einen DEA konstruieren, welcher L2 akzeptiert.
(3) Ist der von Ihnen konstruierte Automat A minimal? Begründen Sie Ihre
Antwort.
(4) Sollte der von Ihnen konstruierte Automat A nicht minimal sein, geben
Sie einen minimalen DEA A0 mit L(A0 ) = L2 an.
138
Aufgabe 14.12 Das Alphabet sei Σ = {+, −, 0, 1}. Geben Sie zum nachfolgend beschriebenen DEA A = (Q, Σ, q0 , δ, F ) einen minimalen DEA an, welcher
die gleiche Sprache akzeptiert wie A.
Es gelten Q = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, q0 = 0 und F = {1, 4, 5, 6, 8}. Die Zustandsüberführungsfunktion δ wird durch folgende Tabelle angegeben.
q
0
1
2
3
4
5
6
7
8
9
δ(q, a)
+ −
3 2
7 7
7 7
7 7
9 6
7 7
7 7
7 7
7 7
7 9
für
0
6
1
7
7
5
5
7
7
8
4
a=
1
5
1
8
1
2
5
7
7
8
8
Welche Zustände in A sind überflüssig, welche äquivalent? Nutzen Sie den Algorithmus aus Definition 1.7 und seine Implementierung, um die Frage zu beantworten.
Aufgabe 14.13 Das Alphabet Σ1 enthalte genau die Dezimalziffern, die Kleinbuchstaben des englischen Alphabets, das Unterstreichungszeichen, öffnende
und schließende runde Klammern, Leerzeichen, Doppelpunkt, Komma und Semikolon.
(1) Beschreiben Sie mit einem regulären Ausdruck die Menge der Wörter über
dem Alphabet Σ1 , die in Pascal Prozedurköpfe darstellen, die keinen anderen außer Wertparametern vom Typ integer oder real enthalten. Auf
Kontextabhängigkeiten (Verbot von Doppeltverwendung von Parameternamen) braucht keine Rücksicht genommen zu werden.
(2) Schreiben Sie eine Eingabedatei für das Programm lex (bzw. flex), aus
welcher ein Programm generiert wird, welches die vorstehend beschriebene
Sprache akzeptiert.
(3) Geben Sie einen DEA an, welcher die vorstehend beschriebene Sprache
akzeptiert.
Aufgabe 14.14 Das Alphabet Σ2 enthalte genau die Dezimalziffern, die Kleinbuchstaben des englischen Alphabets, den Dezimalpunkt, den Rückstrich und
das Unterstreichungszeichen.
139
(1) Beschreiben Sie mit einen regulären Ausdruck die Menge der Wörter über
dem Alphabet Σ, die im Dateisystem von DOS Pfadnamen darstellen.
(2) Geben Sie einen DEA A = (Q, Σ2 , q0 , F, δ) an, welcher die vorstehend
beschriebene Sprache akzeptiert.
(3) Ist der von Ihnen konstruierte Automat A minimal? Begründen Sie Ihre
Antwort, indem Sie für nicht überflüssige Zustände q ∈ Q Wörter w ∈ Σ∗2
mit δ ∗ (q0 , w) = q angeben. Für Paare von Zuständen sind Zeugen für
deren Inäquivalenz oder Gründe für die Nichtexistenz derartiger Zeugen
anzugeben.
Aufgabe 14.15 Es sei Σ ein beliebiges Alphabet.
Widerlegen Sie, daß die Sprache L = {uv | u ist Spiegelbild von v} regulär ist.
Aufgabe 14.16 Es sei L1 die Sprache, die genau die unter Verwendung der
Operationszeichen + und ∗ (in Infixnotation), des Variablensymbols a und
der Klammern ( und ) darstellbaren arithmetischen Ausdrücke enthält. Es soll
möglich sein, die arithmetischen Ausdrücke ohne überflüssige Klammern nach
der Regel Punktrechnung geht vor Strichrechnung“ zu bilden.
”
(1) Konstruieren Sie eine kontextfreie Grammatik über dem Alphabet Σ1 =
{+, ∗, a, (, )}, welche L1 erzeugt.
(2) Untersuchen Sie, ob Ihre Grammatik die Kriterien 1 und 2 aus Kapitel
4.1 der Vorlesung erfüllt.
(3) Entwerfen Sie ein Programm, welches die Sprache L1 akzeptiert.
Hinweis: Überlegen Sie, ob Sie eine Ihnen bekannte Programmiersprache als
Vorlage nehmen können.
Aufgabe 14.17 Es sei
Σ2 = {+, ∗, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, (, )}.
Die Sprache L2 sei analog zu L1 aus Aufgabe 14.19 gebildet, jedoch mit dem
Unterschied, daß statt der Variablen a jetzt beliebige nichtleere aus Buchstaben
zusammengesetzte Wörter als Variablen zugelassen sind.
(1) Erweitern Sie die Grammatik aus Übung 14.19, damit L2 erzeugt wird.
(2) Erfüllt Ihre Grammatik die Kriterien 1 und 2 für die effiziente Top-DownAnalyse? Begründen Sie Ihre Antwort.
(3) Entwerfen Sie ein Programm, welches L2 akzeptiert.
140
Aufgabe 14.18 Gegeben ist die Grammatik
G = ( x, n, ∗, (, ), :, ; , =, begin, end , {A, P, D, I, F } , I, R)
mit den Regeln R:
I
A
P
D
F
::= n := A | begin F end
::= x | (P )
::= AD
::= | ∗ AD
::= | I; F
(1) Bestimmen Sie die Mengen der Anfangssymbole für I und F (d.h. as(I), as(F ))
und die Mengen der Folgesymbole für I und F (d.h. f s(I), f s(F )).
(2) Erfüllt die definierte Sprache die Kriterien 1 und 2 für die Top-DownAnalyse?
Aufgabe 14.19 Es sei L die Sprache, die genau die unter Verwendung der
Operationszeichen + und ∗ (in Infixnotation), des Variablensymbols a und der
Klammern ( und ) darstellbaren arithmetischen Ausdrücke enthält. Die Syntaxanalyse soll so erfolgen, das auch Ausdrücke, die ohne nach der Vorrangregel
Punktrechnung geht vor Strichrechnung“ überflüssige Klammern geschrieben
”
werden, richtig interpretiert werden.
(1) Konstruieren Sie eine kontextfreie Grammatik über dem Alphabet Σ1 =
{+, ∗, a, (, )}, welche L1 erzeugt.
(2) Untersuchen Sie, ob Ihre Grammatik die Kriterien 1 und 2 aus Kapitel
4.1 der Vorlesung erfüllt.
(3) Entwerfen Sie ein Programm, welches die Sprache L akzeptiert.
Hinweis: Überlegen Sie, ob Sie eine Ihnen bekannte Programmiersprache als
Vorlage nehmen können.
Aufgabe 14.20 Gegeben ist die Grammatik
n
o
G = ( x, n, | , (, ), &, ; , =, if , {, } , {I, A, P, L, W, S, V } , I, R) mit der Menge R
von in BNF dargestellten Regeln:
I
A
P
L
W
S
V
::=
::=
::=
::=
::=
::=
::=
W | if (A = A) V
x | (ALAP )
| LAP
&&| | |
n=A
| IS
W ; | { IS }
141
(1) Geben Sie je 3 Wörter an, die zur von G erzeugten Sprache gehören bzw.
nicht gehören.
(2) Zeigen Sie, daß die angegebene Grammatik die Kriterien 1 und 2 für die
Top-Down-Analyse erfüllt.
Aufgabe 14.21 Gegeben sei Grammatik G3 = ({u, v, w} , {S, R, T, X} , S, P )
mit den Regeln P :
X ::= Ru | T v
T ::= | T w
S ::= X
R ::= | Rw
(1) Geben Sie Ableitungen für Wörter der Form wn u und wn v an.
(2) Ist die Grammatik eindeutig? D.h. existiert für jedes Wort in L(G3 ) genau
in Syntaxbaum?
(3) Kommt ein Syntaxanlysealgorithmus, welcher diese Grammatik umsetzt,
mit einem konstanten Lookahead5 aus?
(4) Erfüllt diese Grammatik die Kriterien 1 und 2 für die effiziente Top-DownAnalyse? Begründen Sie Ihre Antwort.
5
Als Lookahead wird die Anzahl der Alphabetszeichen bezeichnet, die sich ein Syntaxanlysealgorithmus merken muß, um zu entscheiden, welche Grammatikregel anzuwenden ist.
142
Inhaltsverzeichnis
1 Komplexität von Algorithmen und Problemen
2
1.1
Ressourcenbedarf von Programmen . . . . . . . . . . . . . . . . . . . . .
2
1.2
Algorithmenmodelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.2.1
Programmiersprachen . . . . . . . . . . . . . . . . . . . . . . . .
2
1.2.2
Turing-Maschinen . . . . . . . . . . . . . . . . . . . . . . . . . .
3
1.2.3
Registermaschinen . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.2.4
Nichtdeterministische Registermaschinen . . . . . . . . . . . . . .
5
1.2.5
while-Programme . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
Begriffe zur Komplexität . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
1.3.1
Kosten im schlimmsten Fall (worst case cost) . . . . . . . . . . .
6
1.3.2
Kosten im mittleren Fall (average case cost) . . . . . . . . . . . .
6
1.3.3
Beispiel zur Anwendung der Notation . . . . . . . . . . . . . . .
7
1.3.4
Einige Rechenregeln für Größenordnungen
7
1.3
. . . . . . . . . . . .
2 Turing-Maschinen
8
2.1
Formalisierung der Turing-Maschine . . . . . . . . . . . . . . . . . . . .
8
2.2
Abarbeitungsbegriff für Turing-Maschinen . . . . . . . . . . . . . . . . .
10
2.3
Eigenschaften von Abarbeitungen von Turing-Maschinen . . . . . . . . .
12
3 Schwierige Probleme und ihre Lösung
13
3.1
Fallstudie: Cliquenproblem in ungerichteten Graphen . . . . . . . . . . .
13
3.2
Eine Auswahl schwieriger Probleme . . . . . . . . . . . . . . . . . . . . .
16
3.2.1
Das Erfüllbarkeitsproblem in der Aussagenlogik . . . . . . . . . .
16
3.2.2
Cliquenproblem . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
3.2.3
Das symmetrische Problem des Handelsreisenden . . . . . . . . .
16
3.2.4
Das symmetrische Problem des Handelsreisenden mit Dreiecksungleichung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
Das Rucksackproblem . . . . . . . . . . . . . . . . . . . . . . . .
17
Zusammenhang zwischen Entscheidungs- und Optimierungsproblemen .
17
3.3.1
Optimierungsvarianten des Cliquenproblems . . . . . . . . . . . .
17
3.3.2
Optimierungsvarianten des Rucksackproblems . . . . . . . . . . .
18
3.3.3
Optierungsvarianten des Problems des Handlungsreisenden . . .
18
3.3.4
Optierungsvarianten des Problems des Handlungsreisenden mit
Dreiecksungleichung . . . . . . . . . . . . . . . . . . . . . . . . .
19
Überblick über Lösungsmethoden für schwierige Probleme . . . . . . . .
19
3.2.5
3.3
3.4
4 Die Komplexitätsklassen P und NP
4.1
Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
151
20
20
4.2
NP-Vollständigkeit wichtiger Probleme . . . . . . . . . . . . . . . . . . .
21
4.3
Pseudopolynomielle Algorithmen . . . . . . . . . . . . . . . . . . . . . .
22
5 Beispiele von Problemtransformationen (Reduktionen)
24
5.1
Reduktion Sat ≤p Clique . . . . . . . . . . . . . . . . . . . . . . . . . .
24
5.2
Reduktion Sat ≤p Sat(3) . . . . . . . . . . . . . . . . . . . . . . . . . .
25
5.3
Reduktion Sat(3) ≤p Knapsack . . . . . . . . . . . . . . . . . . . . . . .
25
5.4
Reduktion Sat(3) ≤p DHC . . . . . . . . . . . . . . . . . . . . . . . . .
26
5.5
Reduktion DHC ≤p HC . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
5.6
Reduktion HC ≤p ∆T SP . . . . . . . . . . . . . . . . . . . . . . . . . .
28
6 Quantencomputer
29
7 Berechenbarkeit und Aufzählbarkeit
30
7.1
These von Church . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
7.2
Unentscheidbarkeitsresultate
. . . . . . . . . . . . . . . . . . . . . . . .
30
7.2.1
Das Selbstanwendbarkeitsproblem . . . . . . . . . . . . . . . . .
33
7.2.2
Auf das Selbstanwendbarkeitsproblem reduzierbare Probleme . .
34
7.3
Rekursive Aufzählbarkeit . . . . . . . . . . . . . . . . . . . . . . . . . .
38
7.4
Universelle Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
8 Endliche Automaten
41
8.1
Formale Sprachen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
8.2
Endliche Automaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
8.3
Minimale deterministische endliche Automaten . . . . . . . . . . . . . .
44
8.4
Konstruktions- und Entscheidungsalgorithmen für Automaten . . . . . .
50
8.5
Nichtdeterministische endliche Automaten . . . . . . . . . . . . . . . . .
53
9 Reguläre Sprachen
56
9.1
Reguläre Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
9.2
Beschreibung von Textmustern mitttels regulärer Ausdrücke . . . . . . .
58
9.3
Lexikalische Analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
9.4
Konstruktion von Akzeptoren für reguläre Sprachen . . . . . . . . . . .
60
9.5
Grenzen der Ausdruckfähigkeit regulärer Sprachen . . . . . . . . . . . .
60
10 Kontextfreie Sprachen
63
10 Kellerautomaten und kontextfreie Sprachen
86
11 Deterministisch kontextfreie Sprachen
87
11.1 Top-down Syntaxanalyse . . . . . . . . . . . . . . . . . . . . . . . . . . .
152
87
11.1.1 Syntaxdiagramme . . . . . . . . . . . . . . . . . . . . . . . . . .
91
11.1.2 Konstruktion von Syntaxanalyseprogrammen . . . . . . . . . . .
92
11.2 Syntaxbäume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
94
11.3 Bottom-Up Syntaxanalyse . . . . . . . . . . . . . . . . . . . . . . . . . .
95
12 Die Chomsky-Hierarchie
98
13 Semantik von Programmiersprachen - Überblick
133
14 Übungsaufgaben
134
15 Anhang 1: Programme
144
15.1 Algorithmus zum Entdecken überflüssiger Zustände . . . . . . . . . . . . 144
15.2 Ein einfaches Syntaxanalyseprogramm . . . . . . . . . . . . . . . . . . . 147
153
Literatur
[AHU74] A. V. Aho, J. E. Hopcroft, and J. D. Ullmann. The Design and Analysis of Computer Algorithms. Addison-Wesley Publishing Company,
1974.
[CLRS01] Thomas H. Corman, Charles E. Leiserson, Ronald L. Rivest, and
Cliffor Stein. Introduction to Algorithms. MIT Press, Cambridge
MA, 2001.
[HK95]
Christian Horn and Immo O. Kerner. Lehr- und Übungsbuch Informatik, Band 1: Grundlagen und Überlick. Fachbuchverlag Leipzig,
1995.
[HMU02] John E. Hopcroft, Rajeev Motwani, and Jeffry D. Ullmann.
Einführung in die Automatentheorie, Formale Sprachen und Komplexitätstheorie. Pearson Studium, 2002.
[HSAF93] Ellis Horowitz, Sartaj Sahni, and Susan Anderson-Freed. Fundamentals of Data Structures in C. W. H. Freeman and Company, New
York and Oxford, 1993.
[KSV02]
A. Yu. Kitaev, A. H. Shen, and M. N. Vyalyi. Classical and Quantum
Computation. American Mathematical Society, 2002.
[Lyn66]
Roger C. Lyndon. Notes on Logic. Litton Educational Publishing
Inc., 1966. Polnisch von Wiktor Marek, PWN Warszawa, 1977.
[RMD83] G. Riedewald, Jan Maluszyński, and Piotr Dembiński. Formale Beschreibung von Programmiersprachen - Eine Einführung in die Semantik. Akademie-Verlag, Berlin, 1983.
[Tur36]
Alan M. Turing. On computable numbers, with an application to the
entscheidungsproblem. In Proceedings of the London Mathematical
Society, volume 42 and 43, pages 230–265 and 544–546, 1936.
[Weg93]
Ingo Wegener. Theoretische Informatik. B. G. Teubner, 1993.
[Wir83]
Niklaus Wirth. Algorithmen und Datenstrukturen. B. G. Teubner
Stuttgart, 1983.
154
Herunterladen