|
|
Praktikum objektorientiertes Programmieren: CNF
|
|
|
Spezifikation
|
In diesen Abschnitt beschreiben wir den theoretischen Hintergrund, der
für die meisten kontextfreien Grammatiken die Existenz einer
äquivalenten reduzierten kontextfreien Grammatik in Chomsky-Normalform
ohne Ketten- und ohne
-Produktionen begründet. Wir
orientieren uns an den entsprechenden Beweisen in [2]
und verwenden die dort benutzten Konstruktionen, um Algorithmen
abzuleiten.
Das generelle Umfeld sind Sprachen als Teilmengen der Wortmengen über
gegebenen Alphabeten, für die Regelsysteme zur Beschreibung verwendet
werden. Dabei sind Alphabetzeichen Wörter und die Wortmenge über einem
Alphabet ist der Abschluss gegenüber einer assoziativen binären
Operation o (Konkatenation), die zusammen mit der Wortmenge und
dem neutralen Element
ein Monoid bildet. Wir schreiben für
poq im folgenden immer pq.
Die Menge
L(G) =
w | w
A
und S
w
aller aus dem Startsymbol S ableitbaren Wörter über A heisst die
von G erzeugte Sprache.
Zwei Grammatiken G und G' heissen äquivalent, wenn sie die gleichen Sprachen erzeugen, also L(G) = L(G') gilt.
Der Beweis findet sich in [2, Satz 4.2]. Dort werden im ersten Schritt die Menge aller produktiven und im zweiten die Menge aller erreichbaren Metazeichen effektiv berechnet (Algorithmen 1 und 2), die Korrektheit der angegebenen Algorithmen bewiesen und es wird gezeigt, dass eine Nacheinanderausführung zu einer reduzierten äquivalenten Grammatik führt.
Algorithmus 1 zur Berechnung der Menge Mp aller
produktiven Metazeichen nimmt natürlich alle Metazeichen, aus denen
ein Wort aus A
direkt abgeleitet werden kann in Mp
auf. Anschliessend wird Mp abgeschlossen gegenüber
,
d.h. mit allen Regeln, die (in beiden Komponenten) Nichtterminale
ausschliesslich aus Mp haben, können lediglich Wörter abgeleitet
werden, die ebenfalls Nichtterminale ausschliesslich aus Mp haben.
Nach Berechnung von Mp können alle Produktionen entfernt werden,
die Symbole aus
M
Mp enthalten. Es ergibt sich eine
äquivalente Grammatik mit ausschliesslich produktiven Metazeichen.
Algorithmus 2 zur Berechnung der Menge Me der erreichbaren Metazeichen lässt sich am einfachsten rekursiv formulieren: Das Startzeichen S ist erreichbar und alle Zeichen sind erreichbar, die auf einer rechten Seite einer Produktion stehen, auf deren linker Seite ein erreichbares Zeichen steht.
Nach Berechnung von Me können alle Produktionen gelöscht werden,
deren linke Seite aus
M
Me ist, es ergibt sich eine
äquivalente Grammatik mit ausschliesslich erreichbaren Zeichen.
Im Beweis in [2, Satz 4.3] werden Zeichen m
M
nullierbar genannt, wenn
m
gilt. Es
genügt dann (nach Berechnung einer reduzierten Grammatik), alle
nullierbaren Symbole zu berechnen und daraus eine neue Regelmenge zu
konstruieren.
Der Algorithmus 3 berechnet die Menge Mn aller
nullierbaren Nichtterminale: Alle m
M mit
(m,
)
R
sind nullierbar. Wenn
(u, v)
R und alle Symbole aus v nullierbar
sind, dann ist u nullierbar. Bilden wir darüber den Abschluss,
erhalten wir alle nullierbaren Symbole.
Mit Mn kann die Menge R' der neuen Produktionen (ohne
-Produktion) berechnet werden: Wenn
(m, v1v2...vk)
R, dann füge alle Produktionen
(m, v1'v2'...vk') zu R'
hinzu, wobei gilt:
Mit anderen Worten heisst das: Für jede Teilmenge der Menge der nullierbaren Zeichen auf einer rechten Seite wird eine neue Regel erzeugt, bei der diese Teilmenge aus der rechten Seite gestrichen wurde. Falls dabei nicht alle Zeichen gestrichen wurden, wird die neue Regel in die Regelmenge aufgenommen.
Zur Entfernung der Kettenproduktionen wird für jedes Metazeichen m
die Menge der durch m substituierbaren Metazeichen ermittelt, indem
in der Teilmenge der Produktionen, die Kettenproduktionen sind, die
von m aus erreichbaren Zeichen ermittelt werden. Dazu kann
Algorithmus 2 verwendet werden. Gilt dann
m
m1
...
mk
m' mit
m, m', m1,..., mk
M, dann können alle Regeln der Form (m', w) durch Regeln (m, w)
ersetzt werden. Um eine äquivalente Grammatik zu erhalten, müssen noch
alle Nicht-Kettenproduktionen in die neue Regelmenge aufgenommen
werden. Algorithmus 4 fasst das zusammen.
Nach den vorangegangenen Sätzen existiert eine zu G äquivalente
reduzierte Grammatik ohne
- und ohne Kettenproduktionen. Die
Berechnung der Chomsky-Normalform vollzieht sich nun in zwei
Schritten:
Zuerst wird die Regelmenge so manipuliert, dass alle Regeln entweder
die Form (m, a) mit a
A oder die Form (m, w) mit w
M+
haben. Dazu wird jedes Auftreten von a aus A in einer rechten
Seite durch a' ersetzt und die Regel
a'
a hinzugefügt,
wobei a' ein neues Metazeichen ist.
Nun werden alle Regeln der Form (m, w) mit w
M+ betrachtet. Es
ist zu beachten, dass | w|
2 gilt, da G keine
Kettenproduktionen enthält. Für | w| = 2 ist nichts zu tun und für
| w| > 2 gilt
w = m1m2...mk. Dann wird (m, w) durch die beiden
Regeln
(m, m1[m2...mk]) und
([m2...mk], m2...mk)
ersetzt, wobei
[m2...mk] ein neues Metazeichen ist und die
rechten Seiten kürzer als die rechte Seite von (m, w).
Dieses Vorgehen ist in Algorithmus 5 zusammengefasst, dabei bezeichnet w[a/b] die simultane Ersetzung von a durch b in w und alle zu M hinzugefügten Zeichen seien neu.
|
|
Spezifikation
|
|
|
Praktikum objektorientiertes Programmieren: CNF
|