5.7 Kontextfreie Grammatiken und Kellerautomaten

Ähnliche Dokumente
5.2 Endliche Automaten

Die mathematische Seite

Theoretische Grundlagen der Informatik

Kontextfreie Sprachen

2. Übungsblatt 6.0 VU Theoretische Informatik und Logik

Kontextfreie Sprachen

Theoretische Grundlagen der Informatik

Automaten und formale Sprachen Klausurvorbereitung

Theoretische Grundlagen der Informatik

Sei Σ ein endliches Alphabet. Eine Sprache L Σ ist genau dann regulär, wenn sie von einem regulären Ausdruck beschrieben werden kann.

kontextfreie Grammatiken Theoretische Informatik kontextfreie Grammatiken kontextfreie Grammatiken Rainer Schrader 14. Juli 2009 Gliederung

Übungsblatt 6. Vorlesung Theoretische Grundlagen der Informatik im WS 17/18

Ein Satz der deutschen Sprache besitzt ein Subjekt, ein Prädikat und ein Objekt (SPO).

Algorithmen mit konstantem Platzbedarf: Die Klasse REG

Lösung zur Klausur. Grundlagen der Theoretischen Informatik im WiSe 2003/2004

1. Klausur zur Vorlesung Informatik III Wintersemester 2003/2004. Mit Lösung!

Übung zur Vorlesung Grundlagen der theoretischen Informatik. Aufgabenblatt 7 Lösungen. Wiederholung: Pumping-Lemma für kontextfreie Sprachen

Grundlagen der Theoretischen Informatik

Frank Heitmann 2/47. 1 Ein PDA beginnt im Startzustand z 0 und mit im Keller. 2 Ist der Automat

Übungsaufgaben zu Formalen Sprachen und Automaten

Grammatiken. Grammatiken sind regelbasierte Kalküle zur Konstruktion von Systemen und Sprachen Überprüfung von Systemen und Sprachen

Umformung NTM DTM. Charakterisierung rek. aufz. Spr. Chomsky-3-Grammatiken (T5.3) Chomsky-0-Grammatik Rek. Aufz.

Kapitel: Die Chomsky Hierarchie. Die Chomsky Hierarchie 1 / 14

FORMALE SYSTEME. 3. Vorlesung: Endliche Automaten. TU Dresden, 17. Oktober Markus Krötzsch

Klammersprache Definiere

Theoretische Informatik 2 (WS 2006/07) Automatentheorie und Formale Sprachen / Kontextfreie Sprachen und Kellerautomaten

Reguläre Sprachen. R. Stiebe: Theoretische Informatik für ING-IF und Lehrer,

Worterkennung in Texten speziell im Compilerbau 20. April Frank Heitmann 2/64

Automatentheorie und formale Sprachen

Grundlagen der theoretischen Informatik

Theoretische Informatik. Grammatiken. Grammatiken. Grammatiken. Rainer Schrader. 9. Juli 2009

Theorie der Informatik

2. Klausur zur Vorlesung Theoretische Grundlagen der Informatik Wintersemester 2014/2015

Informatik III. Christian Schindelhauer Wintersemester 2006/07 5. Vorlesung

Hochschule Bonn-Rhein-Sieg University of Applied Sciences Grantham-Allee Sankt Augustin

Theoretische Grundlagen der Informatik

Das Pumping-Lemma Formulierung

Die Nerode-Relation und der Index einer Sprache L

Einführung in die Theoretische Informatik

TU Berlin Nachklausur TheGI 2 Automaten und Komplexität (Niedermeier/Hartung/Nichterlein, Sommersemester 2012)

Übungsblatt Nr. 3. Lösungsvorschlag

Kontextfreie Grammatiken

Grundlagen der Theoretischen Informatik

Einführung in Berechenbarkeit, Formale Sprachen und Komplexitätstheorie

Grundlagen der Theoretischen Informatik

Einführung in die Theoretische Informatik

1. Klausur zur Vorlesung Informatik III Wintersemester 2004/2005

THIA - Übungsblatt 2.

11.1 Kontextsensitive und allgemeine Grammatiken

Grundlagen der Informatik II

(z', B 1...B k ) δ(z,a,a):

Deterministische und nichtdeterministische Turing-Maschinen, Typ1- und Typ0-Sprachen

EINFÜHRUNG IN DIE THEORETISCHE INFORMATIK

Musterlösung Informatik-III-Klausur

Turing Maschine. Thorsten Timmer. SS 2005 Proseminar Beschreibungskomplexität bei Prof. D. Wotschke. Turing Maschine SS 2005 p.

Theorie der Informatik

Definition 98 Eine Turingmaschine heißt linear beschränkt (kurz: LBA), falls für alle q Q gilt:

c) {abcde, abcfg, bcade, bcafg} d) {ade, afg, bcde, bcfg} c) {abcabc} d) {abcbc, abc, a} c) {aa, ab, ba, bb} d) {{aa}, {ab}, {ba}, {bb}}

Theoretische Informatik I

FORMALE SYSTEME. 10. Vorlesung: Grenzen regulärer Sprachen / Probleme für Automaten. TU Dresden, 14. November 2016.

Theoretische Grundlagen der Informatik

Grundlagen der Theoretischen Informatik Musterlösungen zu ausgewählten Übungsaufgaben

2. Gegeben sei folgender nichtdeterministischer endlicher Automat mit ɛ-übergängen:

Klausur zur Vorlesung Informatik III Wintersemester 2007/2008

Theoretische Grundlagen der Informatik

Theoretische Informatik. nichtdeterministische Turingmaschinen NDTM. Turingmaschinen. Rainer Schrader. 29. April 2009

Ein deterministischer endlicher Automat (DFA) kann als 5-Touple dargestellt werden:

I.5. Kontextfreie Sprachen

Kurz-Skript zur Theoretischen Informatik I

Maike Buchin 18. Februar 2016 Stef Sijben. Probeklausur. Theoretische Informatik. Bearbeitungszeit: 3 Stunden

Rekursiv aufzählbare Sprachen

Kellerautomat (1/4) Kellerautomat (2/4) Kellerautomat (3/4) Kellerautomat (4/4)

Übungsblatt Nr. 3. Lösungsvorschlag

Musterlösung zur Hauptklausur Theoretische Grundlagen der Informatik Wintersemester 2013/14

Universität Karlsruhe Institut für Theoretische Informatik. Klausur: Informatik III

Laufzeit einer DTM, Klasse DTIME

1 Σ endliches Terminalalphabet, 2 V endliche Menge von Variablen (mit V Σ = ), 3 P (V (Σ ΣV )) {(S, ε)} endliche Menge von Regeln,

Formale Sprachen. Script, Kapitel 4. Grammatiken

FORMALE SYSTEME. 8. Vorlesung: Minimale Automaten. TU Dresden, 6. November Markus Krötzsch Lehrstuhl Wissensbasierte Systeme

Lösungen zur 1. Klausur. Einführung in Berechenbarkeit, formale Sprachen und Komplexitätstheorie

Formale Sprachen und Automaten

Normalformen für kontextfreie Grammatiken. Noam CHOMSKY, Sheila GREIBACH. Bäume. Ableitungen in kontextfreien Grammatiken. Grammatik G = (N,T,P,S)

Polynomielle Verifizierer und NP

Übungsblatt 7. Vorlesung Theoretische Grundlagen der Informatik im WS 16/17

Worterkennung in Texten speziell im Compilerbau 14. April Frank Heitmann 2/65

Aufgabe Mögliche Punkte Erreichte Punkte a b c d Σ a b c d Σ x1 13

Theoretische Informatik II

Proseminar Komplexitätstheorie P versus NP Wintersemester 2006/07. Nichtdeterministische Turingmaschinen und NP

2.3 Abschlusseigenschaften

Musterlösungen zu Grundlagen der theoretischen Informatik (skizziert)

Formalismen für REG. Formale Grundlagen der Informatik 1 Kapitel 7 Kontextfreie Sprachen. Das Pumping Lemma. Abschlusseigenschaften

2. Teilklausur zur Vorlesung Grundlagen der Theoretischen Informatik

1 Σ endliches Terminalalphabet, 2 V endliche Menge von Variablen (mit V Σ = ), 3 P (V (Σ ΣV )) {(S, ε)} endliche Menge von Regeln,

Hauptklausur zur Vorlesung Theoretische Grundlagen der Informatik Wintersemester 2011/2012

Endliche Automaten, reguläre Ausdrücke, rechtslineare Grammatiken

Formale Sprachen und Automaten: Tutorium Nr. 8

2. Gegeben sei folgender nichtdeterministischer endlicher Automat mit ɛ-übergängen:

Definition 4 (Operationen auf Sprachen) Beispiel 5. Seien A, B Σ zwei (formale) Sprachen. Konkatenation: AB = {uv ; u A, v B} A + = n 1 An

q 0 q gdw. nicht (q A) (q A) q i+1 q gdw. q i q oder ( a Σ) δ(q, a) i δ(q, a) L = {a n b n : n N} für a, b Σ, a b

Deterministischer Kellerautomat (DPDA)

Transkript:

130 5.7 Kontextfreie Grammatiken und Kellerautomaten Im letzten Abschnitt haben wir gesehen, dass wir reguläre Sprachen auch mit Hilfe von endlichen Automaten charakterisieren können. Jetzt wollen wir ein Rechenmodell definieren, dass die kontextfreien Sprachen charakterisiert. Es wird sich dabei um die Kellerautomaten (PDA für pushdown automaton) handeln. Anders als bei endlichen Automaten werden wir Kellerautomaten gleich mit Nichtdeterminismus definieren, da gezeigt werden kann, dass deterministische Kellerautomaten nicht äquivalent zu den nichtdeterministischen Kellerautomaten sind. Diejenigen kontextfreien Sprachen, die von deterministischen Kellerautomaten akzeptiert werden können, spielen in der Theorie der Programmiersprachen eine große Rolle. Darauf einzugehen, würde allerdings den Rahmen dieser Vorlesung sprengen. 5.7.1 Kellerautomaten Kellerautomaten (PDAs) ähneln NFAs, die einen stark eingeschränkten Speicher besitzen. Dieser Speicher wird durch einen sogenannten Stapel oder Keller oder Stack realisiert. Bei einem Stapel kann nur auf das zuletzt eingefügte Element zugegriffen werden. Soll auf ein anderes Element zugegriffen werden, so müssen zunächst alle nach diesem Element eingefügten Elemente aus dem Stapel entfernt werden. Wie der Name Stapel schon sagt, stellen wir uns die in einem Stapel gespeicherten Elemente von unten nach oben angeordnet vor. Das zuletzt eingefügte Element liegt dabei ganz oben auf dem Stapel. Hinzufügen eines Elementes auf einen Stapel nennen wir Ablegen eines Elementes oder eine Push-Operation. Entfernen eines Elementes nennen wir auch eine Pop-Operation. Ein PDA wird wie ein NFA genau einmal über die Eingabe gehen. Der letzte Zustand, der dabei erreicht wird, entscheidet, ob die Eingabe akzeptiert wird oder nicht. Wir werden allerdings auch so genannte ɛ-bewegungen zulassen. Dies bedeutet, dass ein PDA den Zustand wechseln und den Stapel ändern kann, ohne ein Eingabesymbol zu lesen. Schematisch können wir einen PDA wie in Abbildung 5.12 darstellen. Abbildung 5.12: Schematische Darstellung eines Kellerautomaten. Zur Beschreibung von ɛ-bewegungen erweitern wir bei einem PDA das Eingabealphabet Σ um die leere Folge ɛ. Wir bezeichnen dieses erweiterte Alphabet mit Σ ɛ. Analog erweitern wir das Alphabet Γ des Stapels um ɛ zum Alphabet Γ ɛ. Definition 5.7.1 Ein Kellerautomat (PDA) ist definiert durch ein 6-Tupel (Q, Σ, Γ, δ, q 0, F ), wobei

131 Q eine endliche Menge von Zuständen ist, Σ das endliche Eingabealphabet ist, Γ das endliche Stapelalphabet ist, δ : Q Σ ɛ Γ ɛ P(Q Γ ɛ ) die Übergangsfunktion ist, q 0 der Startzustand ist, F Q die Menge von akzeptierenden Zuständen ist. Da wir die Zustandsfunktion als eine Abbildung in die Potenzmenge von Q Γ ɛ definiert haben, sind Kellerautomaten nichtdeterministisch. Da wir als Definitionsbereich von δ die Menge Q Σ ɛ Γ ɛ haben und wir insbesondere als gelesenes Eingabesymbol ɛ zulassen, können Kellerautomaten Aktionen ausführen ohne ein Eingabesymbol zu lesen. Diese wird durch die folgenden Erläuterungen der Rechenschritte von Kellerautomaten präzisiert. Ist (q, z) δ(q, a, u), q, q Q, a, u, z Γ ɛ, so kann der PDA, wenn er sich im Zustand q befindet, das Eingabesymbol a liest und das oberste Stapelsymbol u ist, in den Zustand q gehen, das Stapelsymbol u entfernen (= Pop-Operation) und das Symbol z auf dem Stapel ablegen (= Push-Operation). Wir erlauben also, dass eine Pop- und eine Push-Operation gleichzeitig in einem Schritt erfolgen. Wir lassen in unserer Definition aber auch u, z = ɛ zu. Ist u = ɛ, so bedeutet dieses, dass nur das Element z abgelegt wird, aber kein Element vom Stapel entfernt wird. Ist hingegen z = ɛ, so wird das Element u entfernt, aber kein anderes Element von Γ auf den Stapel abgelegt. Schließlich gibt es noch den Fall, dass gleichzeitig u = ɛ und v = ɛ gilt. In diesem Fall wechselt der Kellerautomat nur den Zustand. Ein PDA K = (Q, Σ, Γ, δ, q 0, F ) akzeptiert ein Wort w Σ, wenn w geschrieben werden kann als w = w 1... w m, w i Σ ɛ, sowie r 0, r 1,..., r m Q und s 0, s 1,..., s m Γ existieren mit 1. r 0 = q 0, s 0 = ɛ 2. Für i = 1,..., m gibt es Elemente a i, b i Γ ɛ und eine Folge t i Γ mit s i = a i t i, s i+1 = b i t i und (r i+1, b i ) δ(r i, w i+1, a i ). 3. r m F. r i sind also die verschiedenen Zustände, die bei Eingabe w durchlaufen werden. Die s i sind die Stapelinhalte nach dem i-ten Rechenschritt. 1. sagt, dass die Rechnung im Startzustand und mit leerem Stapel beginnt. 2. sagt, dass die Rechnung gemäß der Übergangsfunktion erfolgt und 3. sagt, dass die Rechnung in einem akzeptierenden Zustand endet. Wichtig ist hier wie bei den NFAs und den NTMs, dass ein Wort w vom PDA K akzeptiert wird, sobald eine akzeptierende Rechnung bei Eingabe w existiert. Wie bei NFAs kann es bei PDAs Berechnungen geben, so dass für ein i m gilt δ(r i, w i+1, a i ) =. Diese Berechnung bricht dann vor Erreichen des Endes der Eingabe ab. Solche Berechnungen sind nicht akzeptierend, auch dann wenn der Zustand r i in F liegt. Die von einem PDA K akzeptierte Sprache L(K) besteht aus allen Worten, die von K akzeptiert werden, also L(K) := {w Σ es gibt eine akzeptierende Berechnung von K bei Eingabe w}.

132 Als nächstes betrachten wir die Sprache L 1 = {0 n 1 n n 1}. Wir wollen uns überlegen, dass diese Sprache von einem PDA akzeptiert wird. Hier zunächst eine informelle Beschreibung des PDA. 1. Solange das Eingabesymbol 0 ist, pushe eine 0 auf den Stapel. 2. Wird eine 1 gelesen, poppe eine 0 vom Stapel. 3. Wenn hierbei nach der ersten 1 noch eine 0 auftaucht oder eine 1 bei leerem Stapel gelesen wird, lehne die Eingabe ab. 4. Akzeptiere die Eingabe, wenn am Ende der Rechnung der Stapel leer ist. Um diese informelle Beschreibung zu formalisieren, benutzen wir eine graphische Darstellung für PDAs, die derjenigen für NFAs nachgebildet ist. Wir haben dabei einen gerichteten Graphen mit Q als Knotenmenge. Einen Übergang (q, z) δ(q, a, u) machen wir dadurch kenntlich, dass wir an die gerichtete Kante von q nach q das Label a, u z schreiben. Dabei wird eine Kante in der Regel mehrere Label haben. Darunter können auch einige sein, die dasselbe Eingabesymbol und dasselbe oberste Stapelsymbol haben, denn PDAs sind nichtdeterministisch. Gilt hingegen δ(q, a, s) =, so wird es für das Eingabesymbol a und das Stapelsymbol s keine Kante aus dem Knoten q geben. In unserem Beispiel des PDAs für L 1 = {0 n 1 n n 1} erhalten wir dann den Graphen in Abbildung 5.13. Zu diesem Graphen ist noch eine weitere Erläuterung erforderlich. Der PDA für L hat als Stapelalphabet Γ = {0, 1, }. Das Symbol wird nur benutzt, um den Boden des Stapels zu erkennen. D.h., ist das oberste Symbol des Stapels, so enthält der Stapel keine weiteren Elemente. Abbildung 5.13: PDA für L 1 = {0 n 1 n n 1} Betrachten wir bei dem PDA für L 1 eine akzeptierende Berechnung für das Wort w = 0011. Wir schreiben w als w = ɛ0011ɛ. Die Folge von Zuständen r 0 r 1... r 6, die durchlaufen wird, ist q 0, q 1, q 1, q 1, q 2, q 2, q 3. Die Stapelinhalte s 0, s 1,..., s 6 sind gegeben durch ɛ 0 00 0 ɛ Als nächstes Beispiel betrachten wir die Sprache L 2 = {ww R w {0, 1} }, also die Menge aller Worte, die aus einem Wort w verknüpft mit dem Wort w rückwärts gelesen bestehen. Graphisch ist der PDA für L 2 wie in Abbildung 5.14 dargestellt. Das Stapelalphabet des PDA für L 2 ist

133 Abbildung 5.14: PDA für L 2 = {ww R w {0, 1} } Γ = {0, 1, }. Auch in diesem Beispiel wird benutzt, um zu erkennen, wann der Stapel leer ist. Um einzusehen, dass dieser PDA L 2 akzeptiert, beobachtet man, dass der PDA nur dann ein Wort akzeptieren kann, wenn er alle Eingabesymbole, die auf dem Stapel abgelegt wurden, solange sich der PDA im Zustand q 1 befand, nur dann im Zustand q 2 vom Stapel entfernen kann, wenn die Eingabe die abgelegten Eingabesymbole in umgekehrter Reihenfolge noch einmal enthält. Damit ist die vom PDA akzeptierte Sprache eine Teilmenge von L 2. Aber es gibt für jedes Element von L 2 auch eine akzeptierende Berechnung des PDA. Hierzu muss der PDA nur korrekt das Ende von w und den Beginn von w R erraten. An genau dieser Stelle wird der PDA dann den Übergang von q 1 nach q 2 mit Hilfe von (q 2, ɛ) δ(q 1, ɛ, ɛ) vollziehen. Jetzt wollen wir zeigen, dass die von PDAs akzeptierten Sprachen genau die kontextfreien Sprachen sind. Zunächst zeigen wir Lemma 5.7.2 Ist L eine kontextfreie Sprache, so gibt es einen PDA K mit L(P ) = L. Beweis: Da L kontextfrei ist, gibt es eine kontextfreie Grammatik G, die L erzeugt. Wie beim Beweis, dass eine reguläre Sprache von einem NFA akzeptiert wird, werden wir eine Ableitung eines Wortes w L mit Hilfe der Grammatik G in eine akzeptierende Berechnung eines PDAs umwandeln. Bei der Ableitung eines Wortes w L aus dem Startsymbol S der Grammatik G, werden als Zwischenergebnisse der Ableitung Folgen aus (Σ V ) erzeugt, wobei Σ die Menge der Terminale und V die Menge der Variablen von G ist. Aus einem Zwischenergebnis gibt es üblicherweise mehrere Möglichkeiten, die Ableitung fortzusetzen. Diesen Nichtdeterminismus von Grammatiken und Ableitungen können wir wie bei NFAs durch den Nichtdeterminismus von PDAs simulieren. Aber es gibt eine Schwierigkeit, Ableitungen aus kontextfreien Grammatiken zu Berechnungen von PDAs umzuwandeln, die bei regulären Grammatiken und NFAs nicht auftaucht. Schauen wir uns eine einfache Idee an. Betrachten wir einen PDA K, der seine Simulation der Ableitung eines Worts beginnt, indem er zunächst die Startvariable gefolgt von einem speziellen Symbol auf seinen Stapel schreibt. Das Symbol dient dazu, den Boden des Stapels erkennen zu können. Dann wählt K nichtdeterministisch Regeln der Grammatik aus, um eine Ableitung zu simulieren. Die Anwendung einer Regel wird simuliert, indem eine Variable, die auf der linken Seite einer Regel von G auftaucht, durch die rechte Seite der entsprechenden Regel ersetzt wird. Hierbei werden die Symbole auf der rechten Seite der Regel von rechts nach links auf den Stapel abgelegt. Irgendwann wird der Stapel nur Terminale der Grammatik enthalten. Nun kann geprüft werden, ob der Stapelinhalt mit der Eingabe übereinstimmt. Bei dieser Idee gibt es eine Schwierigkeit. Wir können nämlich nicht einfach alle Zwischenergebnisse im Stapel speichern. Der PDA kann ja immer nur auf das oberste Element des Stapels

134 zugreifen. Ist dieses keine Variable, so muss der PDA eine Variable finden, die als nächstes ersetzt werden kann. Der PDA kann aber nicht einfach Elemente vom Stapel entfernen, da er hierdurch Informationen über Zwischenergebnisse einer Ableitung unwiderruflich verliert. Die folgende Beobachtung hilft jedoch, diese Schwierigkeit zu umgehen. In einer kontextfreien Grammatik besteht die linke Seite jeder Regel aus einer Variablen. Daraus folgt, dass in jeder Ableitung eines Worts w die Terminale eines Zwischenergebnisses, die links von der ersten Variablen des Zwischenergebnisses stehen, mit den ersten Eingabesymbolen übereinstimmen müssen. Somit können wir Terminale, die oben auf dem Stapel liegen, gleich mit den ersten Eingabesymbolen vergleichen und vom Stapel entfernen. Das Zwischenergebnis einer Ableitung wird also durch einen PDA gespeichert, indem der Teil des Zwischenergebnisses, der rechts von der ersten Variablen steht, auf dem Stapel steht. Hierbei liegt die erste Variable ganz oben. Die führenden Terminale des Zwischenergebnisses müssen mit den links vom Lesekopf des PDA liegenden Eingabesymbolen übereinstimmen. Wir erhalten also für die Speicherung eines Zwischenergebnisses einer Ableitung durch einen PDA ein Bild wie in Abbildung 5.15. Das Wort w muss dabei mit 001, den bereits gelesenen Symbolen der Eingabe, beginnen. Der Rest 0101 der Eingabe muss aus der Folge v11v0 ableitbar sein. Abbildung 5.15: Speicherung von Zwischenergebnissen einer Ableitung durch einen PDA. Diese Beobachtung führt zur folgenden informellen Beschreibung für die Arbeitsweise eines PDAs, der Ableitungen einer kontextfreien Grammatik simuliert. 1. Um den Beginn des Stapels erkennen zu können, lege ein spezielles Symbol auf den Stapel ab. Als nächstes Element lege die Startvariable S auf den Stapel. 2. Wiederhole folgende Schritte (a) Ist das oberste Stapelsymbol eine Variable v der Grammatik G, wähle nichtdeterministisch eine der Regeln von G mit linker Seite v. Entferne v vom Stapel und lege die gesamte rechte Seite der entsprechenden Regel auf den Stapel ab. (b) Ist das oberste Stapelsymbol ein Terminal a von G, vergleiche dieses Symbol mit dem nächsten Eingabesymbol und entferne es vom Stapel. Stimmen die Symbole überein, so wird die Berechnung weitergeführt. Sonst wird diese nichtdeterministische Berechnung abgebrochen. Die Berechnung ist dann ablehnend. (c) Ist das oberste Stacksymbol und wurden alle Eingabesymbole gelesen, akzeptiere. Sonst ist die Berechnung ablehnend. Die Schritte (a) und (b) sind in Abbildung 5.16 und Abbildung 5.17 illustriert. Hierbei wird zunächst auf den PDA im Zustand wie in Abbildung 5.15 die Regel v 0u angewandt. Dann

135 Abbildung 5.16: Berechnung bei Auswahl der Regel v 0u Abbildung 5.17: Berechnung bei Terminal als oberstem Stacksymbol wird die 0 als oberstes Stapelsymbol mit dem nächsten Eingabesymbol verglichen. Die Abbildungen zeigen jeweils den Zustand des PDA nach der Ausführung der Schritte. Im Schritt (a) müssen wir nicht nur ein Symbol, sondern eine Folge von Symbolen auf den Stapel ablegen. Dieses kann durch eine Folge von Push-Operationen geschehen. Um die Notation nicht zu kompliziert zu gestalten, nehmen wir an, dass wir einen Zustand q des PDA haben, der nicht nur ein Symbol, sondern eine Folge von Symbolen ablegen kann. So etwas kann durch eine Folge von speziellen Zuständen realisiert werden. Hierbei ist zu beobachten, dass es nur endlich viele Regeln in einer Grammatik geben kann. Daher gibt es eine feste obere Schranke für die Länge der rechten Seiten der Regeln. Damit können wir das gewünschte Verhalten des PDA im Zustand q durch endlich viele verschiedene Zustände realisieren. Zusammenfassend wird also der Übergang ( q, w) δ( q, ɛ, v), v V, w (Σ V ), bedeuten, dass v entfernt und w = w 1... w k auf den Stapel abgelegt wird, und zwar in der Reihenfolge w k,..., w 1. Jetzt können wir unseren PDA K = (Q, Σ, Γ, δ, q 0, F ) für eine kontextfreie Sprache L erzeugt durch die kontextfreie Grammatik G = (Σ, V, P, S) formal wie folgt beschreiben. Die Menge der Terminale von G und das Eingabealphabet von K stimmen überein. Das Stapelalphabet von K ist Γ = Σ V { }, wobei Σ V. Die Menge Q der Zustände von K ist Q = {q 0, q, q accept }. Die Menge F der akzeptierenden Zustände von K enthält nur q accept, F = {q accept }. Schließlich ist die Übergangsfunktion δ definiert durch die folgenden Regeln δ(q 0, ɛ, ɛ) = {( q, S )} δ( q, ɛ, v), v V = {( q, w) für alle Regeln v w in P } δ( q, a, a), a Σ = {( q, ɛ)} δ( q, ɛ, ) = {(q accept, ɛ)} Für alle Tripel aus Q Σ ɛ Γ ɛ, die nicht in dieser Aufstellung auftauchen, ist das Bild unter δ die leere Menge. Schematisch kann man den PDA wie in Abbildung 5.18 darstellen.

136 Abbildung 5.18: Schematische Darstellung für PDA gewonnen aus kontextfreier Grammatik Nach dem bislang Gesagten sollte klar sein, dass der PDA K genau die Sprache L akzeptiert. Nun wollen wir die Umkehrung dieses Lemmas zeigen. Lemma 5.7.3 Sei K = (Q, Σ, Γ, δ, q 0, F ) ein PDA und sei L = L(K) die von K akzeptierte Sprache. Dann ist L kontextfrei. Beweis: Wir müssen eine kontextfreie Grammatik konstruieren, die L erzeugt. Hierzu überlegen wir uns zunächst, dass wir den PDA so modifizieren können, dass er L immer noch akzeptiert, aber zusätzlich folgende Eigenschaften besitzt: 1. F = 1, d.h., es gibt nur einen akzeptierenden Zustand q accept. 2. Am Ende einer akzeptierenden Berechnung ist der Stapel immer leer. 3. Jeder Rechenschritt gemäß der Übergangsfunktion δ poppt entweder ein Element vom Stapel oder er pusht ein Element auf den Stapel. 1. und 2. können durch zusätzliche ɛ-bewegungen erreicht werden. 3. kann erreicht werden, indem man einen Rechenschritt des PDA eventuell durch zwei Rechenschritte ersetzt. Um die gewünschte Grammatik G = (Σ, V, P, S) zu konstruieren, werden wir für je zwei (möglicherweise identische) Zustände p, q Q eine Variable v pq V einführen. Die Variable v pq soll dabei die folgende Funktion erfüllen: Aus v pq können alle Worte x Σ abgeleitet werden, die K aus dem Zustand p und mit leerem Stapel in den Zustand q und wiederum mit leerem Stapel überführen können. Hat ein Wort x die gerade beschriebene Eigenschaft, so gilt auch, dass x den PDA K aus dem Zustand p und mit Stapelinhalt s Γ in den Zustand q und mit Stapelinhalt s überführt. Dabei können zwar zwischenzeitlich Elemente auf den Stapel gelegt werden, aber diese werden dann vor Erreichen des Zustandes q wieder entfernt. Außerdem wird bei einer solchen Überführung keines der Elemente in s jemals entfernt. Nun müssen wir noch die Produktionen in der Grammatik angeben, damit die Variablen v pq die gewünschten Eigenschaften haben. Betrachten wir hierzu ein Wort x, das den PDA K aus dem Zustand p in den Zustand q überführt, wobei jeweils der Stapel leer ist. Betrachten wir weiter die Berechnung, die K bei der Überführung von p nach q durch das Wort x ausführt. Da wir immer annehmen, dass ein Rechenschritt von K entweder ein Element auf dem Stapel ablegt oder ein Element vom Stapel entfernt, aber wir den PDA im Zustand p bei leerem Stapel betrachten,

137 muss bei der Berechnung mit Eingabe x, die p in q überführt, die erste Stapeloperation eine Push-Operation sein. Ist K dann im Zustand q, muss der Stapel wieder leer sein. Also muss die letzte Stapeloperation eine Pop-Operation sein. Es gibt nun für die Berechnung mit x zwei Möglichkeiten. 1. Während der Berechnung mit Eingabe x, die K aus p nach q überführt, ist der Stapel nicht nur am Anfang und am Ende leer, sondern auch noch nach einem Zwischenschritt. Dieser Fall ist in Abbildung 5.19 schematisch dargestellt. 2. Während der Berechnung mit Eingabe x, die p nach q überführt, ist der Stapel nur am Anfang und am Ende leer. Dann ist das Element das zu Beginn auf dem Stapel abgelegt abgelegt wird, das Element, das am Ende vom Stapel entfernt wird. Dieser Fall ist in Abbildung 5.20 schematisch dargestellt. Abbildung 5.19: Überführung von p nach q mit zwischenzeitlich leerem Stapel Abbildung 5.20: Überführung von p nach q ohne zwischenzeitlich leerem Stapel Bei 1. sei r der Zustand, in dem sich K nach dem Zwischenschritt befindet, der den Stapel geleert hat. Wir können dann x in zwei Teile y, z aufteilen. y ist der Teil von x, der von p bis zum Erreichen von r abgearbeitet wird. z ist der Teil von x, der vom Erreichen des Zustands r bis zum Erreichen des Zustands q durchlaufen wird. Gemäß unseren Forderungen an die Variablen der Grammatik G soll y durch die Variable v pr und z durch die Variable v rq erzeugt werden können. Wir nehmen nun die Regel v pq v pr v rq in die Menge der Produktionen von G auf.

138 Tritt 2. ein, so sei a das erste Symbol von x und b das letzte Symbol von x. Weiter sei r der Zustand, indem sich der PDA nach dem ersten Schritt befindet. Schließlich sei s der Zustand des PDA, bevor er in den Zustand q wechselt. Für diesen Fall führen wir die Regel v pq av rs b ein. Hierbei lassen wir a, b = ɛ zu. Wichtig ist an beiden Fällen, dass wir die Ableitung von x aus der Variablen v pq ersetzt haben durch die Ableitung von Teilworten von x aus anderen Variablen der Grammatik. Bei 1. die Herleitung von y aus v pr und von z aus v rq. Im 2. Fall muss x verkürzt um das erste und letzte Symbol aus v rs abgeleitet werden. Formal können wir die Grammatik G wie folgt beschreiben. Die Menge Σ der Terminale von G ist identisch zum Eingabealphabet von K. Die Menge der Variablen von G ist gegeben durch V = {v pq p, q Q}. Das Startsymbol ist gegeben durch S = v q0 q accept, wobei q accept der einzige akzeptierende Zustand von K ist (zur Erinnerung: wir hatten bereits argumentiert, dass wir immer annehmen können, dass K nur einen akzeptierenden Zustand besitzt). Die Menge der Produktionen ist definiert durch: Für alle p, q, r Q ist v pq v pr v rq eine Produktion in G. Für alle p, q, r, s Q und alle a, b Σ ɛ ist v pq av rs b eine Produktion von G, falls es zusätzlich ein t Γ gibt, so dass (r, t) δ(p, a, ɛ) und (q, ɛ) δ(s, b, t). Für alle p Q ist v pp ɛ eine Produktion von G. Wir können nun zeigen, dass mit diesen Produktionen die Variablen v pq genau das Gewünschte erreichen. Wir erhalten nämlich 1. Wenn v pq ein Wort x erzeugt, so kann x den PDA K vom Zustand p in den Zustand q überführen, wobei am Anfang und Ende der Stapel jeweils leer ist. 2. Kann x den PDA K vom Zustand p in den Zustand q überführen, wobei am Anfang und Ende der Stapel jeweils leer ist, so kann x aus v pq abgeleitet werden. 1. kann durch Induktion über die Anzahl der Ableitungsschritte, die zur Ableitung von x aus der Variablen v pq benötigt werden, gezeigt werden. 2. kann durch Induktion über die Anzahl der Schritte in der Rechnung, die p in q überführt, gezeigt werden. Insbesondere erhalten wir nun, dass aus der Startvariablen S = v q0 q accept genau diejenigen Worte x Σ abgeleitet werden können, die K aus dem Zustand q 0 in den Zustand q accept überführen können, wobei am Anfang und am Ende der Stapel jeweils leer ist. Dieses sind aber genau die Worte, die von K akzeptiert werden. Somit gilt L = L(G) = L(P ). 5.8 Das Wortproblem für kontextfreie Sprachen - Der CYK- Algorithmus In diesem Abschnitt wollen wir das Wortproblem für kontextfreie Sprachen untersuchen. Dieses ist folgendermaßen definiert.

139 Gegeben: Eine kontextfreie Grammatik G = (Σ, V, P, S) und ein Wort w Σ. Entscheide: Ob w in der von G erzeugten Sprache L = L(G) liegt, d.h., entscheide, ob w aus der Startvariablen S abgeleitet werden kann. Um dieses Problem lösen zu können, brauchen wir zunächst den Begriff einer Chomsky Normalform. Definition 5.8.1 Eine kontextfreie Grammatik (Σ, V, P, S) ist in Chomsky Normalform, wenn jede Regel in P von der Form ist. Zusätzlich ist die Regel S ɛ erlaubt. Es gilt folgender Satz. v uz u, z V \{S} oder v a a Σ Satz 5.8.2 Sei G eine kontextfreie Grammatik. Dann kann aus G eine kontextfreie Grammatik G in Chomsky Normalform konstruiert werden, die dieselbe Sprache wie G erzeugt. Wir werden den Beweis dieses Satzes hier nicht führen. Er kann in den Büchern von Schöning, Wegener oder Sipser nachgelesen werden. Von nun an nehmen wir stets an, dass eine kontextfreie Sprache L durch eine kontextfreie Grammatik in Chomsky Normalform erzeugt wird. Dann kann gezeigt werden (Übung), dass für jedes Wort w = w 1 w n der Länge n in L jede Ableitung mit Hilfe der Grammatik G aus genau 2n 1 Ableitungsschritten besteht. Damit können wir das Wortproblem lösen, indem wir bei Eingabe w = w 1 w n alle möglichen Ableitungen mit höchstens 2n 1 vielen Ableitungsschritten ausprobieren, um zu sehen, ob eine dieser Ableitungen das Wort w erzeugt. Dieses ist jedoch eine sehr ineffiziente Methode. Wir werden deshalb jetzt einen sehr viel besseren Algorithmus für das Wortproblem bei kontextfreien Sprachen kennenlernen. Dieser Algorithmus beruht auf der Technik des dynamischen Programmierens. Dynamisches Programmieren löst ein Problem, indem die Lösung großer Probleminstanzen aus den Lösungen kleinerer Teilinstanzen auf einfache Art gewonnen wird. Beim Wortproblem für kontextfreie Sprachen wird dies folgendermaßen realisiert. Statt bei Eingabe w = w 1 w n Σ nur zu entscheiden, ob w aus der Startvariablen abgeleitet werden kann, werden alle Variablen v V berechnet, aus denen w abgeleitet werden kann. Die Teilprobleme, die wir betrachten, sind nun die folgenden. Für alle 1 i j n berechnen wir die Variablen aus V, die das Teilwort w i w j erzeugen können. Für ein Wort w der Länge n legen wir daher für alle i, j mit 1 i < j n, eine Menge T (i, j) an, die diese Variablen enthalten soll. Die Mengen T (i, i) können leicht berechnet werden. Hierzu müssen wir in der Menge P der Regeln von G, diejenigen Regeln der Form v a, a Σ mit a = w i finden. Für diese Regeln werden wir die Variablen v auf den linken Seiten der Regeln in die Menge T (i, i) aufnehmen. Grundlage zur Berechnung der T (i, j) für i < j ist die folgende leicht zu überprüfende Gleichung: { } T (i, j) = v V es existiert ein i k j 1 und eine Produktion v uz. mit u T (i, k) und z T (k, j)

140 Wir stellen uns nun die Mengen T (i, j) in der folgenden Tabelle angeordnet vor. l = n T (1, n) l = n 1 T (1, n 1) T (2, n)...... l = i T (1, i) T (2, i + 1)... T (n i + 1, n)........ l = 2 T (1, 2) T (2, 3)... T (n 1, n) l = 1 T (1, 1) T (2, 2)... T (n 1, n 1) T (n, n) In einer Zeile der Tabelle stehen die T (i, j) für Teilworte w i w j der gleichen Länge l. Nehmen wir nun an, wir haben für alle Teilfolgen w i w j der Länge höchstens l die Menge T (i, j) bereits berechnet. Dann können wir für Teilfolgen w i w j der Länge l + 1 die Menge T (i, j) wie folgt berechnen. Wir spalten w i... w j auf alle möglichen Arten in zwei zusammenhängende nicht-leere Teilfolgen auf. Für jede Aufspaltung w i w k und w k+1 w j, sowie für alle Regeln der Form v uz, u, z V testen wir, ob w 1 w k aus u und w k+1 w j aus z abgeleitet werden kann, indem wir in den entsprechenden Mengen T (i, k) und T (k + 1, j) nach den Einträgen u bzw. z suchen. Wir fügen v zu T (i, j) hinzu, falls dieses zutrifft. Wie oben bereits angemerkt, lösen wir also größere Teilprobleme (entsprechen längeren Teilfolgen) mit Hilfe bereits bekannter Lösungen zu kleineren Teilproblemen (entsprechen kürzeren Teilfolgen des Wortes w). Das Wortproblem lösen wir am Ende, indem wir testen, ob S T (1, n). Insgesamt erhalten wir damit den folgenden Algorithmus für das Wortproblem bei kontextfreien Sprachen. Er heißt CYK-Algorithmus nach seinen drei Erfindern Cocke, Younger, Kasami. Bei Eingabe w = w 1 w n : CYK-Algorithmus 1. Falls w = ɛ und S ɛ eine Regel ist, akzeptiere. 2. Für i = 1 bis n 3. Für jede Variable v 4. Teste, ob v b eine Regel ist, wobei b = w i 5. Falls ja, füge v zu T (i, i) hinzu. 6. Für l = 2 bis n \\l := Länge der Teilfolge 7. Für i = 1 bis n l + 1 \\i := Startindex der Teilfolge 8. Setze j = i + l 1 \\j := Schlussindex der Teilfolge 9. Für k = i bis j 1 \\k := Splitposition 10. Für jede Regel v uz 11. Falls u T (i, k) und z T (k + 1, j), füge v zu T (i, j) hinzu. 12. Falls S in T (1, n) enthalten ist, akzeptiere. Sonst lehne ab. Betrachten wir als Beispiel die Grammatik G = (V, Σ, S, P ), wobei V = {S, A, B, C} und Σ =

141 {a, b}. Die Menge der Produktionen P ist gegeben durch S AB S BC A BA A a P = B CC B b C AB C a Dieses ist eine Grammatik in Chomsky-Normalform. Betrachten wir weiter das Wort baaba. Der CYK-Algorithmus berechnet dann die folgende Tabelle von Mengen T (i, j), 1 i < j 5. l = 5 {S, A, C} l = 4 {S, A, C} l = 3 {B} {B} l = 2 {S, A} {B} {S, C} {S, A} l = 1 {B} {A, C} {A, C} {B} {A, C} b a a b a Es ist T (1, 5) = {S, A, C}. Da S in dieser Menge enthalten ist, liegt also das Wort baaba in der von der Grammatik G erzeugten Sprache. Jetzt wollen wir noch die Laufzeit des CYK-Algorithmus analysieren. Die Ausführung jeder einzelnen Zeile dieses Algorithmus benötigt nur Zeit polynomiell in der Beschreibungsgröße von G. Diese Beschreibungsgröße ist konstant. Die Schleife in Zeile 2 wird n-mal durchlaufen und die Schleife in Zeile 3 wird V -mal durchlaufen. Damit benötigen die ersten fünf Zeile des Algorithmus lineare Zeit. Die Schleifen in Zeilen 6,7 und 9 werden jeweils höchstens n-mal durchlaufen. Die Schleife in Zeile 10 wird P -mal durchlaufen, also konstant häufig, da P wie die gesamte Beschreibungsgröße von G konstant ist. Da, wie oben bemerkt, jede Zeile nur konstant viel Zeit benötigt, erhalten wir insgesamt einen Algorithmus mit Laufzeit O(n 3 ). 5.9 Das Pumping Lemma für kontextfreie Sprachen In diesem Abschnitt wollen wir das Pumping Lemma für kontextfreie Sprachen herleiten. Mit Hilfe dieses Lemmas kann häufig bewiesen werden, dass eine Sprache nicht kontextfrei ist. Das Pumping Lemma für kontextfreie Sprachen hat dieselbe logische Form wie das Pumping Lemma für reguläre Sprachen. Lemma 5.9.1 Sei L eine kontextfreie Sprache. Dann gibt es ein p N, so dass für alle w L mit w p eine Aufteilung von w in fünf Teile u, v, x, y, z existiert mit w = uvxyz, vy 1 und vxy p, wobei dann für alle i N 0 gilt uv i xy i z L. Beweis: Sei G = (V, Σ, P, S) eine Grammatik in Chomsky Normalform, die L erzeugt. Nach Satz 5.8.2 existiert eine solche Grammatik. Der Ableitungsbaum eines Worts w L = L(G) hat immer die Form wie in Abbildung 5.21.

142 Abbildung 5.21: Ableitungsbaum bei einer Grammatik in Chomsky Normalform Im Ableitungsbaum haben bis auf die Blätter und die Elternknoten der Blätter alle Knoten genau 2 Kinder. Die Elternknoten der Blätter haben jeweils ein Kind. Wir sagen, dass der Ableitungsbaum aus einem Binärbaum besteht mit zusätzlich angehängten Blättern. Die Anzahl der Blätter des gesamten Ableitungsbaums ist genau die Anzahl der Blätter seines zugehörigen Binärbaums. Diese Anzahl wiederum ist genau die Länge des abgeleiteten Wortes. Wir setzen nun p = 2 V. Sei w ein Wort mit w p. Ein beliebiger Ableitungsbaum T für w muss nun genau w p Blätter besitzen. Entsprechend muss auch der zu T gehörige Binärbaum p viele Blätter besitzen. Daher muss der Binärbaum Tiefe mindestens V haben, d.h., es muss in dem Binärbaum einen Pfad von der Wurzel zu einem Blatt des Binärbaums geben, auf dem mindestens V Kanten liegen. Dieses gilt, da ein Binärbaum der Tiefe V 1 nur 2 V 1 < p Blätter haben kann. Wir wählen nun einen Pfad der Länge mindestens V in dem Binärbaum des Ableitungsbaums T aus. Auf diesem Pfad liegen mindestens V + 1 viele Knoten, die alle mit Variablen aus V gelabelt sind (wir betrachten ja nur den Binärbaum, deshalb sind alle Labels Variablen). Gehen wir den Pfad nun vom Blatt zur Wurzel hoch, so müssen nach dem Schubfachprinzip unter den ersten V + 1 Variablen, die wir antreffen, 2 identisch sein. Nennen wir diese Variable R. Wir erhalten somit eine Bild wie in der ersten schematischen Darstellung in Abbildung 5.22. Zu jedem Knoten des Ableitungsbaums können wir den Teilbaum betrachten, der diesen Knoten als Wurzel hat. Diesem Teilbaum wiederum können wir das Teilwort des Worts w zuordnen, das sich aus den Terminalen an den Blättern des Teilbaums ergibt. Damit erhalten wir aus den beiden Teilbäumen, deren Wurzel die beiden mit R gelabelten Knoten sind, eine Aufteilung des Worts w in w = uvxyz, wie sie ebenfalls in der ersten Darstellung in Abbildung 5.22 dargestellt ist. Diese Aufteilung von w erfüllt nun alle im Pumping Lemma geforderten Bedingungen. vy 1 ergibt sich aus der Tatsache, dass wir eine Grammatik in Chomsky Normalform betrachten. vxy p ergibt sich aus der Tatsache, dass der Teilbaum, dessen Wurzel der zweite mit R gelabelte Knoten ist, höchstens Tiefe V hat. Hier benutzen wir, dass wir das zweifache Auftauchen einer Variablen bereits unter den ersten V + 1 Variablen auf dem Weg vom Blatt zur Wurzel finden. Es bleibt noch nachzuweisen, dass uv i xy i z L für alle i 0. Zunächst kann der Teilbaum, dessen Wurzel der erste mit R gelabelte Knoten ist, durch den Teilbaum ersetzt werden, dessen

143 Abbildung 5.22: Schematische Darstellung des Pumping Lemmas für kontextfreie Sprachen Wurzel der zweite mit R gelabelte Knoten ist, um wiederum einen korrekten Ableitungsbaum zu erhalten. Dies ist dann ein Ableitungsbaum für uv 2 xy 2 z. Damit ist uv 2 xy 2 z L. Dies ist in der zweiten Darstellung in Abbildung 5.22 skizziert. Ersetzt man nun in diesem neuen Ableitungsbaum wie vorher den Teilbaum, dessen Wurzel der erste mit R gelabelte Knoten ist, durch den Teilbaum, der am zweiten mit R gelabelten Knoten hängt, so erhält man einen Ableitungsbaum für uv 3 xy 3 z L. Fährt man auf diese Weise fort, so sieht man dass uv i xy i z L für i 1. Es bleibt noch der Fall i = 0. Hierzu ersetzt man den Teilbaum, der am zweiten mit R gelabelten Knoten hängt, durch den Teilbaum, der am ersten mit R gelabelten Knoten hängt. Dies ist in der letzten Darstellung in Abbildung 5.22 skizziert. Man erhält so einen Ableitungsbaum für uv 0 xy 0 z. Somit ist auch dieses Wort in L. Wir wollen das Pumping Lemma für kontextfreie Sprachen benutzen, um zu zeigen, dass eine Sprache nicht kontextfrei ist. Dieses können wir tun, indem wir von einer Sprache L zeigen, dass sie den Bedingungen des Pumping Lemmas nicht genügt. Anders ausgedrückt, das Pumping Lemma ist logisch von der Form A B, wobei A die Aussage L ist kontextfrei ist. Nun ist aber A B äquivalent zu B A. Und in letzterer Form benutzen wir das Pumping Lemma, um zu zeigen, dass eine Sprache L nicht kontextfrei ist. Zusammengefasst sind die beiden äquivalenten Formulierungen des Pumping Lemmas für kontextfreie Sprachen in der folgenden Tabelle. Ist L kontextfrei, so gilt: L ist nicht kontextfrei, wenn gilt Es existiert ein p N, Für alle p N so dass für alle w L mit w p existiert ein w L mit w p, so dass eine Aufteilung w = uvxyz existiert für alle Aufteilungen w = uvxyz mit vxy p, vy 1 mit vxy p, vy 1 wobei für alle i N 0 ein i N 0 existiert, uv i xy i z L. so dass uv i xy i z L.

144 Wir wollen nun an zwei Beispielen zeigen, wie mit Hilfe des Pumping Lemmas bewiesen werden kann, dass eine Sprache nicht kontextfrei ist. Beispiel 1: Sei L = {a n b n c n n 1}. Sei p N beliebig. Wir wählen w = a p b p c p L. Sei nun w = uvxyz eine beliebige Aufteilung von w, mit vy 1 und vxy p. Wir werden zeigen, dass dann immer ein i 0 existiert, so dass uv i xy i z L. Aus vxy p schließen wir, dass vy nur zwei der drei Symbole a, b, c enthalten kann. Wir führen nun eine Fallunterscheidung durch, basierend auf dem in vy fehlenden Symbol. a fehlt Wir betrachten das Wort uv 0 xy 0 z. Da vy 1 fehlen nun einige der Symbole b, c, die in w auftauchten. Da aber vy kein a enthält, fehlen keine der a s. Damit enthält uv 0 xy 0 z mehr a s als b s oder c s, und ist somit nicht in L. b fehlt Wir betrachten das Wort uv 2 xy 2 z. Aus vy 1 folgt, dass in vy das Symbol a oder das Symbol c auftaucht. Damit enthält uv 2 xy 2 z mehr a s oder c s als b s und ist kein Element von L. c fehlt Wir betrachten das Wort uv 2 xy 2 z. Aus vy 1 folgt, dass in vy das Symbol a oder das Symbol b auftaucht. Damit enthält uv 2 xy 2 z mehr a s oder b s als c s und ist kein Element von L. Wir sehen also, dass es für diese Wahl von w keine Aufteilung mit vy 1 und vxy p gibt, so dass uv i xy i z L für alle i 0. Da dies für alle möglichen p s gilt, ist L nicht kontextfrei. Beispiel 2: Sei L = {a i b j c k 1 i j k}. Sei p N beliebig. Wir wählen w = a p b p c p L. Sei nun w = uvxyz eine beliebige Aufteilung von w, mit vy 1 und vxy p. Wir werden zeigen, dass dann immer ein i 0 existiert, so dass uv i xy i z L. Sei also w = uvxyz eine Aufteilung von w = a p b p c p mit vy 1 und vxy p. Aus vxy p schließen wir, dass vy nur zwei der drei Symbole a, b, c enthalten kann. Wir führen wieder eine Fallunterscheidung durch, basierend auf dem in vy fehlenden Symbol. a fehlt Wir betrachten das Wort uv 0 xy 0 z. Da vy 1 fehlen nun einige der Symbole b, c, die in w auftauchten. Da aber vy kein a enthält, fehlen keine der a s. Damit enthält uv 0 xy 0 z mehr a s als b s oder c s, und ist somit nicht in L. b fehlt Aus vy 1 folgt, dass in vy das Symbol a oder das Symbol c auftaucht. Taucht das Symbol a auf, so betrachten wir das Wort uv 2 xy 2 z. Dieses enthält in diesem Fall mehr a s als b s und ist kein Element von L. Taucht das Symbol c in vy auf, so betrachten wir uv 0 xy 0 z. Dieses Wort enthält in diesem Fall weniger c s als b s und ist kein Element von L. c fehlt Wir betrachten das Wort uv 2 xy 2 z. Aus vy 1 folgt, dass in vy das Symbol a oder das Symbol b auftaucht. Damit enthält uv 2 xy 2 z mehr a s oder b s als c s und ist kein Element von L. Für w = a p b p c p kann also keine Aufteilung mit vy 1 und vxy p gefunden werden, so dass uv i xy i z L für alle i 0. Daher kann L nicht kontextfrei sein.

145 5.10 Abschlusseigenschaften kontextfreier Sprachen In einer Übungsaufgabe wurde gezeigt, dass die regulären Sprachen unter Vereinigung abgeschlossen sind. D.h., sind L 1, L 2 regulär, so ist auch L 1 L 2 regulär. Beim Beweis wurde der Nichtdeterminismus von NFAs ausgenutzt. Denselben Beweis kann man nun für Kellerautomaten führen und erhält dann, dass für kontextfreie Sprachen L 1, L 2 auch die Sprache L 1 L 2 kontextfrei ist. Weiter kann unter Ausnutzung von Nichtdeterminismus und ɛ-bewegungen gezeigt werden, dass für kontextfreie Sprachen L 1 und L 2 auch ihr Produkt L 1 L 2 kontextfrei ist. Schließlich ist L 1 kontextfrei, wenn L 1 kontextfrei ist. Insgesamt haben wir also Satz 5.10.1 Seien L 1, L 2 kontextfreie Sprachen. Dann sind auch 1. L 1 L 2 2. L 1 L 2 3. L 1 kontextfreie Sprachen. Nun wollen wir an einem Beispiel zeigen, dass die kontextfreien Sprachen nicht unter Durchschnitt abgeschlossen sind. Wir werden zwei kontextfreie Sprachen L 1, L 2 angeben, deren Schnitt L 1 L 2 nicht kontextfrei ist. Hierzu sei und L 1 := {a i b j c j i, j 1} L 2 := {a i b i c j i, j 1}. L 1 ist das Produkt der beiden kontextfreien Sprachen {b j c j j 1} und {a i i 1} und daher nach Satz 5.10.1 auch kontextfrei. Dass L 1 kontextfrei ist, kann natürlich auch direkt durch die Angabe einer kontextfreien Grammatik G 1 mit L(G 1 ) = L 1 gezeigt werden. Wir können G 1 etwa wählen als G 1 = (V, Σ, P, S), wobei V = {S, A, B}, Σ = {a, b, c} und die Menge der Produktionen gegeben ist durch S AB A a A aa B bc B bbc Analog kann gezeigt werden, dass L 2 kontextfrei ist. Nun ist aber der Durchschnitt L 1 L 2 genau die Sprache {a n b n c n n 1}. Von dieser Sprache hatten wir mit Hilfe des Pumping Lemmas gezeigt, dass sie nicht kontextfrei ist. Damit ist gezeigt, dass der Schnitt kontextfreier Sprachen nicht kontextfrei sein muss. Nun folgt aber auch, dass das Komplement einer kontextfreien Sprachen nicht kontextfrei sein muss. Wir können nämlich den Schnitt zweier Sprachen L 1, L 2 Σ mit Hilfe von Vereinigung und Komplement folgendermaßen ausdrücken L 1 L 2 = Σ \ (Σ \L 1 Σ \L 2 ) = L 1 L 2. Wären nun die kontextfreien Sprachen unter Komplementbildung abgeschlossen, so müssten sie auch unter Durchschnitt abgeschlossen sein, denn unter Vereinigung sind die kontextfreien

146 Sprachen abgeschlossen. Da wir bereits wissen, dass die kontextfreien Sprachen nicht unter Durchschnitt abgeschlossen sind, sind sie es auch nicht unter Komplementbildung. Wir erhalten insgesamt Satz 5.10.2 Es existieren kontextfreie Sprachen L 1, L 2, so dass L 1 L 2 nicht kontextfrei ist. Weiter gibt es kontextfreie Sprachen, deren Komplement nicht kontextfrei ist. Es kann gezeigt werden, dass das Komplement von L = {a n b n c n n 1} kontextfrei ist. Aber wie wir mit Hilfe des Pumping Lemmas für kontextfreie Sprachen gesehen haben, ist L nicht kontextfrei. L ist also ein Beispiel einer kontextfreien Sprache, deren Komplement nicht kontextfrei ist.