Das Wortproblem [T6.3] Wortproblem für kontextfreie Grammatiken Eingabe: Eine kontextfreie Grammatik G und ein Wort w. Frage: Ist w∈L(G)? Motivation: Entwurf v. Programmiersprachen Wortproblem Programm syntaktisch korrekt? 510 CYK-Algorithmus • benannt nach Cocke, Younger, Kasami • löst das Wortproblem für kontextfreie Grammatiken in Chomsky-Normalform • Ansatz: Dynamische Programmierung • Rechenzeit O(n3|P |) — zu langsam für Compiler 511 CYK-Algorithmus Eingabe: Wort w1...wn Definiere: * wi...wj. Vi,j: Menge der Variablen A mit A Idee: Berechne die Mengen Vi,j mit wachsender Differenz j – i und speichere die berechneten Mengen. • i=j. Vi,i = {A | es gibt die Regel Awi} 512 CYK-Algorithmus • j>i. Dann kann wi...wj aus A hergeleitet werden, wenn A B C * * wi ... wk wk+1 ... wj für eine passende Regel ABC und passenden Schnittpunkt k∈{i,…,j–1}. Also: Vi,j = { A | ∃ Regel ABC und ∃ k∈{i,…,j–1} mit B∈Vi,k und C∈ Vk+1,j } Vi,j: Menge der Variablen A mit A * wi...wj. 513 CYK-Algorithmus • Entscheidung: w1...wn∈ L(G) ⇔ S∈V1,n. • Rechenzeit: – Es sind O(n2) Mengen Vi,j zu berechnen. – Jede Berechnung kostet O(n|P |) Rechenzeit. Durchprobieren Rechenzeit O(n3|P |). aller Regeln Durchprobieren aller k Vi,j: Menge der Variablen A mit A * wi...wj. 514 Pumping-Lemma [T6.4] Ziel: Kriterium, um zu zeigen, dass eine Sprache nicht kontextfrei ist. Satz T6.4.1: Sei L eine kontextfreie Sprache. Dann gibt es eine Konstante n, so dass sich jedes z∈L mit |z|≥n in z=uvwxy zerlegen lässt, wobei |vwx|n und |vx|≥1 gilt und weiterhin für alle i≥0 auch uviwxiy∈ L gilt. 515 Kontraposition L kontextfrei ⇒ ∃ n∈N ∀ z∈L mit |z|≥n ∃ Zerl. z=uvwxy mit |vwx|n und |vx|≥1 ∀ i≥0 : uviwxiy∈L ∀ n∈N ∃ z∈L mit |z|≥n ∀ Zerl. z=uvwxy mit |vwx|n und |vx|≥1 ∃ i≥0 : uviwxiy∉L ⇒ L nicht kontextfrei 516 Anwendung L={anbncn| n≥1} • Gegner gibt uns Wert n vor. • Wir wählen z=anbncn∈L. • Gegner wählt Zerl. z=uvwxy mit |vwx|n, |vx|≥1. vx enth. nur zwei versch. Buchst. • Wir wählen i=2. Dann uv2wx2y∉L. ∀ n∈N ∃ z∈L mit |z|≥n ∀ Zerl. z=uvwxy m. |vwx|n u. |vx|≥1 ∃ i≥0 : uviwxiy∉L ⇒ L nicht kontextfrei 517 L={w∈{a,b,c}* | |w|a=|w|b=|w|c} • Gegner gibt uns Wert n vor. • Wir wählen z=anbncn∈L. • Gegner wählt Zerl. z=uvwxy mit |vwx|n, |vx|≥1. vx enth. nur zwei versch. Buchst. • Wir wählen i=2. Dann uv2wx2y∉L. ∀ n∈N ∃ z∈L mit |z|≥n ∀ Zerl. z=uvwxy m. |vwx|n u. |vx|≥1 ∃ i≥0 : uviwxiy∉L ⇒ L nicht kontextfrei 518 L={ww | w∈{0,1}*} • Gegner gibt uns Wert n vor. • Wir wählen z=0n1n0n1n∈L. • Gegner wählt Zerl. z=uvwxy mit |vwx|n, |vx|≥1 ⇒ vx enth. nur Nullen bzw. Einsen nur aus einem der beiden Blöcke. • Wir wählen i=2. Dann uv2wx2y∉L. ∀ n∈N ∃ z∈L mit |z|≥n ∀ Zerl. z=uvwxy m. |vwx|n u. |vx|≥1 ∃ i≥0 : uviwxiy∉L ⇒ L nicht kontextfrei 519 L={aibjcidj | i,j≥ 0} • Gegner gibt uns Wert n vor. • Wir wählen z=anbncndn∈L. • Gegner wählt Zerl. z=uvwxy mit |vwx|n, |vx|≥1 ⇒ vx enth. nicht gleichzeitig a´s und c´s (bzw. b´s und d´s). • Wir wählen i=2. Dann uv2wx2y∉L. ∀ n∈N ∃ z∈L mit |z|≥n ∀ Zerl. z=uvwxy m. |vwx|n u. |vx|≥1 ∃ i≥0 : uviwxiy∉L ⇒ L nicht kontextfrei 520 Beweis des Pumping-Lemmas Sei L kontextfrei und G zug. Grammatik in Chomsky-Normalform. • Wir wählen n=2|V |+1. • Gegner wählt z∈L mit |z|≥n. Betrachte Syntaxbaum von z. L kontextfrei ⇒ ∃ n∈N ∀ z∈L mit |z|≥n ∃ Zerl. z=uvwxy m. |vwx|n u. |vx|≥1 ∀ i≥0 : uviwxiy∈L 521 Syntaxbaum von z∈L mit |z|≥n Starte an Wurzel und gehe jeweils in den Teilbaum mit der größeren Anzahl von Blättern S A B a C Resultat: Pfad mit ≥ log n ≥ |V |+1 inneren Knoten Variable doppelt auf dem Pfad. D d E b F c 522 Syntaxbaum Sei A eine unter den letzten |V |+1 Var. auf dem Pfad mehrfach vork. Variable. Wir geben Zerlegung an: • w: vom letzten A abgeleitetes Teilwort • vwx: vom vorletzten A abgeleitetes Teilwort • u, y: Rest von z Kopieren des grünen Bereichs ergibt Syntaxbaum für u uviwxiy. S A A v w x y 523 Weiteres Beispiel L={arbsctdu | r=0 ∨ s=t=u} Nahe liegende Vermutung: L nicht kontextfrei. Kann man mit dem Pumping-Lemma nicht zeigen. • r=0: „Pumpen“ erzeugt Wort aus L. • r>0: „Pumpen“ der a´s erzeugt Wort aus L. ∀ n∈N ∃ z∈L mit |z|≥n ∀ Zerl. z=uvwxy m. |vwx|n u. |vx|≥1 ∃ i≥0 : uviwxiy∉L ⇒ L nicht kontextfrei 524 Ogdens Lemma (T6.4.2) L kontextfrei ⇒ ∃ n∈N ∀ z∈L mit |z|≥n ∀ Markierungen von mindestens n Buchstaben in z ∃ Zerl. z=uvwxy mit vwx enthält n mark. Buchstaben und vx enth. ≥1 mark. Buchst. ∀ i≥0 : uviwxiy∈L Beweis ähnlich zum Pumping-Lemma 525 Beweis von Ogdens Lemma Sei L kontextfrei und G zug. Grammatik in Chomsky-Normalform. • Wir wählen n=2|V |+1. • Gegner wählt z∈L mit |z|≥n und markiert mindestens n Buchstaben. Betrachte Syntaxbaum von z. L kontextfrei ⇒ ∃ n∈N ∀ z∈L mit |z|≥n ∀ Markierungen von mindestens n Buchstaben in z 526 Syntaxbaum von z∈L mit |z|≥n Starte an Wurzel und gehe jeweils in den Teilbaum mit der größeren Anz. v. mark. Buchst. Verzweigungsknoten: Knoten auf dem Pfad, so dass in beiden Teilbäumen markierte Knoten sind. S A B a C Resultat: Pfad mit ≥ log n ≥ |V |+1 Verzweigungsknoten Variable doppelt auf den letzten |V |+1 Verzweigungsknoten. D d E b F c 527 Syntaxbaum Sei A eine unter den letzten |V |+1 Verzw.knoten auf d. Pfad mehrfach vork. Var. Wir geben Zerlegung an: • w: vom letzten A abgeleitetes Teilwort • vwx: vom vorletzten A abgeleitetes Teilwort • u, y: Rest von z Kopieren des grünen Bereichs ergibt Syntaxbaum für u uviwxiy. S A A v w x y 528 Anwendung von Ogdens Lemma L={arbsctdu | r=0 ∨ s=t=u} • Gegner gibt uns Wert n vor. • Wir wählen z=abncndn∈L u. markieren bcnd. • Gegner wählt Zerl. z=uvwxy. Da vwx höchstens n markierte Buchstaben enthält, enthält vx nicht zugleich b´s und d´s. • Wir wählen i=2. Dann uv2wx2y∉L. 529 Weitere Anwendung L={aibjck | i≠j ∧ i≠k ∧ j≠k} Behauptung: L nicht kontextfrei. Beweis: Anwendung von Ogdens Lemma. • Gegner gibt uns Wert n vor. • Wir wählen z=anbn+n!cn+2n! ∈ L und markieren an. • Gegner wählt Zerl. z=uvwxy. Wg. Markierung enth. v oder x mind. ein a. • Unser Ziel: i so wählen, dass uviwxiy∉L. 530 z=uvwxy=anbn+n!cn+2n! ∈ L 1. Fall: v enthält mind. ein a und mind. einen weiteren anderen Buchstaben. Beim Pumpen wird die Reihenfolge a-b-c zerstört uv2wx2y∉L. 2. Fall: v=ar und x=as, r+s≥1. Dann: r+sn p=r+s Teiler von n!. Wähle i=1+n!/p. Dann uviwxiy = an+n!bn+n!cn+2n! ∉L 531 z=uvwxy=anbn+n!cn+2n! ∈ L 3. Fall: v=ap und x=b*. Wähle i=1+2n!/p. Dann uviwxiy = an+2n!b?cn+2n! ∉L. 4. Fall: v=ap und x=c*. Wähle i=1+n!/p. Dann uviwxiy = an+n!bn+n!c? ∉L. 532 z=uvwxy=anbn+n!cn+2n! ∈ L 5. Fall: v=ap, und x enthält mind. zwei verschiedene Buchstaben. Beim Pumpen wird die Reihenfolge a-b-c zerstört uv2wx2y∉L. 533 Abschlusseigenschaften u. Algos Ziele: • Vereinfachung von kontextfreien Grammatiken • Konstruktion von kontextfreien Grammatiken 534 Nutzlose Variablen Def. T.6.5.1: Sei G eine kontextfreie Grammatik. Eine Variable heißt nutzlos, wenn sie in keiner Ableitung S * w∈T* vorkommt. Klar: • Nutzlose Variablen und Regeln, in denen sie vorkommen, dürfen gestrichen werden. • Die von einer Grammatik erzeugte Sprache ist leer, wenn S nutzlos ist. 535 Entfernen nutzloser Variablen Schritt 1: Berechne Menge V´ von Var. A mit * Aw∈T *. Idee: • Ersetze in allen Regeln Terminalzeichen durch ε. • Wende Algo aus Schritt 3 der Umformung in Chomsky-Normalform an, um die Menge V´ * zu finden. von Variablen A mit Aε Alle Variablen außerhalb von V´ nutzlos, also alle solchen Variablen u. zug. Regeln löschen. Rechenzeit: O(|V|s(G)). 536 Entfernen nutzloser Variablen Schritt 2: Sei S∈V´. Berechne Menge V´´⊆V´ * aller Variablen A, so dass SαAβ mit α,β∈(V´∪T)*. Algorithmus: • S in V´´ aufnehmen. • Zu jeder Var. A, die in V´´ aufgenommen wird, alle Var. B mit Regel AαBβ in V´´ aufnehmen. Korrektheit des Algo: einfache Induktion. Rechenzeit: O(|V|s(G)). 537 Korrektheit des Ansatzes 1. Behauptung: Alle Variablen in V´´ sind nicht nutzlos. Sei A∈V´´. Dann S * αAβ mit α,β∈(V´∪T )*. Aus A, den Variablen in α und in β sind Wörter aus T * ableitbar. A kommt in einer Ableitung vor. 2. Behauptung: Alle nicht nutzlosen Variablen sind in V´´. 538 • Gesamte Rechenzeit: O(|V|s(G)). Folgerung T6.5.3: Für eine kontextfreie Grammatik G kann in Zeit O(|V|s(G)) entschieden werden, ob L(G)=∅ ist. 539 Endlichkeitstest Satz T6.5.4: Für eine kontextfreie Grammatik G in Chomsky-Normalform und ohne nutzlose Variablen kann in Zeit O(s(G)) entschieden werden, ob L(G) endlich ist. Beweis: Konstruiere Graphen H: • Knoten: Variablen • Kanten AB und AC für jede Regel ABC. 540 Endlichkeitstest Behauptung: L(G) endlich ⇔ H kreisfrei. „⇒“: H enthalte einen Kreis * Dann: AαAβ mit α≠ε oder β≠ε. Da es keine nutzlosen Variablen gibt, folgt * • Sα´Aβ´ * * v, β´ * v´, Au * w´, β * w, α´ • α • Insgesamt folgt: S * w´wiuviv´ für alle i∈N, also L(G) unendlich. 541 L(G) endlich ⇔ H kreisfrei. „⇐“: H sei kreisfrei. Dann enthält jeder Syntaxbaum auf jedem Pfad jede Variable höchstens einmal. Tiefe aller Syntaxbäume durch |V | beschränkt. Da es nur endlich viele solche Syntaxbäume gibt, ist L(G) endlich. 542 Abschlusseigenschaften Satz T6.5.5: Die kontextfreien Sprachen sind gegen Vereinigung, Konkatenation und kleeneschen Abschluss abgeschlossen. Beweis: Vereinigung: Seien G1, G2 Grammatiken für L1, L2. O.B.d.A. seien Variablenmengen disjunkt. Erzeuge Regel SS1, SS2 und übernimm alle Regeln von G1, G2 Grammatik für L1∪L2. 543 Konkatenation Seien G1, G2 Grammatiken für L1, L2. O.B.d.A. seien Variablenmengen disjunkt. Erzeuge Regel SS1S2 und übernimm alle Regeln von G1, G2 Grammatik für L1L2. 544 Kleenescher Abschluss Sei G Grammatik für L. Erzeuge neues Startsymbol S´, die Regeln S´ε, S´S´S´, S´S und übernimm alle Regeln von G Grammatik für L*. 545 Durchschnitt und Komplement Satz T6.5.6: Die kontextfreien Sprachen sind nicht gegen Durchschnitt und Komplement abgeschlossen. Beweis: (Durchschnitt) L1={anbn | n≥1}, L2 ={c*}, L3={a*}, L4={bncn | n≥1} und damit auch L1L2 sowie L3L4 sind kontextfrei, aber (L1L2) ∩ (L3L4) = {anbncn | n≥1} nicht. 546 Komplement 1. Beweis: Annahme: Kontextfreie Sprachen sind gegen Komplementbildung abgeschlossen. Seien L1,L2 kontextfrei. Dann ist auch L1∩L2 = L1∪L2 kontextfrei. 2. Beweis: {anbncn| n≥1} ist kontextfrei Übungen. 547 Unentscheidbare Probleme Folgende Probleme sind für geg. kontextfreie Grammatiken G, G1, G2 unentscheidbar. • Ist L(G)=T*? (Vollständigkeitstest) • Ist L(G1)=L(G2)? (Äquivalenztest) • Ist L(G1)⊆L(G2)? • Ist L(G1)∩L(G2)=∅? (Schnittproblem) • Ist L(G1)∩L(G2) kontextfrei? • Ist L(G) kontextfrei? • Ist G mehrdeutig? • Berechne G´ mit L(G)=L(G´) und s(G´) minimal. (Minimierungsproblem) 548 Schnittproblem Satz T6.6.1: Für kontextfreie Grammatiken G1 und G2 ist der Test, ob L(G1)∩L(G2)=∅ gilt, unentscheidbar. Beweis: Reduktion PKP Schnittproblem Erinnerung PKP: Eingabe: K=((x1,y1),...,(xk,yk)) endliche Folge von Wortpaaren über endl. Alphabet Σ. Frage: Gibt es Folge i1,...,in∈{1,...,k}, n≥1, mit xi1xi2...xin=yi1yi ...yi ? 2 n 549 Reduktion PKP Schnittproblem Sei Eingabe K=((x1,y1),...,(xk,yk)) für das PKP gegeben. Die Grammatik G1 hat die Regeln: S1 a1x1, ..., akxk, a1S1x1, ...,akS1xk. mit neuen Terminalsymbolen a1,...,ak. Damit: L(G1)={ai(n)...ai(1)xi(1)...xi(n)} Folgen von Terminalsymbole ai mögliche PKP-Lösungen 550 Die Grammatik G2 hat die Regeln: S2 a1y1, ..., akyk, a1S2y1, ...,akS2yk. Damit: L(G1)={ai(n)...ai(1)xi(1)...xi(n)} L(G2)={ai(n)...ai(1)yi(1)...yi(n)} • Reduktionsfunktion f:K → (G1,G2). • PKP-Problem K hat Lösung ⇔ L(G1)∩L(G2)≠∅. Denn: xi(1)...xi(n) ist Lösung für K ⇔ xi(1)...xi(n)= yi(1)...yi(n) ⇔ ai(n)...ai(1)xi(1)...xi(n) ∈ L(G1)∩L(G2). 551 Mehrdeutigkeitsproblem Satz T6.6.2: Das Mehrdeutigkeitsproblem für kontextfreie Gram. ist nicht entscheidbar. Beweis: Reduktion PKP Mehrdeutigkeitsproblem Erzeuge Gram. G mit Regeln SS1, SS2, sowie allen Regeln aus dem vorh. Beweis. Dann: xi(1)...xi(n) ist Lösung für K ⇔ ai(n)...ai(1)xi(1)...xi(n)= ai(n)...ai(1)yi(1)...yi(n) ist aus S1 und S2 herleitbar. ⇔ G mehrdeutig 552 Fazit zu kontextfreien Sprachen • Geeignet, um viele Konstrukte aus gängigen Programmiersprachen zu beschreiben Backus-Naur-Form • Wortproblem nur „einigermaßen“ effizient lösbar. • Viele interessante Probleme für kontextfreie Sprachen nicht entscheidbar. • Wichtige Eigenschaften: Pumping-Lemma, Ogdens Lemma, Abschlusseigenschaften 553 Chomsky-1-Sprachen Satz T5.4.5: L1=NTAPE(n). • Dabei ist NTAPE(n) die Menge der von NTMs mit linearem Platz berechenbaren Sprachen. • Beweis des Satzes ähnlich zu L0={Menge der rekursiv aufz. Sprachen} Folgerung: Alle Chomsky-1-Sprachen sind rekursiv und deterministisch in exponentieller Zeit berechenbar. 554 Abschlusseigenschaften Die Chomsky-1-Sprachen sind gegen • Vereinigung (Beweis analog zu kontextfr. Spr.) • Komplement (Satz von Immerman/Szelépcsenyi) • Durchschnitt (Anwendung der de-Morgan-Regeln) abgeschlossen. 555 Chomsky-1-Sprachen L1 enthält NP-schwere Probleme, z.B., Cliquedec∈ L1 (=NTAPE(n)): Durchprobieren aller k-elementigen Mengen von Knoten und der Test, ob sie eine Clique bilden, geht (sogar deterministisch) auf linearem Platz. Fazit: Chomsky-1-Sprachen zur Beschreibung von Programmiersprachen ungeeignet. 556 Überblick über die Sprachklassen Chomsky-0 Chomsky-1 Chomsky-2 Chomsky-3 rekursiv aufz. Sprachen kontextsens. Sprachen kontextfreie Sprachen reguläre Sprachen Grammatiken kontextohne Einsensitive schränkungen Grammatiken kontextfreie Grammatiken rechtslineare Grammatiken, reguläre Ausdrücke Det./Nichtdet. TuringMaschinen Abschluss unter ∩,∪, ()*,· nicht unter Nichtdeterm. Kellerautom. (NPDAs) Abschluss u. ∪,()*,·, nicht unter ∩, DFAs, NFAs Linear bandbeschr. NTMs(NLBAs) Abschluss u. ∩,∪, ,()*,· Abschluss u. ∩,∪, ,()*,· 557