4.2 Die Chomsky Normalform Für algorithmische Problemstellungen (z.b. das Wortproblem) aber auch für den Nachweis von Eigenschaften kontextfreier Sprachen ist es angenehm, von CFG in Normalformen auszugehen. Eine der wichtigsten Normalformen für CFG ist die Chomsky Normalform. Definition 4.2.1 (Chomsky Normalform (CNF)). Sei G =(V,Σ,P,S) eine CFG. G heißt in CNF, falls alle Produktionen in G von der Form a für ein a Σ oder BC für Nichtterminale B, C sind. Wir sprechen von einer CNF-Grammatik, um eine CFG in CNF zu bezeichnen. Z.B. ist die CFG mit den Regeln S D B, D SD d, a, B b in CNF; nicht aber die CFG mit den Regeln S asb ab. Satz 4.2.2. Zu jeder CFG G mit ε/ L(G) gibt es eine äquivalente CFG in CNF. Beweis. Sei G =(V,Σ,P,S) eine CFG mit ε/ L(G). Wir geben nun ein Verfahren an, mit dem G in eine äquivalente CFG G in CNF überführt werden kann. 1. Zunächst erstellen wir eine zu G äquivalente ε-freie CFG G 1. Wegen ε/ L(G), enthält diese keine ε-regeln. 2. Im zweiten Schritt führen wir G 1 in eine äquivalente CFG G 2 ohne Kettenregeln, d.h. ohne Regeln der Form B, über. Dazu wenden wir das in lgorithmus 15 (Seite 147) angegebene Verfahren an. Der erste Teil von lgorithmus 15 läßt sich mit einem lgorithmus durchführen, der die starken Zusammenhangskomponenten des Digraphen (V,E), wobei (,B) E genau dann, wenn B eine Kettenregel in G 1 ist, berechnet, daraus den zugehörigen azyklischen Digraphen G der starken Zusammenhangskomponenten erstellt und anschließend eine topologische Sortierung für G bestimmt. 3. G 2 wird durch eine äquivalente CFG G 3 ersetzt, in der sämtliche Regeln die Form a oder B 1 B 2...B k mit k 2 haben, wobei,b 1,...,B k Variablen sind und a ein Terminal. Hierzu gehen wir wie folgt vor. Jede Regel yaz mit yz 1 in G 2 wird durch y a z ersetzt. Dabei ist a ein neues Nichtterminal mit der Regel a a. (D.h. aus a ist nur das Wort a ableitbar.) 13 13 In Schritt 3 ist es offenbar ausreichend, nur für solche Terminalzeichen a ein neues Nichtterminal a einzuführen, für die es nach usführung von Schritt 1 eine Regel x gibt, so daß x 2 und a in x vorkommt. Weiter kann man a = setzen, falls eine bereits existente Variable ist, für die es genau die Regel a gibt. 146
4. Im letzten Schritt ersetzen wir G 3 durch eine äquivalente CNF-Grammatik G 4. Hierzu müssen alle Regeln B 1...B k mit k 3 von G 3 in CNF-Gestalt gebracht. Die Vorgehensweise ist wie folgt. Für jede Regel B 1 B 2...B k in G 3 mit k 3 fügen wir neue, paarweise verschiedene Nichtterminale C 1,C 2,...C k 2 ein und ersetzen die Regel B 1 B 2...B k durch folgende Regeln: B 1 C 1 C 1 B 2 C 2. C k 3 B k 2 C k 2 C k 2 B k 1 B k Die neuen Variablen C 1,C 2,...C k 2 tauchen in keinen weiteren Regeln auf. Die Motivation für die Ersetzung der Regel B 1 B 2...B k durch die angegebenen CNF-Regeln besteht darin, jede nwendung der Regel B 1...B k in G 3 durch die Rechtsableitung in G 4 zu simulieren. B 1 C 1 B 1 B 2 C 2 B 1 B 2 B 3 C 3... B 1 B 2...B k 2 C k 2 B 1 B 2...B k 2 B k 1 B k Da L(G)=L(G 1 )=L(G 2 )=L(G 3 )=L(G 4 ) und da G 4 offenbar eine CNF-Grammatik ist, ist hiermit die ussage von Satz 4.2.2 bewiesen. lgorithmus 15 G 1 G 2 (Elimination von Kettenregeln) (* Teil 1: entferne Zyklen *) WHILE 1,..., n V mit 1 2, 2 3,..., n 1 n, n 1 DO ersetze 2,..., n durch 1 entferne die Regel 1 1 bestimme eine Nummerierung 1,..., k der Nichtterminale, so dass gilt: aus i j folgt i<j (* Teil 2: entferne die verbleibenden Kettenregeln *) FOR i = k,k 1,...,1 DO FOR j = i+1,...,k DO IF i j THEN streiche die Regel i j FOR LL Regeln j x DO füge die Regel i x hinzu. FI 147
Bemerkung 4.2.3 (Elimination von Kettenregeln). In lgorithmus 15 ist die Reihenfolge, in der die Regeln i j entfernt werden, wesentlich. Z.B. für die Grammatik G mit den Regeln S, B und B b wird zuerst B durch b ersetzt und dann S durch S b. Würde man zuerst S eliminieren, dann würde man die Grammatik bestehend aus der Regeln S B, b, B b erhalten, welche die Kettenregel S B enthält. Selbst wenn man eventuell neu entstehende Kettenregeln ignoriert, kann das Verfahren fehlschlagen, falls die im lgorithmus beschriebene Reihenfolge nicht eingehalten wird. In obigem Beispiel würde man die Grammatik mit den Regeln b, B b erhalten, in der es keine Regel für das Startsymbol S gibt. Die erzeugte Sprache dieser Grammatik ist leer und stimmt somit nicht mit der durch G definierten Sprache L(G)={b} überein. Beispiel 4.2.4 (Erstellung der CNF). Für die CFG mit den Regeln S C und C acb ab arbeitet der im Beweis von Satz 4.2.2 angegebene lgorithmus zur Erstellung einer äquivalenten CNF-Grammatik wie folgt. Da es keine Zyklen 1 2,..., n 1 n, n 1 gibt, wird im ersten Schritt nur die Regel S C entfernt und durch die beiden Regeln S acb und S ab ersetzt. Im zweiten Schritt werden neue Nichtterminale a = und b = B mit den Regeln a und B b hinzugefügt. nschließend werden sämtliche Vorkommen von a bzw. b auf der rechten Seite einer Regel durch bzw. B ersetzt. Wir erhalten das Produktionssystem S CB B C CB B a B b Im letzten Schritt werden die beiden Regeln S CB und C CB durch ersetzt. 14 S D, D CB, C E, E CB, a,b b 14 Soweit der lgorithmus. Man sieht, daß einige Optimierungen möglich sind. Beispielsweise kann man D = E setzen und C durch S ersetzen. 148
Beispiel 4.2.5 (Erstellung der CNF, Elimination von Kettenregeln). Wir betrachten die CFG mit den folgenden Regeln. S ab ac B S Ba D d ddd B C cd C D c Zunächst werden mit lgorithmus 15 die Kettenregeln S, B, B S, C und C D entfernt. Wir erstellen folgenden Digraphen. S C S C D B D Die Variablen S,, B bilden eine starke Zusammenhangskomponente. Zusätzlich bilden jeweils C und D einelementige starke Zusammenhangskomponenten. Wir ersetzen und B durch S und streichen die Regel S S. Man erhält die Grammatik mit folgenden Regeln: S as ac C csd Sa C D c D d ddd Im letzten Schritt wird zuerst C D durch C d ddd, dann S C durch S d ddd c ersetzt. uf die so erhaltene Grammatik wenden wir den im Beweis von Satz 4.2.2 angegebenen lgorithmus an. Dieser bringt z.b. die Regel C ddd in CNF-Gestalt, indem ein neues Nichtterminal d eingefügt wird und C ddd zunächst durch C d DD, d d, und dann C d DD durch C d D 2 und D 2 DD ersetzt wird. Entsprechend wird mit der Regel S ddd verfahren. Die Regeln werden nun durch S as ac Sa S a S a C Sa a a c c ersetzt. Die Eliminierung der Regel S csd wird durch Einfügen der Regeln S c E und E S d vorgenommen. Die Größe der konstruierten CNF-Grammatik Die Größe einer CFG G wird an der nzahl an Nichtterminalen und der Summe der Längen aller Produktionen gemessen und mit size(g) bezeichnet. Das Terminalalphabet Σ wird als konstant angenommen und geht daher nicht in die Größe der Grammatik ein. Mit der beschriebenen Methode zur Erstellung einer äquivalenten CNF-Grammatik G gilt size(g )=O ( size(g) 2), 149
sofern eine CFG ohne ε-regeln vorliegt. Man beachte, daß die Elimination der Kettenregeln die Größe der Grammatik quadratisch vergrößern kann; während der Ersetzungsprozeß B 1...B k B 1 C 1, C 1 B 2 C 2,..., C k 2 B k 1 B k 2 keinen Einfluß auf die asymptotische Größe der Grammatik hat. Der in bschnitt 2 (siehe Seite 89) beschriebene lgorithmus, der eine gegebene CFG in eine äquivalente ε-freie CFG überführt, kann zu einem exponentiellen Blow-Up führen. Es gibt jedoch ein effizientes Verfahren, welches die asymptotische Größe der CFG unverändert läßt (siehe Übungen). 4.3 Der Cocke-Younger-Kasami lgorithmus Um das Wortproblem für kontextfreie Sprachen zu lösen, gehen wir von einer Darstellung der Sprache durch eine CNF-Grammatik G =(V,Σ,P,S) aus. Sei w = a 1 a 2...a n Σ. Für den Test, ob w L(G) liegt, wenden wir die Methode des dynamischen Programmierens zur Bestimmung der Variablenmengen V[i,j] = { V : w i,j } an. Dabei ist w i,j = a i a i+1...a i+j 1 und 1 i n, 1 j n+1 i. Es gilt: w liegt genau dann in L(G), wenn S V[1,n]. Da G in CNF ist, gilt V[i,1]= { V : a i }. Für j 2 und V gilt wi,j genau dann, wenn es eine Regel BC und einen Index l {1,...,j 1} gibt, so daß B w i,l und C w i+l,j l. B C w i,l = a i...a i+l 1 w i+l,j l = a i+l...a i+j 1 w i,l w i+l,j l bbildung 46: bleitungsbaums für w i,j = a i a i+1...a i+j 1 Daher haben wir folgende rekursive Charakterisierung der Mengen V[i,j]. V[i,j] = j 1 l=1 { V : BC mit B V[i,l] C V[i+l,j l] }. 150
Diese Beobachtung wird im lgorithmus von Cocke-Younger-Kasami, kurz CYK-lgorithmus genannt, angewandt. Siehe lgorithmus 16 auf Seite 151. Dieser berechnet in Bottom-Up- Manier die Zeilen der folgenden Tabelle. V[1,n] V[1,n 1] V[2,n 1] V[1,n 2] V[2,n 2] V[3,n 2]. V[1, 2] V[2, 2] V[3, 2] V[4, 2]... V[n 1, 2] V[1, 1] V[2, 1] V[3, 1] V[4, 1]... V[n 1, 1] V[n, 1] a 1 a 2 a 3 a 4... a n 1 a n lgorithmus 16 Der CYK-lgorithmus (* Das Eingabewort sei w = a 1 a 2...a n. *) FOR i = 1,...,n DO V[i,1] := { V : a i }; FOR j = 2,...,n DO FOR i = 1,...,n + 1 j DO V[i,j] := ; FOR l = 1,...,j 1 DO V[i,j] := V[i,j] { V : BC mit B V[i,l] C V[i+l,j l]}; IF S V[1,n] THEN Return J. w L(G). ELSE Return NEIN. w L(G). FI Es ist offensichtlich, daß die Laufzeit des CYK-lgorithmus kubisch in der Länge des Eingabeworts ist und daß der Platzbedarf quadratisch ist, sofern die Grammatik als fest angesehen wird. Die Kosten beziehen sich auf den Fall, daß die kontextfreie Sprache durch eine feste CNF- Grammatik dargestellt ist. Die Größe der CNF-Grammatik wird daher als konstant angesehen. Wir erhalten folgenden Satz: Satz 4.3.1. Das Wortproblem für CNF-Grammatiken läßt sich mit dem CYK-lgorithmus in Zeit O(n 3 ) und Platz O(n 2 ) lösen. Dabei ist n die Länge des Eingabeworts. Beispiel 4.3.2 (CYK-lgorithmus). Die rbeitsweise des CYK-lgorithmus für die Sprache L = {a n b n : n 1}, dargestellt durch die CNF-Grammatik S C B C SB a B b, und das Wort w = aabb ist wie folgt. Im Initialisierungsschritt wird 151
V[1, 1]=V[2, 1]={} und V[3, 1]=V[4, 1]={B} gesetzt. Daraus ergibt sich V[1, 2]=V[3, 2]= und V[2, 2]={S}. Im zweiten Schleifendurchlauf erhalten wir V[1, 3]= und V[2, 3]={C}, da S V[2,2], B V[3,1] und C SB. Wegen V[1,1] und C V[2,3] ergibt sich V[1,4]= {S}. Die oben erwähnte Tabelle hat also die Gestalt: {S} {C} {S} {} {} {B} {B} a a b b Der lgorithmus terminiert also mit der ntwort J. Eigenschaften kontextfreier Sprachen Wie für reguläre Sprachen gibt es ein notwendiges Kriterium, das unter dem Stichwort Pumping Lemma bekannt ist und das für den Nachweis, daß eine Sprache nicht kontextfrei ist, hilfreich sein kann. Später diskutieren wir bschlußeigenschaften für die Klasse der kontextfreien Sprachen. 4.4 Das Pumping Lemma für kontextfreie Sprachen In nalogie zum Pumping Lemma für reguläre Sprachen gibt es ein notwendiges Kriterium für kontextfreie Sprachen. Wir werden dieses mit Hilfe der bleitungsbäume für CNF- Grammatiken beweisen. Satz 4.4.1 (Pumping Lemma für kontextfreie Sprachen). Sei L eine kontextfreie Sprache. Dann gibt es eine natürliche Zahl n, so daß sich jedes Wort z L der Länge n wie folgt zerlegen läßt: z = uvwxy, wobei (1) vx 1 (2) vwx n (3) uv k wx k y L für alle k N. Beweis. Wir können o.e. annehmen, daß ε/ L. (Ist ε L, dann betrachten wir die Sprache L \{ε} anstelle von L.) Sei G eine CNF-Grammatik mit L = L(G) (siehe Satz 4.2.2, Seite 146). Weiter sei N = V die nzahl an Variablen in G. Die im Pumping Lemma genannte Konstante n ist wie folgt definiert: n = 2 N 152
Sei z L mit z n. Zu zeigen ist nun, dass sich z in fünf Teilwörter u,v,w,x,y zerlegen läßt, so dass Eigenschaften (1), (2) und (3) erfüllt sind. ls Hilfsmittel für die Definition solcher Teilwörter u, v, w, x, y verwenden wir einen bleitungsbaum T für z. Dieser ist ein Binärbaum mit z n Blättern. Innere Knoten mit genau einem Sohn repräsentieren eine Regel der Form a. Sie haben die Höhe 1. lle anderen inneren Knoten stehen für eine Regel der Form BC. Sie haben genau zwei Söhne. Die Höhe von T sei h+1. Es gilt: h log z logn = N. Sei v 0,v 1,...,v h+1 ein Pfad in T der Länge h+1 von der Wurzel v 0 zu einem Blatt v h+1. Weiter sei i die Markierung des Knotens v i, i = 0,1,...,h. Dann ist 0 = S, 1,..., h eine Folge von Variablen der Länge h+1 N+1. lso gibt es eine Variable und Indizes i,j {0,1,...,h}, so daß folgende drei Eigenschaften erfüllt sind: = i = j i < j i+1,..., h sind paarweise verschieden. Wir zerlegen z in z = uvwxy gemäß der Skizze in bbildung 47. S i j u v w x y z = uvwxy bbildung 47: Zerlegung von z in uvwxy 153
(1) Da G in CNF ist, ist v ε oder x ε. (Da v i ein innerer Knoten der Höhe > 1 ist, steht v i für das nwenden einer Regel der Gestalt i BC. Ist z.b. v j ein Nachfolger des mit B markierten Sohns von v i, so ist das aus C hergeleitete Wort ein Suffix von x. Somit ist x ε.) Es folgt: vx 1. (2) Wir betrachten den Teilbaum T mit Wurzel v i. T ist ein bleitungsbaum für die bleitung i vwx. Die Höhe von T ist h i+1, da v i,v i+1,...,v h+1 ein längster Pfad in T ist. Da i+1,..., h paarweise verschieden sind, gilt h i N. Die Höhe von T ist daher N+1. Da in jeder CNF-Grammatik die Höhe eines bleitungsbaum für ein Wort der Länge l mindestens logl + 1 ist, folgt hieraus: vwx 2 h i 2 N = n (3) bleitungen der Wörter uv k wx k y ergeben sich durch Kombinieren der bleitungen S u i y = uy, = j w, = i v j x = vx. Es folgt S uv k wx k y (also uv k wx k y L) für alle k N. bbildung 48 skizziert die bleitungsbäume für k = 0 und k = 2. Die Zerlegung z = uvwxy erfüllt also die drei geforderten Bedingungen. k = 0 : S uy uwy S k = 2 : S uy uvxy uvvxxy uv 2 wx 2 y S u w y u v v w x x y bbildung 48: Pumpeigenschaft für k = 0 und k = 2 154