Entdecken Sie eBooks
Kategorien
Entdecken Sie Hörbücher
Kategorien
Entdecken Sie Zeitschriften
Kategorien
Entdecken Sie Dokumente
Kategorien
• Das Übungsblatt ist in zwei Teile gegliedert: den Vorbereitungsteil, den Sie vor der
Übung selbstständig bearbeiten sollen, und den Übungs-/Nachbereitungsteil, der
Aufgaben enthält, die in der Übung besprochen werden und von Ihnen anschließend
zur Nachbereitung verwendet werden können.
• Das ist nicht das Hausaufgabenblatt! Die Hausaufgaben finden Sie auf einem se-
paraten Blatt.
Dieser NFA akzeptiert die Sprache {u}. Wenn wir bei q0 und qn noch eine Schleife
mit Σ hinzufügen, akzeptiert der NFA genau die Sprache aller Wörter, die u ent-
halten. Um daraus einen DFA zu bekommen muss man bei q0 die Schleife mit dem
Zeichen u1 entfernen, und von den Zuständen qi Rückwärtskanten für die Zeichen
Σ \ ui+1 einfügen. Das Ziel dieser Kanten muss immer das längste Präfix von u
sein, das ein Suffix der bisher gelesenen Zeichenkette ist. Alternativ kann man den
NFA natürlich mit der Potenzmengenkonstruktion determinisieren.
(b) Ähnlich wie (a). Wenn u am Ende des Wortes vorkommen soll, dann macht man
eine Schleife mit Σ an q0 , soll es am Anfang vorkommen gehört die Schleife an qn .
Im letzteren Fall ist die Determinisierung leicht, man fügt von allen Zuständen qi
(außer qn ) eine Transition mit Σ \ ui+1 in einen Fangzustand ein.
Soll u am Ende des Wortes vorkommen, müssen wir wie bei (a) Rückwärtskanten
einfügen.
(c)
Σ
q0 q1
Σ
Wenn q0 zu einem Endzustand gemacht wird, akzeptiert dieser DFA genau alle
Wörter gerader Länge. Wird hingegen q1 zum Endzustand gemacht, so akzeptiert
er genau alle Wörter ungerader Länge.
(d) Ähnlich zu (a). Der folgende NFA akzeptiert genau alle Wörter der Länge n:
q0 Σ q1 Σ ... Σ qn
Σ
Fügt man noch einen Fangzustand ∅ Σ hinzu und verbindet qn → ∅, so er-
halten wir sogar einen DFA.
(e) Es geht um alle Wörter w, die an der Stelle n den Buchstaben a haben. Man kann
den NFA aus dem ersten Teil von (a) leicht anpassen:
q0 Σ q1 Σ ... Σ qn−1 a qn Σ
Auch hier erreicht man durch Hinzufügen eines Fangzustands wieder einen DFA.
a, b a, b
q0 q1 q0 q1
a, b q1 a, b q1 a, b
a a a a
q0 q3 q0 a b q3
b q2 b b q2 b
a, b
a, b q1 q3 a, b
a a
q0 q5
b q2 q4 b
a, b
NFA für B2
q3
b
b
q1 q4 a
a a
a
q0 a b q7 a, b
b
b q2 a q5
a b
b q6
DFA für B2
(c) Der NFA rät, ob jetzt das i-te Zeichen gelesen wird, welches die Bedingung erfüllt.
Der DFA muss sich hingegen immer die letzten n Zeichen die er gelesen hat merken,
um zu überprüfen, ob die Bedingung wi = wi+n erfüllt ist.
(d) Die Aussage ist korrekt. Der Beweis ist ähnlich zu dem Beweis in den Vorlesungs-
folien zur Sprache Lk . (Lemma 3.12)
S → XO O → ε X → XaA | XbB | ε
Aa → aA Ba → aB AO → Oa
Ab → bA Bb → bB BO → Ob
Wir schreiben alle Buchstaben das Wortes doppelt und verschieben A und B
bis zum Ende (markiert mit O) und wandeln dort das Zeichen wieder um.
Vielen Dank an David Schneller für diese Lösung.
→
− → −
2. G = ({S, X, O, A, B, A , B }, {a, b}, P, S) mit Produktionen P wie folgt
S → S0• S 0 → AS 0 A | BS 0 B | ◦
←− ←
− ←
− ←
− ←
−
A→a A• → A ◦ AA → AA B A → AB
←
− ←
− ←
− ←
− ←
−
B→b B• → B ◦ AB → B A B B → B B
←− ←− →
−
◦ A → A• ◦ B → B• • → ◦X
→
− →
− →
− →
− → −
X A → AX X B → B X X ◦ → •
◦• → ε •◦ → ε
Ein beliebiges Wort w zu erzeugen ist leicht. Im Aufgabenteil (c) sieht man,
wie man wwR bilden kann. Die Idee hinter dieser Aufgabe ist, zuerst wwR zu
bilden, aber alle Elemente von wR voerst als Nichtterminale darzustellen. Im
Anschluss verschieben wir die Nichtterminale in wR an die richtige Position
und ersetzen Sie schlussendlich durch Terminale. Die Intuition der Lösung
→
− ← −
ist, dass •, X , X den aktiven Bereich der Berechnung darstellen, wobei X ∈
{A, B}. ◦ ist der deaktivierte Begrenzer, der markiert, bis zu welcher Position
wir noch Buchstaben verschieben müssen. ◦ trennt zunächst die w und wR
voneinander. Mit jedem Buchstaben, den wir vom Ende von wR nach vorne
verschieben, wandert ◦ weiter nach rechts.
←
− → −
(e) G = ({S, A, A , A , •, ◦, #, $, X# }, {a, b}, P, S) mit Produktionen P wie folgt
S → •AX# $ X# → #X# | ε A → a
→
− →
− →
− ←
− ←−
•A → A ◦ A AA → AA AA → AA
→
− →
− ←
−
◦ A # → •AAA A A # → A #A
→
− ←−
A$ → ε ◦→ε ◦ A → •A
Die Grammatik rät zuerst die natürliche Zahl n und erzeugt dann alle ungerade
Zahlen 1, 3, ..., 2n (1 wird mit einem Nichtterminal dargestellt, welches am Ende
durch ein Terminal ersetzt wird, 3 mit drei solchen Nichtterminalen, etc.). Die
Summe all dieser ungeraden Zahlen ergibt gerade n2 , damit erhalten wir gerade eine
Zeichensequenz mit n2 Nichtterminalen, die im letzten Schritt dann mit Terminalen
ersetzt werden.
A∗ :=
[ [
An = A0 ∪ An := A0 ∪ A+ := {ε} ∪ A+ .
n≥0 n≥1
VL
Es reicht also ε ∈ A+ zu zeigen. Nach Vorlesung (VL) wissen wir A+ =
AA∗ := {uv | u ∈ A und v ∈ A∗ }. Wir wissen ε ∈ A per Annahme und es gilt
stets ε ∈ A∗ . Somit ε ∈ AA∗ = A+ .
=⇒: Beweis per Kontraposition (Erinnerung: Eine Aussage A =⇒ B ist äqui-
valent zu ihrer Kontraposition ¬B =⇒ ¬A). Annahme ε ∈ / A. Zu zeigen
∗ + ∗
A 6= A . Da ε ∈ A , reicht es ε ∈ / A zu zeigen. Da A = n≥1 An per Defi-
+ + S
nition, reicht es ε ∈ n
/ A für n ≥ 1 zu zeigen. Der Fall n = 1 gilt per Annahme.
Für den Fall n > 1 haben wir An := AAn−1 := {uv | u ∈ A und v ∈ An−1 }.
Sei nun w ∈ An . Dann gibt es u ∈ A und v ∈ An−1 mit w = uv. Da ε ∈ / A
gilt |u| > 0, somit |w| = |u| + |v| > 0 = |ε| und somit w 6= ε.
(b) Die Aussage ist falsch. Wähle A = {a, aa}, B = {b} und C = {ab}. Dann gilt
A(B ∩ C) = A∅ = ∅ =
6 {aab} = {ab, aab} ∩ {aab, aaab} = AB ∩ AC.
(c) Die Aussage ist wahr. Annahme (Ann.) A ⊆ B. Wir zeigen die Aussage per Induk-
tion über n. Für den Fall n = 0 gilt A0 = {ε} = B 0 . Im Fall n + 1 gilt An ⊆ B n per
Induktionshypothese (IH). Wähle nun w ∈ An+1 := AAn := {uv | u ∈ A und v ∈
Ann. IH
An }. Das heißt es gibt u ∈ A ⊆ B und v ∈ An ⊆ B n mit w = uv. Somit
w = uv ∈ BB n := B n+1 .
(d) Die Aussage ist wahr. Annahme A 6= ∅. Wir zeigen beide Richtungen der Aussage
getrennt.
Um festzustellen, ob die Quersumme durch 3 teilbar ist, genügt es uns, sich die Quer-
summe modulo 3 zu merken. Wir verwenden also Zustände Q = {0, 1, 2}, Startzustand
q0 = 0, akzeptierenden Zustände {0}, und Übergänge δ wie folgt.
0,3,6,9
1
2,5,8 1,4,7
0,3,6,9
1,4,7 2,5,8
1,4,7 0,3,6,9
0 2
2,5,8
Insbesondere gilt δ(q, c) = (q + c) mod 3 für alle Zustände q und Zeichen c ∈ {0, ..., 9}.
(b) Einfach die Quersumme zu betrachten genügt hier nicht, aber wir können ein
ähnliches Verfahren verwenden. Sei Mk := (Q, Σ, δ, q0 , F ) ein DFA, mit Zuständen
Q := {0, ..., k − 1}, Startzustand q0 := 0, akzeptierenden Zuständen F = {0}, und
Übergängen δ(q, c) := (10q + c) mod k für jedes q ∈ Q, c ∈ Σ.
Um zu beweisen, dass L(Mk ) = Lk gilt, zeigen wir die Aussage δ̂(q0 , w) = (w)10 mod k
mit vollständiger Induktion über die Wortlänge. Die Aussage, die wir beweisen wollen,
ist also: für jedes n ∈ N gilt, dass alle Wörter w ∈ Σn mit Länge |w| = n die Gleichung
δ̂(q0 , w) = (w)10 mod k erfüllen.
Induktionsbasis. Für n = 0 kann w nur das leere Wort sein, und es gilt
Induktionsschritt. Angenommen, die Aussage gilt für ein bestimmtes n ∈ N, es gilt also
δ̂(q0 , w) = (w)10 mod k für alle Wörter w mit Länge n. Wir müssen nun zeigen, dass
diese Gleichung auch für alle Wörter der Länge n + 1 gilt. Sei also w ∈ Σn+1 ein Wort
der Länge n + 1. Wir können w schreiben als w = uc, wobei u ∈ Σn ein Wort der Länge
n ist und c ∈ Σ ein Zeichen. Es gilt also
(1) (IA)
δ̂(q0 , w) = δ̂(q0 , uc) = δ(δ̂(q0 , u), c) = δ((u)10 mod k, c)
(2) (3)
= (10(u)10 + c) mod k = (uc)10 mod k = (w)10 mod k
In Schritt (1) haben wir die Definition von δ̂ verwendet, für (2) unsere Konstruktion von
δ, und (3) folgt aus der Definition von (w)10 .
Aufgabe H1.5. (Buchstabenfhler) 2+2+1 Punkte
Der Superschurke Dr. Evilsparza hat sich ins Campusnetzwerk gehackt und es ist ihm
gelungen, aus mehreren Programmen Fragmente zu löschen! Sie sind Teil des Cyberse-
curityteams, das versucht das Ausmaß des Schadens zu bestimmen und die beschädigten
Programme zu reparieren.
Sei Σ := {a, b} ein Alphabet und w ∈ Σ∗ ein Wort. Mit wR bezeichnen wir die
Umdrehung von w, also (w1 w2 ...wn )R := wn wn−1 ...w1 (hier sind w1 , w2 , ..., wn ∈ Σ) die
Buchstaben von w. Beispielsweise gilt also (abbaaa)R = aaabba.
(a) Sei L := {w ∈ Σ∗ : w = wR } die Menge der Palindrome über Σ. Wir definieren
folgende kontextfreie Grammatik G = ({S}, Σ, P, S) mit Produktionen P := {S →
aSa | bSb | ε}.
Gilt L(G) = L? Wenn ja, beweisen Sie es, wenn nein, geben Sie ein Gegenbeispiel
an und „reparieren“ Sie G, konstruieren Sie also eine Grammatik G0 mit L(G0 ) = L,
indem Sie neue Produktionen zu G hinzufügen.
(b) Sei G eine beliebige Grammatik, und G0 eine Grammatik, die durch das Entfernen
von einer beliebigen Produktion aus G entsteht. Beweisen Sie L(G0 ) ⊆ L(G), oder
widerlegen Sie es durch Angabe eines Gegenbeispiels.
(c) Sei G wieder eine beliebige Grammatik, und G0 eine Grammatik, die man erhält,
wenn man von G ein beliebiges Nichtterminalzeichen aus der rechten Seite einer
beliebigen Produktion löscht. Beweisen oder widerlegen Sie: L(G0 ) ⊆ L(G)
Lösungsskizze.
(a) L(G) = L gilt nicht, da a ∈ L, aber nicht über G produziert werden kann, weil
jedes Wort w ∈ ({S} ∪ Σ)∗ das aus S abgeleitet werden kann, d.h. S →∗G w, eine
gerade Anzahl an a’s hat. Wir reparieren G, indem wir S → a | b hinzufügen.
(b) Die Aussage ist wahr: Sei w ∈ L(G0 ) beliebig, und S das Startsymbol von G. Nach
Definition von L(G0 ) gilt also S →∗G0 w. Da wir für G0 aber nur eine Produktion
entfernt haben, gilt S →∗G w ebenfalls, und somit w ∈ L(G).
(c) Falsch! Ein Gegenbeispiel wäre G = ({S}, Σ, P, S) mit P = {S → aS}. Es ist nicht
möglich, in G ein Wort produzieren, das nur aus Terminalzeichen besteht, also
L(G) = ∅. Wenn wir allerdings die Produktionsregel zu S → a verändern, erhalten
wir L(G0 ) = {a}.
(b) Hier verwenden wir wieder einen DFA M19 = (Q, Σ, δ, q0 , F ) aus Aufgabe H1.4. Das
Wort w2021 hat allerdings Länge 22021 , eine Zahl, die zu groß ist, um ihre Binärdarstel-
lung in diesem Universum zu speichern. Wir müssen uns also ein geschicktes Verfahren
überlegen, um M19 auf w2021 auszuführen, ohne jedes Zeichen einzeln durchzugehen.
Hierzu merken wir uns für jedes n nicht nur, in welchen Zustand M19 landet, wenn wir
in Zustand 0 starten und wn einlesen, sondern wir merken uns auch die Endzustände für
jeden anderen Startzustand. In anderen Worten sind wir an der Funktion fn : Q → Q
interessiert, die fn (q) = δ̂(q, wn ) erfüllt. Analog dazu definieren wir uns gn für wn , also
gn (q) = δ̂(q, wn ).
Nach Definition von wn+1 gilt wn+1 = wn wn , wir können also (nach Definition von δ̂)
folgendes schreiben:
fn+1 (q) = δ̂(q, wn+1 ) = δ̂(q, wn wn ) = δ̂(δ̂(q, wn ), wn ) = δ̂(fn (q), wn ) = gn (fn (q))
Somit gilt fn+1 = gn ◦ fn . Mit dem gleichen Argument zeigen wir auch gn+1 = fn ◦ gn
(beachten Sie hier, dass wn+1 = wn wn ). Die Startwerte f0 , g0 ergeben sich direkt aus δ,
z.B. f0 (q) = δ(q, 0). Es genügt nun, f2021 (0) auszurechnen, etwa mit folgenden Python-
Code:
def a(n):
if n == 0: return 2
return [4, 16, 9, 5, 6, 17][(n-1)%6]
y = 0
for i in range(2021):
y = (a(i)-1) * (y+1) % 19
print(y)
Anmerkung: Da an 6-periodisch ist, und yn nur 19 mögliche Werte hat, ist yn auch
periodisch, mit Periode höchstens 6 · 19 = 114. Tatsächlich ist yn 108-periodisch und
somit gilt y2021 = y77 .
Prof. Javier Esparza Technische Universität München
Philipp Czerner, Martin Helfrich Lehrstuhl für Theoretische Informatik
• Das Übungsblatt ist in zwei Teile gegliedert: den Vorbereitungsteil, den Sie vor der
Übung selbstständig bearbeiten sollen, und den Übungs-/Nachbereitungsteil, der
Aufgaben enthält, die in der Übung besprochen werden und von Ihnen anschließend
zur Nachbereitung verwendet werden können.
• Das ist nicht das Hausaufgabenblatt! Die Hausaufgaben finden Sie auf einem se-
paraten Blatt.
1
Wenn Sie Automata Tutor noch nicht verwendet haben, folgen Sie erst den Schritten in Ü1.2, um sich
richtig zu registrieren.
Lösungsskizze.
(a) Ja: Man erstellt vom Startzustand q0 eine Kopie q00 , die nur die ausgehenden Kanten
von q0 erbt. Danach wird q0 zu einem normalen Zustand, während q00 zu einem
Startzustand wird. Formal: N 0 = (Q0 , Σ, δ 0 , q00 , F 0 ), wobei
• Q0 = Q ∪ {q00 },
• δ 0 = δ ∪ {(q00 , x, q) : (q0 , x, q) ∈ δ}
• F 0 = F ∪ {q00 : q0 ∈ F }
q2
a, b
a, c
a, c
q1 q3
b, c
b, c
q4
q2 , q3 b q2
a c c
a
a, b, c
b b a, c b
q1 q2 , q4 q3 ∅
c c
c a a
b, c
q3 , q4 q4
b
a a b
a a
(q, g) (r, g)
Der DFA M ist nicht minimal. Er akzeptiert die gleiche Sprache wie M1 .
Übungsaufgabe Ü2.7. (Teilwörter und reguläre Sprachen)
Ein Teilwort eines Wortes w ist ein zusammenhängendes Wort in w. Wir definieren die
Menge aller Teilwörter von w als ↓[w] := {w0 ∈ Σ∗ : w enthält w0 }. Also gilt beispielswei-
se the, he, theo, ε ∈ ↓[theo], aber to, theoo ∈
/ ↓[theo]. Die Menge aller Wörter, von denen
w ein Teilwort ist, ist dann entsprechend definiert als ↑[w] := {w0 ∈ Σ∗ : w0 enthält w};
z.B. thetheotee ∈ ↑[theo]. Wir erweitern dies auf Sprachen: Für eine beliebige Sprache
L ⊆ Σ∗ , definieren wir also ↓[L] := w∈L ↓[w], und ↑[L] := w∈L ↑[w].
S S
q0 q1 t q2 h q3 e q4 o q5
Σ Σ
q0 q1 t q2 h q3 e q4 o q5 q6
(b) Wenn L regulär ist, gibt es einen NFA N = (Q, Σ, δ, q0 , F ) der L akzeptiert und
bei dem jeder Zustand von q0 erreichbar ist. Wir zeigen, dass es einen -NFA N 0
gibt, der ↓[L] akzeptiert, indem wir N modifizieren.
Idee: Da wir alle Teilwörter akzeptieren wollen, muss es in N 0 möglich sein, ein
Präfix zu überspringen. Dafür führen wir einen neuen Startzustand ein, der jeden
anderen Zustand mit einem -Übergang erreichen kann. Da auch ein beliebiges Suf-
fix gelöscht werden darf, wird jeder Zustand in N , der einen Endzustand erreichen
kann, akzeptierend.
Wir definieren also -NFA N 0 = (Q ∪ {q00 }, Σ, δ 0 , q00 , F 0 ). Dabei ist
δ 0 = δ ] {(q00 , , q) : q ∈ Q}
F 0 = {q ∈ Q : ∃w ∈ Σ∗ : δ̄ˆ(q, w) ∩ F 6= ∅}
] {(q, , qf ) | q ∈ F } ] {(qf , x, qf ) | x ∈ Σ}
a b
b
1 2 3 4
b a
Lösungsskizze.
a b a
{1} {2} {1, 3} {2, 3} a a
b a a b
∅ {1, 3, 4} {3}
b a
b
a, b b
{3, 4}
a, b a a
b
q r s f g h
b a b
M1 M2
(a) Konstruieren Sie einen DFA M mit L(M ) = L(M1 ) ∩ L(M2 ), indem Sie die Pro-
duktkonstruktion verwenden.
(b) Konstruieren Sie einen DFA M 0 mit L(M 0 ) = L(M1 )∪L(M2 ). Sie dürfen ihr Ergeb-
nis aus Teilaufgabe (a) wiederverwenden – in dem Fall genügt es, zu beschreiben,
wie Sie es anpassen.
Lösungsskizze.
(a)
a
a
(q, f ) (r, f ) (s, f )
b a
b b
b
(q, g) (r, g) (s, g) b
b a
a
b b
a a
(r, h) (s, h)
a
(b) Wir müssen im Automaten aus (a) lediglich die akzeptierenden Zustände ändern,
hier sind {(r, f ), (r, g), (r, h), (q, g), (s, g)} akzeptierend.
Aufgabe H2.4. (Fangfrage) 2+1 Punkte
Sei Σ := {a, ..., z} und L := {w ∈ Σ∗ : w enthält theo}. Die Sprache L besteht also
aus genau den Wörtern, die theo als Teilwort besitzen, z.B. apotheose, pantheon, oder
theologie.
Für einen DFA bezeichnen wir einen Zustand als Fangzustand, wenn er keinen End-
zustand erreichen kann. (Es kann mehr als einen Fangzustand geben.)
(a) Zeigen Sie, dass jeder DFA, der L akzeptiert, einen Fangzustand besitzt.
(b) Zeigen Sie, dass in keinem DFA, der L akzeptiert, ein vom Startzustand aus er-
reichbarer Fangzustand existiert.
Lösungsskizze.
(a) Sei M = (Q, Σ, δ, q0 , F ) ein DFA mit L(M ) = L. Wir betrachten den Zustand
q := δ̂(q0 , theo), also den Zustand nach dem Einlesen des Wortes theo, und be-
hauptet nun, dass q ein Fangzustand ist. Hierzu führen wir einen Widerspruchsbe-
weis durch, wir nehmen also an, dass q kein Fangzustand ist. Somit kann q einen
Endzustand erreichen; es gibt also ein Wort w mit δ̂(q, w) ∈ F . Insbesondere ist
damit das Wort theo w von M akzeptiert – dies ist ein Widerspruch, da is in L
enthalten ist, und M genau das Komplement von L akzeptiert.
(b) Wir führen wider einen Widerspruchsbeweis. Nehmen wir also an, es gäbe einen
DFA M = (Q, Σ, δ, q0 , F ) mit L(M ) = L, sodass M einen Fangzustand q besitzt,
der von q0 zu erreichen ist. Es gibt also ein Wort w mit δ̂(q0 , w) = q. Da q ein
Fangzustand ist, gilt δ̂(q, theo) ∈
/ F , das Wort w theo wird also nicht von M
akzeptiert. Dies ist ein Widerspruch zur Annahme L(M ) = L.
q01 ... M1
q0
q02 ... M2
1
Die Notation A ] B entspricht A ∪ B, fordert aber zusätzlich, dass A und B disjunkt sind.
(a) Wenden Sie das Verfahren aus der Vorlesung an, um M zu einem NFA M 0 zu
konvertieren, indem Sie geeignet die ε-Kanten durch neue Kanten ersetzten. Be-
schreiben Sie das Ergebnis kurz.
(b) Zeigen Sie, dass das Anwenden der Potenzmengenkonstruktion aus der Vorlesung
auf M 0 einen DFA M 00 mit höchstens O(|Q1 | · |Q2 |) Zuständen ergibt. Beachten
Sie, dass wir – wie üblich – nur die aus {q0 } erreichbaren Zustände konstruieren.
Lösungsskizze. (a) Von {q0 } gibt es zwei Kanten für das Zeichen a, eine davon zu
δ1 (q01 , a), also dem Zustand, den M1 nach Lesen eines a erreicht; die andere zu δ2 (q02 , a).
Analog gibt es zwei Kanten mit Zeichen b. Insgesamt ergibt sich folgendes:
a
q01 ... M1
a b
b
q0 a
b
a
q02 ... M2
b
(b) Behauptung: Jeder von {q0 } in n ≥ 1 Schritten erreichbare Zustand in M 00 hat die
Form {r, s}, wobei r ∈ Q1 und s ∈ Q2 . Wir zeigen die Behauptung gleich per Induktion.
Falls die Behauptung tatsächlich wahr ist, dann hat M 00 höchstens 1+|Q1 ||Q2 | Zustände,
da es nur {q0 } von {q0 } in 0 Schritten erreicht werden kann.
Induktionsbasis. Für n = 1 müssen wir alle Zustände betrachten, die man von {q0 }
erreichen kann. Wie in (a) beschrieben, erreichen wir über Zeichen a die Zustände r :=
δ1 (q01 , a) und s := δ2 (q02 , a). Es gilt r ∈ Q1 und s ∈ Q2 , und somit ist {r, s} von der
beschriebenen Form. Das gleiche Argument funktioniert auch für Zeichen b.
Induktionsschritt. Set q ⊆ Q ein Zustand, der in n > 1 Schritten von {q0 } erreicht
wird. Nach dem vorletzten Schritt sind wir in einem Zustand q 0 ⊆ Q der in n − 1 ≥
1 Schritten erreicht wurde, für ihn gilt also q 0 = {r0 , s0 } mit r0 ∈ Q1 und s0 ∈ Q2
nach Induktionsannahme. In unserer Konstruktion haben wir aber keine zusätzlichen
ausgehenden Transitions zu den Zuständen vom M1 und M2 hinzugefügt. Da M1 und
M2 DFAs sind, erreichen r0 und s0 jeweils genau einen Zustand beim Lesen eines Zeichens.
Für Zeichen a erhalten wir mit r := δ1 (r0 , a) und s := δ2 (s0 , a) also Zustand {r, s}. Dies
gilt für Zeichen b analog, was die Aussage beweist.
Aufgabe H2.6. (Sparmaßnahmen) 1+3 Punkte
Die Universitätsleitung zeigt sich entsetzt über die große Menge an Tinte, die in die
fettgedruckten Symbole und ∅ in regulären Ausdrücken fließt. Deshalb wird angeordnet,
dass diese Symbole künftig – wenn möglich – vermieden werden. Jeder reguläre Ausdruck
soll in eine der folgenden Formen gebracht werden:
(F1) r (F2) r | (F3) (F4) ∅
Hierfür ist r ein beliebiger regulärer Ausdruck, der weder noch ∅ enthält.
Beruhigen Sie ihre verzweifelten Kollegen, indem Sie beweisen, dass jeder Ausdruck in
diese Form gebracht werden kann.
(a) Beweisen Sie (r | )∗ ≡ r∗ für jeden regulären Ausdruck r.
(b) Zeigen Sie, dass zu jedem regulären Ausdruck r0 ein äquivalenter Ausdruck r exis-
tiert, der in einer der obigen Formen ist.
Hinweis: Für (b) können Sie strukturelle Induktion verwenden.
Lösungsskizze. (a) Sei r ein beliebiger regulärer Ausdruck.
(b) Wir zeigen die Aussage mithilfe von struktureller Induktion. Als Induktionsbasis
zeigen wir die Aussage also für alle atomaren regulären Ausdrücke (d.h. für ∅, und jedes
c ∈ Σ); für den Induktionsschritt nehmen wir an, dass die Aussage für zwei beliebige
reguläre Ausdrücke r, s gilt, und zeigen, dass sie auch für r∗ , r | s und rs gilt.
Induktionsbasis. ∅ ist bereits in (F4), in (F3), und jedes Zeichen c ∈ Σ ist in (F1).
Induktionsschritt. Seien r0 , s0 beliebige reguläre Ausdrücke, die jeweils einen äquivalent
regulären Ausdruck r, s in einer der obigen Formen besitzen.
r∗ : Wenn r = oder r = ∅ (also (F3) oder (F4)), dann ist r∗ ≡ . Wenn r in (F1)
ist, so ist es auch r∗ . Wenn r in (F2) ist, dann gilt r = t | für einen regulären
Ausdruck t in (F1). Nach (a) gilt r∗ ≡ t∗ ; und t∗ ist in (F1).
rs: Wenn r = ∅ oder s = ∅, dann ist rs ≡ ∅. Wenn r = , dann ist rs ≡ s, und s ist
bereits in (F1), (F2) oder (F3). Analog für s = . Es bleiben 4 Fälle:
1. r und s in (F1): Dann ist rs auch in (F1).
2. r in (F1), s in (F2): Sei s = u | . Es gilt rs = r(u | ) ≡ ru | r, was in (F1) ist.
3. r in (F2), s in (F1): Analog zum vorherigen Fall.
4. r und s in (F2): Seien r = t | und s = u | . Dann gilt rs = (t | )(u | ) ≡
(tu | t | u) | , was in (F2) ist.
r | s: Da Vereinigung kommutativ ist, können wir ohne Beschränkung der Allgemeingül-
tigkeit annehmen, dass r und s nach Formnummer sortiert sind. (Wenn z.B. r in
(F4) ist und s in (F3), dann tauschen wir sie; r hat also nie eine größere Form als
s.) Wenn s = ∅ (also (F4)) dann ist r | s ≡ r, und r ist in einer der 4 Formen.
Folgende Fälle bleiben übrig:
1. r und s in (F1): Dann ist r | s auch in (F1).
2. r in (F1), s in (F2): Sei s = u | . Es gilt r | s ≡ (r | u) | , was in (F1) ist.
3. r in (F1), s in (F3): Dann ist r | u bereits in (F2).
4. r und s in (F2): Seien r = t | und s = u | . Dann gilt r | s = (t | ) | (u | ) ≡
(t | u) | , was in (F2) ist.
5. r in (F2) oder (F3), s in (F3): Dann ist r | u ≡ r, und r ist bereits in (F2)
oder (F3).
Bonusaufgabe H2.7. (Passwortsuche) 1+2 Bonuspunkte
Nach dem jüngsten Hackerangriff hat die IT der Universität beschlossen, neue Sicher-
heitsvorkehrungen zu treffen. Passwörter müssen nun die folgenden Regeln erfüllen:
• Ein Passwort besteht aus Ziffern Z := {0, ..., 9}, Kleinbuchstaben K = {a, ..., z},
Großbuchstaben G := {A, ..., Z}, und Sonderzeichen S := {+, −, %, $, /, #, ∼, !}.
• Jedes Passwort hat mindestens 3 und höchstens 5 Zeichen.
• Nach jeder Ziffer kommt ein Sonderzeichen oder das Wortende.
• Es dürfen keine zwei Sonderzeichen aufeinander folgen.
• Das Passwort muss mit einem Buchstaben oder einer Ziffer anfangen und enden.
• Ein Sonderzeichen darf nicht auf einen Buchstaben folgen.
• Nach einem Großbuchstaben darf keine Ziffer stehen.
• Vor einem Großbuchstaben darf kein Kleinbuchstabe stehen.
Die letzten sechs Regeln beziehen sich hierbei immer auf die Zeichen unmittelbar danach
oder davor. So darf z.B. nur direkt vor einem Großbuchstaben kein Kleinbuchstabe
stehen, aber r0 $E wäre erlaubt. Sie sollen nun die Stärke dieses Systems einschätzen,
indem Sie zählen, wie viele Passwörter erlaubt sind.
(a) Bestimmen Sie zunächst die Anzahl der möglichen Passwörter über dem verein-
fachten Alphabet Σ0 := {Z, K, G, S}. Hierzu ersetzen wir jeden Kleinbuchstaben
durch K, jeden Großbuchstaben durch G, usw. Aus dem Passwort Te0 !1 würde
also GKZSZ werden.
(b) Erweitern Sie nun ihr Ergebnis aus (a) und zählen sie die Passwörter, die den
obigen Regeln genügen.
Sowohl bei (a) als auch bei (b) sind wir an Verfahren interessiert, die sich verallgemei-
nern ließen, und z.B. auch Passwörter mit Länge 20 zählen könnten. Alle Möglichkeiten
durchzugehen ist hierfür nicht hinreichend. Geben Sie sowohl bei (a) als auch bei (b) Ih-
ren vollständigen Rechenweg an. Sie dürfen einen Taschenrechner verwenden, ansonsten
lösen Sie die Aufgabe bitte – wie immer – von Hand.
Hinweis: Auch die Bonusaufgaben beziehen sich auf die Vorlesungsinhalte und lassen
sich mit diesen lösen. (Es mag auch andere Lösungen geben.)
Lösungsskizze. (a) Abgesehen von der Länge werden die Regeln von dem folgenden DFA
M1 überprüft:
G
S G G
Z K K
S
Z
Z K K
Nicht existente Kanten führen hier zu einem impliziten Fangzustand. Die Idee hinter
M1 ist, dass wir uns immer das letzte Zeichen merken. Der Anfang des Wortes ist dabei
äquivalent dazu, hinter einem Sonderzeichen zu stehen. Die Länge überprüfen wir dann
mit einem DFA M2 :
Σ Σ Σ Σ Σ
0 1 2 3 4 5
Nicht existente Kanten führen wieder zu einem impliziten Fangzustand. Nun berechnen
wir einen DFA M = (Q, Σ0 , δ, q0 , F ) als Schnitt von M1 und M2 . Den Zustand (X, i) ist
dabei als Xi notiert, und jede eingehende Kante vom Zustand Xi ist mit X beschriftet.
Es gibt wieder einen impliziten Fangzustand.
Z1 Z2 Z3 Z4 Z5
S0 S2 S3 S4
G1 G2 G3 G4 G5
K1 K2 K3 K4 K5
Nun berechnen wir für jeden Zustand q von M , wie viele Wörter von q aus akzeptiert
werden, d.h. wir berechnen die Größe von a(q) := {w ∈ (Σ0 )∗ : δ̂(q, w) ∈ F }. Nach
Definition von DFAs ist a(q) = {ε : q ∈ F } ] c∈Σ0 {c}a(δ(q, c)); also ε, wenn q akzep-
U
tierend ist, und sonst alle enthält a(q) alle Wörter a(q 0 ) des Nachfolgezustandes q 0 , den
man über Zeichen c erreicht, mit einem c vorne angehängt. Diese Wörter sind alle unter-
schiedlich, wir können also |a(q)| bestimmen, indem wir die Werte der Nachfolgezustände
summieren und, falls q ∈ F , um 1 erhöhen.
16 7 4 1 1
53 16 7 3
21 12 7 3 1
16 9 5 3 1
• Das Übungsblatt ist in zwei Teile gegliedert: den Vorbereitungsteil, den Sie vor der
Übung selbstständig bearbeiten sollen, und den Übungs-/Nachbereitungsteil, der
Aufgaben enthält, die in der Übung besprochen werden und von Ihnen anschließend
zur Nachbereitung verwendet werden können.
• Das ist nicht das Hausaufgabenblatt! Die Hausaufgaben finden Sie auf einem se-
paraten Blatt.
q2
a a
b
q1 q3 a
b
Berechnen Sie mit dem Gauß-Verfahren und Ardens Lemma einen regulären Ausdruck
α mit L(α) = L(M ).
Lösungsskizze. Gleichungssystem:
X2 ≡ b∗ aX3 (4)
∗ ∗
X1 ≡ ab aX3 | bX3 ≡ (ab a | b)X3 (5)
Einsetzen in (5):
contains(a, ∅) = true
contains(a, ) = false
contains(a, x) = (x = a)
contains(a, r1 |r2 ) = contains(a, r1 ) ∧ contains(a, r2 )
contains(a, r1 r2 ) = contains(a, r1 ) ∨ contains(a, r2 )
contains(a, r∗ ) = false
(b) • Fall r = ∅
Es gilt contains(a, ∅) = true ⇐⇒ ∀w ∈ L(∅). P (w), da L(∅) = ∅.
• Fall r =
Wir haben L(r) = {} und contains(a, ) = false ⇐⇒ P () ⇐⇒ ∀w ∈
L(). P (w).
• Fall r = x
Wenn a = x, dann gilt L(x) = {a} und somit contains(a, x) = true ⇐⇒
P (a) ⇐⇒ ∀w ∈ L(x). P (w). Ansonsten haben wir contains(a, x) = false ⇐⇒
P (x) ⇐⇒ ∀w ∈ L(x). P (w), da L(x) = {x}.
• Fall r = r1 |r2
Als Induktionshypothesen erhalten wir contains(a, r1 ) ⇐⇒ ∀w ∈ L(r1 ). P (w)
und contains(a, r2 ) ⇐⇒ ∀w ∈ L(r2 ). P (w). Damit haben wir
• Fall r = r1 r2 (optional)
Als Induktionshypothesen erhalten wir contains(a, r1 ) ⇐⇒ ∀w ∈ L(r1 ). P (w)
und contains(a, r2 ) ⇐⇒ ∀w ∈ L(r2 ). P (w). Wenn L(r1 ) = ∅ oder L(r2 ) = ∅,
dann gilt L(r1 r2 ) = ∅ und die Korrektheit folgt analog zum Fall r = ∅.
Ansonsten gilt
Dabei gilt die dritte Äquivalenz aufgrund der Annahmen L(r1 ) 6= ∅ und
L(r2 ) 6= ∅.
• Fall r = r1∗
Dann gilt ∈ L(r1∗ ) und da P () = false, ist die Definition contains(a, r∗ ) =
false korrekt.
Prof. Javier Esparza Technische Universität München
Philipp Czerner, Martin Helfrich Lehrstuhl für Theoretische Informatik
Einführung in die Theoretische Informatik
Sommersemester 2021 – Hausaufgabenblatt 3
Aufgabe H3.1. (ein paar as, dann ein b...) 1+1+1 Punkte
Geben sie an, zu welchen regulären Ausdrücken die gleiche Sprache gehört. Bestimmen
Sie außerdem für jede Sprache, die Sie so identifizieren, ein Wort, das nur in dieser
Sprache liegen. Die sechs regulären Ausdrücke erzeugen drei unterschiedliche Sprachen.
Beispiel: Sie stellen fest, dass (1,2), (3,4) und (5,6) die gleiche Sprache erzeugen. Dann
müssen Sie ein Wort in L1,2 \ (L3,4 ∪ L5,6 ) finden, eines in L3,4 \ (L1,2 ∪ L5,6 ), und eines
in L5,6 \ (L1,2 ∪ L3,4 ).
Wie üblich, schreiben wir r+ anstelle von rr∗ , für einen regulären Ausdruck r.
(1) b | a+ (baa+ )∗ (b|bab) (4) (aba | a)∗ b
(2) (a | ab)+ | a(b∗ a∅)+ (5) a(a∗ ba)∗ a∗ (b | )
(3) (a+ b)∗ (6) ∅∗ | a(a | ba)∗ b
Lösungsskizze.
• (1) ≡ (4): b
• (2) ≡ (5): a (alle Wörter in a+ sind möglich)
• (3) ≡ (6): ε
Dezimalzahlen, deren Quersumme eine Primzahl ist, mit einer Raute vorneweg.
Beweisen Sie, dass L nicht regulär ist.
Der Rektor hat sich in der Zwischenzeit einen neuen Ansatz überlegt. Die Primzahl-
quersumme bräuchte man eigentlich nur in der traditionellen estlinger Form, für neue
Studenten müsse man es nicht so genau nehmen – ##1234 sei ja auch eine prima Matri-
kelnummer (für nicht-Estlinger).
(b) Zeigen Sie, dass die Sprache L0 := L ∪ {#i w : i 6= 1, w ∈ Σ∗ } die Eigenschaft des
Pumping-Lemmas erfüllt.
(c) Beweisen Sie, dass L0 dennoch nicht regulär ist, z.B. indem Sie Abschlusseigen-
schaften regulärer Sprachen verwenden.
Lösungsskizze.
(a) Wir nehmen an, L wäre regulär. Nun verwenden wir das Pumping-Lemma, um
einen Widerspruch herzuleiten. Sei also n ∈ N beliebig (n ist die „Pumping-
Lemma Zahl“). Es gibt unendlich viele Primzahlen, wir können dementsprechend
eine Primzahl p ≥ n wählen. Als Wort z wählen wir nun #1p . Offensichtlich gilt
z ∈ L und |z| ≥ n. Das Pumping-Lemma gibt uns nun eine Zerlegung z = uvw,
sodass v 6= ε und uv i w ∈ L für alle i ∈ N. Falls v die Raute enthält, ist das Wort
uv 0 w = w bereits nichts in L enthalten. Ansonsten sei z 0 := uv p+1 w, aber für
dessen Quersumme gilt
zi0 =
X X X
zi + p vi = p + p|v| = p(|v| + 1)
i>1 i>1 i≥1
Da v 6= ε und somit |v| > 0 ist p(|v|+1) aber keine Primzahl, da es durch die Zahlen
p und |v| + 1 teilbar ist. In jedem Fall konnten wir das Wort z also „aufpumpen“,
sodass es nicht mehr in L liegt. Dies steht aber im Widerspruch zur Aussage des
Pumping-Lemma, somit kann L nicht regulär sein.
(b) Wir wählen n := 2. Sei nun z ∈ L0 beliebig, mit |z| ≥ 2. Nun gibt es folgende Fälle,
abhängig von der Anzahl an Rauten k, mit denen z beginnt.
(c) Sei L1 := {#}Σ∗ die Sprache der Matrikelnummern, die mit genau einer Rau-
te beginnen. Die Sprache L1 ist offensichtlich regulär. Um einen Widerspruch zu
erzeugen, nehmen wir an, dass L0 regulär sei. Nach den Abschlusseigenschaften
regulärer Sprachen wäre dann auch L1 ∩ L0 regulär, es gilt aber L1 ∩ L0 = L und
wir haben bereits gezeigt, dass L nicht regulär ist. Dies ist ein Widerspruch, also
kann L0 auch nicht regulär sein.
Anmerkung: Es lässt sich auch auf direktem Wege beweisen, dass L0 nicht regulär
ist, z.B. mit der Methode über Residualsprachen, die wir im Kontext des Satzes von
Myhill-Nerode kennen lernen werden.
Aufgabe H3.3. (NFA zu RA) 3+1 Punkte
(a) Konvertieren Sie den folgenden NFA M zu einem regulären Ausdruck, indem Sie
ein geeignetes Gleichungssystem aufstellen und dieses lösen.
(b) Geben Sie einen äquivalenten NFA an, der 4 Zustände aber nur 5 Transitionen hat.
b
a
a b a
X Y Z W
Erklärung: (1) Wir setzen Y ≡ bZ bei X und W ein und wenden Ardens Lemma auf
Z an. (2) Wir setzen Z ≡ b∗ aW bei X, Y und W ein. (3) Wir vereinfachen die Gleichung
von X, da L(abb∗ aW ) ⊆ L(ab∗ aW ), außerdem wenden wir Ardens Lemma auf W an.
(4) Wir setzen W ≡ (abb∗ a)∗ in den anderen Gleichungen ein.
Somit erhalten wir L(M ) = L(ab∗ a(abb∗ a)∗ ).
(b) Wir konvertieren unseren regulären Ausdruck direkt zu einem NFA. Zustände 0, 1, 2
bilden das ab∗ a Präfix ab, also ist 2 akzeptierend. Um die (abb∗ a)∗ Schleife einzuleiten,
geht der Automat zuerst von 2 zu 3 – da der b∗ a Teil bereits am Anfang vorkommt,
können wir aber direkt von 3 zu 1 gehen.
b
a a a
0 1 2 3
Ansonsten übernehmen wir die Transitionen aus M , drehen sie aber um:
Es gibt also eine Transition von q 0 zu q in M 0 genau dann, wenn es eine von q zu q 0 in M
gibt. Die akzeptierenden Zustände sind F 0 = {q0 }, falls ε ∈/ L(M ), sonst F 0 = {q0 , q00 }.
Dieser NFA hat wie gefordert n + 1 Zustände.
(c) Wir geben die Konstruktion rekursiv an. Es gibt folgende Möglichkeiten:
• r ∈ {∅, } ∪ Σ: Wir setzen r0 := r, da hier L(r) = L(r)R gilt.
• r = (s)∗ : Wir konstruieren rekursiv einen regulären Ausdruck s0 mit L(s0 ) = L(s)R
und setzen r0 := (s0 )∗ . Dann gilt
• r = st: Rekursiv gibt es reguläre Ausdrücke s0 , t0 mit L(s0 ) = L(s)R und L(t0 ) =
L(t)R . Wir definieren r0 := t0 s0 und erhalten
• r = s | t: Wieder gibt es s0 , t0 mit L(s0 ) = L(s)R und L(t0 ) = L(t)R . Wir definieren
r0 := s0 | t0 und erhalten
Der Term fc ◦ fw hängt nur von fw (dem aktuellen Zustand) und c ab – insbesondere
hängt es nicht unmittelbar von w ab. Es ist für einen Zustandsübergang also (glückli-
cherweise) nicht wichtig, mit welchem Wort wir den Zustand betreten haben.
Für einen Zustand f ∈ Q0 und Zeichen c definieren wir also δ 0 (f, c) := fc ◦ f . Die
Finalzustände sind nun F 0 := {f ∈ Q0 | ∀i ∈ N : f i (q0 ) ∈ F }; wie oben erläutert ist
fwi (q0 ) der Zustand, den M erreicht, nachdem er das Wort w genau i-mal eingelesen
hat. Wir merken an, dass es uns zwar genügen würde, die Menge F 0 mathematisch zu
definieren, ohne dass wir angeben, wie man feststellt, ob ein bestimmter Zustand q ∈ Q0
nun tatsächlich dort enthalten wäre. Allerdings lässt sich die Eigenschaft ∀i : f i (q0 ) ∈ F
auch unschwer entscheiden: man berechnet sukzessiv die Folge q0 , f (q0 ), f 2 (q0 ), ... und
überprüft, ob alle Zustände in F enthalten sind. Sobald sich ein Zustand wiederholt,
kann man aufhören.
Abschließend beweisen wir noch formal, dass M 0 tatsächlich L0 akzeptiert. Es gilt
Da fwi = fwi nach Definition von δ̂, erhalten wir also w ∈ L0 genau dann, wenn fw ∈ F 0 .
Es genügt also, δ̂ 0 (q00 , w) = fw für alle w ∈ Σ∗ zu zeigen. Dies folgt über Induktion; als
Basis erhalten wir δ̂ 0 (q00 , ε) = q00 = Id = fε . Für den Induktionsschritt sei nun w ∈ Σ∗
und c ∈ Σ beliebig.
IA
δ̂ 0 (q00 , wc) = δ 0 (δ̂ 0 (q00 , w), c) = δ 0 (fw , c) = fc ◦ fw = fwc
Prof. Javier Esparza Technische Universität München
Philipp Czerner, Martin Helfrich Lehrstuhl für Theoretische Informatik
• Das Übungsblatt ist in zwei Teile gegliedert: den Vorbereitungsteil, den Sie vor der
Übung selbstständig bearbeiten sollen, und den Übungs-/Nachbereitungsteil, der
Aufgaben enthält, die in der Übung besprochen werden und von Ihnen anschließend
zur Nachbereitung verwendet werden können.
• Das ist nicht das Hausaufgabenblatt! Die Hausaufgaben finden Sie auf einem se-
paraten Blatt.
1
Falls der Link nicht mehr funktioniert, teilen Sie dies bitte der Übungsleitung mit. Die Teilnehmeran-
zahl ist leider auf 2000 begrenzt.
2
Wenn Sie Automata Tutor noch nicht verwendet haben, folgen Sie erst den Schritten in Ü1.2, um sich
richtig zu registrieren.
b
q1 a
a
a
q0 q3
b b b
q2
a
(b) Überlegen Sie sich, wie man den Minimierungsalgorithmus aus der Vorlesung ab-
ändern könnte, damit er neben einem minimalen DFA auch noch für jedes Paar
an Zuständen (q1 , q2 ), die nicht äquivalent sind, ein möglichst kurzes Wort w ge-
neriert, dass beweist, dass q1 und q2 nicht äquivalent sind.
Wenden Sie den neuen Algorithmus auf den DFA aus (a) an.
Lösungsskizze.
(a) Hier die Tabelle aus dem Minimierungsalgorithmus und der minimierte DFA:
b
q1
q0 q1 q2 q3 a
q0 − − − − a
q0 , q3
q1 × − − −
b
q2 × × − −
q3 = × × − b q2
a
(b) Statt in der Tabelle nur mit einem Kreuz (×) zu markieren, dass zwei Zustände
unterscheidbar sind, merken wir uns in der Tabelle ein Wort, dass sie unterscheidet.
Gegeben ein DFA (Q, Σ, q0 , δ, F ). Im ersten Schritt, tragen wir bei allen Paaren q1 ∈
F, q2 ∈ Q \ F das leere Wort ein. Dann iterieren wir so lange über die Tabelle, bis
sich nichts mehr ändert. Immer wenn wir zwei Zustände q1 , q2 ∈ Q mit dem Zeichen
x ∈ Σ unterscheiden können, tragen wir als Beweis xw in die Tabelle ein, wobei
w ∈ Σ∗ der Beweis aus der Tabelle ist, dass δ(q1 , x), δ(q2 , x) unterscheidbar sind.
Hier die Tabelle von Aufgabe (a), die durch den neuen Minimierungsalgorithmus
entsteht:
q0 q1 q2 q3
q0 − − − −
q1 ε − − −
q2 ε a − −
q3 = ε ε −
p0 b p1 b p2 b p3
b
(b) DFA D2
b
b
q0 a q1 q2
b
a
a a
b b b
q5 a q4 q3
a
Lösungsskizze.
(a) Tabelle und minimierter DFA für D1 :
p0 p1 p2 p3
p0 − − − −
p1 ε − − −
p2 ε b − −
p3 = ε ε −
a
a a
p0 , p3 b p1 b p2
b
(b) Tabelle und minimierter DFA für D2 :
q0 q1 q2 q3 q4 q5
q0 − − − − − −
q1 ε − − − − −
q2 ε = − − − −
q3 b ε ε − − −
q4 b ε ε = − −
q5 = ε ε b b −
b {q1 , q2 }
a
a
b
{q0 , q5 } {q3 , q4 }
a
• Kanonischer DFA:
a [a]
a
[ε] b, c
b, c
[b] Σ
{[ai ] | i ∈ N }
a a a ...
[abc] [a] [aa] [aaa]
c b b b
c b b
[aabb] [aaabb]
c b
[aaabbb]
...
(c) • Bestimmen einer unendlichen Menge von Äquivalenzklassen:
{[bi ] | i ∈ N }
• Kanonischer DFA:
b, c a
a
[ε] [a]
b, c
{[ai bi ] | w ∈ Σ∗ }
• Kanonischer DFA:
[bb]
b
a
[b]
b a b
b
[ε] [ba]
a a
[a]
a, b
{[(ab)i ] | i ∈ N }
a
0 1 2 3
b
b
a a
4 42 6 7
a b a
b b
b
8 9 A B
a
0 2
b
b
a a
4 42 6 7
a b
b b
b
8 9 A
Da Zustand 6 lediglich beliebig viele b einliest und dann zu Zustand 2 wechselt, der
ebenfalls beliebig viele b einliest (und beide Zustände akzeptierend sind), lässt sich die
Kante von 6 zu 2 kollabieren. Von 42 aus wird jede Folge an b akzeptiert, auch das
leere Wort, also können wir die Kante von 42 nach A kollabieren. Schließlich können wir
Zustand 9 entfernen, indem wir Kanten von 8 direkt zu 4 und 12 erstellen.
b
b
a
0 2 7
a
b
a
4 42
a b
b b
8
(b) Die oberen Zustände (also {0, 2, 7}) des Automaten akzeptieren genau a(b | ba)∗ .
Dies sind die Wörter, die mit einem a beginnen und aa nicht enthalten. An dieser Stelle
kann man auch durch clevere Umformungen darauf kommen, dass der untere Teil des
Automaten genau die gleiche Sprache akzeptiert – falls man dies allerdings nicht bemerkt,
bietet sich eine Potenzmengenkonstruktion an, um die beiden Teile zu vereinfachen.
b
a
{0} {2} {2, 7}
a
b
b
a
{4} {8, 42} {8, 4, 42}
a
Nicht gezeichnete Kanten führen zu einem impliziten Fangzustand. Da beide DFAs iden-
tisch sind, müssen auch beide Teile des -NFAs die gleiche Sprache akzeptieren. Somit
können wir Zustände {4, 8, 42} löschen, und erhalten a(b | ba)∗ als regulären Ausdruck
äquivalent zu M mit Länge 6.
Aufgabe H4.3. (a maiore ad minus) 2+1 Punkte
(a) Bestimmen Sie für folgenden DFA M die Äquivalenzklassen von ≡M mit der Er-
weiterung des in der Vorlesung vorgestellten Verfahrens aus Ü4.4. Geben Sie also
insbesondere für jedes Paar an Zuständen (q, r), das sie „markieren“, ein Wort w
an, das sie unterscheidet (d.h. von δ(q, w), δ(r, w) ist genau einer akzeptierend). Es
steht ihnen frei, auch die optimierte Version des Verfahrens mit Abhängigkeitsana-
lyse zu verwenden.
(b) Erzeugen Sie einen minimalen DFA äquivalent zu M , indem sie die äquivalenten
Zustände von M kollabieren.
b
a
a, b b
a
0 1 2 3
b a
a a
b
4 5
b
Lösungsskizze.
0 0 0
ε 1 ε 1 ε 1
ε 2 a ε 2 a ε 2
ε ε 3 ε ε 3 ε ε 3
ε ε 4 ε a ε 4 ε a ε 4
ε ε ε 5 ε ε ε 5 ε ε ε 5
(a) Zuerst markieren wir alle Paare die genau einen akzeptierenden Zustand besitzen als
a
unterschiedlich. Danach gehen wir alle verbleibenden Paare durch: (0, 2) → (1, 2) und
a
(1, 2) ist markiert mit ε, also wird auch (0, 2) markiert, und zwar mit a. (1, 3) → (2, 2)
b a
und (1, 3) → (0, 0), also bleibt (1, 3) unmarkiert (und wird es auch immer sein). (2, 4) →
a b
(2, 1), also wird (2, 4) markiert, ebenfalls mit a. (3, 5) → (2, 2) und (3, 5) → (0, 4), also
a b
bleibt (3, 5) unmarkiert. (0, 4) → (1, 1) und (0, 4) → (1, 5), also bleibt (0, 4) unmarkiert.
a b
Schließlich gilt (1, 5) → (2, 2) und (1, 5) → (0, 4), und (1, 5) bleibt auch unmarkiert.
In der nächsten Iteration gibt es keine Veränderungen. Die Äquivalenzklassen sind also
{{0, 4}, {1, 3, 5}, {2}}.
(b) Der minimierte DFA sieht folgendermaßen aus:
a
a, b a
0, 4 1, 3, 5 2
b b
a
a b
0 2 4 7
b a
a
b
b b
1 3 5 8
b
a a
a, b
a 6 9
a, b
Lösungsskizze. (a) Die Äquivalenzklassen sind {{0, 4}, {1}, {2, 5}, {3, 8}, {6, 7, 9}}.
b a, b
a
a b
0 2 4 7
b a
a
b
b b
1 3 5 8
b
a a
a, b
a 6 9
a, b
(b) Zuerst eliminieren wir den nicht-erreichbaren Zustand 1. Danach kollabieren wir
äquivalente Zustände und erhalten folgenden Automaten.
a
2, 5 0, 4
a b
b b
a
3, 8 6, 7, 9 a, b
Zustand 7 ist ein Fangzustand, der DFA akzeptiert also die Sprache, die von dem regu-
lären Ausdruck a(aa | bb)∗ erzeugt wird.
Aufgabe H4.5. (ejusdem generis) 1+3 Punkte
(a) Sei Σ := {a}, k ∈ N>0 beliebig und L := {aik : i ∈ N} die Sprache der Wörter
deren Länge ein Vielfaches von k ist. Bestimmen sie die Äquivalenzklassen von
≡L (s. Definition 3.55), und zeigen Sie so, dass der minimale DFA für L genau k
Zustände hat.
(b) Sei r := ab∗ | ba∗ ein regulärer Ausdruck über Σ := {a, b}. Konstruieren Sie den
kanonischen Minimalautomaten für L(r) direkt nach Definition 3.59. Beschriften
Sie hierfür jeden Zustand mit einem regulären Ausdruck, dessen erzeugte Sprache
der Äquivalenzklasse des Zustandes entspricht. (Der Startzustand wäre z.B. mit
beschriftet.) Beschreiben Sie ihr Vorgehen. Sie müssen nicht beweisen, dass Sie
jeder Äquivalenzklasse einen passenden regulären Ausdruck zugeordnet haben.
Achtung: Wir betrachten die Äquivalenzklassen bezüglich ≡L(r) , nicht die der
Zustände des Automaten!
Lösungsskizze. (a) Zwei Wörter u, v sind äquivalent genau dann, wenn |u| ≡ |v| (mod k).
Die Äquivalenzklassen von ≡L sind also
(b) (Wie üblich ergibt sich die Äquivalenzrelation implizit aus dem Kontext und wir
schreiben [·] statt [·]≡L(r) .) Zuerst müssen wir uns davon überzeugen, dass [ε] = {ε}
tatsächlich gilt, wie von der Aufgabenstellung behauptet. Zur Erinnerung: [ε] enthält
die Wörter w, sodass für jedes Wort u das Wort wu genau dann in L ist, wenn u es auch
ist. Da ab ∈ L, muss somit auch wab ∈ L gelten – aber jedes Wort in L hat genau ein a
oder genau ein b, also gilt w = ε.
Vom Startzustand ausgehend müssen wir nun die Äquivalenzklassen [a] und [b] be-
stimmen. An das Wort a lassen sich genau die Wörter in b∗ anhängen (um ein Wort
in L zu erhalten), die Äquivalenzklasse ist also ab∗ . Analog dazu ist gilt [b] = L(ba∗ ).
Außerdem gilt ε ∈ [a], [b], beide Zustände sind somit final. Der Automat sieht nun wie
folgt aus:
a ab∗
b
ba∗
Wir fahren mit Zustand [a] = L(ab∗ ) fort. Da ab ∈ L(ab∗ ), gilt [ab] = [a] und es gibt eine
b-Schleife von diesem Zustand aus. Für aa gilt, dass es kein Wort w gibt, sodass aaw ∈ L,
die Äquivalenzklasse [aa] enthält also genau die Wörter, die nicht Präfix eines Wortes
in L sind. Das sind genau die Wörter, bei denen der erste Buchstabe ein zweites Mal im
Wort vorkommt, also ab∗ a(a | b)∗ und ba∗ b(a | b)∗ . Beachten Sie, dass beide Ausdrücke
mit (a | b)∗ enden, da ein schlechtes Präfix nicht gut werden kann, indem man Zeichen
anhängt. Für [ba] und [bb] ist die Situation dann analog.
b
a, b
a ab∗ a
(ab∗ a | ba∗ b)(a|b)∗
b ba∗ b
Nach (b) hat der minimale DFA für L1 ∩L2 genau |Q1 |·|Q2 | = |Q3 |·|Q4 | Zustände,
und somit nach (a) auch der minimale DFA für L1 ∩ L2 = L(M3 ) ∪ L(M4 ).
Bonusaufgabe H4.7. (inveniet quod quisque velit) 3 Bonuspunkte
Der Superschurke Dr. Evilsparza hat jüngst ein Pharmaunternehmen (Evillest Evilness
Inc.) gegründet, und behauptet nun, einen Impfstoff gegen schlechtes Wetter entwickelt
zu haben. Die Öffentlichkeit ist begeistert – Sie trauen dem angeblich reformierten Sün-
der allerdings nicht und versuchen, in der DNA-Sequenz nach Hinweisen zu suchen.
Bekanntermaßen werden in der DNA vier verschiedene Basen kodiert: Evalcyclohex-
andifluorit, Isophoronditrigocyanat, Vinylcyclohexenquadroxid, und Levomethagameor-
phan. Diese werden mit ihrem Initialbuchstaben abgekürzt, sodass letztendlich ein Wort
über dem Alphabet Σ := {e, i, l, v} entsteht. Sie sind in Besitz einer Sequenz, mit der Dr.
Evilsparza in 2006 versuchte, die gesamte Studierendenschaft zu mathematischen Zom-
bies zu wandeln, um die Universitätsherrschaft an sich zu reißen. Sie vermuten, dass er
diese Sequenz wieder verwendet – aber Sie müssen Beweise finden, und die Zeit drängt!
Unter diesem Link finden Sie sowohl die Impfstoff-Sequenz w, als auch die Zombie-
Sequenz s. Bestimmen Sie, ob s in w enthalten ist, und geben sie den kleinsten Index i
an, sodass w1 w2 ...wi bereits s enthält. Beschreiben Sie ihr Vorgehen.
Hinweise: Verwenden Sie zur Lösung dieser Aufgabe einen Computer. Beschreiben
Sie bitte Ihren Ansatz in natürlicher Sprache und illustrieren die wesentlichen Schritte
ihrer Lösung mit geeigneten Codefragmenten. Sie können (müssen aber nicht), ihrer
Lösung ihren vollständigen Programmcode beifügen, jedoch steht es den Korrektoren
frei, diesen zu ignorieren. Wenn Sie existierende Algorithmen verwenden, die nicht Teil
der Vorlesung sind, beschreiben Sie bitte ausführlich, weshalb und auf welche Weise diese
funktionieren.
Wir sind, wie immer, an Lösungen interessiert, die sich verallgemeinern lassen. Ihre
Lösung sollte also für beliebige Wörter w und s funktionieren. Zusätzlich soll ihre Lösung
effizient sein (im Bezug auf die theoretische Komplexität des Algorithmus), und innerhalb
von wenigen Sekunden (aber auf jeden Fall innerhalb von einer Minute) terminieren. Sie
dürfen Standard-Datenstrukturen (wie etwa Hashtabellen oder binäre Bäume) verwen-
den, ansonsten beschränken Sie sich bitte auf grundlegende Funktionalitäten verbreiteter
Programmiersprachen.
Highscores: Die Musterlösung wurde nicht optimiert und terminiert in etwa 750ms.
Falls ihr Programm schneller ist, können Sie gerne eine Mail an Philipp Czerner mit
dem Betreff „THEO H4.7“ schreiben, in der Sie ihr Programm und Anweisungen, es
auszuführen, anhängen. Wir veröffentlichen dann eine Bestenliste auf Zulip. (Um die
Zeiten für die Bestenliste zu ermitteln, werden wir etwas andere w, s ∈ Σ∗ verwenden.)
Lösungsskizze. Zuerst lesen wir die beiden Dateien ein:
w = open(’impfstoff.txt’, ’r’).read()
s = open(’zombie.txt’, ’r’).read() + ’.’
An s hängen wir dabei noch ein $ an, da dies den folgenden Code vereinfachen wird.
Wir erzeugen zunächst wir einen NFA M , um s (mit Länge l := |s|) zu erkennen:
Σ
s1 s2 s3 sl
0 1 2 l
In Mengenschreibweise würden wir M = (Q, Σ, δ, q0 , F ) also definieren, indem wir
Zustände Q := {0, ..., l} wählen, q0 := 0, F := {l}, und Übergänge
Diesen Automaten konvertieren wir nun zu einem DFA M 0 = (Q0 , Σ, δ 0 , q00 , F 0 ), indem wir
eine Potenzmengenkonstruktion anwenden. Prinzipiell könnte M 0 bis zu 21000 Zustände
haben, tatsächlich hat M 0 aber nur |s|+1 Zustände. (Dies lässt sich mit der Beobachtung
zeigen, dass q := δ({q0 }, s1 s2 ...si ) der einzige Zustand von M 0 ist, der i ∈ q, i+1, i+2, ... ∈
/
q erfüllt. Für weitere Details seien interessierte Studierende Vorlesung Automatentheorie
verwiesen.) Die Potenzmengenkonstruktion lässt sich folgendermaßen implementieren.
states = {q_0}
transitions = {}
q_0 = (0,)
final = set()
workset = [q_0]
while workset:
q = workset.pop()
for c in ’eilv’:
q_next = tuple([0] + [i+1 for i in q if s[i] == c])
if q_next not in states:
states.add(q_next)
if len(s)-1 in q_next: final.add(q_next)
workset.append(q_next)
transitions[q,c] = q_next
Dies ist ein Workset-Algorithmus: Die Zustände, die wir noch nicht abgearbeitet haben,
befinden sich in workset. Wir nehmen uns wiederholt einen Zustand aus dem Work-
set heraus, in erzeugen dessen ausgehende Transitionen. Immer wenn wir einen neuen
Zustand erreichen, fügen wir ihn in das Workset ein.
Schlussendlich erhalten wir
• states: Q0 , gespeichert in einem set, damit wir effizient überprüfen können, ob
ein Element enthalten ist.
• transitions: δ 0 , als dict, bildet (q, c) ∈ Q0 × Σ0 Paare auf δ 0 (q, c) ab.
• q_0: Der Startzustand q00 .
• final: Die Finalzustände F 0 , wieder als set.
Hier werden die Zustände direkt als Tupel dargestellt, z.B. wäre {0, 3, 8} ∈ Q0 das
Python-Tupel (0,3,8). Es gibt zwar nur |s| + 1 Zustände in M 0 , aber diese können
auch bis zu |s| + 1 Elemente enthalten. Das macht es ineffizient, direkt mit den Tupeln
zu arbeiten. Stattdessen benennen wir die Zustände jetzt um, sodass sie wieder Zahlen
0, ..., |s| sind.
M = {q: i for i, q in enumerate(states)}
transitions = {(M[q],c): M[r] for (q,c),r in transitions.items()}
q_0 = M[q_0]
final = {M[i] for i in final}
Hierzu erstellen wir ein dict, also M, das Zustände in states auf Zahlen in 0, ..., |s|
abbildet. Das verwenden wir dann, um die Zustände in transitions, q_0 und final
umzubenennen. Schließlich müssen wir nur den DFA auf dem Wort w ausführen.
q = q_0
for i, c in enumerate(w):
q = transitions[q,c]
if q in final: print(i+1); break
Das Programm gibt 4026864 aus, also ist s bereits in w1 w2 ...w4026864 enthalten.
Prof. Javier Esparza Technische Universität München
Philipp Czerner, Martin Helfrich Lehrstuhl für Theoretische Informatik
• Das Übungsblatt ist in zwei Teile gegliedert: den Vorbereitungsteil, den Sie vor der
Übung selbstständig bearbeiten sollen, und den Übungs-/Nachbereitungsteil, der
Aufgaben enthält, die in der Übung besprochen werden und von Ihnen anschließend
zur Nachbereitung verwendet werden können.
• Das ist nicht das Hausaufgabenblatt! Die Hausaufgaben finden Sie auf einem se-
paraten Blatt.
1
Wenn Sie Automata Tutor noch nicht verwendet haben, folgen Sie erst den Schritten in Ü1.2, um sich
richtig zu registrieren.
(d) S → aSb | A | B
A → aA | a
B → bB | b
V = {J, D, T, N, N 0 , Z, A, S, E, U, B, C, V, U 0 , B 0 }
Σ = {;, {, }, (, ), =, a, b, ..., y, z, 0, 1, ..., 8, 9, +, -, ·, /, %, !, <, >, &&, ||}
J → DS | S
D → T N ;D | T N ;
T → int
N → AN 0
N 0 → AN 0 | ZN 0 | A | Z
A → a | b | c | ... | y | z
Z → 0 | 1 | ... | 8 | 9
S → SS | ; | {S} | N = E; | N = read(); | write(E); | if(C) S else S | while(C) S
E → Z | N | (E) | U E | EBE
U →-
B→-|+|·|/|%
C → true | false | (C) | EV E | U 0 (C) | CB 0 C
V → == | != | <= | < | >= | >
U0 → !
B 0 → && | ||
D S
T N ; while( C ) S
..
int A N’ C’ ( C ) .
x Z ! C B’ C
.. .
1 . && ..
S → aSa | bSb | aT b | bT a
T → aT | bT |
S→E|O
E → AB | BA
A → XAX | a
B → XBX | b
O → XXO | X
X→a|b
(a) Geben Sie für jedes der folgenden Wörter jeweils eine Linksableitung und eine
Rechtsableitung zzgl. des entsprechenden Syntaxbaums an:
(i) abaaaa (ii) babab (iii) aabbaaba
(b) Entscheiden Sie, ob die Grammatik G mehrdeutig ist oder nicht. Wenn sie mehr-
deutig ist, geben Sie ein Wort w ∈ L(G) mit zwei Syntaxbäumen an. Sonst beweisen
Sie, dass G nicht mehrdeutig ist.
2
Das heißt, eine Beschreibung der Form L := {w ∈ A | P (a)} für eine geeignete Menge A und Prädikat
P.
Lösungsskizze.
(a) (i)
Linksableitung: S → E → BA → XBXA → aBXA → abXA → abaA →
abaXaX → abaaaX → abaaaa
Rechtsableitung: S → E → BA → BXaX → BXaa → Baaa → XbXaaa →
Xbaaaa → abaaaa
S
B A
X B X X A X
a b a a a a
(ii)
S
X X O
b a X X O
b a X
b
(iii)
S
B A
X B X a
a X B X b
aX B Xa
b b a
(b) G ist nicht eindeutig:
S S
E E
A B A B
a X B X X A X X
a b b a a b b
Übungsaufgabe Ü5.6. (Residualsprachen)
Die Äquivalenzklassen einer Sprache L kann man verwenden um z.B. direkt den minima-
len DFA aufzustellen, oder um festzustellen, ob L regulär ist. Allerdings ist es teilweise
mühsam, die Äquivalenzklassen herauszufinden: die Äquivalenzklasse von u enthält alle
Wörter v, sodass die Suffixe w, die man an u anhängen muss, damit uw ∈ L, genau die
sind, die man an v anhängen muss, damit vw ∈ L. Wir betrachten nun diese Suffixe
direkt und zeigen, dass man auch auf diese Weise bereits den minimalen DFA aufstellen
kann und entscheiden kann, ob eine Sprache regulär ist.
Sei Σ := {a, b} und L ⊆ Σ∗ eine Sprache über Σ. Für ein Wort w ∈ Σ∗ definieren wir
die Residualsprache Lw := {u : wu ∈ L}. Die Residualsprache Lw enthält also genau die
Wörter in L, die mit w beginnen, wobei das führende w entfernt wurde. Beispielsweise
gilt L(ab∗ | ba∗ )a = L(b∗ ) und L(ab∗ | ba∗ )aba = ∅.
(a) Zeigen Sie u ≡L v ⇔ Lu = Lv für beliebige Wörter u, v ∈ Σ∗ .
(b) Folgern Sie aus der (a), dass L genau dann regulär ist, wenn L endlich viele (un-
terschiedliche) Residualsprachen besitzt, also |{Lw : w ∈ Σ∗ }| < ∞.
(c) Konstruieren Sie den kanonischen Minimalautomaten zu dem regulären Ausdruck
r := ab | ba∗ , indem Sie einen Zustand [w]≡L(r) nicht mit dessen Äquivalenzklasse,
sondern mit einem regulären Ausdruck für die Residualsprache L(r)w beschriften.
Lösungsskizze. (a) Seien u, v ∈ Σ∗ beliebig. Wir teilen den Beweis in zwei Richtungen
auf.
„⇒“ Es gelte also u ≡L v. Zur Erinnerung bedeutet dies, dass für alle w ∈ Σ∗ gilt, dass
uw ∈ L ⇔ vw ∈ L. Wir müssen für alle Wörter w ∈ Σ∗ zeigen, dass w ∈ Lu ⇔
w ∈ Lv . Sei also w beliebig. Es gilt
(1) (2) (1)
w ∈ Lu ⇐⇒ uw ∈ L ⇐⇒ vw ∈ L ⇐⇒ w ∈ Lv
Bei (1) verwenden wir die Definition von Residualsprachen, bei (2) benutzen wir
u ≡L v, wie oben angemerkt.
„⇐“ Nun nehmen wir Lu = Lv an. Es ist zu zeigen, dass für alle Wörter w ∈ Σ∗ gilt,
dass uw ∈ L ⇔ vw ∈ L. Es gilt für alle w:
(1) (2) (1)
uw ∈ L ⇐⇒ w ∈ Lu ⇐⇒ w ∈ Lv ⇐⇒ vw ∈ L.
Bei (1) verwenden wir wieder die Definition von Residualsprachen, bei (2) Lu = Lv .
(b) Aus (a) folgt u 6≡L v ⇔ Lu 6= Lv . Das bedeutet, die Anzahl Äquivalenzklassen bezüg-
lich ≡L ist genau die Anzahl der verschiedenen Residualsprachen. Laut Myhill-Nerode
(Satz 3.60) ist eine Sprache regulär genau dann, wenn sie endlich viele Äquivalenzklassen
besitzt. Aufgrund der eben festgestellten Gleichheit also regulär genau dann, wenn sie
endlich viele Residualsprachen besitzt.
Etwas formaler sei M1 := {[w]≡L : w ∈ Σ∗ } die Menge der Äquivalenzlassen von
≡L und M2 := {Lw : w ∈ Σ∗ } die Menge der Residualsprachen von L. Wir definieren
die Funktion f : M1 → M2 als f ([w]≡L ) := Lw für alle w ∈ Σ∗ . Nach Teilaufgabe
(a) hängt f ([w]≡L ) nicht davon ab, welchen Repräsentanten w ∈ [w]≡L wir wählen,
f ist also wohldefiniert. Für Äquivalenzklassen [u]≡L 6= [v]≡L gilt Lu 6= Lv (wieder
nach (a)), und somit f ([u]≡L ) 6= f ([v]≡L ). Also ist f injektiv. Da jedes Wort w ∈ Σ∗
eine Äquivalenzklasse [w]≡L besitzt, ist f auch surjektiv. Also ist f eine Bijektion und
|M1 | = |M2 | gilt; insbesondere gibt es genau dann unendlich viele Äquivalenzklassen,
wenn es unendlich viele Residualsprachen gibt.
(c) Wir erhalten folgenden Automaten:
a b
ab | ba∗ b
b a
a, b
b
a a∗ ∅
a, b
Wir haben Startpunkt blau markiert. Linienzüge beschreiben wir im Folgenden als eine
Sequenz von Pfeilen, d.h. als Worte über dem Alphabet Σ = {→, ←, ↑, ↓}. Die Pfeile
beschreiben dabei (vom Startpunkt aus gesehen) einen ein Kästchen langen Schritt ent-
lang des Gitters. Wir stellen daher den im Bild rot eingezeichnete Linienzug durch das
Wort w =→→↑←←←↓↓ dar.
(a) Betrachten Sie die folgenden natürlich sprachlichen Beschreibungen zusammen mit
jeweils einem Beispiel, welches in der Sprache liegt (auf der linken Seite), und einem
Beispiel, das kein Element der Sprache ist (auf der rechten Seite). Geben Sie für
jede der Sprachen eine formale Definition der Form {w ∈ Σ∗ | ...} an.3
(1) die Sprache aller Treppen über dem Alphabet Σ0 = {→, ↑}
(2) die Sprache aller im Uhrzeigersinn laufenden Spiralen über dem Alphabet Σ,
die vom Startpunkt aus zuerst nach oben laufen
(3) die Sprache aller “Skylines” über dem Alphabet Σ00 = {→, ↑, ↓}
3
Das heißt insbesondere, dass Sie in diesem Aufgabenteil keinen Automaten, keinen regulären Ausdruck,
keine Grammatik oder ähnliches angeben sollen, die die Sprache beschreiben.
Hinweis: Die Sprachen sind mithilfe der Beispiele nicht eindeutig bestimmt! Ziel der
Aufgabe ist es, die intuitive Beschreibung (z.B. “Sprache aller Skylines”) zusammen
mit den Beispielen in eine möglichst allgemeine Sprachdefinition zu bringen.
(b) Stellen Sie Vermutungen auf, ob die obigen Sprachen regulär oder kontextfrei sind.
Begründen Sie Ihre Antwort möglichst anschaulich anhand des Beispiels.
(c) Geben Sie zu jeder der Sprachen L aus Aufgabenteil (a) eine Grammatik G an.
Lösungsskizze.
(a) (1) L = {(→↑)i | i ∈ N }{ε, →}
(2) L = {u ∈ Σ∗ | ∃v ∈ Σ∗ . uv ∈ L((↑+ →+ ↓+ ←+ )∗ )}
(3) L = {w ∈ Σ∗ | (∀u, v ∈ Σ∗ . w = uv → |u|↑ ≥ |u|↓ ) ∧ (∀u, v ∈ Σ∗ . ∀x, y ∈
Σ. w = uxyv → xy 6∈ {↑↓, ↓↑})}
(b) (1) regulär, da nur eine Alternierung konstanter Pfade verlangt wird.
(2) regulär, da nur die Laufrichtung wichtig ist, aber nicht die Länge.
(3) kontextfrei, da zwei Längen verglichen werden müssen.
(c) (1) S 7→→↑ S |→| ε
(2) S 7→ ↑ S | ↑ T | ε T 7→ → T | → U | ε U 7→ ↓ U | ↓ V |
ε V →
7 ←V |←S |ε
(3) S 7→ T? | T? → S T? 7→ ε | T T 7→ ↑ T ↓ | T? → T?
Prof. Javier Esparza Technische Universität München
Philipp Czerner, Martin Helfrich Lehrstuhl für Theoretische Informatik
Einführung in die Theoretische Informatik
Sommersemester 2021 – Hausaufgabenblatt 5
• Sei Φ := {{1}, {2, 3}, {4}, {5}, {6}}. Nach dem Abgabedatum werden wir für jede
Menge A ∈ Φ eine zufällige Aufgabe a ∈ A wählen und korrigieren.
Update: Die Aufgaben {1, 2, 4, 5, 6} werden korrigiert.
• Wenn Sie einen Beweis aufstellen, von dem Sie wissen, das einzelne Schritte proble-
matisch oder unvollständig sind, merken Sie dies bitte in Ihrer Lösung an, damit
wir das bei der Korrektur positiv berücksichtigen können.
A B
A A B C B
a a b a b b
(c) Ja, S → BC → BCBC → ABACBC → aBACBC → abACBC → abaCBC →
abaabBC → abaabbC → abaabbba.
S
B C
B C B b a
A B A a b b
a b a
(d) Nein, da kein Wort in G vier konsekutive b enthält. (Aus A werden nur Wörter
in a+ erzeugt, aus C nur Wörter, die ein a beinhalten und mit höchstens einem
b anfangen oder aufhören. Somit aus B nur Wörter, die ein a beinhalten und
mit höchstens zwei b anfangen oder aufhören, und höchstens drei konsekutive b
beinhalten; ebenso für S.)
Um h(i) auszurechnen lesen wir also die Zeichen w1 , w2 , ..., wi und rechnen +1 für jedes
a, und −1 für jedes b. Da w ∈ L muss h(n) = 0 gelten, wir können also das auch
kleinste i wählen, sodass h(i) = 0 gilt. In jedem Schritt kann sich h nur um maximal
1 verändern, h(i − 1) = 1 muss also gelten (wenn h(i − 1) = −1 wäre, würde es ein
kleineres i mit h(i) = 0 geben). Daraus folgt wi = b, und wir definieren nun unsere
Zerlegung als u := w2 w3 ...wi−1 , v =: wi+1 wi+2 ...wn . (Beachten Sie, dass nach Konvention
w1 w2 ...wi = ε für i = 0.)
Schließlich erhalten wir u, v ∈ L aufgrund von
„⊇“: Jetzt zeigen wir, dass jedes Wort w mit gleich vielen a und b sich aus G erzeugen
lässt. Dies geschieht per Induktion über die Wortlänge.
Induktionsbasis: S → ε ist trivial.
Induktionsschritt: Sei w ∈ L beliebig, mit w 6= ε. Nach (b) gilt w = aubv oder w =
buav für u, v ∈ L. Im ersten Fall können wir S → aSbS ableiten, und aus u, v ∈ L
folgt nach Induktionsannahme S →∗ u und S →∗ v, da |u|, |v| < |w|. Insgesamt
erhalten wir S → aSbS →∗ aubS →∗ aubv = w. Der zweite Fall w = buav ist
analog.
(d) Die Grammatik ist mehrdeutig, denn das Wort w = abab hat zwei Syntaxbäume.
S S
a S b S a S b S
ε a S b S b S a S ε
ε ε ε ε
d∗ a∗ a a∗ d ∅ a d(ad|da)∗
d
a a, d
(c) Die möglichen Wörter sind daad, dada, dadd, und ddad.
Bonusaufgabe H5.6. (Irrational irregulär) 1+3 Bonuspunkte
Sei Σ := {0, ..., 9}. Für Wörter u, v ∈ Σ∗ bezeichnen wir mit (u.v)10 := (u)10 +10−|v| ·(v)10
den Wert eines Dezimalbruchs, es gilt also z.B. (1.75)10 = 74 .
(a) Zeigen Sie, dass L1 := {w ∈ Σ∗ : (0.w)10 < 17 } regulär ist.
(b) Beweisen Sie, dass L2 := {w ∈ Σ∗ : (0.w)10 < √12 } nicht regulär ist, indem sie un-
endlich viele Äquivalenzklassen (oder Residualsprachen, s. Übungsaufgabe Ü5.6)
von ≡L2 identifizieren. (Sie müssen nicht angeben, welche Elemente in den Äqui-
valenzklassen / Residualsprachen enthalten sind.)
Lösungsskizze. (a) In Dezimalschreibweise erhalten wir 17 = 0.142857. Wir sind nun an
den endlichen Dezimalbrüchen interessiert, die kleiner sind, wobei wir die Ziffern von
links nach rechts einlesen. Zur Veranschaulichung ein paar Beispiele: Das Wort 27384
würden wir nicht akzeptieren, da 0.27384 > 0.142857. Dies lässt sich bereits an der
ersten Ziffer erkennen, da 0.2 > 0.142857. Es ist nicht möglich, die Zahl zu verkleinern,
indem weitere Ziffern angehängt werden. Umgekehrt würden wir 1234 akzeptieren, da
0.1234 < 0.142857. Hier lässt sich dies bereits nach der zweiten Ziffer bestimmen, denn
0.129 = 0.13 < 0.142857 – auch wenn nach Lesen von 12 stets die größtmögliche Ziffer
käme, können wir nur Zahlen erreichen, die kleiner als 71 sind.
Nun machen wir diese Überlegung formal. Sei f1 , f2 , ... ∈ Σ eine Folge, sodass f1 f2 ...f6 =
142857 und fi+6 = fi für i ∈ N+ . Die Folge (fi )i∈N+ entspricht also den Ziffern der De-
zimaldarstellung von 71 . Es gilt
1
(0.w)10 < 7
⇔ 10−|w| (w)10 < 0.142857
⇔ (w)10 < (f1 f2 ...f|w| )10 + α
wobei 0 < α < 1 hier eine geeignete Konstante ist. Mit f := f1 f2 ...f|w| erhalten wir
Hier bezeichnet ≤lex die lexikographische Sortierung: wir vergleichen zunächst w1 und
f1 . Wenn w1 < f1 , dann ist w <lex f , wenn w1 > f1 , dann ist w >lex f . Ansonsten
gilt w1 = f1 , und wir wiederholen diese Prozedur mit w2 und f2 . (Nach diesem Schema
werden auch Wörter in einem Lexikon sortiert, daher der Name.)
Da sich die Zeichen von f wiederholen, lässt sich leicht ein DFA zeichnen, der diese
Vergleiche ausführt.
7
1 4 2 8 5
f1 f2 f3 f4 f5 f6
0, 1, 2 0, ..., 7
0, ..., 3 0, ..., 4
0 0, ..., 6
0, ..., 9
(1) (2)
10i (0.f w)10 = (f )10 + (0.w)10 > (f )10 + 10i · √1
2
− (f )10
Für (1) verwenden wir |f | = i, für (2) (0.w)10 > x. Insgesamt erhalten wir
(0.f w)10 > √12 , was im Widerspruch zu f w ∈ L2 steht.
• „keine kleinere obere Schranke“: Sei nun y < x beliebig. Wir wählen nun ein w ∈ Σ∗
mit y < (0.w)10 < x, d.h. w stellt einen Dezimalbruch zwischen x und y dar. Nun
gilt
Also ist f w ∈ L2 und somit w ∈ Lf2 und schließlich (0.w)10 ∈ M . Da y < (0.w)10 ,
ist y keine obere Schranke vom M .
Die Behauptung ist somit bewiesen. Wenn L2 regulär wäre, kann es – wie in Übungs-
aufgabe Ü5.6 gezeigt – nur endliche viele Residualsprachen geben. Obige Ausführungen
0
gelten für ein beliebiges i, wir wählen also i, i0 mit Lf2 = Lf2 , wobei wir f := f1 f2 ...fi
und f 0 := f1 f2 ...fi0 definieren. Weiterhin definieren wir M, M 0 und x, x0 entsprechend.
0
Da Lf2 = Lf2 muss auch M = M 0 und somit x = sup M = sup M 0 = x0 gelten. Die
Aussage x = x0 ist nach Definition von x äquivalent zu
0
10i · √1
2
− (f )10 = 10i · √1
2
− (f 0 )10
0
⇒ (10i − 10i ) · √1
2
= (f )10 − (f 0 )10
0
√ 10i − 10i
⇒ 2= ∈Q
(f )10 − (f 0 )10
0 √
Da 10i , 10i , (f )10 − (f 0 )10 rationale Zahlen sind, müsste 2 es demnach auch sein. Dies
ist aber bekanntermaßen nicht der Fall und L2 kann somit nicht regulär sein sein.
Prof. Javier Esparza Technische Universität München
Philipp Czerner, Martin Helfrich Lehrstuhl für Theoretische Informatik
• Dies ist ein Entwurf. Die finale Version wird am Montag bereitgestellt, sich aber
aller Wahrscheinlichkeit nicht besonders stark unterscheiden.
• Das Übungsblatt ist in zwei Teile gegliedert: den Vorbereitungsteil, den Sie vor der
Übung selbstständig bearbeiten sollen, und den Übungs-/Nachbereitungsteil, der
Aufgaben enthält, die in der Übung besprochen werden und von Ihnen anschließend
zur Nachbereitung verwendet werden können.
• Das ist nicht das Hausaufgabenblatt! Die Hausaufgaben finden Sie auf einem se-
paraten Blatt.
1
Wenn Sie Automata Tutor noch nicht verwendet haben, folgen Sie erst den Schritten in Ü1.2, um sich
richtig zu registrieren.
Lösung: S → F R | F A | a | GB | b
R → SG
A → FA | a
B → GB | b
F →a
G→b
(b) Zwischenschritte:
S → KX | AT
X → DT
S → KDT | AT
K → c | j | ET | D
S → KDT | aT K → c | j | ET | D
D → BY | AZ
K→c|j|E D → BDS | ABB
Y → DS
D → bDS | abb T →
Z → BB
T → E→a|T
T →
E→a|T A→a
E→a|T
B→b
A→a
B→b
S → KX | X | AT | A
S → KX | X | A | A
X → DT | D
X→D|D
K → c | j | ET | D | E | T |
K→c|j|E|D|E
D → BY | AZ
D → BY | AZ
Y → DS
Y → DS
Z → BB
Z → BB
T →
E→a
E→a|T |
A→a
A→a
B→b
B→b
Lösung: S → KX | BY | AZ | a
X → BY | AZ
K → c | j | a | BY | AZ
D → BY | AZ
Y → DS
Z → BB
E→a
A→a
B→b
(2)
[
Lb = L(→i (↑j | ↓j ) ←k )
i<j<k
(b) (1) • Wir nehmen an, dass La kontextfrei ist und führen diese Annahme zum
Widerspruch.
• Sei n ≥ 1 eine Pumping-Lemma-Zahl für die kontextfreie Sprache La .
• Sei zusätzlich z =→n ↑n ←n ↓n , d.h., z ∈ La und |z| ≥ n.
• Gemäß Pumping-Lemma gibt es dann also eine Zerlegung z = uvwxy mit
Wörtern u, v, w, x, y ∈ Σ∗ und den folgenden Eigenschaften:
• Da jeder Fall zu einem Widerspruch führt und die obigen Fälle alle mög-
lichen Zerlegungen abdecken, kann die ursprüngliche Annahme nicht gel-
ten. Also ist La nicht kontextfrei.
(2) • Wir nehmen an, dass Lb kontextfrei ist und führen diese Annahme zum
Widerspruch.
• Sei n ≥ 1 eine Pumping-Lemma-Zahl für die kontextfreie Sprache Lb .
• Dann ist z =→n ↑n+1 ←n+2 , d.h., z ∈ Lb und |z| ≥ n.
• Gemäß Pumping-Lemma gibt es dann also eine Zerlegung z = uvwxy mit
Wörtern u, v, w, x, y ∈ Σ∗ und den folgenden Eigenschaften:
• Zuerst informell: Da |vwx| ≤ n, kann vwx nur von der Form →∗ ↑∗ oder
↑∗ ←∗ sein. Wegen |vx| > 0 muss mindestens ein Pfeil gepumpt werden.
Gilt |vx|→ > 0, dann können wir die Anzahl der → über die Anzahl der
← pumpen, enthält vx keinen → aber mindestens ein ↑, so kann man
die Anzahl der → auf höchstens n reduzieren, indem man vx entfernt.
Andernfalls besteht vx nur aus ←, dann aus mindestens einem, so dass
man durch Entfernen von vx die Anzahl der ← auf n + 1 oder weniger
reduziert wird, man also höchstens so viele ← wie ↑ hat.
• Formal: Aufgrund von (1) unterscheiden wir die folgenden Fälle:
Da jeder Fall zu einem Widerspruch führt und die obigen Fälle alle mög-
lichen Zerlegungen abdecken, kann die ursprüngliche Annahme nicht gel-
ten. Also ist Lb nicht kontextfrei.
Übung und Nachbereitung
• In jeder Regel (X, γ) mit |γ| ≥ 2 Ersetzen jedes Vorkommen eines Terminals
x durch Xx und Ergänzen der benötigten Produktionen Xx → x:
2
Hier geht es nicht um einen formalen Beweis, dass die beiden Sprachen gleich sind, sondern um eine
Strategie, wie Sie bei Aufgaben wie im vorherigen Aufgabenteil Fehler vermeiden.
• Überführen aller rechten Seiten, welche aus mindestens drei Variablen beste-
hen, in quadratische Monome über V . Die einfachste Variante ist dabei, aus
XY Z einfach XXY Z machen, wobei XY Z einfach eine Hilfsvariable ist, die
das Ergebnis von Y Z mittels XY Z → Y Z zugewiesen bekommt. Damit:
G00 : S → AXSA | Xa B A→B|S B→b|ε Xa → a XSA → SA
• E0 := {X ∈ V | (X, ε) ∈ P }
• Ek+1 := Ek ∪ {X ∈ V | ∃(X, γ) ∈ P. γ ∈ Ek∗ } bis Ek+1 = Ek .
E0 = {B} E1 = {B, A} = E2
• T0 := {(X, Y ) ∈ P ∩ V × V }
• Tk+1 := Tk ∪ {(X, Y ) ∈ V × V | ∃Z ∈ V. (X, Z) ∈ Tk ∧ (Z, Y ) ∈ Tk } bis
Tk+1 = Tk =: T∗ (einfach transitiver Abschluss über durch Kettenproduktio-
nen gegebener Kantenrelation auf V ).
T0 = {(S, XSA ), (S, Xa ), (A, B), (A, S), (XSA , S)}
T1 = T0 ∪ {(S, S), (A, XSA ), (A, Xa ), (XSA , XSA ), (XSA , Xa )} = T2
• Dann (1) Entfernen aller Kettenproduktion und (2) anschließend, falls (X, Y ) ∈
T∗ , füge (X, γ) zu P hinzu für jede Regel (Y, γ) ∈ P .
G0000 : S → AXSA | SA | Xa B | a
A → b | AXSA | SA | Xa B | a
B→b
Xa → a
XSA → SA | AXSA | SA | Xa B | a
(b) • Prüfen, dass alle Produktionen die Form A → BC oder A → a haben.
• Insbesondere darf nur vom Startsymbol (oder gar nicht, wie hier) produziert
werden.
• Für einige kleine/leichte Worte überprüfen, dass Sie von beiden Grammatiken
(nicht) erzeugt werden können.
Prof. Javier Esparza Technische Universität München
Philipp Czerner, Martin Helfrich Lehrstuhl für Theoretische Informatik
Einführung in die Theoretische Informatik
Sommersemester 2021 – Hausaufgabenblatt 6
S → XU b | Y Y → ab | Y Y
X → U bY | U U U → aU | ε
Konvertieren Sie G mit dem aus der Vorlesung bekannten Verfahren schrittweise zur
Chomsky-Normalform, indem Sie G so anpassen, dass für jede Produktion α → β fol-
gende zusätzlichen Einschränkungen gelten:
(a) β ∈ Σ ∪ V ∗ (b) |β| ≤ 2 (c) β 6= ε (d) β ∈
/V
0 0
Sie sollen also eine Grammatik G angeben, die (a) und L(G ) = L(G) erfüllt, eine
Grammatik G00 , die (a), (b) und L(G00 ) = L(G) erfüllt, usw.
Lösungsskizze.
(a) Wir fügen A → a und B → b hinzu, und ersetzten a und b in den anderen Pro-
duktionen jeweils durch A und B.
S → XUB | Y U → AU | ε
X → UBY | U U A→a
Y → AB | Y Y B→b
(b) Wir passen jeweils die erste Produktion von S und von X an.
S → XS1 | Y Y → AB | Y Y
S1 → UB U → AU | ε
X → U X1 | U U A→a
X1 → BY B→b
(c) Zuerst betrachten wir U → ε. Damit können wir folgende Ableitungen erzeugen:
S1 → B
X→U
X→ε
X → X1
U →A
Wir erhalten also insbesondere X → ε, hiermit erzeugen wir
S → S1
S → XS1 | Y | S1 Y → AB | Y Y
S1 → UB | B U → AU | A
X → U X1 | U U | U | X1 A→a
X1 → BY B→b
S → AB | Y Y | UB | B
S1 → b
X → AU | A | BY
U →a
X→a|a
S→b|b
S → XS1 | AB | Y Y | UB | b Y → AB | Y Y
S1 → UB | b U → AU | a
X → U X1 | U U | AU | BY | a A→a
X1 → BY B→b
Wir definieren uns nun eine Programmiersprache, die wir theoLISP nennen, aus folgenden
Komponenten.
• Arithmetische Operationen:
(add x y) → x + y
(sub x y) → x − y
(mul x y) → xy
• Variablenzuweisungen:
(set x y) Setzt die Variable mit Namen x auf den Wert von y
Ein Programm ist eine Liste an Befehlen, die Ausgabe eines Programms ist der Wert
der Variablen result. Alle Variablen sind mit 0 initialisiert, und können Werte in Z
annehmen.
Beispielprogramme mit Ihren Ausgaben:
((set x 42)
(set result (sub x 2021)))
→ −1979
((set x 1)
(while (sub 16 i) (
(set x (mul x 2))
(set i (add i 1))))
(set result x))
→ 65536
→ 13
Insbesondere erwartet z.B. set als erstes Argument einen Variablennamen, keine Zahl;
und if als erstes Argument eine Variable, Zahl, oder arithmetische Operation, und keine
Anweisung oder Liste an Anweisungen.
(a) Konstruieren Sie eine kontextfreie Grammatik, die genau die theoLISP Programme
erzeugt. Es genügt, wenn Sie nur die Programme erzeugen, die keine unnötigen
Leerzeichen oder Zeilenumbrüche enthalten. Das erste Beispielprogramm wäre also
Lösungsskizze.
(a)
S → ( hBefehlei ) | ( )
hBefehlei → ( hBefehli ) . hBefehlei | ( hBefehli )
hBefehli → hIfi | hWhilei | hSeti
hTermi → ( hArithi ) | hZahli | hVari
hArithi → hOpi . hTermi . hTermi
hIfi → if . hTermi . S . S
hWhilei → while . hTermi . S
hSeti → set . hVari . hTermi
hVari → hAlphaihVari | hAlphai
hZahli → hZifferihZahli | hZifferi
hOpi → add | mul | sub
hAlphai → a | ... | z
hZifferi → 0 | ... | 9
(b)
S
( hBefehlei )
( hBefehli ) . hBefehlei
hWhilei ( hBefehli )
4 hZifferi 7
2
Bonusaufgabe H6.4. (S-Parser) 1+1+1 Bonuspunkte
Bei Ausgrabungen im antiken Rom findet der Archäologe Jasper Vazarie eine kuriose
Marmortafel mit folgender Beschriftung:
Jasper vermutet, dass es sich hierbei um ein theoLISP Programm handelt, da dies
eine beliebte Programmiersprache in der damaligen hispanischen Provinz Gallaecia war.
Die Tafel stammt aus dem Jahre 339 n. Chr. und wurde, so die Überlieferung, dazu
verwendet, die Geburt des nächsten großen Kaisers vorherzusagen. Leider litt auch die
Marmortafel unter dem Zahn der Zeit und es befinden sich einige Fehler im Programm.
Helfen Sie Jasper, und korrigieren das Programm! Implementieren Sie hierzu einen
Recogniser, der entscheidet, ob ein Wort ein syntaktisch korrektes theoLISP Programm
ist, wie in Aufgabe H6.3 definiert. (Sie dürfen annehmen, dass das Programm keine
unnötigen Leerzeichen und Zeilenumbrüche enthält.)
Hinweise: Verwenden Sie zur Lösung dieser Aufgabe einen Computer. Beschreiben
Sie bitte Ihren Ansatz in natürlicher Sprache und illustrieren die wesentlichen Schritte
Ihrer Lösung mit geeigneten Codefragmenten. Sie können (müssen aber nicht), Ihrer Lö-
sung Ihren vollständigen Programmcode beifügen, jedoch steht es den Korrektoren frei,
diesen zu ignorieren. Beschränken Sie sich in Ihrer Implementierung auf grundlegende
Funktionalitäten verbreiteter Programmiersprachen. Insbesondere ist die Verwendung
von Library-Funktionen für reguläre Ausdrücke oder andere Parser-Generatoren nicht
gestattet.
Obiges Programm hat genau drei Fehler. Um Ihr Programm zu implementieren, mag
es sinnvoll sein, Ihre Lösung zu Aufgabe H6.3(a) zu verwenden, und für jede Variable V
eine Funktion zu schreiben, die (rekursiv) ein maximales Präfix aus LG (V ) einliest. Zum
Finden der Syntaxfehler bietet es sich an, dass Ihr Recogniser zusätzliche Informationen
ausgibt, wenn er einen Fehler feststellt.
Die Beispielprogramme auf diesem Blatt finden Sie unter diesem Link. Im Ordner
nospace finden Sie jeweils Versionen ohne unnötige Leerzeichen und Zeilenumbrüche.
Die syntaktisch korrekten Beispiele beginnen mit einem a, die inkorrekten Beispiele mit
einem b, und obiges Programm heißt c1.
Lösungsskizze. (Der Code lässt sich unter diesem Link herunterladen.) Zuerst lesen wir
das Programm ein und entfernen unnötige Leerzeichen und Zeilenumbrüche.
import sys
with open(sys.argv[1], ’r’) as f: code_raw = f.read()
def eat_maybe(s):
global code
if code.startswith(s):
code = code[len(s):]
return True
else:
return False
Nun lassen sich die Produktionen der Grammatik ohne viel Aufwand umsetzen.
S → ( hBefehlei ) | ( )
def S():
eat(’(’)
if not eat_maybe(’)’):
Befehle()
eat(’)’)
Für S gibt es zwei mögliche Produktionen, die beider mit ( beginnen. Also lesen
wir die öffnende Klammer zuerst ein, und entscheiden danach, welche der Produktio-
nen wir ausführen. Falls direkt danach eine schließende Klammer kommt, wird die mit
eat_maybe(’)’) eingelesen und wir sind fertig, ansonsten lesen wir hBefehlei und da-
nach die schließende Klammer ein. Die anderen Produktionen werden auf ähnliche Art
implementiert.
hBefehlei → ( hBefehli ) . hBefehlei | ( hBefehli )
def Befehle():
eat(’(’); Befehl(); eat(’)’)
if eat_maybe(’ ’): Befehle()
Interessant ist lediglich, wie wir entscheiden, welche Produktion wir ausführen. Hierfür
reicht es allerdings immer, sich das nächste Zeichen anzuschauen. Bei hBefehli, hTermi
und hOpi wird dies besonders deutlich:
def Befehl():
if code[0] == ’i’: If()
elif code[0] == ’w’: While()
elif code[0] == ’s’: Set()
else: assert False
def Term():
if eat_maybe(’(’): Arith(); eat(’)’)
elif code[0].isdigit(): Zahl()
elif code[0].isalpha(): Var()
else: assert False
def Op():
if code[0] == ’a’: eat(’add’)
elif code[0] == ’m’: eat(’mul’)
elif code[0] == ’s’: eat(’sub’)
else: assert False
Die Nichtterminale hArithi, hIfi, hWhilei und hSeti sind leicht zu implementieren, da
es hierfür nur jeweils eine Produktion gibt.
(Beachten Sie, dass eat(’if ’) nach dem if auch ein Leerzeichen liest.) Schließlich
verbleiben noch hVari und hZahli, wobei wir hier leicht von der Grammatik abweichen,
und diese direkt implementieren.
def Var():
assert code[0].isalpha()
while code[0].isalpha(): eat(code[0])
def Zahl():
assert code[0].isdigit()
while code[0].isdigit(): eat(code[0])
try:
S()
assert len(code) == 0
print(’Correct’)
except:
print(’Incorrect’)
sys.exit(1)
Nun haben wir bereits einen funktionierenden Recogniser. Damit es leichter wird,
die Fehler zu finden, erweitern wir unseren Recogniser, sodass er ein maximales Präfix
angibt, das zu einem korrekten Programm erweitert werden kann. Beispiel:
Die Zeichen bis zum if können zu einem korrekten Programm erweitert werden, etwa
Unseren Recogniser so zu erweitern ist leicht – wir speichern die Zeichen, die wir bereits
eingelesen haben, und geben diese dann aus. Hierzu passen wir die eat_maybe Prozedur
an:
parsed = ’’
def eat_maybe(s):
global code
global parsed
if code.startswith(s):
parsed += s
code = code[len(s):]
return True
else:
return False
Wenn es einen Fehler gibt, können wir nun den Inhalt von parsed ausgeben.
try:
S()
assert len(code) == 0
print(’Correct’)
except:
print(’Incorrect’)
print(parsed)
sys.exit(1)
...
89)) (while ((sub a 112)) ((set a (sub a 113)))) (set x 1) (set
set dd d) (while dd ((set x (mul x a)) (while (sub x (sub n 1)) (
...
(add n 2))))))))
• In Zeile 5 müssen bei ((sub a 112)) die äußeren Klammern entfernt werden
• Am Ende von Zeile 5 beginnt (set set dd d) – hier sollte nur ein set sein
• Am Ende des Programms befindet sich eine schließende Klammer zu viel
Prof. Javier Esparza Technische Universität München
Philipp Czerner, Martin Helfrich Lehrstuhl für Theoretische Informatik
Einführung in die Theoretische Informatik
Sommersemester 2021 – Übungsblatt 7
• Das Übungsblatt ist in zwei Teile gegliedert: den Vorbereitungsteil, den Sie vor der
Übung selbstständig bearbeiten sollen, und den Übungs-/Nachbereitungsteil, der
Aufgaben enthält, die in der Übung besprochen werden und von Ihnen anschließend
zur Nachbereitung verwendet werden können.
• Das ist nicht das Hausaufgabenblatt! Die Hausaufgaben finden Sie auf einem se-
paraten Blatt.
oder man stellt diesen als Graph mit Knotenmenge Q dar, wobei die Kante (p, q)
dann mit “a, X/Y Z” beschriftet ist (siehe Hopcroft et al., Introduction to Automata
Theory, Kapitel 6 ):
a, Z0 /XZ0
b, X/ε p a, X/XX
ε, Z0 /ε
1,5 S
1,4 S 2,5 S
1,3 2,4 S 3,5
(a)
1,2 2,3 L 3,4 4,5
1,4 O
1,3 O 2,4 Y
(b) 1,2 O, U 2,3 Y 3,4 S
1,1 O, K, U 2,2 O, K, U 3,3 S 4,4 S
d d v v
(c) , bb, aababbab ∈ L und abaab, bbb, aaabaaa 6∈ L
(d) abaababb, abba, ababbaaaba ∈ L und baa, aab, bbbbb 6∈ L
a, Z0 /AAZ0 b, A/ε
b, A/ε
a, A/AAA q p
ε,
Z ε, Z0 /ε
0/
ε
r
(e)
1
Falls der Link nicht mehr funktioniert, teilen Sie dies bitte der Übungsleitung mit. Die Teilnehmeran-
zahl ist leider auf 2000 begrenzt.
2
Wenn Sie Automata Tutor noch nicht verwendet haben, folgen Sie erst den Schritten in Ü1.2, um sich
richtig zu registrieren.
(, Z0 /XZ0
), X/ε q (, X/XX
ε, Z0 /ε
(f)
Lösungsskizze. Idee: Für jedes a legen wir ein X auf den Stack und überprüfe dann, ob
die die Anzahl von bs mit der Anzahl an X auf dem Stack übereinstimmt.
Ein PDA A der mit leerem Keller die Sprache L akzeptiert (also L (A) = L) ist:
a, Z0 /XZ0
b, X/ε
q p b, X/ε
ε, Z0 /ε
a, X/XX ε, Z0 /ε
S → ASA | aB
A → B | S | CB
B → b|ε
C → aC
D → aSCb | a
(a) Beschreiben Sie in eigenen Worten, wann ein Nichtterminal nützlich in einer Gram-
matik ist.
(b) Reduzieren Sie die Grammatik G auf die nützlichen Nichtterminale.
Lösungsskizze.
(a) Ein Nichtterminal ist nützlich, wenn es eine Ableitung vom Startsymbol zu einem
Wort (also einer Folge von Terminalen) gibt, in der das Nichtterminal verwendet
wird. Nützliche Symbole sind stets erzeugend und erreichbar. Erzeugend bedeu-
tet, dass von dem Nichtterminal ausgehend ein Wort produziert werden kann; er-
reichbar bedeutet, dass vom Startsymbol ausgehend das Nichtterminal produziert
werden kann. Der Begriff ist relevant, da ähnlich wie bei Automaten angenommen
wird, dass alle Zustände erreichbar sind, man bei Grammatiken annehmen möch-
te, dass Sie nur nützliche Nichtterminale enthalten. Deswegen benötigt man eine
klare Definition und eine Möglichkeit, eine Grammatik, die die Anforderung nicht
erfüllt, in eine mit nur nützlichen Nichtterminalen zu überführen.
(b) Erzeugende Variablen :
• Intuition: C kann kein Wort produzieren, da eine Ableitung, die ein C enthält,
niemals “terminiert”, also nie nur Terminale enthält.
• Formal bauen wir iterativ die Menge aller Nichtterminale, die eine Möglichkeit
haben, ein Wort aus nur Terminalen zu erzeugen.
• P0 := {X | ∃(X, Γ) ∈ P. Γ ∈ Σ∗ }
• Pk+1 := Pk ∪ {X ∈ V | ∃(X, Γ) ∈ P. ∀Y ∈ V. (|Γ|Y > 0 → Y ∈ Pk )} bis
Pk+1 = Pk .
• Führt auf:
P0 = {B, D} P1 = {B, D, A, S} = P2
Erreichbare Variablen :
R0 = {S} R1 = {S, A, B} = R2
S → T S | CT | a A→a
T → AU | T T | c B→b
U → SB | AB C→c
Bestimmen Sie mit dem CYK-Algorithmus, ob ccaab ∈ L(G) und aabcc ∈ L(G).
Geben Sie dabei auch die berechneten Tabellen an.
Lösungsskizze.
(a) Das Feld Fx,y beinhaltet alle Nichtterminale, die das Teilwort vom x-ten Terminal
bis zum y-ten Terminal erzeugen können. (Wir fangen hier mit 1 an zu zählen.)
Beispiel: Wenn das Wort w = abaaab ist, dann beinhaltet F2,4 die Terminale, die
baa erzeugen.
(b) Für Felder Fx,x (in der untersten Zeile) sucht man nach allen Nichtterminalen
X, die eine Produktion X → a haben wobei a das x-te Zeichen des betrachteten
Wortes ist.
Für Felder Fx,y betrachtet man alle Kombinationen aus Feldern Fx,x × Fx+1,y ,
Fx,x+1 × Fx+2,y und so weiter.3 Wenn (A, B) in einer der Mengen vorkommt und
es eine Produktion X → AB gibt, dann fügt man X zum Feld Fx,y hinzu.
(c) Nach dem CYK-Algorithmus ergeben sich folgende Berechnungstabellen:
1,5 S, T
1,4 2,5 S, T
1,3 S 2,4 3,5 T
1,2 S, T 2,3 S 3,4 4,5 U
1,1 C, T 2,2 C, T 3,3 S, A 4,4 S, A 5,5 B
c c a a b
1,5 S, T
1,4 T 2,5
1,5
1,4 R 2,5
1,5 S, T, H
1,4 S, T 2,5 S, T, H
1,3 S 2,4 S, T 3,5 S
(b)
1,2 2,3 S 3,4 S 4,5 S, H
1,1 L 2,2 H 3,3 L 4,4 S, T, L 5,5 L
z s z w z
(c) , aabccb, acbccb ∈ L und b, bb, abb 6∈ L
(d) , aaabbaaa, ababbaba ∈ L und bbb, aab, aaabaaa 6∈ L
(e)
a, Z0 /A
a, A/AA
a, B/AB ε, Z0 /ε
ε, A/A
ε, B/B a, A/ε
q p
b, B/ε
b, Z0 /B
b, A/BA
b, B/BB
(f)
b, A/AAA
b, A/ε
3 4 b, A/ε
a, Z0 /AA
ε, Z0 /ε
a, A/A
0 a, Z/ε
a, B/B
b, Z/ε
b, A/A
a, Z0 /A
b, B/B
b, Z0 /B a, A/ε
1 2
b, B/ε
a, A/AA ε, A/A
a, B/AB ε, B/B
b, A/BA
b, B/BB
(a) Eliminieren Sie alle unnützen Symbole aus G mit den aus der Vorlesung bekannten
Verfahren. Geben Sie ihren Rechenweg an.
(b) Leider ist G noch nicht klein genug. Geben Sie eine Grammatik G0 mit L(G0 ) =
L(G) an, die höchstens zwei Produktionen enthält. Beschreiben Sie ihr Vorgehen.
Lösungsskizze. (a) Zuerst berechnen wir die Menge der erzeugenden Symbole. Jede Zeile
entspricht hierbei einem Schritt der Induktion aus Satz 4.37.
{a, b}
∪ {C, D, T, V }
∪ {A, S}
∪∅
Hier ist die Induktion (bzw. der Fixpunktalgorithmus) also abgeschlossen, und wir er-
halten folgende Grammatik:
S → SS | AD | T D → Sb | b
A → aT | aaD T →S|ε
C → aV | ε V → aSb | ab
Nun bestimmen wir die Symbole, die erreichbar sind, induktiv nach Satz 4.40.
{S}
∪ {A, D, T }
∪∅
S → SS | AD | T D → Sb | b
A → aT | aaD T →S|ε
S → SS | AD | ε D → Sb | b
A → aS | aaD | a
S → SS | ASb | Ab | ε
A → aS | aaSb | aab | a
Die Produktionen S → aSSb | aaSbSb | aabSb | aaSbb | aabb | ab lassen sich nun entfernen,
da man jeweils die rechte Seite auch in folgender Grammatik ableiten kann.
S → SS | aSb | ε
Diese Grammatik erzeugt genau die balancierten Klammerwörter (mit a als öffnende
und b als schließende Klammer), wie aus der Vorlesung (Beispiel 4.10) bekannt. Dafür
können wir aber auch eine kleinere Grammatik angeben:
S → aSbS | ε
Aufgabe H7.3. (Hochstaplerei) 1+3 Punkte
Dora ist wütend. Ihr Kindergartenrivalin, Eva Pirsalz, behauptet einen größeren Bau-
steinturm als Dora gebaut zu haben. Aber als Dora sich den Turm anschauen wollte,
war er nicht mehr da – Eva behauptet, sie hat ihn schon wieder abgebaut. Dora will der
Sache auf den Grund gehen, und besorgt sich eine Kopie von Evas Labortagebuch. Da
muss für jeden Baustein jeweils vermerkt sein, wann der er aus der Bausteinbox geholt
wurde, wann er verbaut wurde, und wann er wieder zurückgelegt wurde.
Die Einträge werden mit dem Alphabet Σ := {g, v, z} notiert. In Doras Labortage-
buch steht z.B. das Protokoll ggvgvvzgvzzz. Ein Baustein muss immer zuerst geholt,
dann verbaut, und dann zurückgegeben werden. Das Protokoll gvvgzz wäre also nicht
gültig, da hier ein Stein verbaut wurde, bevor er geholt wurde. Ebenso wäre ggvgvvzz
nicht in Ordnung, da einer der Steine nicht zurückgegeben wurde, oder gz, da einer der
Steine nicht verbaut wurde. Sei L := {w ∈ Σ∗ : w ist gültiges Protokoll}. Um Eva zu
überführen, will Dora nun einen Kellerautomaten bauen, der jedes Protokoll in Evas
Labortagebuch überprüft.
(a) Zeigen Sie, dass L nicht kontextfrei ist und es somit keinen Kellerautomaten für L
gibt.
Dora ist enttäuscht, hat aber noch eine Idee: Für Ihre Zwecke wäre es genauso gut, einen
Kellerautomaten zu haben, der die ungültigen Protokolle akzeptiert.
(b) Konstruieren Sie einen Kellerautomaten für L und beschreiben Sie die Idee hinter
Ihrer Konstruktion.
Hinweis: Bitte beachten Sie die Anmerkungen zur Notation von Kellerautomaten
auf Übungsblatt 7.
Lösungsskizze. (a) Angenommen, L wäre kontextfrei. Dann können wir das Pumping-
Lemma für kontextfreie Sprachen anwenden.
Sei n ∈ N PL-Zahl. Wir wählen das Wort r := g n v n z n . (Wir bezeichnen dies meist als
z, das wäre hier aber ungünstig, da im Alphabet Σ. Also wählen wir r statt z für den
Namen des Wortes, und f statt v für den zweiten Teil der Zerlegung.)
Sei uf wxy eine Zerlegung unseres Wortes mit |f wx| ≤ n und f x 6= ε. Wir betrachten
die folgenden Fälle:
• |f x|z = 0: Wir pumpen also kein z. Wir pumpen ab, betrachten also das Wort
r0 := uf 0 wx0 y = uwy. Da f x 6= ε, haben wir zumindest ein g oder ein f entfernt.
Daher gilt |r0 |g < |r0 |z oder |r0 |v < |r0 |z . Das heißt, ein Stein wurde zurückgegeben
bevor er geholt oder verbaut wurde. Daher ist in beiden Fällen das Wort r0 ∈ / L.
• |f x|z > 0: Aufgrund der Form unseres Wortes und |f wx| ≤ n gilt also |f wx|g = 0.
Wir pumpen 2-mal, betrachten also r0 := uf 2 wx2 y. Es gilt |r0 |g = n < n + |f x|z =
|r0 |z . In r0 wurde daher ein Stein zurückgegeben, bevor er geholt wurde, und r0 ∈
/ L.
(b) Um zu überprüfen, dass ein Wort in L enthalten ist, können wir folgendermaßen
vorgehen: Wir gehen das Wort Zeichen für Zeichen durch, und merken uns stets die
Anzahl der Steine die wir geholt, aber nicht verbaut haben, und die der Steine, die wir
verbaut, aber nicht zurückgelegt haben. (Erstere Zahl nennen wir A, und letztere B.)
Keine dieser Zahlen darf negativ werden, und am Ende müssen beide 0 sein. Mit einem
Kellerautomaten kann man dies nicht überprüfen, da er sich nur eine dieser Zahlen
merken kann. Aber: Falls das Wort nicht in der Sprache ist, muss also einer dieser
Zähler negativ werden oder nicht auf 0 enden. Dies können wir überprüfen, indem wir
den Nichtdeterminismus ausnutzen.
g, Γ/AΓ
v, A/ε
z, Γ/Γ v, Z0 /Z0
1
ε, A/ε
ε
g
0 3 4 v
z
ε
ε, B/ε
g, Γ/Γ 2 z, Z0 /Z0
v, Γ/BΓ
z, B/ε
(Der PDA verwendet die auf Übungsblatt 8 eingeführte Kurznotation.) Zuerst entschei-
det sich der Automat, ob er A oder B überprüft. Wir betrachten nun den Fall, dass der
Automat A überprüft, das Vorgehen für B ist analog. Anfangs setzten wir den Zähler
auf 1, indem er ein A auf den Stapel legt. Danach liest er das Wort ein. Jedes g legt
ein weiteres A auf den Stapel, jedes v nimmt eines herunter. Es gibt zwei Möglichkeiten,
wie das Wort inkorrekt sein könnte: (1) Der Zähler erreicht zwischendurch die Zahl 0 (es
wurde also ein Stein verbaut, der nicht geholt wurde). (2) Der Zähler endet nicht bei 1
(es wurden nicht alle Steine verbaut).
Im Fall (1) geht der Automat zu Zustand 4 über, und kann dort den Rest des Wortes
akzeptieren. (Umgekehrt kann man Zustand 4 auch nur in Fall (1) erreichen.) Bei (2)
müssen am Ende des Wortes zwei A auf dem Stapel liegen (der Zähler ist also mindestens
2) – hier gehen wir nach 3, von wo aus keine weiteren Zeichen mehr eingelesen werden
können. Auch hier gilt die Umkehrung: wir können nur nach 3 gehen, wenn wir am Ende
des Wortes sind und mindestens zwei A auf dem Stapel liegen.
Bonusaufgabe H7.4. 2 Bonuspunkte
Implementieren Sie ein Programm, das beliebige theoLISP Programme ausführen kann
(wie in Aufgabe H6.3 definiert). Führen Sie so das (korrigierte) Programm aus Aufga-
be H6.4 aus und geben Sie das Ergebnis an.
Hinweise: Es ist sinnvoll, hierzu Ihre Lösung von Aufgabe H6.4 zu erweitern. Alter-
nativ können Sie auch auf der Musterlösung aufbauen, diese finden sie hier, zusammen
mit dem korrigierten Programm aus Aufgabe H6.4. Beachten Sie bitte auch die Beispiel-
programme zu Aufgabe H6.3 (diese sind hier zu finden), für die die korrekten Ausgaben
jeweils angegeben sind.
Wie immer: Beschreiben Sie bitte Ihren Ansatz in natürlicher Sprache und illustrie-
ren die wesentlichen Schritte Ihrer Lösung mit geeigneten Codefragmenten. Sie können
(müssen aber nicht), Ihrer Lösung Ihren vollständigen Programmcode beifügen, jedoch
steht es den Korrektoren frei, diesen zu ignorieren. Beschränken Sie sich in Ihrer Imple-
mentierung auf grundlegende Funktionalitäten verbreiteter Programmiersprachen.
Es genügt zu beschreiben, wie Sie ihren Recogniser (oder den der Musterlösung) an-
passen. Sie müssen nicht erneut beschreiben, wie dieser funktioniert.
Knobelaufgabe: Wenn Sie herausfinden, was das Programm tatsächlich ausrechnet
(für beliebige Eingaben n), können Sie gerne eine E-Mail an Philipp Czerner schicken.
Lösungsskizze. Zuerst ändern wir unseren Recogniser, sodass er eine verschachtelte Liste
mit dem Programminhalt zurückgibt. Für das Programm
Die Liste entspricht also exakt der S-Expression; Zahlen sind als Zahlen repräsentiert,
und alles andere als String. In unserem Parser haben wir bereits für jede Variable eine
Funktion, die diese Variable einliest – wir müssen die Funktion nun so anpassen, dass
sie eine entsprechende Liste zurückgibt. Beispiel:
def Zahl():
r = ’’
assert code[0].isdigit()
while code[0].isdigit(): r += code[0]; eat(code[0])
return int(r)
Hier wird eine Zahl eingelesen und zu einem Integer konvertiert. Die meisten dieser
Funktionen arbeiten rekursiv:
def Term():
if eat_maybe(’(’): r = Arith(); eat(’)’); return r
elif code[0].isdigit(): return Zahl()
elif code[0].isalpha(): return Var()
else: assert False
def Arith():
r1 = Op(); eat(’ ’)
r2 = Term(); eat(’ ’)
r3 = Term()
return [r1, r2, r3]
def While():
eat(’while’); eat(’ ’)
r2 = Term(); eat(’ ’)
r3 = S()
return [’while’, r2, r3]
Das Vorgehen ist stets das gleiche, die anderen Funktionen sind deshalb hier nicht gezeigt.
Nun können wir das Programm einlesen.
program = S()
Um das Programm dann auszuführen, gehen wir wieder rekursiv vor. Wir erstellen
drei Funktionen: run, um eine Liste an Befehlen auszuführen; run_single, für einen
einzelnen Befehl, und calc, um den Wert eines arithmetischen Ausdrucks zu ermitteln.
Die Implementation von run ist leicht.
def run(program):
for i in program: run_single(i)
Um calc zu implementieren, müssen wir uns den aktuellen Wert aller Variablen merken.
Hierzu verwenden wir ein globales Dictionary.
variables = {}
def calc(E):
if isinstance(E, int): return E
elif isinstance(E, str): return variables.get(E, 0)
elif E[0] == ’add’: return calc(E[1]) + calc(E[2])
elif E[0] == ’mul’: return calc(E[1]) * calc(E[2])
elif E[0] == ’sub’: return calc(E[1]) - calc(E[2])
Beachten Sie, dass wir für Variablen, denen bisher kein Wert zugewiesen wurde, den
Wert 0 verwenden. Schließlich implementieren wir run_single, unter Verwendung der
beiden vorherigen Funktionen.
def run_single(P):
if P[0] == ’if’:
if calc(P[1]) > 0: run(P[2])
else: run(P[3])
elif P[0] == ’while’:
while calc(P[1]) > 0: run(P[2])
elif P[0] == ’set’:
variables[P[1]] = calc(P[2])
Nun führen wir das Programm aus und geben das Ergebnis zurück.
run(program)
print(calc(’result’))
Der Ergebnis ist 347. (Und tatsächlich wurde im Jahre 347 der spätere Kaiser Theodosius
der Große geboren. )
Prof. Javier Esparza Technische Universität München
Philipp Czerner, Martin Helfrich Lehrstuhl für Theoretische Informatik
Einführung in die Theoretische Informatik
Sommersemester 2021 – Übungsblatt 8
• Das Übungsblatt ist in zwei Teile gegliedert: den Vorbereitungsteil, den Sie vor der
Übung selbstständig bearbeiten sollen, und den Übungs-/Nachbereitungsteil, der
Aufgaben enthält, die in der Übung besprochen werden und von Ihnen anschließend
zur Nachbereitung verwendet werden können.
• Das ist nicht das Hausaufgabenblatt! Die Hausaufgaben finden Sie auf einem se-
paraten Blatt.
Notation von PDA-Regeln 2: Auf Übungsblatt 7 wurde eine graphische Notation für
PDAs eingeführt. Für einige häufige Fälle führen wir nun weitere Kurzschreibweisen
ein. Sei M = (Q, Σ, Γ, q0 , Z0 , δ, F ) ein PDA mit Γ = {X1 , X2 , ..., Xk } und a ∈ Σ∪{}.
Wir schreiben
• a, Γ/ε statt a, X1 /ε, ..., a, Xk /ε,
• a, Γ/αΓ statt a, X1 /αX1 , ..., a, Xk /αXk , mit α ∈ Γ∗ , und
• a statt a, Γ/Γ.
x, Z/Z
a, Γ/XΓ q p x,Z/Z
a,Z/XZ
a,X/XX x,X/X
b, X/ε ε,Z/Z
r
x, X/X
a, Γ/AΓ
q0 q1
a, Γ/AΓ
b
b, A/ε
q2 q3
b, A/ε
b, Z0 /Z0
b
q4 q5
b
S → SS | aSb | bSa | c
(b) Übersetzen Sie den folgenden PDA M = ({q, p}, {a, b}, {Z0 , A, B}, q, Z0 , δ) in eine
CFG G mit Lε (M ) = L(G), wobei δ definiert ist durch:
a, A/AA
b, Z0 /ε q p b, A/ε
b, A/ε
a, Z0 /A
a/0 b/−1
q0 qa qb
(c) In dieser Variante steht der Zähler am Anfang auf 0 und beim Lesen eines Zeichens
kann der Zähler auf Gleichheit mit 0 überprüft werden. Akzeptiert wird mit Endzu-
stand. Der folgende Automat akzeptiert die Sprache {w | |w|a = |w|b ∧w ∈ {a, b}∗ }.
a, !0/ + 1
qa b, !0/−1
a, 0/+1
ε, 0/0
q0
b, 0/+1
ε, 0/0
qb a, !0/−1
b, !0/+1
Hier bezeichnet 0 (bzw !0) an der zweiten Stelle einer Transition, dass der Zähler
(nicht) gleich null ist. Es ist auch möglich diesen Automaten zu determinisieren.
(d) Beispiel: {wwR : w ∈ {a, b}∗ }
Knobelaufgaben:
(a) Idee: Wir raten eine Stelle k, an der der k-te Buchstabe nicht mit dem k-letzten
Buchstaben übereinstimmt.
Σ, !0/0
qa
a, ?/+1 b, !0/−1
ε, 0/0
inc Σ, ?/+1 Σ, !0/−1 dec qf
b, ?/+1 a, !0/−1
qb
Σ, !0/0
• Sei Φ := {{1}, {2}, {3, 4}, {5}}. Nach dem Abgabedatum werden wir für jede Men-
ge A ∈ Φ eine zufällige Aufgabe a ∈ A wählen und korrigieren.
• Es werden diese Aufgaben korrigiert: H8.1, H8.2, H8.4, H8.5
a, Z0 /XZ0 b, X/X
0 1 2 5
b, X/ε b, Z0 /Z0
b, X/X b, Z0 /Z0
b, Z0 /Z0
3 4
(b) Um einen PDA für die Sprache der Grammatik S → (S) | S +S | SS | x zu erstellen,
formen wir die Grammatik zunächst um.
S → (SQ | SP S | SS | x
Q→) P →+
Den PDA erstellen wir nun mit dem Verfahren aus der Vorlesung. Das initiale Keller-
symbol ist S, und der PDA akzeptiert über leeren Keller.
(, S/SQ
, S/SP S
, S/SS
0 x, S/ε
), Q/ε
+, P/ε
(c) Vorab kurz die Anmerkung, dass man für diese Aufgabe den DPDA auch direkt
hinschreiben kann. In der folgenden Lösung präsentieren wir eine Möglichkeit, wie man
strukturiert vorgehen kann – dies ist aber nicht notwendig.
Für diesen Aufgabenteil formen wir die Grammatik zunächst um, mit dem Ziel, dass
man nur mit Kenntnis des nächsten Zeichen des Wortes bereits entscheiden kann, welche
Produktion verwendet werden soll. Die Produktionen S → S + S | SS stellen hier
jedoch ein Problem dar, da man sie erst nach dem Einlesen von S unterscheiden kann.
(Produktionen solcher Form bezeichnet man auch als linksrekursiv, für mehr Details sei
auf die Vorlesung Compilerbau verwiesen.) Also führen wir eine neue Variable T ein, zu
der wir die Produktionen von S, die nicht mit S beginnen, bewegen, und terminieren
die Rekursion direkt in T :
S → T + S | TS | T
T → (S) | x
Die Produktionen von S beginnen allerdings alle mit T , sodass wir immer noch nicht
zwischen ihnen unterscheiden können. Stattdessen führen wir eine neue Variable ein,
sodass S nur noch eine Produktion hat.
S → TR
R → +S | S | ε
T → (S) | x
S → TR
R → +T R | (T R)R | xR | ε
T → (T R) | x
Nun hat jede Variable entweder genau eine Produktion, oder jede Produktion beginnt
mit unterschiedlichen Terminalsymbolen. Jede Produktion? Nein! Die Produktion R → ε
leistet erbitterten Widerstand. Wir wollen die Grammatik nun weiter umformen, sodass
die Produktion R → ε nur am Ende des Wortes vorkommen kann (und wir das Wort
mit dieser Produktion also direkt akzeptieren).
Wir beobachten, dass nach R immer entweder das Ende des Wortes oder ) kommt.
Wir führen also eine neue Variable K ein, die R und dann eine schließende Klammer
einliest.
S → TR
R → +T R | (T KR | xR | ε
T → (T K | x
K → R)
Damit R nun tatsächlich immer nur am Ende des Wortes steht, müssen wir die Produk-
tion K → R) ersetzten, und die dadurch entstandenen R) in den Produktionen von K
wieder durch K.
S → TR
R → +T R | (T KR | xR | ε
T → (T K | x
K → +T K | (T KK | xK | )
Hieraus lässt sich ein DPDA erstellen. Der DPDA akzeptiert über Finalzustände. Wir
haben dafür gesorgt, dass R stets an der untersten Stelle des Kellers steht, sodass wir
ein Wort genau dann akzeptieren, wenn wir R das einzige Zeichen im Keller ist. Also
fügen wir eine -Transition ein, die feststellt, ob dies der Fall ist.
, S/T R
(, T /T K
x, T /ε
+, K/T K
0 (, K/T KK
x, K/K
), K/ε
+, R/T R
, R/R
(, R/T KR
1 x, R/R
a, Z0 /XXZ0
0 a, X/XXX
a, Y /X
b, X/XX b, Z0 /Y Y Z0
a, Z0 /XZ0 a, X/
0 1 2 b, X/Y
b, Y /
b, Y /Y Y Y
b, X/X
b, X/
1
b, Y /
ε, X/X
c, X/ a, X/
c, Z0 / a, Y /
3 2 3
c, X/ ε, X/ ε, Y /
c, Z0 / ε, Z0 / ε, Z0 /
(a) (b)
γ := ( ε, Z0 /Z0 ε, X/X ε, Y /Y )
a, A/AA d, X/ c, X/XX
b, A/BA d, Y /Y Y c, Y /
3
d, Z0 /Y Z0 c, Z0 /XZ0
γ γ
0 1
a, A/AA 0 2
a, B/AB
a, Z0 /AZ0 a, A/
ε, A/A a, X/XX
b, B/ a, Y / b, X/
ε, B/B 1
2 ε, Z0 / a, Z0 /XZ0 b, Y /Y Y
ε, Z0 /Z0
γ b, Z0 /Y Z0
γ
(c) (d)
Lösungsskizze.
(a) {ab2n cn+2 : n ∈ N}
(b) {wxy : w ∈ {aa, bb}∗ , x, y ∈ {a, b}, f (y)(f (w) + 2f (x)) ≥ 0}, f (w) := |w|a − |w|b .
Alternativ:
S → aC | Da | BC C → aS | BC
B → BB | b D → CB | ε
S 0 → C | SBa | ε
S 0 → C | SBa | ε
S → aC | Da | BC C → aS | BC
B → BB | b D → CB | ε
(b) Wir konvertierten H zuerst zur Chomsky-Normalform. (Beachten Sie, dass es keinen
Einfluss auf L(H)c hat, ob ε ∈ L(H).) Als Variablen verwenden wir V 0 := V ] {Xc :
X ∈ V }, und das Startsymbol ist nun S 0 := Sc . Die Idee ist, dass LH 0 (Xc ) = LH (X)c
für jedes X ∈ V gilt, dass also Xc genau die Wörter erzeugt, die der Residualsprache
der von X erzeugen Wörter entspricht.
Die Produktionen P 0 konstruieren wir folgendermaßen:
• Alle Produktionen aus P sind in P 0 enthalten.
• Für (X → c) ∈ P fügen wir Xc → ε zu P 0 hinzu.
• Für (X → Y Z) ∈ P fügen wir Xc → Yc Z zu P 0 hinzu.
(c) Zuerst konvertieren wir G zur Chomsky-Normalform.
S → AC | DA | BC | a C → AS | BC
B → BB | b D → CB
A→a
Nun fügen wir folgende Produktionen hinzu (Sb ist das neue Startsymbol).
Sb → Ab C | Db A | Bb C Cb → Ab S | Bb C
Bb → Bb B | ε D b → Cb B
Wir merken an, dass das Symbol Ab nicht erzeugend ist – alle Produktionen, die es
involvieren, könnten also auch gelöscht werden.
Aufgabe H8.4. (Twice the ↑, double the ↓) 2+3 Punkte
Durch die steigenden Bevölkerungszahlen in jüngerer Vergangenheit wachsen auch die
Orte Estlingen und Oberfeld langsam zusammen. Dies stellt die Bebauungsplanerstel-
lungskommission der Gemeindeverwaltung Oberfeld vor Probleme, die (teils kuriosen)
traditionellen Estlinger Bauweisen mit den wissenschaftlich fundierten Oberfelder Vor-
gaben zu vereinen. Nun benötigen sie Ihre Hilfe bei einem besonders kniffeligen Fall.
Ähnlich zu Übungsaufgabe Ü5.7 betrachten wir „Skylines“. Sei also Σ := {↑, →, ↓, ↑, ↓}
ein Alphabet, wobei wir Wörter aus Σ∗ als Linien illustrieren. Beispielsweise stellen wir
Die Pfeile ↑ und ↓ stellen jeweils Fenster dar. Formal definieren wir Skylines induktiv:
ε ist eine Skyline, jedes Wort in n,m>0 {↑, ↑}n {→}m {↓, ↓}n ist eine Skyline, und für
S
• Alle Gebäude haben ungerade Höhe und Fenster befinden sich nur in ungera-
den Stockwerken. (Das linke Haus in obigem Beispiel erfüllt dies.)
• Die Fenster auf gegenüberliegenden Seiten des Hauses müssen übereinstim-
men, und alle Häuser müssen mindestens Breite 2 haben.
Hinweise: Sie dürfen die (b) verwenden. Falls Sie dies tun, ist es nicht notwendig,
M auszurechnen – M1 und M2 genügen. Um Ihre Notation zu vereinfachen, können
Sie alternativ das Alphabet Σ0 := {o, r, u, o0 , u0 } benutzen.
Sie sind mittlerweile leicht genervt von „traditionellen“ Estlinger Bräuchen, und beschlie-
ßen, der Bebauungsplanerstellungskommission ein Werkzeug an die Hand zu geben, mit
dem sie sich entsprechende PDAs auch selbst zusammenstellen kann.
Sei f : Σ → N eine Funktion und M = (Q, Σ, Γ, q0 , Z0 , δ, F ) ein PDA. Wir sagen,
dass M Signatur f hat, wenn für alle (q, c, Z) ∈ Q × Σ × Γ sowohl |α| = f (c) für alle
(q 0 , α) ∈ δ(q, c, Z) gilt, also auch |α| = 1 für alle (q 0 , α) ∈ δ(q, , Z). In anderen Worten
sorgt jede Transition, die ein Zeichen c ∈ Σ einliest, dafür, dass genau f (c) − 1 Zeichen
auf den Stapel geschrieben werden, und -Transitionen dürfen die Größe des Stapels
nicht verändern.
(b) Seien M1 , M2 beliebige PDAs, die beide Signatur f haben. Konstruieren Sie einen
PDA M mit LF (M ) = LF (M1 ) ∩ LF (M2 ), und begründen Sie, wieso Ihre Kon-
struktion funktioniert.
Lösungsskizze. (a) Zuerst konstruieren wir uns einen PDA für die erste Einschränkung:
↓, X/
↓, Y /
→ → ↓, Y /
↑, Γ/XΓ
ε → ε
0 1 2 3 4
↑, X/Y X ε, Z0 /Z0
↑, X/Y X
5
→
ε → → ε, Z0 /Z0
0 1 2 3 4
→, Z0 /Z0
Beide PDAs haben die Signatur f mit f (→) = 1, f (↑) = f (↑) = 2 und f (↓) = f (↓) = 0.
Über (b) konstruieren wir dann einen PDA für ihren Schnitt.
(b) Diese Konstruktion ist ähnlich zur Produktkonstruktion für DFAs. Wir müssen
jedoch auch die Stapel beider PDAs gleichzeitig simulieren, und haben nur einen Stapel
zur Verfügung. Hier benutzen wir, dass die PDAs M1 und M2 die gleiche Signatur haben,
was dazu führt, dass ihre Stapel stets gleich groß sind.
Formal: Seien M1 = (Q1 , Σ, Γ1 , q01 , Z01 , δ1 , F1 ) und M2 = (Q2 , Σ, Γ2 , q02 , Z02 , δ2 , F2 )
zwei PDAs mit Signatur f . Aus technischen Gründen passen wir M1 und M2 zuerst so
an, dass es in jedem Zustand eine -Transition zu sich selbst gibt. Für i ∈ {1, 2} und
q ∈ Qi , X ∈ Γi fügen wir also qX → qX in δi ein. (∗)
Wir definieren Q := Q1 × Q2 , Γ := Γ1 × Γ2 , q0 := (q01 , q02 ), Z0 := (Z01 , Z02 ) und
a a
F := F1 × F2 . Sei a ∈ Σ ∪ {ε}. Für jede Transition (q1 X1 → r1 α) ∈ δ1 und (q2 X2 →
r2 β) ∈ δ2 gilt |α| = f (a) = |β| (da M1 und M2 beide Signatur f haben). Wir setzen also
α1 ...αk := α und β1 ...βk := β, und fügen folgende Transition zu δ hinzu.
a
(q1 , q2 )(X1 , X2 ) → (r1 , r2 )(α1 , β1 )(α2 , β2 ) · · · (αk , βk )
Aufgrund der Definition von δ wird ein Schritt von M wird immer aus gültigen Schrit-
ten von M1 und M2 bestehen. Falls M in einen Endzustand übergeht, sind sowohl M1
als auch M2 in einem Endzustand, das Wort muss also in beiden Sprachen liegen. An-
dererseits, wenn sowohl M1 als auch M2 für ein gegebenes Wort w mit irgendwelchen
Übergängen in einen Endzustand können, können wir diese Übergänge kombinieren und
in M ausführen, damit wir also auch alle Wörter im Schnitt von M1 und M2 akzeptieren.
Falls nur einer der PDAs eine -Transition ausführt, kann der andere eine der nutzlosen
Transitionen, die wir in (∗) hinzugefügt haben, ausführen.
Wichtig! Wir wissen aus der Vorlesung, dass kontextfreie Sprachen nicht unter Durch-
schnitt abgeschlossen sind, deswegen funktioniert diese Konstruktion (wie vorher mehr-
mals erwähnt) nur wegen der Bedingung an die Signatur! In anderen Fällen ist ein
Argument, dass wir einen PDA für den Durchschnitt bauen können, inkorrekt.
Bonusaufgabe H8.5. (Semilineare Mengen) 2+2 Bonuspunkte
Sei n ∈ N beliebig. Wir nennen eine Menge M ⊆ Nn linear, wenn es Vektoren r, p1 , ..., pk ∈
Nn gibt, sodass
M = {r + λ1 p1 + ... + λk pk : λ1 , ..., λk ∈ N}
Insbesondere genügt es also einen PDA für den Spezialfall, dass S eine lineare Menge ist,
zu konstruieren. Für den allgemeinen Fall bilden wir dann die Vereinigung von endlich
vielen PDAs.
Sei also nun S linear. Wir können also r, p1 , ..., pk ∈ N2 wählen, sodass
S = {r + λ1 p1 + ... + λk pk : λ1 , ..., λk ∈ N}
gilt. Wir zeigen, dass L kontextfrei ist, indem wir einen PDA für L erstellen.
Die Idee des PDAs ist, dass er eine Sequenz an Vektoren v ∈ {p1 , ..., pk } ⊆ N2 „rät“.
Er merkt sich daraufhin, dass er v2 zusätzliche b einlesen muss, indem er entsprechende
Zeichen in den Keller schreibt, und liest v1 viele a ein. Wir verwenden den Keller also als
Zähler, wobei X jeweils „+1“ repräsentiert, und Y „−1“. (Wir üblich sorgen wir dafür,
dass sich X und Y nicht vermischen.)
Beispiel: Sei p1 := (2, 1) und p2 := (1, 1). Beim Einlesen des Wortes aabba geht der
Automat folgendermaßen vor:
• Der Automat wird initialisiert.
Keller: Z0 , Restwort: aabba
• Der PDA rät v = p1 = (2, 1), schreibt X auf den Keller und liest aa ein.
Keller: XZ0 , Restwort: bba
• Der PDA liest zwei b ein und dekrementiert den Zähler zweimal.
Keller: Y Z0 , Restwort: a
• Schließlich rät der PDA v = p2 = (1, 1), erhöht den Zähler um 1, und liest ein a
ein.
Keller: Z0 , Restwort: ε
Nun definieren wir den Automaten M = (Q, Σ, Γ, q0 , Z0 , δ, F ) formal. Wir wählen
hierfür P := max{v1 , v2 : v ∈ {r, p1 , ..., pk }} als den größten Eintrag in einem der Vek-
toren, die S festlegen. Unsere Zustände sind Q := {0, ..., P } × {0, ..., P }, wobei Zustand
(i, j) ∈ Q bedeutet, dass wir i-mal ein a einlesen wollen, und j-mal ein b. Als Kelleral-
phabet verwenden wir Γ := {Z0 , X, Y }, der Startzustand ist q0 := r und die Menge an
akzeptierenden Zuständen F := ∅, da wir mit leerem Keller akzeptieren wollen.
Es verbleibt, die Übergangsfunktion δ zu beschreiben. Zuerst kümmern wir uns darum,
dass wir die korrekte Anzahl an b einlesen: Wenn wir in einem Zustand (i, j) ∈ Q sind
mit j > 0, wollen wir den Zählen um j erhöhen. Dafür erhöhen wir den Zähler um 1 und
gehen zu Zustand (i, j − 1).
ε
(i, j)Z0 → (i, j−1)XZ0
ε
(i, j)X → (i, j−1)XX für i ∈ {0, ..., P } und j ∈ {1, ..., P } (1)
ε
(i, j)Y → (i, j−1) ε
Die Zustände (i, 0) ∈ Q können dann beliebig viele b einlesen, und den Zählen jeweils
um 1 senken.
b
(i, 0)Z0 → (i, 0)Y Z0
b
(i, 0)X → (i, 0) ε für i ∈ {0, ..., P } (2)
b
(i, 0)Y → (i, 0)Y Y
Schließlich kann der PDA akzeptieren, wenn er in Zustand (0, 0) im Keller nur Z0 stehen
hat, der Zähler also 0 ist.
ε
(0, 0)Z0 → (0, 0) ε (5)
(b) Nun beweisen wir, dass obiger Automat korrekt ist. Wie üblich, teilen wir diesen
Beweis in zwei Richtungen auf und zeigen L(M ) ⊆ L und L(M ) ⊇ L. Für die folgenden
Beweise ist ein wenig Notation hilfreich, wir definieren also f : Σ∗ → N2 als f (w) :=
(|w|a , |w|b ) und g : Γ∗ → N als g(α) := |w|X − |w|Y . Außerdem schreiben wir e2 := (0, 1).
„⊆“: Sei w ∈ Σ∗ ∗ beliebig. Wir zeigen, dass für jede Konfiguration C := (q, w0 , α)
von M , die von der Startkonfiguration (r, w, Z0 ) erreicht werden kann, H(C) :=
q + e2 g(α) + f (w) − f (w0 ) ∈ S gilt. Aus dieser Aussage folgt L(M ) ⊆ L direkt,
da ein Wort nur in einer Konfiguration C ∗ := ((0, 0), ε, ε) akzeptiert wird, und
H(C ∗ ) = f (w) ∈ S impliziert w ∈ L. Der Beweis erfolgt mithilfe von Induktion
über die Anzahl ausgeführter Transitionen.
Für die Induktionsbasis erhalten wir C = (q, w0 , α) = (r, w, Z0 ), und somit H(C) =
r ∈ S. Für den Induktionsschritt sei nun C = (q, u, α) eine beliebige Konfiguration
mit H(C) ∈ S, und C 0 = (q 0 , u0 , α0 ) eine Konfiguration mit C →M C 0 . Nun müssen
wir lediglich alle Transitionen durchgehen: (1) inkrementiert g(α) und senkt q2
um 1, (2) dekrementiert g(α) und erhöht −f (u)2 um 1, (3) reduziert q1 und ver-
größert −f (u)1 , und (5) ändert keinen der Terme. In diesen Fällen gilt also (mit
Induktionsannahme)
Es bleibt noch Transition (4), hier gilt q = (0, 0) und q 0 ∈ {p1 , ..., pk } und somit:
H(C 0 ) = H(C) + q 0 ∈ S
Anschließend müssen wir lediglich Transition (4) x2 -mal anwenden und können
dann das Wort mit Transition (5) akzeptieren. Insbesondere gilt damit ax1 bx2 ∈
L(M ) für jedes x ∈ S, und somit L ∩ L(a∗ b∗ ) ⊆ L(M ).
Um den Beweis abzuschließen, zeigen wir, dass für w ∈ L(M ) mit ab ∈ w auch
w0 ∈ L(M ) gilt, wobei w0 das Wort ist, das wir erhalten, wenn wir ein ab in
w durch ba ersetzen. Da sich ein a nur über Transition (3) einlesen lässt, muss
der PDA vor Einlesen des a in einem Zustand der Form (i, 0) sein, von dem aus
wir Transition (2) ausführen können (ohne den Zustand zu ändern). Da wir den
Keller aus (auch negativen) Zähler verwenden, können wir die Transition (2), die
b einliest, nach vorne verschieben, und die übrigen Transitionen lassen sich immer
noch ausführen. Am Ende der Ausführung (vor Transition (5)) muss der Zähler
dann den gleichen Wert anzeigen, und wir können w0 ebenfalls über Transition (5)
akzeptieren.
Prof. Javier Esparza Technische Universität München
Philipp Czerner, Martin Helfrich Lehrstuhl für Theoretische Informatik
Einführung in die Theoretische Informatik
Sommersemester 2021 – Übungsblatt 9
• Das Übungsblatt ist in zwei Teile gegliedert: den Vorbereitungsteil, den Sie vor der
Übung selbstständig bearbeiten sollen, und den Übungs-/Nachbereitungsteil, der
Aufgaben enthält, die in der Übung besprochen werden und von Ihnen anschließend
zur Nachbereitung verwendet werden können.
• Das ist nicht das Hausaufgabenblatt! Die Hausaufgaben finden Sie auf einem se-
paraten Blatt.
A/A, R
B/B, R /
,
N
qB qC qF
C/C, R /, N
B/B, R C/C, R
1
Führende Nullen sind erlaubt: (0100)2 = (100)2 = 4
M1 : x0 := x0 + 1
M2 : if x1 = 1 goto M16
M3 : x2 := x1
M4 : x3 := 0
M5 : x4 := 4
M6 : if x2 = 1 goto M12
M7 : if x2 = 0 goto M14
M8 : x2 := x2 − 2
M9 : x3 := x3 + 1
M10 : x4 := x4 + 6
M11 : goto M6
M12 : x1 := x4
M13 : goto M1
M14 : x1 := x3
M15 : goto M1
M16 : HALT
(b) Übersetzen Sie das GOTO-Programm mit Hilfe der Konstruktion aus der Vorlesung
(Satz 5.24, Folie 253f) in ein WHILE-Programm. Nutzen Sie diese Vorlage:
pc :=
while do
if pc = 1 then end
if pc = 2 then end
if pc = 3 then end
if pc = 4 then end
if pc = 5 then end
if pc = 6 then end
if pc = 7 then end
if pc = 8 then end
if pc = 9 then end
if pc = 10 then end
if pc = 11 then end
if pc = 12 then end
if pc = 13 then end
if pc = 14 then end
if pc = 15 then end
if pc = 16 then end
end
Lösungsskizze.
(a) • Eingabe x1 = 16 produziert Ausgabe x0 = 5
(16 → 8 → 4 → 2 → 1)
• Eingabe x1 = 3 produziert Ausgabe x0 = 8
(3 → 10 → 5 → 16 → · · · → 1)
• Eingabe x1 = 42 produziert Ausgabe x0 = 9
(42 → 21 → 64 → 32 → 16 → · · · → 1)
Das Programm berechnet die Länge der Collatz-Sequenz für die positive Zahl x1 .
Die Collatz-Sequenze entsteht durch wiederholtes Anwenden der Funktion
(
x
2 wenn x ≡ 0 (mod 2)
f (x) =
3x + 1 sonst
bis der Wert 1 erreicht wird.2 Es ist unbekannt, ob die Sequenz / das Programm
immer terminiert.
(b) Lösungsvorschlag:
2
Es gibt auch Definitionen der Sequenz, bei denen die Sequenz bei 1 weitergeht und somit die Sequenz
1 → 4 → 2 → 1 unendlich oft wiederholt wird.
pc := 1
while pc 6= 0 do
if pc = 1 then x0 := x0 + 1; pc := pc + 1 end
if pc = 2 then if x1 = 1 then pc := 16 else pc := pc + 1 end end
if pc = 3 then x2 := x1 ; pc := pc + 1 end
if pc = 4 then x3 := 0; pc := pc + 1 end
if pc = 5 then x4 := 4; pc := pc + 1 end
if pc = 6 then if x2 = 1 then pc := 12 else pc := pc + 1 end end
if pc = 7 then if x2 = 0 then pc := 14 else pc := pc + 1 end end
if pc = 8 then x2 := x2 − 2; pc := pc + 1 end
if pc = 9 then x3 := x3 + 1; pc := pc + 1 end
if pc = 10 then x4 := x4 + 6; pc := pc + 1 end
if pc = 11 then pc := 6 end
if pc = 12 then x1 := x4 ; pc := pc + 1 end
if pc = 13 then pc := 1 end
if pc = 14 then x1 := x3 ; pc := pc + 1 end
if pc = 15 then pc := 1 end
if pc = 16 then pc := 0 end
end
Prof. Javier Esparza Technische Universität München
Philipp Czerner, Martin Helfrich Lehrstuhl für Theoretische Informatik
• Sei Φ := {{1}, {2, 3}, {4}}. Nach dem Abgabedatum werden wir für jede Menge
A ∈ Φ eine zufällige Aufgabe a ∈ A wählen und korrigieren.
Update: Wir korrigieren H9.1, H9.2 und H9.4
• Wenn Sie einen Beweis aufstellen, von dem Sie wissen, das einzelne Schritte proble-
matisch oder unvollständig sind, merken Sie dies bitte in Ihrer Lösung an, damit
wir das bei der Korrektur positiv berücksichtigen können.
• 0∈N
a/a, R b/b, R
x/x, R x/x, R x/x, R
c/x, L
a/x, R
3 /, R
b/b, L
x/x, L
(b) Überlieferungen zufolge hatte der Hochpriester von Nakbé folgendes Programm
verwendet, um seine Entscheidungen zu begründen. Welche Funktion f : N → N
berechnet es?
z := x1 + 6
while x1 6= 0 do
w := z + 0
while w 6= 0 do
y := y + 1
w := w − 1
end
x1 := x1 − 1
end
x0 := y − 91
(c) Folgende Wegbeschreibung wurde neben einer römischen Straße im heutigen Italien
entdeckt. Welche Funktion f : N → N berechnet sie?
Geata: if x1 = 0 goto Rom
y := x1
z := 1
k := y MOD 2
Labici: if k = 1 goto Ardea
y := y DIV 2
z := z ∗ 2
k := y MOD 2
goto Labici
Ardea: x1 := x1 − z
x1 := x1 ∗ 2
x0 := x0 + 1
goto Geata
Rom: HALT
Beachten Sie, dass hierbei die syntaktischen Abkürzungen von Folie 245 verwendet
wurden. Insbesondere ist x DIV y die (abgerundete) Division von x durch y, und
x MOD y der verbleibende Rest.
Lösungsskizze.
(a) Die TM sollte die Sprache {an bn+1 cn+1 : n ∈ N>0 } akzeptieren, tut es aber leider
nicht.
(b) Zuerst vereinfachen wir das Programm zu
z := x1 + 6
while x1 6= 0 do
y := y + z
x1 := x1 − 1
end
x0 := y − 91
und dann zu
z := x1 + 6
y := zx1
x0 := y − 91
Nun ist klar, dass das Programm die Funktion f (x) := max{(x + 6)x − 91, 0}
berechnet. Äquivalent lässt sich dies auch folgendermaßen schreiben:
(
x2 + 6x − 91 für x ≥ 7
f (x) :=
0 sonst
(c) Nach Labici steht in z die maximale Zahl der Form 2i , sodass x1 2−i ganzzahlig ist.
Insbesondere ist x1 2−i damit ungerade, und in der Binärdarstellung von x1 − z ist
ein Bit weniger gesetzt als in x1 . Die Zeile x1 := x1 ∗ 2 ändert daran nichts, und
wir erreichen irgendwann den Fall, in dem kein Bit von x1 gesetzt ist, ergo x1 = 0.
Es führen also alle Wege nach Rom, und x0 enthält die Anzahl der 1-Bits von x1 .
Die Funktion f ist also f (x) := | bin(x) |1 .
Aufgabe H9.2. (Gelangwhiled?) 1+1+1+1+2 Punkte
Doras Kindergartenprofessor steht leider im Stau, und die Kindergartenkinder wissen
nicht, was sie mit ihrer Zeit anfangen sollen. Ehe es einen Aufstand gibt, beschließen
Sie die Kinder zu unterhalten, indem Sie die Konvertierung von WHILE-Programmen zu
deterministischen Turingmaschinen erklären.
(a) Sei Σ := {0, 1}. Geben Sie eine TM M 0 an, die die Funktion f : Σ∗ → Σ∗ berechnet,
mit f (w) = 0 für alle w.
(b) Geben Sie eine TM M − an, die eine Funktion f : Σ∗ → Σ∗ berechnet, wobei
f (bin(i)) := bin(i − 1) für alle i ∈ N>0 gilt, und f (0) := 0.
(Wie aus der Vorlesung bekannt bezeichnet bin(i) die Binärdarstellung von i, also
das kürzeste w ∈ {0, 1}+ mit (w)2 = i.)
Im Folgenden seien die TMs aus (a) und (b) so modifiziert, dass sie auf einem beliebigen
(aber festen) Band einer k-Band-TM operieren. Wir nennen die Version von M − , die auf
Band i operiert, dec(i). Ebenso sei setzero(i) die Version von M 0 , die auf Band i arbeitet.
Zusätzlich verwenden wir inc(i) für die angepasste TM aus Beispiel 5.13 (Binär +1), und
iszero(i) für die „Band i = 0 ?“ TM von Folie 241.
(c) Seien n, i ∈ N fix. Konstruieren Sie nun eine k-Band TM add(i, n), die die Binärzahl
auf Band i um n erhöht, und eine k-Band TM sub(i, n), die die Binärzahl auf Band
i um n senkt (statt negativen Ergebnissen ergibt sich 0).
Hinweis: Hier (und im Folgenden) bietet sich die Notation zur sequentiellen Kom-
position aus der Vorlesung an (Folie 240).
(d) Konstruieren Sie eine k-Band TM copy(i, j), die das WHILE-Programm xi := xj
simuliert.
(e) Konvertieren Sie nun folgendes WHILE-Programm, das eine Funktion f : N → N
berechnet, zu einer k-Band TM:
while x1 6= 0 do
x2 := 0
while x1 6= 0 do
x1 := x1 − 2
x2 := x2 + 1
end
x1 := x2
x0 := x0 + 1
end
Lösungsskizze.
(a)
0/, R
1/, R
/0, N
0 1
(b)
0/0, R 0/0, L
1/1, R 0/1, L 1/1, L
0/0, N /, R
1 5
1/1, N
0/, R
6
(d) Wir wählen uns eine Hilfsvariable xk . Zuerst implementieren wir eine TM move(k, i, j),
die das Programm xk := xj ; xi := xi + xj ; xj := 0 implementiert:
nein
setzero(k) iszero(j) dec(j) inc(k) inc(i)
ja
nein nein
iszero(1) setzero(2) iszero(1) sub(1, 2) inc(2)
ja ja
copy(1, 2) inc(0)
Aufgabe H9.3. (Gehe zu GOTO, gehe nicht über WHILE...) 1+1+1+1+2 Punkte
In dieser Aufgabe wollen wir uns die Konvertierung von Turingmaschinen zu GOTO-
Programmen genauer ansehen und diese auf direktem Wege implementieren. Anders
als in der Vorlesung benutzen wir also nicht, dass wir WHILE über GOTO simulieren kön-
nen. Beachten Sie insbesondere, dass sie in der folgenden Aufgabenteilen nur Makros
verwenden dürfen, die wir ohne Simulation von WHILE-Programmen darstellen können.
(a) Implementieren Sie ein GOTO-Programm addmul(x, y, b). Die Parameter x, y sind
Namen von Variablen, und b ∈ N≥2 ist eine Zahl. Das Programm soll y mit b
multiplizieren, und das Ergebnis auf x addieren.
(b) Implementieren Sie ein GOTO-Programm divmod(x, y, z, b). Die Parameter x, y, z
sind Namen von Variablen, und b ∈ N≥2 ist eine Zahl. Das Programm soll z durch
b teilen, das (abgerundete) Ergebnis in x schreiben und den Rest in y. Es soll also
b · x0 + y 0 = z und y 0 < b gelten, wobei x0 , y 0 den Wert der Variablen nach der
Ausführung bezeichnen.
Fortan können wir x := y ∗ b + z als Makro für x := z; addmul(x, y, b) schreiben (mit
x, y, z Variablen, und b ∈ N≥2 ).
Sei M = (Q, Σ, Γ, δ, q0 , , F ) eine TM, mit Γ = {} ∪ {a1 , ..., ab−1 } für ein b ∈ N≥2 .
Um die spätere Notation zu vereinfachen setzen wir a0 := . Wie in der Vorlesung wollen
wir einen Bandinhalt w ∈ Γ∗ als Zahl darstellen, wir definieren also f : Γ∗ → N über
Perm(w) := {wf (1) wf (2) ...wf (n) | f : {1, ..., n} → {1, ..., n} bijektiv}
Beispielweise gilt Perm(abaa) = {aaab, aaba, abaa, baaa}. Wir erweitern dies auf Spra-
chen, für L ⊆ Σ∗ gilt also Perm(L) := w∈L Perm(w).
S
(a) Zeigen oder widerlegen Sie: Für jede Sprache L gibt es eine TM M , die Perm(L)
akzeptiert.
(b) Zeigen Sie, dass Perm(L) kontextfrei ist, wenn L regulär ist.
Lösungsskizze. (a) Die Aussage ist falsch. Wir zeigen, dass es überabzählbar viele Spra-
chen Perm(L) gibt. Daraus folgt die Aussage, denn – wie aus der Vorlesung bekannt –
es gibt nur abzählbar viele TMs, und jede TM akzeptiert genau eine Sprache.
Zuerst beobachten wir, dass Perm(L) = L für L ⊆ {a}∗ . Es genügt also zu zeigen,
dass es überabzählbar viele unäre Sprachen gibt. Eine Sprache L ⊆ {a}∗ können wir
identifizieren mit einer Funktion f : N → {0, 1}, die für jedes n ∈ N angibt, ob an ∈ L.
Nach Satz 5.8 ist die Menge der Funktionen f : N → {0, 1} überabzählbar.
(b) Hier gibt es zwei Ansätze: Man kann aus einem DFA M für L einen PDA M 0 direkt
konstruieren. M 0 hat als Zustände genau die Zustände von M , und verwendet den Stapel
als Zähler. Es gibt folgende Transitionen:
• M 0 kann ein a einlesen, und den gleichen Übergang wie M ausführen.
• M 0 kann ein b einlesen, und den Zähler um 1 dekrementieren.
• M 0 kann den b-Übergang von M ausführen, und den Zähler um 1 erhöhen.
• Wenn M 0 in einem Finalzustand von M ist und der Zähler auf 0 steht, kann M 0
akzeptieren.
Statt dies formal zu beweisen werden wir aber eine andere Lösung angeben, die Aufga-
be H8.5 verwendet.
Sei f : Σ∗ → N2 mit f (w) := (|w|a , |w|b ). Wir erweitern f auf Sprachen und setzten
f (L) := {f (w) : w ∈ L} für L ⊆ Σ∗ . Offensichtlich gilt w ∈ Perm(L) ⇔ f (w) ∈ f (L),
da es nur darauf ankommt, wie viele Zeichen in w vorhanden sind. Für einen regulären
Ausdruck s schreiben wir außerdem F (s) := f (L(s)).
Sei s nun ein regulärer Ausdruck. Wir zeigen nun, dass F (s) semilinear ist, indem wir
mit struktureller Induktion über s beweisen, dass es reguläre Ausdrücke s1 , ..., sk gibt,
sodass F (si ) linear ist und s ≡ s1 | ... | sk .
• s = ∅: Hier gilt F (s) = ∅, wir setzten also k := 0.
• s = ∨ s = a ∨ s = b: Die Mengen F (s) = {(0, 0)}, F (s) = {(1, 0)} und F (s) =
{(0, 1)} sind bereits linear.
• s = t | u: Wir wählen t1 , ..., tk und u1 , ..., ul entsprechend der Induktionsannahme,
es gilt also s ≡ t1 | ... | tk | u1 | ... | uk und somit die Aussage für s.
• s = tu: Hier gilt s ≡ t1 u1 | t1 u2 | ... | t1 ul | t2 u1 | ... | tk ul . Es genügt also zu zeigen,
dass für beliebige i, j die Menge F (ti uj ) = {x + y : x ∈ F (ti ), y ∈ F (uj )} linear ist.
Da (nach Induktionsannahme) F (ti ) und F (uj ) linear sind, können wir Vektoren
r, p1 , ..., pj , r0 , p01 , ..., p0k ∈ N2 mit
F (ti ) = {r + λ1 p1 + ... + λm pm : λ ∈ Nm }
F (uj ) = {r0 + λ01 p01 + ... + λ0n p0n : λ0 ∈ Nn }
wählen. (Dies folgt aus der Definition von linear.) Dann gilt
F (t) = {r + λ1 p1 + ... + λm pm : λ ∈ Nm }
Da jedes Wort in t∗ die Konkatenation von endlich vielen Wörtern aus t ist, folgt
• Das Übungsblatt ist in zwei Teile gegliedert: den Vorbereitungsteil, den Sie vor der
Übung selbstständig bearbeiten sollen, und den Übungs-/Nachbereitungsteil, der
Aufgaben enthält, die in der Übung besprochen werden und von Ihnen anschließend
zur Nachbereitung verwendet werden können.
• Das ist nicht das Hausaufgabenblatt! Die Hausaufgaben finden Sie auf einem se-
paraten Blatt.
Diese Funktion ist intuitiv berechenbar und eine charakteristische Funktion von
A ∩ B, da
semi-entscheidbar ist. Sie dürfen ohne Beweis verwenden, dass es berechenbare, surjektive
Funktionen g : N → Σ∗ und h : N → Nk gibt, für beliebiges k ∈ N.
Hinweise: Es ist nicht notwendig (und oft unerwünscht), eine TM formal präzise
anzugeben. Achten Sie jedoch darauf, Ihre Idee genau zu schildern, sodass einem Leser
klar ist, wie eine entsprechende TM auszusehen hätte.
Lösungsskizze. Sei w ∈ Σ∗ beliebig. Wir schreiben Mw [v]↓n für Mw hält für Eingabe v
in n Schritten. Nun können w ∈ L äquivalent schreiben als
Gegeben u, v, n lassen sich Mw [u]↓n und Mw [v]↓n leicht überprüfen, indem man Mw auf
der entsprechenden Eingabe für n Schritte simuliert. Unser Programm ist also
for all (u, v, n) ∈ Σ∗ × Σ∗ × N
if u 6= v ∧ Mw [u]↓n ∧ Mw [v]↓n return
Es verbleibt noch, zu argumentieren, dass wir über alle Elemente Σ∗ × Σ∗ × N iterieren
können. Es genügt, eine surjektive, berechenbare Funktion f : N → Σ∗ × Σ∗ × N zu
finden: diese konstruieren wir als f (n) := (g(h1 (n)), g(h2 (n)), h3 (n)), wobei g, h wie in
der Aufgabenstellung definiert sind, mit k := 3.
Aufgabe H10.4. (Alle Register ziehen) 0.5+0.5+1 Punkte
Als es gerade den Oeehthto-Gürtel umrundet, wird Tyx’Hxli E’Oozrts Raumschiff von
Piraten – geführt vom berüchtigten Dokh’Toa Ivl’Zpaasa – angegriffen. Tyx kann zwar
gerade noch entfliehen, steht aber nun vor einem neuen Problem: Sein Bordcomputer
wurde schwer beschädigt und fast alle Speicherbänke wurden zerstört. Ohne dessen Re-
chenkapazität kann Tyx aber unmöglich die quantenstatischen absolutitätstheoretischen
Berechnungen ausführen, die für einen Hyperraumsprung notwendig sind. Können Sie
Tyx helfen?
Unser Ziel ist es, mit einem GOTO-Programm, das nur auf die Variablen x0 und x1
zugreifen darf, ein beliebiges Programm zu simulieren. Wir definieren also die Tyx-GOTO -
Programme als die GOTO-Programme, die nur die Variablen x0 und x1 verwenden.
(a) Beschreiben Sie, wie Sie Zahlen y1 , ..., yk ∈ N über eine einzelne Zahl x darstellen
können. Geben Sie also eine berechenbare, injektive Funktion f : Nk → N an, und
beschreiben sie, wie sich f (y1 , ..., yk ) verändert, wenn sie einzelne Komponenten
von (y1 , ..., yk ) inkrementieren oder dekrementieren.
(b) Implementieren Sie nun ein Tyx-GOTO Makro für yi := yi + n, mit i ∈ {1, ..., k} und
n ∈ Z. Wenn vorher x0 = 0 und x1 = f (y1 , ..., yk ) gilt (für y1 , ..., yk ∈ N), soll nach
der Ausführung x0 = 0 und x1 = f (y1 , ..., yi−1 , max{yi + n, 0}, yi+1 , ..., yk ) gelten.
(c) Zeigen Sie, dass das allgemeine Halteproblem für Tyx-GOTO Programme unent-
scheidbar ist, also die Sprache
Lösungsskizze. (a) Seien p1 , ..., pk die ersten k Primzahlen. Dann definieren wir f als
Es ist klar, dass f berechenbar ist. Da die Primfaktorzerlegung einer Zahl eindeutig ist,
ist f injektiv. Wenn wir yi inkrementieren (bzw. dekrementieren) müssen wir f mit pi
multiplizieren (bzw. durch pi teilen).
(b) Vorab implementieren wir ein Makro für xi := 0:
Wir implementieren das Makro für die Spezialfälle n = ±1, die übrigen Fälle erhält
man, indem man wiederholt inkrementiert bzw. dekrementiert. Für n = 1 müssen wir
x1 einfach mit der Konstanten pi multiplizieren.
loop : x1 := x1 − 1
if x1 = 0 goto end
x0 := x0 + pi
goto loop
end : x1 := x0
x0 := 0
Für n = −1 ist das Vorgehen etwas komplizierter. Hier müssen wir überprüfen, ob x1
durch pi teilbar ist. Falls dies nicht der Fall ist, gehen wir zu fail und machen so die
vorherigen Veränderungen rückgängig.
(c) Wir wollen zunächst ein Makro iszero(yi ) implementieren. Wenn vorher x0 = 0 und
x1 = f (y1 , ..., yk ) gilt (für y1 , ..., yk ∈ N), soll nach der Ausführung x0 auf 1 gesetzt
werden, falls yi = 0, sonst auf 0. Dafür müssen wir nur unser Programm für n = −1 aus
(b) leicht anpassen:
• Das Übungsblatt ist in zwei Teile gegliedert: den Vorbereitungsteil, den Sie vor der
Übung selbstständig bearbeiten sollen, und den Übungs-/Nachbereitungsteil, der
Aufgaben enthält, die in der Übung besprochen werden und von Ihnen anschließend
zur Nachbereitung verwendet werden können.
• Das ist nicht das Hausaufgabenblatt! Die Hausaufgaben finden Sie auf einem se-
paraten Blatt.
ist unentscheidbar.
Lösungsskizze. Für diese Aufgabe gibt es eine Videolösung: Link
Wir reduzieren das Halteproblem auf leerem Band H0 auf HN EQ . Dabei gilt zu beach-
ten, dass die Reduktion total, berechenbar und korrekt sein muss.
Reduktion von H0 : Sei w⊥ die Kodierung einer Turing-Maschine, die auf keiner Eingabe
hält. Sei w ∈ {0, 1}∗ beliebig. Wir berechnen zunächst die Kodierung w0 einer Turing-
Maschine, die bei jeder Eingabe das Band löscht und dann Mw [] ausführt. Anschließend
1
Falls der Link nicht mehr funktioniert, teilen Sie dies bitte der Übungsleitung mit. Die Teilnehmeran-
zahl ist leider auf 2000 begrenzt.
geben wir w0 #w⊥ zurück.
Die Reduktion ist total: Für jede Eingabe w wird die Ausgabe w0 #w⊥ erzeugt.
Die Reduktion ist berechenbar: Die En- und Dekodierungsfunktionen für Turing-Maschinen
sind berechenbar. Außerdem kann eine TM alle Zeichen auf dem Band, die nicht dem
Leerzeichen entsprechen, durch geeignete Übergänge anfangs überschreiben.
Die Reduktion ist korrekt:
w ∈ H0 ⇐⇒ Mw []↓ (Def. H0 )
∗
⇐⇒ ∀x ∈ Σ . Mw0 [x]↓ (Mw0 führt immer Mw [] aus)
∗
⇐⇒ ∀x ∈ Σ . Mw0 [x]↓ und ¬Mw⊥ [x]↓ (Mw⊥ hält nie)
0
⇐⇒ w #w⊥ ∈ HN EQ (Def. HN EQ )
2
Eine Sprache L ist co-semi-entscheidbar, wenn es eine TM gibt, die 0 ausgibt wenn die Eingabe nicht
in L ist und nicht terminiert wenn die Eingabe in L ist.
3
Problem ist nulli-entscheidbar, wenn es nicht semi-entscheidbar ist und nicht co-semientscheidbar
Problem ist.
Wenn
terminiert
x 6∈ A terminiert
nicht
Wenn (0)
(⊥)
x∈A
Beispiele: Beispiele:
terminiert
(1)
terminiert
nicht
(⊥)
Beispiele: Beispiele:
terminiert semi-entscheidbar
entscheidbar
(1) rekursiv-aufzählbar
r
i d ba
e
terminiert
co-semi- t sch
nicht en „nulli-entscheidbar“
(⊥)
entscheidbar un
(c) Behauptung: A ≤ H0
Reduktion: f bildet jedes Element x ∈ Σ∗ auf die Kodierung einer TM Mx ab, die
wie folgt definiert ist: Die TM Mx löscht die Eingabe und schreibt x aufs Band,
bestimmt dann die Länge von x, zieht 3 ab und prüft anschließend, ob das Ergebnis
durch 5 teilbar ist. Dementsprechend gibt die Maschine „Ja“(1) oder „Nein“(0) aus.
(d) Behauptung: H0 ≤ H0
Reduktion: f bildet jedes w ∈ {0, 1}∗ auf die Kodierung f (w) einer TM Mf (w)
ab, die Mw [] simuliert. Falls Mw [] hält, geht Mf (w) in eine Endlosschleife. Falls
Mw [] nicht hält, hält Mf (w) .
(e) Behauptung: HΣ∗ ≤ H0 mit HΣ∗ := {w ∈ {0, 1}∗ | ∀x ∈ Σ∗ . Mw [x]↓}.
Reduktion: f bildet jedes w ∈ {0, 1}∗ auf die Kodierung f (w) einer TM Mf (w) ab,
die erst die Eingabe löscht, dann nichtdeterministisch x ∈ Σ∗ erzeugt und dann
Mw [x] simuliert.
Lösungsskizze.
(a) f ist undefiniert auf {0, 1}∗ \ H0 6= ∅ und somit nicht total.
(b) f ist unberechenbar, da H0 unentscheidbar ist und somit χH0 unberechenbar ist.
(c) f bildet auf Kodierungen von Turing-Maschinen ab, die immer terminieren. Da
a 6∈ A, aber f (a) ∈ H0 , erfüllt die Funktion f nicht die Definition einer Reduktion.
Außerdem ist die Notation Mx ungünstig, da wir einen Index einer TM in der
Regel verwenden, um anzuzeigen, dass Mw die TM ist, die von w encodiert wird.
In dieser Reduktion hat Mx aber eine andere Bedeutung.
(d) f ist nicht wohldefiniert. Wenn Mf (w) die Berechnung von Mw [] simuliert und
Mw [] nicht hält, dann hält definitiv Mf (w) auch nicht.
(e) Sei w die Kodierung einer TM mit Mw []↓ und Mw [0]↑. Dann gilt w 6∈ HΣ∗ und
f (w) ∈ H0 .
Prof. Javier Esparza Technische Universität München
Philipp Czerner, Martin Helfrich Lehrstuhl für Theoretische Informatik
Einführung in die Theoretische Informatik
Sommersemester 2021 – Hausaufgabenblatt 11
• Sei Φ := {{1}, {2}, {3, 4}}. Nach dem Abgabedatum werden wir für jede Menge
A ∈ Φ eine zufällige Aufgabe a ∈ A wählen und korrigieren.
• Wenn Sie einen Beweis aufstellen, von dem Sie wissen, das einzelne Schritte proble-
matisch oder unvollständig sind, merken Sie dies bitte in Ihrer Lösung an, damit
wir das bei der Korrektur positiv berücksichtigen können.
• 0 ∈ N, TMs sind deterministisch
(b) Unsere Reduktion konstruiert G01 entsprechend dem Hinweis, also gilt L(G01 ) =
L(G1 ){$}L(G2 )R . Dies ist möglich, da wir CFGs sowohl konkatenieren als auch umdre-
hen können. Die Sprache L := {w$wR : w ∈ Σ∗ } ist deterministisch kontextfrei (siehe
Beispiel 4.61), also ist auch ihr Komplement kontextfrei (Satz 4.66). Wir wählen also ein
G02 mit L(G02 ) = L.
Es gilt
und
S → aSa | bSb | aT b | bT a | CP | QC
T → CT C | $
P → CP | CP C | $
Q → QC | CQC | $
C→a|b
Aufgabe H11.4. (No one can be told what The Matrix is.) 1+1+3 Punkte
Doras Urgroßonkel, der ehemalige Rektor der TH Estlingen-Oberfeld, hat Geburtstag,
und die ganze Familie ist eingeladen. Nach altem Estlinger Brauch gibt es statt Kerzen
auf einer Geburtstagstorte einen Vektor mit dem Alter (er ist (100)7 geworden), und statt
zu pusten wird dieser Vektor so lange mit Matrizen multipliziert, bis er verschwunden
ist. (Die Matrizen werden von den Gästen mitgebracht.) Leider hat Doras Urgroßonkel es
dieses Jahr nicht geschafft, seinen Altersvektor wegzumultiplizieren, obwohl er sich viel
Mühe gegeben hat. Dora möchte ihn nun trösten, und ihm beweisen, dass das Problem
nicht immer gelöst werden kann.
Wir untersuchen nun das Vektorvernichtungsproblem (VVP):
Eingabe: Matrizen M1 , ..., Mk ∈ Z3×3 , Vektor v ∈ Z3
Ausgabe: Existieren A1 , ..., Al ∈ {M1 , ..., Mk } mit A1 A2 · · · Al v = 0 ?
Unser Ziel ist, zu zeigen, dass das VVP unentscheidbar ist.
(a) Sei M := 0 v −v , mit v ∈ Z3 , und M1 , ..., Mk ∈ Z3×3 , wobei M1 , ..., Mk
invertierbar sind. Zeigen Sie, dass das VVP für M, M1 , ..., Mk ; v genau dann eine
Lösung hat, wenn es A1 , ..., Al ∈ {M1 , ..., Mk } gibt, sodass M A1 A2 · · · Al v = 0.
Wir verwenden wieder Zahlen, um Wörter darzustellen. Sei also Σ := {0, 1} und
f : Σ∗ → N definiert als f (ε) := 0 und f (wc) := 3f (w) + c + 1 für w ∈ Σ∗ , c ∈ Σ.
Insbesondere gilt somit f (u) = f (v) ⇔ u = v für alle u, v ∈ Σ∗ .
(b) Seien x, y ∈ Σ∗ beliebig. Konstruieren Sie eine Matrix Mx,y ∈ Z3×3 mit
1 1
Mx,y f (u) = f (ux) für alle u, v ∈ Σ∗ .
f (v) f (vy)
(c) Zeigen Sie nun, dass das VVP unentscheidbar ist, indem sie 01-MPCP reduzieren.1
Erinnerung: Sei M ∈ R3×3 . Folgende Aussagen sind äquivalent:
(1) M ist invertierbar
(2) det(M ) 6= 0
(3) M x 6= 0 für alle x ∈ R3 \ {0}
Lösungsskizze. (a) Wir zeigen beide Richtungen, wobei „⇐“ allerdings trivial ist. Für
„⇒“ sei nun B0 , ..., Bl ∈ {M, M1 , ..., Mk } eine Lösung des VVP für M, M1 , ..., Mk ; v. Wir
wählen eine kürzeste Lösung, also eine mit minimalem l. Es gibt nun folgende Fälle.
• B0 ∈ {M1 , ..., Mk }: Sei x := B1 · · · Bl v. Wenn x = 0 wäre l nicht minimal, also gilt
x 6= 0. Da B0 invertierbar ist, muss aber B0 x 6= 0 gelten, ein Widerspruch dazu,
das B0 , ..., Bl eine Lösung des VVP ist. Dieser Fall kann also gar nicht auftreten.
• ∃i > 0 : Bi = M : Sei x := Bi · · · Bl v. Es muss wieder x 6= 0 gelten, da sonst
Bi , ..., Bl eine kürzere Lösung wäre. Da Bi = M , muss aber x = αv gelten, für
ein α ∈ R, α 6= 0. Dies folgt aus der Beobachtung, dass für jeden Vektor y =
(y1 , y2 , y3 )> ∈ R3 gilt, dass M y = v(y2 − y3 ). Es gilt:
B0 · · · Bl v = 0 ⇒ B0 · · · Bi−1 x = 0 ⇒ B0 · · · Bi−1 ( α1 x) = 0
Aber α1 x = v, also wäre B0 , ..., Bi−1 eine kürzere Lösung und dieser Fall kann
ebenfalls nicht eintreten.
• B0 = M und B1 , ..., Bl ∈ {M1 , ..., Mk }: Dies ist genau die Aussage, die wir zeigen
wollen, und wir sind fertig.
(b) Nach Definition von f folgt f (ux) = f (u) · 3|x| + f (x), da f Zeichen an die Basis-3
Darstellung der Zahl anhängt. Um sicher zu gehen, zeigen wir diese Aussage kurz per
Induktion über n := |x|.
Die Basis x = ε ist klar. Für den Induktionsschritt fixieren wir ein n und nehmen
f (ux) = f (u) · 3|x| + f (x) für alle u, x ∈ Σ∗ mit |x| = n an. Für beliebige u, x ∈ Σ∗ mit
x = rc für ein r ∈ Σ∗ und c ∈ Σ gilt nun
f IA
f (ux) = f (urc) = 3f (ur) + c + 1 = 3(f (u) · 3|r| + f (r)) + c + 1
f
= f (u) · 3|r|+1 + 3f (r) + c + 1 = f (u) · 3|rc| + f (rc) = f (u) · 3|x| + f (x)
1
Wir haben zwar nicht explizit in der Vorlesung gezeigt, dass 01-MPCP unentscheidbar ist, aber der
Beweis von Korollar 5.59 funktioniert unverändert.
Unsere Matrix ist nun folgende:
1 0 0
Mx,y := f (x) 3
|x| 0
f (y) 0 3|y|
(c) Wir reduzieren von 01-MPCP und erhalten somit Wörter x1 , ..., xk , y1 , ..., yk ∈ {0, 1}∗
als Eingabe. Unsere Reduktion konstruiert die Instanz M, M1 , ..., Mk ; v des VVPs, mit
Mi := Mxk ,yk (wie in (b) definiert) und v := (1, f (x1 ), f (y1 ))> . Nun zeigen wir, dass die
Reduktion korrekt ist, also „MPCP lösbar“ ⇔ „VVP lösbar“.
„⇒“: Sei i1 , ..., in ∈ {1, ..., k} eine Lösung des MPCP, es gilt somit i1 = 1. Wir behaupten
nun, dass M, Min , ..., Mi2 eine Lösung des VVPs ist. Es gilt
M M i 2 Mi 3 · · · Mi n v
1 1
(b)
= M Min · · · Mi3 Mi2 f (xi1 ) = M Min · · · Mi3 f (xi1 xi2 )
f (yi1 ) f (yi1 yi2 )
1 0
(∗)
= ... = M f (xi1 ...xin ) = f (xi1 ...xin ) − f (yi1 ...yin ) v = 0
f (yi1 ...yin ) 0
Für (∗) verwenden wir, dass i1 , ..., in ∈ {1, ..., k} eine Lösung des MPCPs ist und
somit xi1 ...xin = yi1 ...yin gilt.
„⇐“: Da det(Mx,y ) = 3|x|+|y| 6= 0 für x, y ∈ Σ∗ , können wir die Aussage der (a) anwen-
den, und es existiert eine Lösung der Form M, Min , ..., Mi2 mit i2 , ..., in ∈ {1, ..., k}.
Wie wir für den anderen Fall bereits argumentiert haben, gilt
f (xi1 ...xin ) − f (yi1 ...yin )
M M i n · · · Mi 2 v = 0
0
wobei wir i1 := 1 setzen. Da M, Min , ..., Mi2 eine Lösung des VVPs ist, muss die
linke Seite 0 sein. Somit folgt direkt f (xi1 ...xin ) = f (yi1 ...yin ) und schließlich, wie
nach der Definition von f angemerkt, xi1 ...xin = yi1 ...yin . Folglich ist i1 , ..., in eine
Lösung des MPCP, mit i1 = 1.
Prof. Javier Esparza Technische Universität München
Philipp Czerner, Martin Helfrich Lehrstuhl für Theoretische Informatik
• Das Übungsblatt ist in zwei Teile gegliedert: den Vorbereitungsteil, den Sie vor der
Übung selbstständig bearbeiten sollen, und den Übungs-/Nachbereitungsteil, der
Aufgaben enthält, die in der Übung besprochen werden und von Ihnen anschließend
zur Nachbereitung verwendet werden können.
• Das ist nicht das Hausaufgabenblatt! Die Hausaufgaben finden Sie auf einem se-
paraten Blatt.
TSP:
• Eingabe: n × n Matrix M mit Mi,j ∈ N und eine Zahl k ∈ N.
• Frage: Gibt es eine “Rundreise” der Länge ≤ k.
1
Wir lernen viele dieser Probleme erst in den kommenden Vorlesungen kennen. Sie müssen nicht schon
zum jetzigen Zeitpunkt alle Probleme kennen / verstehen.
Eine Rundreise ist eine Permutation π von [1; n], also ein einfacher Kreis, der jede Insel
einmal enthält. Die Länge der Rundreise ist die Summe der Kosten der einzelnen Reisen,
also Σni=1 Mπi ,πj (dabei ist πi der i-te Eintrag der Permutation, beginnend bei 0, und πj
ist der Eintrag für die nächste Insel, also j = (i + 1)%n).
Lösungsskizze. (Diese Lösung ist sehr ausführlich und wird teilweise auch auf Folie 350
behandelt.) Um zu zeigen, dass TSP NP-vollständig ist, müssen wir zeigen, dass TSP
∈ NP und dass TSP NP-schwer ist.
• ∈ NP: Wir können eine korrekte Rundreise raten, und dann in polynomieller Zeit
verifizieren, dass sie eine Länge ≤ k hat, indem wir einmal den Pfad entlang gehen
und die Kosten ausrechnen. Das entspricht |π| = n Zugriffen auf die Matrix, geht
also in linearer Zeit.
• NP-schwer: Durch Reduktion HAMILTON ≤p TSP. Gegeben das Encoding eines
Graphen G = (V, E) konstruieren wir eine Matrix wie folgt: Wir nummerieren die
Knoten in G von 1 bis n durch. Dann ist
(
1 falls {vi , vj } ∈ E
Mi,j :=
2 sonst
Also sind die Kosten, von i nach j zu kommen 1, wenn eine Kante in G existiert, und
2, wenn nicht. Dann ist (M, n) eine Instanz des TSP und es gilt G ∈ HAMILTON ⇔
f (G) = (M, n) ∈ TSP. (noch zu beweisen)
Gegeben etwas, das keinen Graphen encodiert, geben wir etwas zurück, das nicht
∈ TSP ist, also z.B. etwas, das kein Tupel (M, k) encodiert oder eine Matrix mit
positiven Kosten und k = 0.
Außerdem noch ein Randfall: Gegeben einen Graphen, der weniger als 3 Knoten
hat, geben wir etwas zurück, das nicht ∈ TSP ist, weil ein Graph mit weniger als
3 Knoten niemals einen Hamilton-Kreis enthalten kann; unsere Reduktion könnte
aber eventuell ein Element aus TSP zurück geben. Beispiel: G = ({1, 2}, {{1, 2}}).
Korrektheit:
– Wenn G ∈ HAMILTON, dann gibt es einen Kreis, der nur Kanten von G
verwendet und alle Knoten genau einmal besucht. Folglich gibt es auch eine
Rundreise mit Kosten n in M .
– Wenn G ∈ / HAMILTON, dann gibt es keinen Kreis, der nur Kanten von G ver-
wendet und alle Knoten genau einmal besucht. Folglich gibt es keine Rund-
reise mit Kosten ≤ n in M , da mindestens einmal eine Kante mit Kosten 2
verwendet werden muss.
– Gegeben etwas, das keinen Graph encodiert, also nicht in HAMILTON ist,
geben wir etwas zurück, das nicht in TSP ist.
Berechenbarkeit in polynomieller Zeit:
Die Reduktion definiert eine n × n Matrix, wobei n die Anzahl der Knoten von G
ist. Folglich braucht sie quadratische Zeit in der Anzahl der Knoten.
Übung und Nachbereitung
• Eingabe: Eine Formel F in KNF, bei der jede Variable höchstens dreimal
auftritt.
• Frage: Ist F erfüllbar?
ITE-SAT:
• Eingabe: Eine ITE-Formel F .
• Frage: Ist F erfüllbar?
Lösungsskizze.
• NP-schwer: Sei F eine Formel in 3-KNF. Somit F = ni=1 Ki und Ki =
V
(a)
Wm
j=1 Lij mit m ≤ 3. O.b.d.A. kommen keine Variablen doppelt in einer
Klausel vor. Sei v die Anzahl der in F verwendeten Variablen. Dann er-
setzten wir in jeder Klausel die Variablen mit für diese Klausel spezifische
Variablen und fügen eine Bedingung ein, die erzwingt, dass alle Kopien ei-
ner Variable in der Eingabe den gleichen Wert zugewiesen bekommen. Die-
se Bedingung hat eine Ringstruktur, um Variablenverwendungen zu sparen:
(xk,1 → xk,2 ) ∧ (xk,2 → xk,3 ) ∧ ...(xk,n → xk,1 ).
n
^ v ^
^ n
f (F ) = f (Ki ) ∧ (¬xk,i ∨ xk,(i mod n)+1 )
i=1 k=1 i=1
m
_
f (Ki ) = f (Lij )
j=1
(
xk,i falls Lij = xk
f (Lij ) =
¬xk,i falls Lij = ¬xk
Eine Klausel mit drei Literalen, z.B. ¬x ∨ ¬y ∨ ¬z lässt sich damit umformen
zu
¬x ∨ ¬y ∨ ¬z ≡ ITE(
ITE(x, false, true),
true,
ITE(
ITE(y, false, true),
true,
ITE(z, false, true)
)
)
Jede Klausel wird in eine ITE-Formel übersetzt, welche nur um einen kon-
stanten Faktor größer ist. Entsprechend übersetzt sich jede 3KNF-Formel in
eine semantisch äquivalente ITE-Formel, die nur um einen konstanten Faktor
größer ist. Die Korrektheit folgt aus der Verwendung semantisch-äquivalenten
Umformungen.
• ∈ NP: Eine erfüllende Belegung ist ein geeignetes Zertifikat, das es maximal
genauso groß ist wie die Formel F und in polynomieller Zeit geprüft werden
kann.
b1 ≤ a1,1 y1 + . . . + a1,n yn
b2 ≤ a2,1 y1 + . . . + a2,n yn
..
.
bm ≤ am,1 y1 + . . . + am,n yn
Für das ZOLP wählen wir m = k + 2z und n = 2z. Die Zeile i ∈ [1, k] ist dann
definiert in Abhängigkeit von Ci als
f (Li,1 ∨ Li,2 ∨ Li,3 ) 7→ 1 ≤ f (Li,1 ) + f (Li,2 ) + f (Li,3 )
Zusätzlich fügen wir folgende Konsistenzgleichungen ein, damit y2i und y2i − 1
unterschiedliche Werte erhalten für alle i ∈ [1, z]
1 ≤ y2i + y2i−1
−1 ≤ −y2i − y2i−1
Die Reduktion ist polynomiell in der Eingabegröße, da für jede Klausel eine Un-
gleichung und für jede Variable 2 Ungleichungen erstellt werden.
Anwendung auf Beispiel (¬x1 ∨ x2 ∨ x3 ) ∧ (x1 ∨ ¬x3 ∨ x4 ):
1 ≤ y1 + y4 + y6
1 ≤ y2 + y3 + y8
1 ≤ y1 + y2
−1 ≤ −y1 − y2
1 ≤ y3 + y4
−1 ≤ −y3 − y4
1 ≤ y5 + y6
−1 ≤ −y5 − y6
1 ≤ y7 + y8
−1 ≤ −y7 − y8
Unsere Reduktion negiert also einfach die Formel, was offensichtlich in polynomieller
Zeit geht.
(b) Wenn L1 ≤p L2 , dann gibt es eine polynomiell berechenbare Funktion f , die L1 auf
L2 reduziert. Wir können die gleiche Funktion verwenden, um L1 auf L2 zu reduzieren:
w ∈ L1 ⇔ w ∈
/ L1 ⇔ f (w) ∈
/ L2 ⇔ f (w) ∈ L2
Damit haben wir L1 ≤p L2 ⇒ L1 ≤p L2 gezeigt. Indem wir diese Aussage auf die rechte
Seite anwenden, erhalten wir
L1 ≤p L2 ⇒ L1 ≤p L2 ⇔ L1 ≤p L2
(c) Sei f die Reduktionsfunktion für L1 ≤p L2 , und g die für L2 ≤p L3 . Dann wählen
wir h := g ◦ f (also g angewendet auf f ). Dies ist offensichtlich in polynomieller Zeit
berechenbar, und es gilt
w ∈ L1 ⇔ f (w) ∈ L2 ⇔ g(f (w)) ∈ L3 ⇔ h(w) ∈ L3
(d) Sei L ∈ coNP beliebig. Es gilt also L ∈ NP. Wir wissen, dass SAT NP-vollständig ist,
somit insbesondere NP-hart, woraus L ≤p SAT folgt. Durch Anwenden der (b) erhalten
wir L ≤p SAT, und aus der (a) und der (c) folgt nun L ≤p TAUTOLOGY .
Aufgabe H12.2. (NP = Number Pyramids?) 2+1 Punkte
Der kleine Theo macht gerade seine Hausaufgaben (auch wenn eigentlich viel lieber den
Pfützen beim Austrocknen zuschauen würde). Heute kamen Zahlenpyramiden dran:
500
45 100
17 90
6 7 50 10
Jedes Feld ist die Summe der beiden darunterliegenden Felder, und alle Felder sind mit
ganzen Zahlen gefüllt (nur Pluszahlen). Formal ist das Problem PYRAMID wie folgt:
Eingabe: w1 $...$wk , mit wi ∈ {} ∪ bin(N) und k = 1 + ... + n für ein n ∈ N
Ausgabe: Existiert eine Zahlenpyramide, deren i-tes Feld wi enthält, für wi 6= ?
Hierfür nummerieren wir die Felder durch, von oben nach unten und links nach rechts.
(a) Konstruieren Sie eine Zertifikatssprache für PYRAMID (nach Def. 6.7), sodass das
Zertifikat für w ∈ PYRAMID höchstens Länge p(|w|) hat, für ein Polynom p. Sie
dürfen annehmen, dass jede lösbare Pyramide mit k Feldern eine Lösung hat, in
der alle Zahlen höchstens D · 2k sind, wobei D die größte vorgegebene Zahl ist.
Achtung: Eine Begründung, wieso die Zertifikate die vorgegebene Länge haben,
ist erforderlich.
(b) Zeigen Sie, dass ein polynomiell beschränkter Verifikator für PYRAMID (bezüglich
ihrer Zertifikate aus (a)) existiert, und somit PYRAMID ∈ NP.
Anmerkung: Können Sie die gezeigten Pyramiden (von Hand) lösen? Es gibt jeweils
eine eindeutige Lösung. Für den geneigten Leser haben wir auch noch weitere Instanzen.
Lösungsskizze. (a) Sei w ∈ PYRAMID beliebig, mit w = w1 $...$wk . Es gibt also eine
Lösung der (partiellen) Zahlenpyramide w, und damit eine, deren größter Eintrag D · 2k
ist, wobei D = max{(wi )2 : i ∈ {1, ..., k}}.
Unser Zertifikat enthält einfach die Binärdarstellungen der Zahlen, die in den Feldern
der vollständig ausgefüllten Pyramide stehen. Wir wählen also c := c1 $...$ck mit ci :=
bin(xi ), wobei xi ∈ N die Zahl ist, die in Feld i steht.
Wir wissen, dass |w| ≥ k und |w| ≥ log2 D gelten (letzteres, da die Binärdarstellung
einer Zahl x ∈ N>0 genau dlog2 (x + 1)e Stellen hat). Somit folgt
für x1 > 0. Im Fall x1 = 0 gilt stattdessen |c| = 2k − 1 ≤ 2|w| − 1 ≤ |w|(3 + 2|w|). Für
beide Fälle finden wir also ein polynomielle Schranke für |c| in Abhängigkeit von |w|.
(b) Gegeben drei Binärwörter u, v, w ∈ {0, 1}∗ lässt sich in polynomieller Zeit über-
prüfen, ob (u)2 + (v)2 = (w)2 . Gegeben eine Eingabe w#c mit w = w1 $...$wk und
c = c1 $...$ck , müssen wir also überprüfen, dass
• wi = ci für alle wi 6= , und
• (ci )2 + (cj )2 = (cl )2 für alle Felder l, die über Feldern i, j liegen.
Beides lässt sich in polynomieller Zeit überprüfen, und muss jeweils höchstens k-mal
ausgeführt werden. Da |w| ≥ k, erhalten wir insgesamt einen polynomiell beschränkter
Verifikator.
Aufgabe H12.3. (Laser-focused) 1+1+1+1+1 Punkte
Nachdem er sich einige Wochen lange verdeckt gehalten hatte, hatten die meisten den
berüchtigten Superschurken Dr. Evilsparza schon vergessen. Nun ist er aber wieder aufge-
taucht, mit einem diabolischen Plan, die Weltherrschaft an sich zu reißen! Er hat eine Rei-
he von Superlasern aufgestellt, mit denen er direkt auf den THEO-Hausaufgabenserver
zielt. Ohne Musterlösungen werden sicher alle Teilnehmer durchfallen, sodass es keine
neuen Informatikabsolventen gibt, und alle auf das IT-Consultingunternehmen „Evillest
Evilness Software Inc“ angewiesen sind. Zum Glück hat der Lehrstuhl für KI (Klausu-
rintegrität) einen Plan.
Spezielle, mit Spiegeln ausgestattete Drohnen können losgeschickt werden, um die
Superlaser zu ihrer Quelle zurückzuschicken und so zu zerstören. Auf einer Karte sind
bereits die Schusslinien der Laser eingezeichnet, die möglichen Flugbahnen der Drohnen,
die Punkte, an denen eine Drohne den Laserstrahl kreuzen würde, und die Punkte, an
denen sich die Flugbahn zweier Drohnen kreuzen würde. Letzteres würde zum Absturz
beider Drohnen führen und muss unbedingt vermieden werden.
Ihre Aufgabe ist es nun, herauszufinden welche Drohnen gestartet werden müssen,
sodass sich keine zwei Drohnen kreuzen und alle Laser zerstört werden.
(1) (2) (3)
Anschaulich gesprochen fordern wir also für jeden Laser, der von Drohnen d1 , ..., dk
geschnitten wird, dass xd1 ∨...∨xdk (jeder Laser muss zerstört werden), und für jedes Paar
Drohnen (d, b), deren Flugbahnen sich überschneiden, dass ¬xd ∨¬xb (keine zwei Drohnen
kreuzen sich). Aus der Konstruktion ist bereits offensichtlich, dass die Reduktion korrekt
ist.
(b) Unsere Konstruktion sieht folgendermaßen aus:
x x
Formal verwenden wir also zwei Drohnen D := {x, x} und einen Laser L := {l}. Die
Schnittpunkte sind S := {(x, x), (l, x), (l, x)}.
(c) Wir fügen eine Kopie von Iv für jede Variable v ∈ {x, y, z} ein. Für dir Klausel
erstellen wir dann einen Laser, und Schnittpunkte mit genau den Literalen aus der
Klausel. Für das Beispiel x ∨ ¬y ∨ z erhalten wir folgendes.
x x y y z z
(d) Hier müssen wir lediglich ein Gadget Iv für jede Variable erstellen, und dann für
jede Klausel einen Laser wie in (c) einfügen. Dies lässt sich offensichtlich in polynomieller
Zeit machen. Wir zeigen nun „KRP lösbar ⇔ 3KNF-SAT lösbar“:
„⇒“ Sei M die Lösung des KRP. Für jede Variable v ist nach Konstruktion von Iv
entweder v ∈ M oder v ∈ M . Wir wählen nun eine entsprechende Belegung der
3KNF-SAT Instanz. Unter dieser Belegung muss nun jede Klausel erfüllt sein, da
wir für jede Klausel einen entsprechenden Laser erstellt haben.
„⇐“ Sei σ eine erfüllende Belegung der 3KNF-SAT Formel. Wir wählen nun M := {v :
σ(v) = 1} ∪ {v : σ(v) = 0}. Da für jede Variable v die Drohnen v und v nicht
gleichzeitig fliegen, kollidieren keine Drohnen. Jeder Laser in Iv wird zerstört, da
v oder v immer fliegt, und die Laser für die Klauseln werden auch zerstört, da σ
erfüllend ist.
(e) Die Instanz sieht folgendermaßen aus:
x x y y z z
Für einen Laser l ∈ L gilt nun, dass es höchstens 2|V |−2 Möglichkeiten gibt, f so zu
wählen, dass l nicht gestoppt wird: Für l gibt es mindestens zwei Drohnen d, b. Falls
d, b kollidieren würden, fliegt immer mindestens eine davon und l würde immer gestoppt
werden. Ansonsten muss f sowohl für d als auch für b jeweils den Partner wählen.
Insbesondere gibt es also immer 2|V | − 2|V |−2 = 34 · 2|V | Möglichkeiten, f zu wählen,
sodass l gestoppt wird. Nun gilt
1 X X 1 X X 1 X 3 |V | 3
σ= r(f, l) = r(f, l) ≥ · 2 = · |L|
2|V | f :V →{0,1} l∈L
2|V | l∈L f :V →{0,1}
2|V | l∈L 4 4
Im Durchschnitt über alle f werden also 34 der Laser gestoppt, und, da das Maximum
immer höher als der Durchschnitt ist, gibt es somit ein f , dass mindestens 34 der Laser
stoppt.
(b) Wir können das Verfahren aus der (a) erweitern. Zunächst vereinfachen wir die
Instanz wie in (a), danach entfernen wir zusätzlich jeden Laser, der von zwei Drohnen,
die kollidieren, gestoppt werden kann. (Diese Laser werden immer gestoppt.) Nun wissen
wir, dass es für jeden Laser l, der von k Drohnen gestoppt werden kann, genau 2|V |−k
mögliche Wahlen von f gibt, sodass l gestoppt wird. (Die k Drohnen dürfen jeweils nicht
fliegen, und die anderen |V | − k sind beliebig.) Sei also N (l) := |{{l}×D ∩ S}| die Anzahl
der Drohnen, die Laser l stoppen könnten. Nun gilt
(a) 1 X 1 X
2|V |−N (l) = 2−N (l)
X X
σ = r(f, l) =
2|V | l∈L f :V →{0,1}
2|V | l∈L l∈L
Wir können den Durchschnitt also in polynomieller Zeit ausrechnen. Nun wählen wir ein
beliebiges Paar (d, b) ∈ V und betrachten die beiden Instanzen, die wir erhalten, wenn
wir p (bzw. b) aktivieren und b (bzw. p) löschen. Für diese beiden Instanzen berechnen
wir die Durchschnitte σ1 , σ2 . (Dazu müssen wir die sicher gestoppten Laser zunächst
entfernen, und danach wieder aufaddieren.) Es gilt σ = (σ1 + σ2 )/2, also gibt es ein
i ∈ {1, 2} mit σi ≥ σ. Wir wählen nun dieses i und arbeiten rekursiv auf dieser Instanz
weiter. Da die durchschnittliche Anzahl an gestoppten Lasern nie sinkt, finden wir also
nach |V | Schritten eine Instanz, in der 34 der Laser gestoppt wurden.
Greedy Algorithmen, die immer die Drohne wählen, die die meisten Laser stoppt, funk-
tionieren nicht. Hier ist ein Gegenbeispiel:
Der Greedy Algorithmus würde nur die oberen 8 Laser abdecken. Allerdings ist 8 < 43 ·11,
somit würde er also nicht genügend Laser stoppen.
Eine andere Variante wählt immer die Drohne, die am wenigsten Laser stoppt, und
entfernt diese.
Prof. Javier Esparza Technische Universität München
Philipp Czerner, Martin Helfrich Lehrstuhl für Theoretische Informatik
Einführung in die Theoretische Informatik
Sommersemester 2021 – Übungsblatt 13
• Dieses Übungsblatt besteht aus einer Auswahl von Klausuraufgaben aus vorheri-
gen Jahren und beeinhaltet keinen neuen Stoff aus der Vorlesung. Verwenden Sie
die letzte Übung für allgemeine Fragen zum Vorlesungsstoff in Hinblick auf die
Klausurvorbereitung. (siehe Aufgabe Ü13.1)
• Das Übungsblatt ist in zwei Teile gegliedert: den Vorbereitungsteil, den Sie vor
der Übung selbstständig bearbeiten sollen, und den Übungs-/Nachbereitungsteil,
der Aufgaben enthält, die in der Übung besprochen werden und Aufgaben, die
von Ihnen anschließend zur Nachbereitung verwendet werden können. Insbesondere
werden nicht alle Aufgaben aus dem Übungs-/Nachbereitungsteil in der Übung
besprochen.
• Das ist nicht das Hausaufgabenblatt! Die Hausaufgaben finden Sie auf einem se-
paraten Blatt.
q0 a q1 b q2
(b) DFA B bzw. gleich DFA C aus nächstem Schritt (ist ja offensichtlich):
a
a b
b
q0 a q0 , q1 b q0 , q2 a q0 , q1 , q2
b
(c) DFA C:
a a,b
b
q0 a q0 , q1 b q0 , q2
(d) DFA D:
b a a,b
q0 a q1 b q2
(e) Aufstellen des LSGs und lösen:
Endergebnis: r0 = rq0 = b∗ a∗
ε: |ε|a = 0 = |ε|c .
aSc: Sei |w|a = |w|c . Dann gilt |awc|a = 1 + |w|a = 1 + |w|c = |awc|c .
aSbSv: Sei |w|a = |w|c und |v|a = |v|c . Dann gilt |avbwc|a = 1 + |v|a + |w|a =
1 + |v|c + |w|c = |avbwc|c .
• w ∈ H0 : Mw hält nicht auf dem leeren Band, folglich hält Mw0 auf keinem
Input, da es immer das Band löscht und Mw auf dem leeren Band simuliert.
Damit ist |L(Mw0 )| = 0 ≤ 42 und somit w0 ∈ A.
• w∈ / H0 : Da Mw auf dem leeren Band hält, akzeptiert Mw0 jeden Input, da
es immer Mw auf dem leeren Band simuliert und dann in einen Endzustand
übergeht. Damit ist |L(Mw0 )| = ∞ > 42 und w0 ∈
/ A.
(b) A ist die Menge der Wörter, die eine TM kodieren, die auf mindestens 43 Einga-
ben hält. Semientscheidungsalgorithmus: Simuliere Mw mit Dove-Tailing auf allen
Inputs. (Also: Simuliere für alle Eingaben der Länge ≤1 für 1 Schritt, dann für alle
Eingaben der Länge ≤2 für 2 Schritte, usw.) Sobald 43 der Simulationen halten,
gib 1 aus.
Übungsaufgabe Ü13.9. (polynomielle Reduktion)
Mit SUBSET bezeichnen wir das Problem:
• Gegeben: Ein -NFA N mit n Zuständen über dem Alphabet Σ = {0, 1} und eine
Zahl m ≤ n.
• Frage: Gibt es ein Wort w der Länge m, sodass N dieses Wort nicht akzeptiert?
In Mengenschreibweise:
(a) Zeigen Sie, dass SUBSET NP-vollständig ist. Verwenden Sie hierbei eine geeignete
Reduktion von 3-KNF-SAT auf SUBSET.
(b) Wenden Sie Ihre Reduktion auf (x1 ∨ ¬x3 ∨ x4 ) ∧ (¬x1 ∨ x2 ∨ x3 ) an. Geben Sie
den konstruierten -NFA graphisch an.
Hinweis: Betrachten Sie die Menge aller nichterfüllenden Belegungen für die Formel F ,
die genau m Variablen hat, als Wörter der Länge m.
Lösungsskizze.
(a) • Idee: Der -NFA N erkennt alle nicht erfüllenden Belegungen von F . Hierfür
rät er zunächst die Klausel, welche nicht erfüllt ist und dann die unerfüllende
Belegung.
• Reduktion: Sei F = ki=1 Ci eine Formel in 3-KNF mit m Variablen (x1 , x2 , ...xm )
V
wobei
1 0 0 0, 1
Prof. Javier Esparza Technische Universität München
Philipp Czerner, Martin Helfrich Lehrstuhl für Theoretische Informatik
Einführung in die Theoretische Informatik
Sommersemester 2021 – Hausaufgabenblatt 13
x1
y 2
x2
(c) Konstruieren Sie ein NOT-Gatter, wobei NOT(x1 ) := {¬x1 } für x1 ∈ {0, 1}.
(d) Sei weakNOT(x1 ) := NOT(x1 ) ∪ {0}. Konstruieren Sie ein weakNOT-Gatter.
(e) Konstruieren Sie ein OR-Gatter, mit OR(x1 , x2 ) := {x1 ∨ x2 } für x1 , x2 ∈ {0, 1}.
(f) Beweisen Sie nun SAT ≤p Partial-3-COL.
Hinweis: Wenn Sie ein Objekt konstruieren, und es nicht offensichtlich ist, dass ihre
Konstruktion den geforderten Bedingungen entspricht, begründen Sie dies kurz.
Lösungsskizze. (a) k-COL ≤p Partial-k-COL ist trivial, wir verwenden einfach die partielle
Funktion, die nirgendwo definiert ist und lassen den Graph unverändert.
Für die andere Richtung sei nun G = (V, E) ein Graph und f 0 : V → {0, ..., k−1} eine
partielle Funktion. Wir fügen G eine k-Clique hinzu, mit Knoten v0 , ..., vk−1 . Wir wissen,
dass jede Färbung von G den Knoten v0 , ..., vk−1 unterschiedliche Farben zuweisen muss
(wir ignorieren f 0 zunächst). Bei einer Färbung Farben zu tauschen macht die Färbung
nicht ungültig, wir können also oBdA annehmen, dass vi genau Farbe i bekommt, für
i ∈ {0, ..., k−1}. Damit können wir nun die partielle Färbung realisieren: hier verbinden
wir jeden Knoten u ∈ V , für den f 0 (u) 6= ⊥ gilt, mit den Knoten {vi : i 6= f 0 (u)}. Damit
muss u dann zwangsläufig Farbe f 0 (u) haben.
Die Aufgabenstellung fordert nur eine Beweisskizze der Korrektheit und die bisherigen
Ausführungen genügen dafür. Zwecks Verständlichkeit folgt nun ein ausführlicher Beweis.
Formal definieren wir also G0 := (V 0 , E 0 ) mit V 0 := V ] {v0 , ..., vk−1 } und
Wenn eine Färbung f für G0 existiert, dann existiert auch eine Färbung f ∗ mit f ∗ (vi ) = i
für i ∈ {0, ..., k−1}. (Dies gilt, da wir Farben vertauschen können, ohne die Färbung zu
beeinflussen.) Angenommen, f 0 wäre keine Teilfärbung von f ∗ . Dann gibt es ein u ∈ V
mit ⊥ = 6 f 0 (u) 6= f ∗ (u). Sei nun c := f ∗ (u). Da ⊥ =
6 f 0 (u) und f 0 (u) 6= c, gibt es eine
Kante {u, vc }. Aber f ∗ (vc ) = c = f ∗ (u); dies ist ein Widerspruch dazu, dass f ∗ eine
Färbung ist.
Umgekehrt, wenn f : V → {0, ..., k−1} eine Färbung von G mit Teilfärbung f 0 ist,
können wir f auf V 0 erweitern, indem wir f (vi ) := i definieren, für i ∈ {0, ..., k−1}.
Jede Kante in E hat unterschiedliche Farben, da f eine Färbung ist. Jede Kante in
{v0 , ..., vk−1 } auch, da f (vi ) = i. Und schließlich sind auch die Kanten zwischen einem
u ∈ V und einem vi erfüllt, da diese Kanten nur existieren, wenn f 0 (u) definiert ist;
somit gilt f (u) = f 0 (u) 6= i = f (vi ).
(b) Hierzu verwenden wir die Färbung als Zertifikat. Wir verifizieren die Färbung, indem
wir alle Kanten durchgehen, was polynomielle Zeit benötigt. Die Färbung besteht aus
|V | Zahlen, ist also auch nur polynomiell lang.
(c)
x1 y 2
(d) Hier geben wir zwei mögliche Lösungen an. Zunächst kann man das Gatter folgen-
dermaßen auf direktem Wege bauen:
x1 y
0 2
Wenn x1 = 1, dann muss der nächste Knoten 2 sein, der nächste 1 und y schließlich 0.
Für x1 = 0 können wir den nächsten Knoten als 1 wählen, den folgenden als 2 und y
dann als 0 oder 1. Alternativ lässt es sich auch über das CHOICE-Gatter konstruieren, da
weakNOT(x1 ) = CHOICE(NOT(x1 ), 0), also als
x1
y 2
2 0
(e) Wenn wir nur CHOICE(x1 , x2 ) verwenden, sind wir für die Fälle x1 = x2 bereits
fertig. Für die Fälle x1 6= x2 müssen wir dann allerdings dafür sorgen, dass die Ausgabe
1 und nicht 0 ist. Hierfür können wir zwei weakNot-Gatter verwenden: Für x1 und x2
bauen wir jeweils ein solches Gatter und verbinden dessen Ausgabe mit der Ausgabe
des CHOICE-Gatters. Wenn z.B. x1 = 0, dann kann das weakNot-Gatter einen beliebigen
Wert annehmen und beeinflusst die Ausgabe des CHOICE-Gatters nicht. Wenn allerdings
x1 = 1, dann ist hat das weakNot-Gatter Ausgabe 0, und das CHOICE-Gatter muss somit
Ausgabe 1 haben.
x1
y 2
x2
0
(f) Mit den Gattern für NOT und OR können wir auch ein Gatter für AND bauen, und
damit beliebige Schaltkreise. Wir reduzieren nun von SAT, sei also F eine beliebige
aussagenlogische Formel mit Variablen x1 , ..., xk . Wir definieren uns nun die Funktion
g : {0, 1}k → P({0, 1}), sodass für eine beliebige Belegung σ : {x1 , ..., xk } → {0, 1}
gilt, dass g(σ(x1 ), ..., σ(xk )) := {σ(F )}. Die Funktion g bildet also die Werte der Va-
riablen auf die einelementige Menge, die den Wahrheitswert der Formel beinhaltet, ab.
Nun können wir ein g-Gatter bauen, unter Verwendung der NOT-, OR- und AND-Gatter.
Schließlich müssen wir sicherstellen, dass eine Färbung den Knoten x1 , ..., xk eine erfül-
lende Belegung zuweist. Hierzu erstellen wir einen Knoten, den wir mit Farbe 2 färben,
und verbinden ihn mit jedem xi , für i ∈ {1, ..., k}, damit diese nur noch Farben 0 und 1
erhalten können. Um dafür zu sorgen, dass die Belegung erfüllend ist, weisen wir Knoten
y die Farbe 1 zu.
Aufgabe H13.3. (Vollständig, oder fehlt da was?) 1+1 Punkte
Zeigen Sie, dass das folgende Problem, was wir NTM-SIM nennen, NP-vollständig ist,
indem Sie Definitionen 6.14 und 6.15 direkt verwenden. Sie dürfen also insbesondere
nicht benutzen, dass wir von anderen Problemen (z.B. SAT) bereits gezeigt haben, dass
diese NP-schwierig sind.
Eingabe: v$x$1n für v, x ∈ {0, 1}∗ , n ∈ N
Ausgabe: Akzeptiert die NTM Mv die Eingabe x in höchstens n Schritten?
(a) Zeigen Sie NTM-SIM ∈ NP .
(b) Beweisen Sie, dass NTM-SIM NP-schwierig ist.
Sie dürfen ohne Angabe von Details verwenden, dass eine Turingmaschine M eine
beliebige andere TM Mw simulieren kann, auch wenn sie nur über w verfügt.
Lösungsskizze. (a) Wir können dieses Problem leicht mit einer NTM lösen. Hierfür si-
mulieren wir Mv auf der Eingabe x für n Schritte – wenn Mv akzeptiert, tun wir dies
auch. Da eine Eingabe w = v$x$1n Länge mindestens |w| ≥ n hat, benötigen wir nur
polynomiell viel Zeit hierfür. Somit kann das Problem in Polynomialzeit auf einer NTM
entschieden werden, und ist in NP.
(b) Sei P ∈ NP beliebig, und sei Mv eine NTM, die P in polynomieller Zeit entscheidet.
Insbesondere gibt es also ein Polynom p, sodass Mv jedes x ∈ P in höchstens p(|x|) Schrit-
ten akzeptiert. Unsere Reduktionsfunktion f ist nun definiert als f (x) := v$x$1p(|x|) . Dies
lässt sich offensichtlich in polynomieller Zeit berechnen, und die Länge der Eingabe ist
polynomiell in |x|.
Aufgabe H13.4. (Auf Wiedersehen! Tschüss!) 1+1 Punkte
Theo hat bald die Grundschule erfolgreich abgeschlossen, und wechselt auf eine weiter-
führende Schule. Dora freut sich riesig für ihn, und möchte eine große Abschiedsparty
organisieren. Sie hat auch schon eine lange Liste mit Freunden und Bekannten, die sie
einladen könnte. Leider gibt es ein paar Personen, die sich nicht leiden können und des-
wegen nicht gleichzeitig eingeladen werden sollten. Dora versucht herauszufinden, wie
viele Leute sie maximal einladen kann. Können Sie ihr dabei helfen?
Wir betrachten hier das PARTY Problem.
Eingabe: Endliche Menge F an Freunden, Abneigungen A ⊆ F × F , k ∈ N
Ausgabe: Existiert ein M ⊆ F mit |M | ≥ k und M 2 ∩ A = ∅ ?
(a) Dora hat folgende Liste:
1. Theo 7. Tyx’Hxli E’Oozrt
2. Dora 8. Ehemaliger Rektor
3. Bijanka 9. Dokh’Toa Ivl’Zpaasa
4. Theos Neffe 10. Dr. Evilsparza
5. Eva Pirsalz 11. Kindergartenprofessor
6. Jasper Vazarie 12. Baukommissionsleiter
Folgende Personen verstehen sich nicht so gut und dürfen deshalb nicht beide
eingeladen werden.
{(2, 5), (7, 9), (8, 12), (1, 10), (5, 11), (3, 6),
(4, 5), (3, 12), (9, 10), (6, 9), (2, 10), (8, 11)}
Wie viele Personen kann Dora maximal einladen? Beweisen Sie Ihre Antwort, und
somit insbesondere, wieso es unmöglich ist, mehr Personen einzuladen.
(b) Zeigen Sie, dass PARTY ein NP-vollständiges Problem ist.
Lösungsskizze. (a) Wir können diese Liste als Graphen betrachten:
1 10 2 5 4
7 9 11
6 3 12 8
Dies ist genau der ungerichtete Graph G = (F, A). In diesem Graphen finden wir nun
ein Matching, also eine Teilmenge der Kanten, sodass keine zwei Kanten adjazent sind:
1 10 2 5 4
7 9 11
6 3 12 8
Von jeder dieser Kanten können wir einen der adjazenten Knoten einladen. Wir haben
5 solcher Paare gefunden und |F | = 12, es ist also nicht möglich, mehr als 7 Personen
einzuladen. Nun genügt es also, eine Lösung M ⊆ F mit Größe |M | = 7 zu finden.
Notwendigerweise müsste hierfür nach unserem vorherigen Argument 4, 11 ∈ M gelten
(falls ein M mit Größe 7 existiert). Für jedes Paar müsste genau einer der Knoten
eingeladen werden, also dann 2, 12, danach 1, 6, und schließlich 7. Wir erhalten M =
{1, 2, 4, 6, 7, 11, 12}, was tatsächlich eine Lösung ist.
1 10 2 5 4
7 9 11
6 3 12 8
(b) Wie in (a) betrachten wir für das PARTY Problem den ungerichteten Graphen (F, A).
Sei f die Funktion, die auf Eingabe eines ungerichteten Graphen G = (V, E) den
komplementären Graphen G = (V, V 2 \ E) ausgibt, also den Graphen, in dem zwei
Knoten genau dann adjazent sind, wenn sie es in G nicht sind. (Formal eigentlich G =
(V, E) mit E := {{u, v} : u, v ∈ V, u 6= v, {u, v} ∈/ E}), da ungerichtete Kanten keine
Paare sind.) Offensichtlich lässt sich f in Polynomialzeit berechnen, da |E| ≤ |V |2 immer
gelten muss.
Wir können nun PARTY ≤p CLIQUE und CLIQUE ≤p PARTY reduzieren. In beiden
Fällen ist f die Reduktionsfunktion (den Parameter k lassen wir unverändert). Sei nun
(F, A, k) eine Instanz von PARTY, und G := (F, A). Eine Menge M ⊆ F mit |M | ≥ k ist
genau dann eine Lösung von (F, A, k), wenn keine zwei Knoten in M benachbart sind.
Dies ist äquivalent dazu, dass in f (G) alle Knoten in M benachbart sind, also M eine
Clique in f (G) bildet. Somit gilt
und wir haben PARTY ≤p CLIQUE gezeigt. Da f bijektiv ist, gilt ebenfalls
Wir hoffen, Sie hatten zumindest ein wenig Freude beim Bear-
beiten der Aufgaben. Die Hausaufgabenzeit ist nunmehr bald
vorbei – wir verabschieden uns und wünschen Ihnen fröhliche
vorlesungsfreie Wochen!