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