Inhalt Empfehlenswerte Referenzen How To: Umformung nach CNF
Transcription
Inhalt Empfehlenswerte Referenzen How To: Umformung nach CNF
Tutorium zur theoretischen Informatik Übungsblatt 5 Zusatzblatt (2006-01-08) Der General, der einen Kampf gewinnt, machte sich in seinem Tempel viele Gedanken, bevor der Kampf ausgetragen wurde. Der General, der einen Kampf verliert, machte sich vorher nur wenige Gedanken. So führen viele Überlegungen zum Sieg und wenige in die Niederlage: erst recht, wenn man gar keine Überlegungen anstellt! Indem ich diesem Punkt meine Aufmerksamkeit widme, kann ich vorhersehen wer vermutlich gewinnen oder verlieren wird. (Sun Tzu in "Die Kunst des Krieges", Kapitel 1 "Grundlegende Erwägungen") Inhalt 1. 2. 3. 4. Empfehlenswerte Referenzen How To: Umformung nach CNF Aufgabe 1 Aufgaben to go Empfehlenswerte Referenzen ● ● http://de.wikipedia.org/wiki/Chomsky-Normalform – der obligatorische Wiki-Link zu CNF http://www.cs.duke.edu/~rodger/tools/pateweb/ - Pâté, ein Java-Tool zur Verifikation von Umformungen von Grammatiken nach CNF How To: Umformung nach CNF Eine Grammatik G ≔ {V, Σ, P, S} liegt dann in Chomsky Normalform (CNF) vor, wenn alle Produktionen einer dieser Formen entsprechen: A → BC A→a S→ℇ ...wobei im letzten Fall S die Startvariable sein muss und auf keiner rechten Seite einer Produktion auftauchen darf. A, B, C und S sind Variablen, a ist ein Terminalsymbol und ℇ ist wie immer das leere Wort. 0. In der Aufgabenstellung ist normalerweise eine Grammatik G ≔ {V, Σ, P, S} gegeben, die in CNF umgeformt werden soll. 1. Das leere Wort ℇ darf nur auf 1 Weise hergeleitet werden können, daher müssen alle anderen Herleitungen eliminiert werden. Wenn z. B. die Produktionen S → AB, A → ℇ und B → ℇ in P enthalten sind, kann man zwar aus der Startvariablen S das leere Wort herleiten, aber es entspricht nicht der CNF (s. o.). a) Erstelle eine neue Menge V' ≔ { alle Variablen A mit A → ℇ }. b) Füge zu V' alle Variablen B hinzu, für die eine Produktion existiert nach dem Schema B → C, wobei bereits C ∈ V'. c) Wiederhole b) bis keine Variablen mehr zu V' hinzugefügt werden. d) Alle Produktionen A → ℇ eliminieren (d. h. aus P entfernen). e) Für alle Produktionen, in denen A ∈ V' auf der rechten Seite enthalten ist, dieselbe Produktion zu P hinzufügen, nur dass A auf der rechten Seite dieser Seite 1 / 3 Tutorium zur theoretischen Informatik Übungsblatt 5 Zusatzblatt (2006-01-08) Produktion entfernt ist. Es muss also sozusagen das Einfügen des leeren Worts vorweg genommen werden. • Beispiel: Es gibt die Produktion B → CAZ in P und A ∈ V'. Dann muss als neue Produkton auch B → CZ in P eingefügt werden. • Evtl. müssen mehrere neue Produktionen eingefügt werden. Beispiel: Es sei die Produktion B → CAZA in der Produktionenmenge P und wieder A ∈ V'. Dann muss neu zu P hinzugefügt werden: B → CAZ | CZA | CZ. (Als Erinnerung: die Spiegelstriche "|" sind eine Art Oder-Verknüpfung. Ausführlich geschrieben stünden hier 3 Produktionen statt nur 1.) f) Für alle Variablen X ∈ V' Schritt d) iterieren. 2. Terminalsymbole dürfen nur einzeln auf der rechten Seite auftauchen. a) Jedem Terminalsymbol a ∈ Σ eine neue Variable A zuordnen, indem zu P die Produktionen A → a hinzugefügt werden. b) Jedes Vorkommen von a in allen Produktionen (die nicht soeben in a) hinzugefügt wurden) durch die Variable A ersetzen. 3. Die rechte Seite der Produktionen auf maximal 2 Variablen limitieren. a) Bei jeder Produktion mit mehr als 2 Variablen auf der rechten Seite müssen (von links her betrachtet) die ersten 2 Variablen (z. B. AB) der rechten Seite durch eine neu eingeführte Variable (z. B. C) ersetzt werden und eine neue Produktion, in welcher die neue Variable in die beiden ersetzten überführt wird (in dem Beispielfall dann C → AB), zu P hinzugefügt werden. • Beispiel: seit A → BCD eine Produktion in P. Dann wird diese Produktion aus P entfernt und dafür diese 2 neuen Produktionen zu P hinzugefügt: A → YD und Y → BC. Hierbei ist Y natürlich eine bislang unverwendete, neue Variable. b) Bei Produktionen mit mehr als 3 Variablen auf der rechten Seite muss a) mehrfach angewendet werden, bis die ursprüngliche Regel komplett "aufgeteilt" ist. 4. Es kann sein, dass jetzt noch Produktionen vorliegen, bei denen die rechte Seite aus einer einzelnen Variablen bestehen. Auch diese Regeln müssen eliminiert werden, da sie nicht der CNF entsprechen. a) Feststellen, ob ein Zyklus vorliegt, z. B. A1 → A2 → A3 → ... → An → A1. Hier müssen alle enthaltenen Variablen durch eine neue oder eine einzelne von ihnen ersetzt und danach die Regeln A1 → A2, A2 → A3, ... gestrichen werden. b) Falls nun immer noch Produktionen der Form A → B vorliegen, gehören sie zu keinem Zyklus. Bei allen diese Produktionen muss auf der rechten Seite die Variable B durch die rechten Seiten von Produktionen ersetzt werden, bei denen B auf der linken Seite steht. • Beispiel: seien die Produktionen A → B und B → CD | X in P enthalten. Dann muss A → B entfernt werden und A → CD | X zu P hinzugefügt werden. Seite 2 / 3 Tutorium zur theoretischen Informatik Übungsblatt 5 Zusatzblatt (2006-01-08) Aufgabe 1 Gegeben ist die Grammatik G ≔ {{S, A, B}, {a, b, c, d}, P, S} mit P ≔ {S → AaBb | cABd, A → cBa | ℇ, B → bAd | ℇ}. Forme G in die CNF um. Lösung Der Einfachheit halber wird hier nur das Ergebnis der jeweiligen Schritte des o. g. Vorgehensmusters angegeben. 1. Redundante Herleitungen des leeren Wort eliminieren. a) V' ≔ {A, B} b) P ≔ {S → AaBb | cABd | aBb | cBd | Aab | cAd | ab | cd, A → cBa | ca, B → bDd | bd} 2. Nur einzelne Terminalsymbole auf der rechten Seite zulassen. P ≔ {At → a, Bt → b, Ct → c, Dt → d, S → AAtBBt | CtABDt | AtBBt | CtBDt | AAtBt | CtADt | AtBt | CtDt, A → CtBAt | CtAt |, B → BtADt | BtDt } 3. Die rechte Seite der Produktionen auf maximal 2 Variablen limitieren. P ≔ {At → a, Bt → b, Ct → c, Dt → d, Y1 → AAt, Y2 → Y1B, Y3 → CtA, Y4 → Y3B, Y5 → AtB, Y6 → CtB, Y7 → BtA, S → Y2Bt | Y4Dt | Y5Bt | Y6Dt | Y1Bt | Y3Dt | AtBt | CtDt, A → Y6At | CtAt, B → Y7Dt | BtDt} 4. Regeln der Form A → B kommen hier nicht vor. Es ist daher dafür nichts weiter zu tun. Aufgaben to go 1. Gegeben ist eine CF-Grammatik G ≔ {{S, A, B, C, D}, {a, b, c, d}, P, S} mit P ≔ {S → AaB | BbC | ℇ, A → ℇ | B | CDd, B → ℇ | C | bA, C → A | c, D → ℇ | d}. Forme G in die CNF um. Seite 3 / 3