André Vratislavsky
Übungsgruppe vom 08.02.2000
(Zu diesen Themen siehe auch Ingo Wegener, Kompendium Informatik)
Kontextfreie Sprachen/Grammatiken
Kontextfreie Sprachen sind ein mächtigeres Konzept als das der regulären
Sprachen, so daß mit Ihnen auch Wörter dargestellt werden können,
die nicht in regulären Sprachen enthalten sind. Z.B. ist {anbn|
n nat. Zahl} kontextfrei aber nicht regulär. Man kann das so formulieren:
"Ein
endlicher Automat ist nicht in der Lage die Anzahl n der a's sich zu "merken",
um sie mit der Anzahl der b's zu vergleichen."
Kontextfreie Sprachen sind ein wichtiges Konzept zur Darstellung von
Programmiersprachen. Sie erlauben eine effiziente Lösung des Wortproblems.
Zur Darstellung von Kontextfreien Programmiersprachen ist die Bachus-Naur-Form
bekannt.
Der Begriff "kontextfrei" geht auf die Produktionsregeln zurück,
in denen das Ergebnis nicht vom Kontext der Ausgangsterme abhängt.
Das heißt, die linke Seite der Ableitungsregeln darf nur aus einer
Variablen bestehen, also keinen Kontext aufweisen.
Es sind also nur Regeln von der Form A->w mit A ein Nichtterminalsymbole
und w ein Wort aus Terminal- oder Nichtterminalsymbolen erlaubt.
Beispiel:
Gegeben: L={anbn|n nat.Zahl}
Behauptung: L= L(G) mit G=(V,T,P,S), wobei V={A}, T={a,b}, P={A->asb,
A->epsilon}, S=A.
Beweis:
Es sind zwei Richtungen zu zeigen!
I) Sei w aus L. Dann läßt sich w=anbn
wie folgt mit Regeln aus G erzeugen:
Die Ableitung A =G> aAb =G> aaAbb =G>
... =G> anAbn =G> an(epsilon)bn=anbn
verwendet nur Regeln aus G.
II) Sei w aus L(G). Alle Ableitungen aus G führen zum Ergebnis
anbn aus L:
A =G> aAb =G> aaAbb =G> ... =G>
anAbn =G> an(epsilon)bn=anbn
.
Syntaxbäume
Faßt man die Startvariable S als Wurzel auf, so läßt sich
eine Ableitung eines aus Produktionen einer kontextfreien Grammatik gebildeten
Wortes als Syntaxbaum darstellen. Die Variable vor dem Pfeil ist jeweils
der Vater, die Symbole hinter dem Pfeil sind die Söhne. An den Blättern
kann das gebildete Wort abgelesen werden. Für jedes Wort gibt es einen
Baum. Es kann aber unter Umständen auch mehrere geben.
Es gibt keine Verbindungen zwischen den Teilbäumen, da es bei
den Produktionen nicht auf die Kombination der Väter ankommt (Kontextfreiheit).
Wenn für jedes Wort einer kontextfreien Grammatik nur ein Syntaxbaum
möglich ist, heißt die Grammatik "eindeutig", sonst "mehrdeutig".
Im allgemeinen sind wiederum für jeden Syntaxbaum mehrere Ableitungen
möglich. Ersetzt man stets die linkeste Variable, so spricht man von
der "Linksableitung".
Die Tatsache, daß man bei kontextfreien Grammatiken nur Syntaxbäume
und nicht etwa beliebige Graphen untersuchen muß, läßt
die effiziente Lösbarkeit des Syntaxanalyseproblems vermuten, also
des Problems, zu entscheiden, ob ein Wort mit einer bestimmten Grammatik
gebildet werden kann.
Bei regulären Grammatiken kommt man sogar mit Syntaxlisten aus.
Überführung einer kontextfreien Grammatik in Chomsky-Normalform
(CNF)
Alle Regeln einer CNF haben die Form A->BC oder A->a, wobei A,B,C Variablen,
a Terminalzeichen.
Jede kontextfreie Grammatik, die nicht das leere Wort erzeugt, kann
in CNF überführt werden.
Vorgehensweise:
1. Ziel: Auf rechter Seite nur Variablen oder nur ein Terminalsymbol.
- Ersetze Terminalsymbol a durch Ya.
- Regel Ya->a einfügen.
2. Ziel: Alle rechten Seiten haben Länge kleinergleich 2.
- Beispiel: A->B1B2B3B4
ersetzen durch
A->B1C1, C1->B2C2,
C2->B3B4
Dabei werden die neuen Variablen C1, C2 benutzt.
3. Ziel: Keine Regeln A->epsilon.
- Streiche Regeln A->epsilon.
- Füge zusätzlich Kettenregel A->B ein für A->BC mit
C=*>epsilon (bzw. für A->CB)
4. Ziel: Chomsky-Normalform.
- Kettenregel A->B streichen.
- Dafür für alle Regeln B->r Regel A->r
hinzufügen.
Younger-Algorithmus
Mit dem Younger-Algorithmus kann das Wortproblem einer kontextfreien Sprache
in Chomsky-Normalform mit dynamischer Programmierung gelöst werden.
(Bottom-up-Methode: Alle Teilprobleme werden nach wachsender Problemgröße
gelöst und die Lösungen in einer Tabelle gespeichert.)
Ein Teilproblem Vij bei der Syntaxanalyse von w = w1...wn
ist die Frage, aus welchen Variablen sich das Teilwort wi...wj
ableiten läßt.
Für alle i,j<=n werden die Teilprobleme Vij untersucht
und die Lösungen in einer Tabelle notiert:
-
Vii ist leicht zu lösen (Wortlänge 1). Der Tabelleneintrag
Vii enthält alle Variablen A, für die A->wi
eine Regel der gegebenen Grammatik ist. ->Unterste Zeile in Tabelle.
-
Dann alle Regeln A->BC und alle Trennstellen k mit i<=k<j untersuchen.
Nach Wahl von B, C und k ist nur zu überprüfen, ob B in Vik
und C in Vk+1,j eingetragen ist.
Das eigentliche Problem ist V1,n. Das Wort w ist genau dann
ableitbar, wenn das Startsymbol S in V1,n ganz oben in der Tabelle
eingetragen ist.
Abschlußeigenschaften kontextfreier Sprachen
Kontextfreie Sprachen sind abgeschlossen gegenüber Vereinigung,
Konkatenation, *-Bildung und Durchschnitt mit regulärer Menge
Kontextfreie Sprachen sind NICHT abgeschlossen gegenüber
Durchschnitt, Komplement .
Das Pumping-Lemma für kontextfreie Sprachen
Das Pumping-Lemma für reguläre Sprachen ist eine notwendige,
aber nicht hinreichende Eigenschaft regulärer Sprachen.
L regulär =>
Es ex. eine nat. Zahl N (z.B. Zustandszahl)
So daß für alle Worte w aus L mit
|w|>=N
Eine Zerlegung w=uvx
ex. mit |uv|<=N (Anfangsstück) und |v|>=1 (Pumpstelle)
So daß für alle i>=0 gilt: uvix ist aus L.
Die Kontraposition dieses Satzes dient zum Nachweis der Nichtregularität:
Für alle Nat. Zahlen N
Gibt es ein Wort w aus L mit |w|>=N
So daß für
alle Zerlegungen w=uvx mit |uv|<=N und |v|>=1
Ein i>=0 ex., so daß gilt: uvix ist nicht aus L.
=> L ist nicht regulär.
Das Pumping-Lemma für kontextfreie Sprachen ist eine notwendige,
aber nicht hinreichende Eigenschaft kontextfreier Sprachen.
L kontextfrei =>
Es ex. eine nat. Zahl N
So daß für alle Worte z aus L mit
|z|>=N
Eine Zerlegung z=uvwxy
ex. mit |vwx|<=N (Mittelstück) und |vx|>=1 (Pumpstelle)
So daß für alle i>=0 gilt: uviwxiy ist
aus L.
Die Kontraposition dieses Satzes dient zum Nachweis der Nichtkontextfreiheit:
Für alle Nat. Zahlen N
Gibt es ein Wort z aus L mit |z|>=N
So daß für
alle Zerlegungen z=uvwxy mit |vwx|<=N und |vx|>=1
Ein i>=0 ex., so daß gilt: uviwxiy ist nicht
aus L.
=> L ist nicht kontextfrei.
WICHTIG:
Der umgekehrte Schluß (<=) gilt nicht!
D.h., Kontextfreiheit ist nicht durch das Pumping-Lemma beweisbar!
Beispiel
L={0n1n2n|n nat.Zahl}
Sei N nat. Zahl
Wähle Wort z=0N1N2N,
|z|=3N>=N
Sei Z=uvwxy bel. Zerlegung
mit |vwx|<=N, |vx|>=1
Wähle i=2:
1.Fall:
v oder x enthalten zwei Buchstabentypen
=> in uv2wx2y wird Reihenfolge 0-1-2 nicht eingehalten
2.Fall:
v und x enthalten jeweils nur einen Buchstabentyp
=> ein oder zwei Buchstabentypen werden gepumpt und einer nicht
=> uv2wx2y ist nicht vom Typ 0n1n2n
=> L ist nicht kontextfrei.