knoten v programmiersprachen

Werbung
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
Herunterladen