• Keine Ergebnisse gefunden

Effiziente Algorithmen für die Konstruktion kontextfreier Grammatiken und die Entscheidung von Eigenschaften

6 Kontextfreie Grammatiken und Sprachen

6.5 Effiziente Algorithmen für die Konstruktion kontextfreier Grammatiken und die Entscheidung von Eigenschaften

kontextfreier Sprachen

Analog zur Behandlung regulärer Sprachen in Kapitel 4.5 wollen wir Abschlusseigenschaften für die Klasse kontextfreier Sprachen konstruktiv mit effizienten Algorithmen beweisen. Für einige Entscheidungsprobleme bei kontextfreien Sprachen sollen effiziente Algorithmen entworfen

werden, viele Probleme werden sich jedoch als nicht rekursiv erweisen.

Definition. Sei G eine kontextfreie Grammatik. Eine Variable A heißt nutzlos, wenn es keine Ableitung S →* w in T* gibt, in der A vorkommt.

Ohne die erzeugte Sprache zu verändern, können alle nutzlosen Variablen und alle Regeln, die mindestens eine nutzlose Variable enthalten, gestrichen werden.

Satz. Für kontextfreie Grammatiken G kann die Menge nutzloser Variablen in Zeit O(|V| s(G)) berechnet werden.

Beweis. Wir gehen in zwei Schritten vor, wobei wir die Menge nützlicher, das heißt nicht nutzloser Variablen konstruieren. Im ersten Schritt berechnen wir die Menge V' aller A in V, für die es ein w in T* mit A S →* w gibt. Variablen, die nicht in V' liegen, sind offensichtlich nutzlos. Wenn wir für diesen Schritt in allen Regeln alle Terminalzeichen durch c ersetzen, stellt sich die Aufgabe, die Menge aller A in V mit A S →* ε zu berechnen. Wir können also den entsprechenden Algorithmus für die Ersetzung aller ε-Regeln bei der Überführung einer kontextfreien Grammatik in Chomsky-Normalform benutzen.

Wenn S 1. V' ist, sind alle Variablen nutzlos, die gegebene Grammatik erzeugt die leere Sprache.

Sei also S in V'. Wir berechnen nun die Variablenmenge V" V' aller A in V', für die es a, ß in (V' ⊆ T)* mit S →* aAß gibt. Alle Variablen außerhalb von V" sind offensichtlich nutzlos. Zunächst

wird S in V" aufgenommen. Mit jeder Variablen A können alle Variablen B, für die es eine Regel A aBß mit a, ß in (V' T)* gibt, in V" aufgenommen werden. Dieser Schritt ist also sogar in Zeit ∪ O(s(G)) durchführbar. Die Korrektheit des Algorithmus lässt sich wieder leicht mit Induktion über die Länge der kürzesten S →* aAß-Ableitung beweisen.

Jede Variable in V" ist nützlich. Sei A in V". Dann gibt es a, ß in (V' T)* mit S →* aAß. Für alle ∪ Variablen B auf der rechten Seite dieser Ableitung gilt, dass sie in ein Wort aus T* ableitbar sind.

Also kommt A in der Ableitung eines Wortes aus T* von S aus vor.

Korollar. Für eine kontext freie Grammatik G kann in Zeit O(|V| s(G)) entschieden werden, ob L(G) = {} ist.

Beweis. Es ist offensichtlich L(G) = {} genau dann, wenn S nutzlos ist.

Die Tatsache, dass an dieser Stelle kein Algorithmus folgt, der entscheidet, ob L(G) = Σ* ist, sollte zu denken geben.

Satz. Für eine kontextfreie Grammatik G ohne nutzlose Variablen in Chomsky-Normalform kann in linearer Zeit entschieden werden, ob L( G) endlich viele oder unendlich viele Wörter enthält.

Beweis. Wir konstruieren einen gerichteten Graphen G*, der für jede Variable aus G einen Knoten enthält. Die Kante (A, B) gehört zum Graphen genau dann, wenn es eine Regel A → BC oder A → CB in G gibt. Mit dem Depth First Search Ansatz wird für diesen Graphen entschieden, ob er kreisfrei ist. Wir behaupten, dass der Graph genau dann kreisfrei ist, wenn L(G) nur endlich viele Wörter enthält.

Zum Beweis dieser Behauptung nehmen wir zunächst an, dass der Graph einen Kreis enthält. Dies bedeutet nach Definition des Graphen, dass es a, ß in V* mit |a| + |ß| ≥ 1 und A →* aAß gibt. Da A

nicht nutzlos ist, gibt es a', ß' in V* mit S →* a'Aß'. Da keine Variable nutzlos ist, gibt es u, v', v, w', w in T* mit |v| + |w| ≥ 1 (es gibt keine ε-Regeln), so dass A ~ u, a' ~ v', a ~ v, ß' ~ w', ß ~ w gilt.

Damit gehören die verschiedenen Wörter V'ViUWiW' für i ≥ 0 zu L(G). Sei nun angenommen, dass der Graph keinen Kreis enthält. Dann gilt für jeden Syntaxbaum, dass auf jedem Pfad jede Variable nur einmal vorkommt. Die Tiefe der Syntaxbäume ist also durch IVI beschränkt. Da es nur endlich viele dieser Syntaxbäume gibt, enthält die Sprache nur endlich viele Wörter.

Satz. Es seien kontextfreie Grammatiken G_1 = (V_1, T, S_1, P_1) und G 2 = (V_2, T, S_2, P_2) gegeben. Dann können kontextfreie Grammatiken für L(G_1) L(G_2), L(G_1)/L(G_2) und ∪ L(G_1)* in linearer Zeit konstruiert werden. Insbesondere ist die Klasse der kontextfreien Sprachen abgeschlossen gegen Vereinigung, Konkatenation und kleeneschen Abschluss.

Beweis Durch eventuelle Umbenennung einiger Variablen wird erreicht, dass V_I und V_2 disjunkt sind. Die Grammatik für L(G_1) L(G_2) hat folgendes Aussehen, wobei S eine neue Variable ist:∪ V = V_1 V_2 {S}, P = P_1 P_2 {S → S_1, S → S_2}.∪ ∪ ∪ ∪

Im ersten Schritt wird nichtdeterministisch entschieden, ob ein Wort aus L(G_1) oder aus L(G_2) erzeugt werden soll. Die Grammatik für L(G_1)/L( G 2) hat folgendes Aussehen:

V = V_1 V_2 {S}, P = P_1 P_2 {S → S_1S_2}.∪ ∪ ∪ ∪ Schließlich hat die Grammatik für L(G_1)* folgendes Aussehen:

V = V_1 {S}, P = H {S → ∪ ∪ ε, S → SS, S → S_1}.

Satz Die Klasse der kontextfreien Sprachen ist nicht abgeschlossen gegen Durchschnittsbildung oder Komplementbildung.

Beweis Es seien L_1 = {a^n b^n | n ≥ 1}, L_2 = {c} *, L_3 = {a} * und L_4 = {b^n c^n | n ≥ 1}.

Wir wissen bereits, dass diese Sprachen kontextfrei sind. Es sind somit auch L_1 L_2 und L_3 L_4 kontextfrei. Die Sprache L = L_1 L_2 geschnitten L_3 L_4 ist gerade die Sprache L = {a^n b^n c^n|

n ≥ 1}, die nicht kontextfrei ist.

Die Klasse der kontextfreien Sprachen ist abgeschlossen gegen Vereinigung. Wenn sie gegen Komplementbildung abgeschlossen wäre, dann wäre sie nach der de Morgan Regel L_1 geschnitten L_2 = ¬(¬ L_1 ¬L_2) auch gegen Durchschnittsbildung abgeschlossen.∪

Satz. Gegeben seien eine kontextfreie Grammatik G = (V, T, S, P) für die Sprache L und

kontextfreie Grammatiken G_a = (V_a, Δ, S_a, P_a), a in T, für die Sprachen f (a) Teilmenbe Δ*

einer Substitution f. Dann kann in linearer Zeit eine kontextfreie Grammatik für die durch Substitution gebildete Sprache f (L) konstruiert werden. Insbesondere ist die Klasse der kontextfreien Sprachen abgeschlossen gegen Substitutionen.

Beweis Durch eventuelle Umbenennung einiger Variablen erreichen wir, dass die Mengen V und V_a, a in T, paarweise disjunkt sind. Die Grammatik für f(L) bauen wir folgendermaßen auf. Die Variablenmenge bestehe aus der Vereinigung von V und allen V_a, a in T. Das Startsymbol S von G wird auch Startsymbol der neuen Grammatik. Die Menge der Ableitungsregeln bestehe aus der Vereinigung von P und allen P_a, a in T, wobei in den Regeln aus P zuvor die Terminalbuchstaben a in T durch die Startsymbole S_a von G_a ersetzt worden sind. Was kann nun aus S abgeleitet

werden? Wenn wir zunächst die Variablen Sa nicht weiter ableiten, erhalten wir alle S_{a_1} ...

S_{a_n} mit a_1 ... a_n in L. Aus Sa können genau die Wörter in f(a) abgeleitet werden. Also können aus S wie gewünscht genau die Wörter in

f(L) = U_ {a_1 .. a_n in L} f(a_1)...f(a_n) abgeleitet werden.

Uns fällt auf, dass dieser Beweis sehr viel einfacher ist als unser entsprechender Beweis für reguläre Sprachen. Für den Abschluss gegen Substitution ist die Darstellung von Sprachen durch

Grammatiken angemessener.

Die Überlegungen spiegeln die entgegengesetzte Sichtweise von Maschinen (versuche für ein Eingabewort den akzeptierenden Zustand zu erreichen) und Grammatiken (erzeuge aus dem Startsymbol alle Wörter der Sprache) wider.