Kontextfreie Sprachen & Kellerautomaten
Kontextfreie Sprachen & Kellerautomaten
Kontextfreie Sprachen & Kellerautomaten
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Kontextfreie</strong> <strong>Sprachen</strong> & <strong>Kellerautomaten</strong><br />
! Stand 26.6.2007<br />
Im Verlauf der Vorlesungen zu diesem Kapitel werden Änderungen und Ergänzungen<br />
erfolgen.<br />
Sie sollten daher sorgfältig auf Unterschiede zwischen den Vorversionen und der<br />
Endversion achten.<br />
FGI-1, SoSe 2007, Habel / Eschenbach
<strong>Kontextfreie</strong> <strong>Sprachen</strong><br />
Die Klasse der kontextfreien <strong>Sprachen</strong> über dem Alphabet $ (bezeichnet durch kfS $ )<br />
• bildet eine weitere Teilklasse der formalen <strong>Sprachen</strong>, die die regulären<br />
<strong>Sprachen</strong> umfasst: REG $ % kfS $<br />
<strong>Kontextfreie</strong> <strong>Sprachen</strong><br />
• werden durch kontextfreie Grammatiken erzeugt<br />
o Die Wörter / Sätze, die von kontextfreien Grammatiken erzeugt werden,<br />
besitzen eine syntaktische Struktur, die für die Verwendung der Sprache<br />
wichtig ist. (! logische Formeln, arithmetische Ausdrücke)<br />
o Parsing bezeichnet den Vorgang der Zuweisung einer syntaktischen<br />
Struktur für eine Zeichenkette. (Parsing basiert auf Grammatiken)<br />
• werden durch einen spezifischen Typ von Automaten, die (nichtdeterministischen)<br />
<strong>Kellerautomaten</strong>, akzeptiert<br />
• besitzen andere Abschlusseigenschaften als die regulären <strong>Sprachen</strong><br />
• Nichtzugehörigkeit zu kfS $ kann durch ein Pumpinglemma (für kontextfreie<br />
<strong>Sprachen</strong>) getestet werden<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [1]<br />
<strong>Kontextfreie</strong> Grammatiken<br />
Definition 13.1 (! Def. 1.6)<br />
Eine kontextfreie Grammatik G ist ein 4-Tupel (!, N, P, S), für das gilt:<br />
• ! ist ein Alphabet, genannt das Alphabet der Terminalsymbole<br />
• N ist ein Alphabet (von Nichtterminalsymbolen), das disjunkt zu ! ist<br />
• P ist eine endliche Menge von Produktionsregeln (auch als Regeln bezeichnet),<br />
wobei jede Regel ein Paar (A, w) ist, mit A ! N und w ! ( ! " N )*<br />
• S ! N heißt Startsymbol<br />
Anmerkungen<br />
• <strong>Kontextfreie</strong> Grammatik wird auch durch kfG oder CFG abgekürzt.<br />
• Nichtterminale werden auch als Variable bezeichnet.<br />
• Regeln werden im Weiteren in der Form A # w geschrieben.<br />
• A wird als linke und w als rechte Seite der Regel bezeichnet.<br />
• Regeln, die die gleiche linke Seite haben, d.h. die Ableitungen vom gleichen<br />
nichtterminalen Symbol betreffen, werden häufig „zusammengefasst“ (siehe<br />
nächste Folie)<br />
• Auch A # " ist eine zulässige Regel (für kontextfreie Grammatiken)<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [2]
Zwei Grammatiken für Arithmetische Ausdrücke<br />
G 4 = (!, N, P, &EXPR')<br />
! = { a, + , (, (, ) } N = {&EXPR'}<br />
P = { &EXPR' # &EXPR' + & EXPR ', &EXPR' # &EXPR' ( & EXPR ',<br />
&EXPR' # ( &EXPR' ), &EXPR' # a }<br />
Die Regeln in zusammengefasster Form:<br />
P = { &EXPR' # &EXPR' + & EXPR ' | &EXPR' ( & EXPR ' | ( &EXPR' ) | # a }<br />
G 3 = (!, N, P, &EXPR')<br />
! = { a, + , (, (, ) }<br />
N = {&EXPR', &TERM', &FACTOR'}<br />
P = { &EXPR' # &EXPR' + &TERM' | &TERM',<br />
&TERM' # &TERM' ( &FACTOR' | &FACTOR',<br />
&FACTOR'# ( &EXPR' ) | a }<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [3]<br />
Regelanwendung, Ableitung<br />
Definition 13.2 (! Def. 1.7)<br />
Seien u, v, w Zeichenketten über ( ! " N ), und A # w eine Regel (einer Grammatik).<br />
Durch die Anwendung der Regel kann aus dem Wort uAv das Wort uwv (direkt)<br />
abgeleitet werden.<br />
Man sagt auch: Die Regel A # w führt vom Wort uAv zum Wort uwv, bzw. das<br />
Nichtterminal / die Variable A wird durch die Regel zu w expandiert.<br />
• Die Regelanwendung wird auch als Ableitung (in einem Schritt) bezeichnet,<br />
und als uAv ) uwv geschrieben.<br />
Wenn u = v oder wenn eine Folge u ) u 1 )u 2 )… ) u k ) v existiert (mit k ! 0),<br />
so ist v aus u (in gegebenenfalls mehreren Schritten) ableitbar. Dieses wird durch<br />
u ) * v notiert. Die Sequenz u ) u 1 )u 2 )… ) u k ) v wird als Ableitung<br />
(derivation) bezeichnet.<br />
• Derartige Ableitungen sind stets von endlicher Länge (endliche Anzahl von<br />
Schritten); die Ableitungssequenz kann aber beliebige Länge haben.<br />
• Zeichenketten w über ( ! " N ), für die eine Ableitung S ) * w, existiert, werden als<br />
Satzformen bezeichnet.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [4]
Ableitungen für Arithmetische Ausdrücke in L(G4)<br />
G 4 = (!, N, P, &EXPR')<br />
! = { a, + , (, (, ) } N = {&EXPR'}<br />
P = { &EXPR' # &EXPR' + & EXPR ' | &EXPR' ( & EXPR ' | ( &EXPR' ) | # a }<br />
Ableitungen für a + a + a ! L(G 4 )<br />
&EXPR' ) &EXPR' + & EXPR '<br />
) &EXPR' + &EXPR' + & EXPR '<br />
) a + &EXPR' + & EXPR '<br />
) a + a + & EXPR '<br />
) a + a + a<br />
&EXPR' ) &EXPR' + & EXPR '<br />
) &EXPR' + &EXPR' + & EXPR '<br />
) &EXPR' + &EXPR' + a<br />
) &EXPR' + a + a<br />
) a + a + a<br />
&EXPR'<br />
) &EXPR' + & EXPR '<br />
) &EXPR' + &EXPR' + & EXPR '<br />
) a + &EXPR' + & EXPR '<br />
) a + &EXPR' + a<br />
) a + a + a<br />
" Es gibt – im Allgemeinen – keine<br />
Festlegung, welches Nichtterminal<br />
durch die Regelanwendung<br />
expandiert wird.<br />
Satzformen betreffen (Zwischen-)resultate des Ableitungsprozesses.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [5]<br />
Linksableitung – Rechtsableitung<br />
Definition 13.3<br />
Wird in einer Ableitung (Ableitungssequenz) stets die am weitesten links (rechts)<br />
auftretende Variable expandiert wird, so wird die Ableitung als Linksableitung /<br />
Rechtsableitung (leftmost / rightmost derivation) bezeichnet.<br />
Wir verwenden die Symbole ) lm bzw. ) rm für Ableitungsschritte und ) * lm bzw.<br />
) * rm für Ableitungssequenzen, die bzgl. leftmost oder rightmost festgelegt sind.<br />
Linksableitung<br />
&EXPR' ) lm &EXPR' + & EXPR '<br />
) lm &EXPR' + &EXPR' + & EXPR '<br />
) lm a + &EXPR' + & EXPR '<br />
) lm a + a + & EXPR '<br />
) lm a + a + a<br />
Rechtsableitung<br />
&EXPR' ) rm &EXPR' + & EXPR '<br />
) rm &EXPR' + &EXPR' + & EXPR '<br />
) rm &EXPR' + &EXPR' + a<br />
) rm &EXPR' + a + a<br />
) rm a + a + a<br />
Satz (ohne Beweis): Zu jeder Ableitung existiert eine äquivalente Linksableitung und<br />
eine äquivalente Rechtsableitung. D.h.: Für eine Zeichenkette v gilt u ) * v genau<br />
dann, wenn u ) * lm v und genau dann, wenn u )* rm v.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [6]
Von einer Grammatik erzeugte Sprache<br />
Definition 13.4 (! Def. 1.8)<br />
Sei G = (!, N, P, S) eine kontextfreie Grammatik, so ist<br />
L(G) = { w ! !* | S ) * w }<br />
die von G erzeugte Sprache.<br />
Ableitungsbäume / Strukturbäume (Parse trees)<br />
Sei A # w eine Regel, mit |w| = k,<br />
wobei w = w 1 w 2 …w k die Darstellung von w durch Symbole des Alphabets ist.<br />
Dann existiert ein zu A # w 1 w 2 …w k korrespondierender Baum<br />
des Verzweigungsgrades k mit Tiefe 2,<br />
der Wurzel A und den Blättern w 1 , w 2 , … ,w k .<br />
Sei S ) u 1 )u 2 )… ) u w 1 w 2 w k<br />
k ) w die Ableitung<br />
eines Wortes w ! L(G), so kann ein Ableitungsbaum (Strukturbaum) zu dieser<br />
Ableitung gebildet werden, indem die zu den verwendeten Regeln korrespondierenden<br />
Bäume „konkateniert“ werden.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [7]<br />
A<br />
Beispiel: Arithmetische Ausdrücke in L(G4)<br />
Für a + a ( a ! L(G 4 ) gibt Ableitungen mit unterschiedlichen Ableitungsbäumen.<br />
Die unterschiedlichen Strukturbäume entsprechen unterschiedlichen Bedeutungen.<br />
&EXPR' ) &EXPR' + & EXPR '<br />
) &EXPR' + &EXPR' ( & EXPR '<br />
) a + &EXPR' ( & EXPR '<br />
) a + a ( & EXPR '<br />
) a + a ( a<br />
ist keine Linksableitung<br />
&EXPR' ) &EXPR' ( & EXPR '<br />
) &EXPR' + &EXPR' ( & EXPR '<br />
) a + &EXPR' ( & EXPR '<br />
) a + a ( & EXPR '<br />
) a + a ( a<br />
ist eine Linksableitung<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [8]
Mehrdeutigkeit (Ambiguität)<br />
Definition 13.5<br />
Eine Zeichenkette w ist mehrdeutig, bzw. wird durch eine kfG G mehrdeutig<br />
abgeleitet, falls w zwei (oder mehr) verschiedene Linksableitungen besitzt.<br />
Eine Grammatik G ist mehrdeutig, falls es Wörter w ! L(G) gibt, die mehrdeutig sind.<br />
a + a ( a ! L(G 4 )<br />
&EXPR' ) lm &EXPR' + & EXPR '<br />
) lm a + &EXPR'<br />
) lm a + &EXPR' ( & EXPR '<br />
) lm a + a ( & EXPR '<br />
) lm a + a ( a<br />
ist eine Linksableitung<br />
# Die Grammatik G 4 ist mehrdeutig.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [9]<br />
Zum Selbststudium: Arithmetische Ausdrücke in L(G3)<br />
G 3 = (!, N, P, &EXPR') ! = { a, + , (, (, ) } N = {&EXPR', &TERM', &FACTOR'}<br />
P = { &EXPR' # &EXPR' + &TERM' | &TERM',<br />
&TERM' # &TERM' ( &FACTOR' | &FACTOR',<br />
&FACTOR'# ( &EXPR' ) | a }<br />
&EXPR' ) lm &EXPR' + &TERM'<br />
) lm &TERM' + &TERM'<br />
) lm &FACTOR' + &TERM'<br />
) lm a + &TERM'<br />
) lm a + &TERM' ( &FACTOR'<br />
) lm a + &FACTOR' ( &FACTOR'<br />
) lm a + a ( &FACTOR'<br />
) lm a + a ( a<br />
ist eine Linksableitung<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [10]
Zum Selbststudium: Arithmetische Ausdrücke in L(G3) Forts.<br />
• Führen Sie eine Linksableitung der Zeichenkette (a + a) ( a durch und<br />
konstruieren Sie den korrespondierenden Strukturbaum.<br />
• Machen Sie sich klar, inwiefern die beiden Strukturbäume<br />
zu a + a ( a bzw. zu (a + a) ( a<br />
zu unterschiedlichen Auswertungen, d.h. Berechnungen der Werte der<br />
arithmetischen Ausdrücke führen.<br />
Die Grammatik G 3 ist so entworfen, dass Zeichenketten eindeutig sind und somit eine<br />
eindeutige Bedeutung haben.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [11]<br />
Parsing<br />
Das Parsingproblem:<br />
Gegeben eine kontextfreie Grammatik G und eine Zeichenkette w.<br />
• Jede Ableitung S ) * w bestimmt einen Strukturbaum, d.h. eine syntaktische<br />
Struktur, zu w.<br />
Die Parsingaufgabe: Bestimme die syntaktische(n) Struktur(en) von w bzgl. G.<br />
Anmerkungen<br />
• Wenn G nicht mehrdeutig ist, dann hat jedes Wort w ! L(G) genau einen<br />
korrespondierenden Strukturbaum.<br />
• Der Prozess des Parsings weist nur Wörtern aus L(G) syntaktische Strukturen zu,<br />
d.h. für Zeichenketten w * L(G) sollte der Parser die Nichtzugehörigkeit zu<br />
L(G) ausweisen.<br />
• Parsing ist – in gewisser Weise – eine Umkehrung der Generierung von<br />
Zeichenketten bei gleichzeitiger Zuweisung der syntaktischen Struktur.<br />
Wir werden in einem späteren Abschnitt detaillierter aufs Parsing eingehen.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [12]
Parsing Beispiel: Arithmetische Ausdrücke in L(G3)<br />
G 3 = (!, N, P, &EXPR') ! = { a, + , (, (, ) } N = {&EXPR', &TERM', &FACTOR'}<br />
P = { &EXPR' # &EXPR' + &TERM' | &TERM',<br />
&TERM' # &TERM' ( &FACTOR' | &FACTOR',<br />
&FACTOR'# ( &EXPR' ) | a }<br />
a + a ( a<br />
+ &FACTOR' + a ( a<br />
+ &TERM' + a ( a<br />
+ & EXPR ' + a ( a<br />
+ & EXPR ' + &FACTOR' ( a<br />
+ & EXPR ' + & TERM ' ( a<br />
+ & EXPR ' + & TERM ' ( &FACTOR'<br />
+ & EXPR ' + & TERM '<br />
+ & EXPR '<br />
[erfolgreicher Parse,<br />
aber erst nach Backtracking]<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [13]<br />
Parsing Beispiel: Arithmetische Ausdrücke in L(G3) – Forts.<br />
G 3 = (!, N, P, &EXPR') ! = { a, + , (, (, ) } N = {&EXPR', &TERM', &FACTOR'}<br />
P = { &EXPR' # &EXPR' + &TERM' | &TERM',<br />
&TERM' # &TERM' ( &FACTOR' | &FACTOR',<br />
&FACTOR'# ( &EXPR' ) | a }<br />
a + a ( a<br />
+ &FACTOR' + a ( a<br />
+ &TERM' + a ( a<br />
+ & EXPR ' + a ( a<br />
+ & EXPR ' + &FACTOR' ( a<br />
+ & EXPR ' + & TERM ' ( a<br />
+ & EXPR ' ( a<br />
+ & EXPR ' ( &FACTOR'<br />
+ & EXPR ' ( & TERM '<br />
+ & EXPR ' ( & EXPR '<br />
+ # [Backtracking notwendig!]<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [14]
<strong>Kontextfreie</strong> Grammatiken – Regelformen<br />
Die Regeln A # w einer <strong>Kontextfreie</strong>n Grammatik haben die Form<br />
• A ! N und w ! ( ! " N )*, d.h.<br />
• linke Seite ein Nichtterminal, rechte Seite eine beliebige Kette über ( ! " N )*<br />
In der Theorie der formalen <strong>Sprachen</strong> wird u.a. untersucht<br />
• inwieweit unterschiedliche Bedingungen an die Regelform, unterschiedliche<br />
Sprachklassen definierten<br />
# reguläre <strong>Sprachen</strong> können über kfG mit spezifischer Regelform spezifiziert<br />
werden<br />
• inwieweit Grammatiken „vereinfacht“ werden können. Dies betrifft insbesondere<br />
die Konstruktion von Beweisen über kfG und <strong>Kellerautomaten</strong>, aber auch das<br />
Entwerfen und Realisieren von effizienten Parsern<br />
# " –Regeln, d.h. Regeln der Form A # ", werden nur benötigt, um das leere<br />
Wort abzuleiten. D.h. für die Erzeugung kontextfreier <strong>Sprachen</strong>, die das<br />
leere Wort nicht enthalten, sind " –freie Grammatiken ausreichend.<br />
# Normalformen, insbesondere Chomsky-Normalform: Aller Regeln haben<br />
die Form A # B C oder A # a mit A, B, C ! N und a ! !.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [15]<br />
Grammatiken für reguläre <strong>Sprachen</strong><br />
Reguläre <strong>Sprachen</strong><br />
• werden von endlichen Automaten verarbeitet / akzeptiert / erzeugt<br />
• können mit regulären Ausdrücken beschrieben werden<br />
• (s. Kapitel 12)<br />
• sind auch durch kontextfreie Grammatiken erzeugbar (noch zu zeigen)<br />
• bilden eine echte Teilklasse der kontextfreien <strong>Sprachen</strong> (noch zu zeigen)<br />
Typ-3-Grammatiken<br />
• sind kontextfreie Grammatiken,<br />
• erfüllen strukturelle Zusatzbedingungen<br />
• erzeugen die reguläre <strong>Sprachen</strong><br />
Welche Zusatzbedingungen erfüllen Typ-3-Grammatiken ?<br />
• einseitige Linearität<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [16]
Einseitig lineare Grammatiken<br />
Definition 13.6<br />
Sei ! ein Alphabet und G = (!, N, P, S) eine kontextfreie Grammatik über !.<br />
• G heißt genau dann rechtslinear, wenn P , N ( ($*N " $*).<br />
• G heißt genau dann linkslinear, wenn P , N ( (N$* " $*).<br />
• G heißt genau dann einseitig linear, wenn G rechtslinear oder linkslinear ist.<br />
Anmerkung<br />
• ‚Linearität’ bezieht sich jeweils darauf, dass in jeder zwischenzeitlich erzeugten<br />
Satzform maximal ein Nichtterminalsymbol auftritt.<br />
• ‚Einseitig’ besagt zudem, dass das Nichtterminalsymbol randständig sein und<br />
bleiben muss.<br />
• Alle Regeln der einseitig linearen Grammatik haben das Nichtterminalsymbol auf<br />
derselben Seite.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [17]<br />
Beispiel: Lineare Grammatiken<br />
Rechtslinear<br />
G rl = ({0, 1}, {S}, P rl , S) mit P rl = { S # 0S, S # 1S, S # 100 }<br />
L(G rl ) = L([0|1]*100)<br />
Linkslinear<br />
G ll = ({0, 1}, {S, R}, P rl , S) mit P rl = { S # R100, R # R1, R # R0, R # " }<br />
L(G ll ) = L([0|1]*100)<br />
Linear aber nicht einseitig linear<br />
G 1 = ({a, b}, {S}, P 1 , S) mit P 1 = { S # aSb, S # ab }<br />
L(G 1 ) = { a n b n | n ! 1 }<br />
(s. Kapitel 1)<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [18]
Einseitig linear erzeugbare <strong>Sprachen</strong><br />
Definition 13.7<br />
• ReL $ ist die Menge der durch rechtslineare Grammatiken erzeugbaren <strong>Sprachen</strong><br />
über $.<br />
• LiL $ ist die Menge der durch linkslineare Grammatiken erzeugbaren <strong>Sprachen</strong> über<br />
$.<br />
• TYP3 $ ist die Menge der durch einseitig lineare Grammatiken erzeugbaren <strong>Sprachen</strong><br />
über $ (also TYP3 $ = ReL $ " LiL $ )<br />
Beispiele<br />
L(G rl ) = L([0|1]*100) ! ReL {0, 1} , TYP3 {0, 1}<br />
L(G ll ) = L([0|1]*100) ! LiL {0, 1} , TYP3 {0, 1}<br />
L(G 1 ) = { a n b n | n ! 1 } * TYP3 {0, 1}<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [19]<br />
Rechtslineare Grammatiken für reguläre <strong>Sprachen</strong><br />
Satz 13.8<br />
Zu jedem endlichen Automaten A über ! existiert eine rechtslineare Grammatik G A<br />
über ! mit L(G A ) = L(A). (Also REG $ , ReL $ )<br />
Grundidee<br />
• Gleichsetzung von Nichtterminalsymbolen mit Zuständen.<br />
• Zustandsübergänge -(s, a) = s' werden zu Ableitungsregeln s # as'.<br />
• In Endzuständen kann die Ableitung beendet werden (s # ").<br />
• Konfigurationen in der Verarbeitung durch den Automaten (s, w) korrespondieren<br />
mit in der Ableitung erzeugten Satzformen (ws)<br />
Konstruktion<br />
Sei A = (!, S, -, s 0 , F) ein endlicher Automat.<br />
Die rechtslineare Grammatik G A = (!, S, P, s 0 ) mit<br />
• P = { s # as' | -(s, a) = s' } " { s # " | s ! F}<br />
erfüllt: L(G A ) = L(A)<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [20]
Spiegelwörter und Spiegelsprachen<br />
Definition 13.9<br />
Es sei ! ein Alphabet. Für die Abbildung SP: !* # !*, die jedes Wort auf sein<br />
Spiegelbild abbildet, gilt:<br />
• SP(") = "; SP(a) = a , für a ! !; SP(u!v) = SP(v)!SP(u) , für u, v ! !*<br />
• Ist L , !* eine Sprache, dann sei SP(L) = {SP(w) | w ! L} die ‚Spiegelsprache’ zu L.<br />
• Ist M , .(!*) eine Sprachfamilie, dann sei SP(M) = {SP(L) | L ! M} die Familie<br />
der ‚Spiegelsprachen’ zu M.<br />
• Eine Sprachfamilie M , .(!*) heißt genau dann abgeschlossen unter Spiegelung,<br />
wenn SP(M) , M.<br />
Beobachtungen 13.10<br />
1. LiL $ = SP(ReL $ ) und ReL $ = SP(LiL $ ) .<br />
2. M , .(!*) ist genau dann abgeschlossen unter Spiegelung, wenn SP(M) = M.<br />
3. TYP3 $ ist abgeschlossen unter Spiegelung.<br />
4. LREXP $ ist abgeschlossen unter Spiegelung.<br />
5. REG $ ist abgeschlossen unter Spiegelung.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [21]<br />
Zum Selbststudium<br />
Beweisen Sie obige Beobachtungen zur Übung<br />
Dazu ist jeweils eine Konstruktion anzugeben (z.B. bei 1) Bildung einer linkslinearen<br />
Grammatik für SP(L(G)) auf Basis einer rechtslinearen Grammatik G) und zu erläutern<br />
/ beweisen, dass die Konstruktion tatsächlich genau das leistet, was sie soll.<br />
2. ist natürlich darauf zurückzuführen, dass für alle Wörter w gilt SP(SP(w)) = w und<br />
damit Entsprechendes für die <strong>Sprachen</strong> und die Sprachfamilien.<br />
Was in der Liste von Beobachtungen noch fehlt, ist, dass auch LiL $ und ReL $<br />
abgeschlossen unter Spiegelung (und damit identisch) sind. Das zeigen wir später über<br />
die Abschlusseigenschaften der beteiligten <strong>Sprachen</strong> (Satz 13.§§)<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [22]
Normalformen für einseitig lineare Grammatiken<br />
Die Definition für einseitig lineare Grammatiken lässt zu:<br />
• beliebig lange Folgen von Terminalsymbolen in den Regeln<br />
• beliebig viele Regeln der Art A # "<br />
• Regeln der Art A # w , mit w ! !*<br />
• Regeln der Art A # B , mit B ! N<br />
Satz 13.11<br />
Zu jeder einseitig linearen Grammatik G gibt es eine einseitig linearen Grammatik G’,<br />
die dieselbe Sprache erzeugt aber folgende Zusatzbedingungen erfüllt:<br />
• alle rechten Seiten der Regeln, in denen Terminalsymbole vorkommen, haben die<br />
Länge 2 (A # aB bzw. A # Ba mit A, B ! N und a ! !)<br />
• es gibt keine Regeln der Art A # B , mit B ! N<br />
• es gibt maximal 2 Regeln der Art A # ", wobei höchstens eine dieser Regeln ein<br />
anderes Nichtterminalsymbol als das Startsymbol ableitet.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [23]<br />
Zum Selbststudium<br />
Konstruktion zu Satz 13.11<br />
‚Vernichtung’ der Regeln der Art A # B , mit B ! N<br />
1. Regeln der Form A # A können gelöscht werden, da Ihre Anwesenheit keinen<br />
Einfluss auf die generierte Sprache haben.<br />
2. Kommt A # B , mit B ! N, in P vor, dann kann diese Regel durch die Menge der<br />
Regeln { A # r | B # r ! P} ersetzt werden.<br />
3. Durch systematische Anwendung von 1) und 2) können alle Regeln der Art A # B<br />
eliminiert werden.<br />
Reduktion der Regeln der Art A # w , mit w ! !* auf maximal 2 Regeln der Art A #<br />
", wobei höchstens eine dieser Regeln ein anderes Nichtterminalsymbol als das<br />
Startsymbol ableitet:<br />
• Führe ein neues Nichterminalsymbol T und die Regel T # " ein.<br />
• Ersetze jede Regel der Art A # w , mit w ! ! + , durch A # wT.<br />
• Ersetze jede Regel der Art A # wB , mit w ! ! + und B # " ! P, durch A # wT.<br />
• Lösche dann alle Regeln der Art B # " außer { T # " , S # " }.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [24]
Zum Selbststudium: Zu Satz 13.11<br />
Beschränkung der rechten Seiten der Regeln, in denen Terminalsymbole vorkommen,<br />
auf Länge 2 (A # aB bzw, A # Ba mit A, B ! N und a ! !)<br />
• Für jedes Paar a ! N, B ! !, für das mindestens eine Regel der Art A # waB ! P,<br />
mit w ! ! + , führe ein neues Nichtterminal C und die Regel C # aB ein und ersetze<br />
alle Regeln der Art A # waB durch A # wC.<br />
• Für jedes Paar a ! N, B ! !, für das mindestens eine Regel der Art A # Baw ! P,<br />
mit w ! ! + , führe ein neues Nichtterminal C und die Regel C # Ba ein und ersetze<br />
alle Regeln der Art A # Baw durch A # Cw.<br />
Es wäre noch zu zeigen, dass die so erzeugte Grammatik tatsächlich genau dieselbe<br />
Sprache erzeugt, wie die ursprüngliche. Dazu zeigt man, wie die Ableitungen der alten<br />
Grammatik durch die neue Grammatik ‚simuliert’ und umgekehrt.<br />
Bemerkung<br />
Die Normalformen der Grammatiken sind oft bei der Beweisführung über die<br />
Sprachfamilien nützlich. Für den praktischen Einsatz sind aber die allgemeinen<br />
Formen oft besser geeignet.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [25]<br />
Rechtslinear erzeugbare <strong>Sprachen</strong> sind regulär<br />
Satz 13.12<br />
Zu jeder rechtslinearen Grammatik G über ! existiert ein endlicher Automat A G über !<br />
mit L(G) = L(A G ). (Also ReL $ , REG $ )<br />
Konstruktion<br />
Sei G = (!, N, P, S) eine rechtslineare Grammatik, bei der auf den rechten Seiten der<br />
Produktionen maximal ein Terminalsymbol steht. (Notfalls müssen wir erst einen<br />
Umformungsschritt gemäß 13.11 machen.)<br />
Für den Automaten A G = (!, N " {ƒ}, -, S, F) mit<br />
• ƒ * N<br />
• F = {ƒ} " { B ! N | B # " ! P}<br />
• - = {(B, a, C) | B # aC ! P} " {(B, a, ƒ) | B # a ! P}<br />
gilt: L(A G ) = L(G)<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [26]
ReL $ = REG $ = LiL $ = TYP3 $<br />
Satz 13.13<br />
ReL $ = REG $ = LiL $ = TYP3 $<br />
Beweis<br />
1. REG $ , ReL $ : Satz 13: 8<br />
2. ReL $ , REG $ : Satz 13: 12<br />
3. ReL $ = REG $ : Konsequenz von 1 und 2<br />
4. LiL $ = SP(ReL $ ) : Beobachtung 13.10.1<br />
5. LiL $ = SP(REG $ ) : Konsequenz von 4 und 3<br />
6. SP(REG $ ) = REG $ : Beobachtung 13.10.2 und 5<br />
7. LiL $ = REG $ : Konsequenz von 5 und 6<br />
8. ReL $ " LiL $ = TYP3 $ : Definition 13.13<br />
9. TYP3 $ = REG $ : Konsequenz von 3, 7, 8<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [27]<br />
Reguläre <strong>Sprachen</strong> – <strong>Kontextfreie</strong> <strong>Sprachen</strong><br />
Typ-2-<strong>Sprachen</strong><br />
• <strong>Kontextfreie</strong> <strong>Sprachen</strong> werden auch als Typ-2-<strong>Sprachen</strong> bezeichnet.<br />
• Dementsprechend wird TYP2 $ für die Menge der <strong>Kontextfreie</strong>n <strong>Sprachen</strong><br />
verwendet.<br />
Reguläre <strong>Sprachen</strong> – <strong>Kontextfreie</strong> <strong>Sprachen</strong><br />
• reguläre <strong>Sprachen</strong> sind eine echte Teilklasse der kontextfreien <strong>Sprachen</strong><br />
• welche Charakteristika von Regeln, Baumstrukturen, Ableitungen sind für die<br />
Nicht-Regularität gewisser kontextfreier <strong>Sprachen</strong> verantwortlich?<br />
• wie unterscheiden sich die Abschlusseigenschaften von regulären und<br />
kontextfreien <strong>Sprachen</strong>?<br />
<strong>Kontextfreie</strong> <strong>Sprachen</strong><br />
• welche Modifikationen des Konzeptes endlicher Automaten werden benötigt, um<br />
Automaten, die kontextfreie <strong>Sprachen</strong> akzeptieren, zu konstruieren?<br />
• welche Eigenschaften charakterisieren <strong>Sprachen</strong> als nicht-kontextfrei?<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [28]
Reguläre <strong>Sprachen</strong> – <strong>Kontextfreie</strong> <strong>Sprachen</strong> (2)<br />
Einseitig lineare Grammatik G 1<br />
S # aS, S # aB, B # bB, B # b<br />
L(G 1 ) = { a n b m | n, m ! 1 } = {a} + {b} +<br />
Nicht einseitig lineare Grammatik G 2<br />
S # aSb, S # ab<br />
L(G 2 ) = { a n b n | n ! 1 }<br />
.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [29]<br />
Normalformen für kontextfreie Grammatiken<br />
Ziel: Vereinfachung von kontextfreien Grammatiken<br />
Die wichtigsten Vereinfachungen<br />
1. Elimination von „nicht benötigten“ (nutzlosen) Symbolen<br />
2. Elimination von "-Regeln<br />
3. Elimination von Kettenregeln (Einheitsproduktionen), d.h. von Regeln der<br />
Form A # B mit A,B ! N.<br />
Theoreme zu vereinfachten Grammatiken (Beweise im Laufe dieser Vorlesung)<br />
1. Für jede kontextfreie Sprache L, d.h. L ! TYP2 $ , gilt, dass L – { " } durch eine<br />
kfG ohne "-Regeln erzeugt werden kann.<br />
2. Zu jeder kfG G gibt es eine äquivalente kfG G' in Chomsky-Normalform, d.h.<br />
• L(G) = L(G')<br />
• Alle Regeln von G' haben die Form A # B C oder A # a mit A, B, C ! N<br />
und a ! !. Falls " ! L = L(G), ist zusätzlich die Regel S # " zugelassen.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [30]
Elimination von nutzlosen Symbolen<br />
Sei G = (!, N, P, S) eine kontextfreie Grammatik.<br />
X ! ! " N ist nützlich in G, wenn es eine Ableitung<br />
S ) * uXv ) * w mit w ! !* gibt,<br />
d.h. X tritt in einer Satzform einer Ableitung von S zu einer terminalen Zeichenkette<br />
auf. Wenn X nicht nützlich ist, dann bezeichnen X wir als nutzlos.<br />
1. Die Sprache L(G) ist durch die Ableitungen von S zu terminalen Zeichenketten<br />
gegeben (Def. 13.4). Wenn X nutzlos ist, kommt X in keiner Ableitung von S zu<br />
einer terminalen Zeichenkette vor.<br />
Also kann X aus der Grammatik entfernt werden, d.h. X wird aus ! " N entfernt,<br />
und alle Regeln, in denen X auftritt, werden ebenfalls entfernt.<br />
2. Es gibt zwei Eigenschaften, die die Nützlichkeit eines Symbols ausmachen:<br />
a. X ist erzeugend, wenn X ) * w für ein w ! !*.<br />
[Da a ) * a für alle a ! !, sind alle terminalen Symbole erzeugend.]<br />
b. X ist erreichbar, wenn es eine Ableitung S ) * uXv gibt,<br />
mit u,v ! (! " N)*.<br />
# Wir werden zuerst alle nicht-erzeugenden und dann alle nicht-erreichbaren<br />
Symbole eliminieren.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [31]<br />
Elimination von nutzlosen Symbolen: Beispiel<br />
Grammatik G ist gegeben durch die Regeln:<br />
S # AB | a A# b<br />
Eliminationsreihenfolge<br />
nicht-erzeugende " nicht-erreichbare nicht-erreichbare " nicht-erzeugende "<br />
Bestimmung der erzeugenden Symbole<br />
• S, A wegen S ) * a bzw. A ) * b<br />
a, b da Terminalsymbole<br />
Elimination der nicht-erzeugenden<br />
Symbole: B<br />
• S # a A# b<br />
Bestimmung der erreichbaren Symbole<br />
• S, a wegen S ) * a<br />
Elimination der nicht-erreichbaren<br />
Symbole: A, b<br />
• S # a<br />
Bestimmung der erreichbaren Symbole<br />
• S, a wegen S ) * a<br />
A, B, b wegen S ) * AB ) * bB<br />
Keine Elimination nicht-erreichbarer<br />
Symbole notwendig<br />
Bestimmung der erzeugenden Symbole<br />
• S, A wegen S ) * a bzw. A ) * b<br />
a, b da Terminalsymbole<br />
Elimination der nicht-erzeugenden<br />
Symbole: B<br />
• S # a A# b<br />
Enthält zwei nutzlose Symbole<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [32]
Elimination von nutzlosen Symbolen<br />
Satz 3.14<br />
Sei G = (!, N, P, S) eine kontextfreie Grammatik mit L(G) " /. Sei G 1 = (! 1 , N 1 , P 1 , S)<br />
die Grammatik, die sich aus dem folgenden Verfahren ergibt:<br />
1. Es werden alle Symbole, die nichts erzeugen, und alle Regeln, die eines oder<br />
mehrere dieser Symbole enthalten, eliminiert. Die hieraus entstehende<br />
Grammatik bezeichnen wird durch G 2 = (! 2 , N 2 , P 2 , S).<br />
2. Es werden aus G 2 alle Symbole, die nicht in G 2 erreichbar sind, eliminiert,<br />
sowie alle Regeln, die eines oder mehrere dieser Symbole enthalten.<br />
Dann enthält G 1 keine nutzlosen Symbole und es gilt: L(G) = L(G 1 )<br />
Anmerkung:<br />
• Da L(G) " /, ist S erzeugend, und kann somit nicht eliminiert werden.<br />
Beweis zur selbständigen Nacharbeit (vgl. Vossen & Witt, Kap. 5.1.2). Zu zeigen ist:<br />
1. G 1 enthält keine nutzlosen Symbole; hier spielt die Reihenfolge der zwei<br />
Eliminationsstufen eine Rolle: G ! G 2 ! G 1<br />
2. L(G) = L(G 1 ), hier ist L(G) , L(G 1 ) die nicht-triviale Richtung des Beweises.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [33]<br />
Berechnung der erzeugenden Symbole<br />
Definition 3.15 (Algorithmus zur Berechnung der erzeugenden Symbole)<br />
Sei G = (!, N, P, S) eine kontextfreie Grammatik.<br />
Induktive Definition eines Algorithmus zur Berechnung der erzeugenden Symbole:<br />
1. Alle a ! !, d.h. alle terminalen Symbole, sind erzeugend.<br />
2. Wenn für eine Regel A # w gilt, dass jedes Symbol in w erzeugend ist, dann ist<br />
A erzeugend.<br />
Regeln: S # AB | a A# b Ableitungsbäume<br />
1. a, b sind erzeugend, da Terminalsymbole<br />
2. S ist erzeugend wg. S # a<br />
A ist erzeugend wg. A # b<br />
S # AB erfüllt nicht die Bedingungen<br />
von (2).<br />
3. Alle Regeln sind berücksichtigt; das<br />
Verfahren ist abgeschlossen.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [34]
Berechnung der erzeugenden Symbole (Forts.)<br />
Satz 3.16 (Algorithmus zur Berechnung der erzeugenden Symbole)<br />
Der in Def. 3.15 induktive definierte Algorithms bestimmt die Menge der erzeugenden<br />
Symbole (MeS) von G = (!, N, P, S).<br />
Zu beweisen sind zwei Richtungen: (1), dass jedes Symbol, das durch den Algorithmus<br />
in MeS aufgenommen wird, wirklich ein erzeugendes Symbol ist, und (2), dass jedes<br />
erzeugende Symbol durch den Algorithmus in MeS aufgenommen wird.<br />
1. Richtung: Induktion über die Reihenfolge, in denen der Algorithmus Symbole in<br />
MeS aufnimmt. [zum Selbststudium!!!]<br />
2. Richtung: X ist erzeugendes Symbol, mit der terminalen Ableitung X ) * w für<br />
ein w ! !*. Induktion über die Ableitungslänge.<br />
• Falls die Ableitung die Länge null hat, dann ist X ist terminales Symbol.<br />
Daher wird im Schritt 1 des Algorithmus X als erzeugend klassifiziert und in<br />
MeS aufgenommen.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [35]<br />
Berechnung der erzeugenden Symbole (Forts.)<br />
• Wenn die Ableitung die Länge n hat (n > 0), dann ist X eine Variable. Die<br />
Ableitung X ) * w kann zerlegt werden in X ) v ) * w, d.h. es wird zuerst<br />
die Regel X # v angewendet.<br />
• Jedes Symbol von v leitet eine terminale Zeichenkette ab, die Teil von w<br />
ist, und diese Ableitung (# Zusammenfassung der Ableitungen, die von v<br />
zu w führen) hat eine Länge kleiner n.<br />
• Nach Induktionshypothese ist daher jedes Symbol aus v erzeugend.<br />
Daher ist die Voraussetzung für den Schritt (2) des Algorithmus erfüllt:<br />
der Algorithmus X als erzeugend klassifiziert und in MeS aufgenommen.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [36]
Berechnung der erreichbaren Symbole<br />
Definition 3.17 (Algorithmus zur Berechnung der erreichbaren Symbole)<br />
Sei G = (!, N, P, S) eine kontextfreie Grammatik.<br />
Induktive Definition eines Algorithmus zur Berechnung der erreichbaren Symbole:<br />
1. Das Startsymbol S ist erreichbar.<br />
2. Wenn für eine Regel A # w gilt, dass A erreichbar ist, dann ist jedes Symbol in<br />
w erreichbar.<br />
Regeln: S # AB | a A# b Ableitungsbäume<br />
1. S ist erreichbar<br />
2. wg. S # AB | a<br />
sind ausserdem A, B und a erreichbar<br />
wg. A# b<br />
ist ausserdem b erreichbar<br />
3. Alle Regeln sind berücksichtigt; das<br />
Verfahren ist abgeschlossen.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [37]<br />
Berechnung der erreichbaren Symbole (Forts.)<br />
Satz 3.18 (Algorithmus zur Berechnung der erreichbaren Symbole)<br />
Der in Def. 3.16 induktive definierte Algorithms bestimmt die Menge der erreichbaren<br />
Symbole von G = (!, N, P, S).<br />
Beweis: Zum Selbststudium!!!<br />
Zu beweisen sind – wie beim Beweis von Satz 3.16 – zwei Richtungen.<br />
Verwendet wird Induktion über Ableitungen bzw. den Ablauf des Algorithmus.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [38]
Elimination von !-Regeln<br />
Satz 3.19 (Elimination von !-Regeln)<br />
Für jede kontextfreie Sprache L gilt, dass L – { " } durch eine kfG ohne "-Regeln<br />
erzeugt werden kann.<br />
[Derartige Grammatiken werden als "-freie Grammatiken bezeichnet.]<br />
Anmerkungen:<br />
Dieser Satz deckt zwei Fälle ab:<br />
1. " * L. Dann ist L – { " } = L, und deswegen gibt es eine "-Regel-freie<br />
Grammatik G, die L erzeugt, d.h. L = L(G).<br />
2. " ! L. Dann gibt es eine "-freie Grammatik G, die L – { " }erzeugt. Für die<br />
Erzeugung des leeren Wortes kann G um eine einzige "-Regel angereichert<br />
werden, die nur an der Erzeugung des leeren Wortes beteiligt ist.<br />
Im Beweis wird daher der Fall "-freier <strong>Sprachen</strong> behandelt (Fall 1). Fall 2 erfordert<br />
dann nur den oben angesprochenen Schritt der Ergänzung um eine "-Regel zur<br />
Erzeugung des leeren Wortes.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [39]<br />
Elimination von !-Regeln – Beweis von Satz 3.19<br />
Sei " * L und G = (!, N, P, S) eine kontextfreie Grammatik mit L = L(G).<br />
• Wir gehen davon aus, dass alle nutzlosen Symbole aus G eliminiert wurden (vgl.<br />
die Sätze 3.14, 3.16 und 3.18).<br />
• Wir erweitern die Grammatik um ein neues Nichtterminalsymbol, S 0 , das als<br />
Startsymbol fungiert. Ausserdem führen wir die Regel S 0 # S ein.<br />
• Die neue Grammatik G' erzeugt genau die gleiche Sprache wie die Grammatik<br />
G, denn zu jeder G-Ableitung S ! * G w mit w ! L(G) gibt es eine<br />
korrespondierende G'-Ableitung S 0 ! * G' w, und zwar S 0 ! * G' S !* G' w.<br />
• Diese Erweiterung der Grammatik führt dazu, dass das Startsymbol von G' nicht<br />
aus der rechten Seite einer Regel auftritt.<br />
Beispiel<br />
S # ASA | aB A# B | S B# b | "<br />
Einführung des neuen Startsymbols S 0<br />
S 0 # S S # ASA | aB A# B | S B# b | "<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [40]
Elimination von !-Regeln – von G'' erzeugte Sprache<br />
Regeln in G'<br />
S 0 # S<br />
S # ASA | aB<br />
A# B | S<br />
B# b | "<br />
Beispiel eines Strukturbaums<br />
Ableitung:<br />
S 0 ) S<br />
) ASA<br />
) SSA ) SaBA ) SaBB<br />
) aBaBB ) aBabB ) aBab"<br />
) a"ab" = aab<br />
Abschluss erfolgt nur über B-Regeln.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [41]<br />
Elimination von !-Regeln – Beweis von Satz 3.19 (Forts.)<br />
• "-Regeln, d.h. Regeln der Form A # " werden eliminiert; dafür werden aber<br />
eventuell neue Regeln eingeführt.<br />
• Für jedes Vorkommen von A auf der rechten Seite einer Regel bilden wir<br />
zusätzlich eine neue Regel ohne dieses Vorkommen von A.<br />
Beispiel: Sei R# uAvAw eine derartige Regel in G', so führt dies zu den Regeln<br />
R# uvAw, R# uAvw, R# uvw<br />
Falls die zu bearbeitende Regel die Form R# A hat , so fügen wir R # " in<br />
die Regelmenge, ausser in den Fällen, in denen R # " schon eliminiert wurde.<br />
• Dieses Verfahren wird durchgeführt, bis alle "-Regeln beseitigt sind.<br />
• In der Regelmenge P gibt es nur eine endliche Menge von Regeln und<br />
insbesondere nur eine endliche Menge von "-Regeln; für jedes Nichtterminal<br />
maximal eine "-Regel.<br />
• Bei der Elimination von "-Regeln können zwar neue "-Regeln entstehen, aber<br />
nur für solche nichtterminale Symbole, zu denen noch keine "-Regeln<br />
eliminiert wurden. Daher terminiert der Prozess der Elimination von "-Regeln.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [42]
Elimination von !-Regeln – Beweis von Satz 3.19 (Forts.)<br />
Beispiel<br />
S 0 # S S # ASA | aB A# B | S B# b | "<br />
Elimination der "-Regel B# "<br />
Einführung neuer Regeln in Bezug auf S # aB S # a<br />
Einführung neuer Regeln in Bezug auf A# B A# "<br />
Elimination der "-Regel A# "<br />
Einführung neuer Regeln in Bezug auf S # ASA S # SA | AS | S<br />
Da keine "-Regel vorkommt, ist das Verfahren abgeschlossen.<br />
Die resultierende Regelmenge:<br />
S 0 # S<br />
S # ASA | aB | a | SA | AS | S<br />
A# B | S<br />
B# b<br />
Die Ausgangs-Regelmenge<br />
S 0 # S<br />
S # ASA | aB<br />
A# B | S<br />
B# b | "<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [43]<br />
Elimination von !-Regeln – von G'' erzeugte Sprache<br />
Regeln in G'<br />
S 0 # S<br />
S # ASA | aB | a | SA | AS | S<br />
A# B | S<br />
B# b<br />
Beispiel eines Strukturbaums<br />
Ableitung:<br />
S 0 ) S<br />
) AS<br />
) SS ) SaB<br />
) aaB ) aab<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [44]
Elimination von !-Regeln – G'-Stukturbaum vs. G''-Stukturbaum<br />
G'-Stukturbaum<br />
G''-Strukturbaums<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [45]<br />
Elimination von !-Regeln – Beweis von Satz 3.19 (2. Forts.)<br />
Die durch Elimination der "-Regeln entstandene Grammatik G'' erzeugt genau die<br />
gleiche Sprache wie die Grammatik G'.<br />
• Da die Grammatik G eine "-freie Sprache erzeugt [" * L = L(G)], werden "-Regeln<br />
nur für den Abschluss von Ableitungen verwendet, die zu echten Zeichenketten<br />
führen.<br />
• Wenn in einer G'-Ableitung eine "-Regel angewendet wird, dann gibt es eine<br />
korrespondierende G''-Ableitung die auf einer der in der "-Regel-Elimination<br />
ergänzten Regeln basiert. Daher ist jedes durch G' erzeugbare Wort auch durch G''<br />
erzeugbar. Entsprechend kann / muss gezeigt werden, dass G'' nicht zusätzliche<br />
Wörter erzeugen kann.<br />
Damit ist der Beweis für den Fall 1 (" * L) abgeschlossen.<br />
Fall 2. ! ! L = L(G)<br />
Dann existiert eine G'-Ableitung zu ". Da nur nichtterminale Symbole getilgt werden<br />
können, und zwar durch "-Regeln, kann das in Fall 1 verwendete Verfahren<br />
angewendet werden: Wir eliminieren "-Regeln für alle Nichtterminale (ausser dem<br />
Startsymbol S 0 ).<br />
# Damit ist der Beweis für den Fall 1 (" * L) abgeschlossen.von Satz 3.19<br />
abgeschlossen.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [46]
Chomsky Normalform<br />
Definition 3.20<br />
Eine kontextfreie Grammatik G = (!, N, P, S) liegt in Chomsky Normalform vor, falls<br />
alle Regeln von G eine der folgenden Formen haben<br />
• A # B C<br />
• A # a<br />
• S # "<br />
mit A, B, C ! N und a ! !.<br />
Anmerkung:<br />
• Es gibt (echt) expandierende Regeln mit zwei nichtterminalen Symbole auf der<br />
rechten Seite (und somit binär verzweigende Strukturbäume) und<br />
• abschliessende Regeln mit genau einem terminalen Symbol auf der rechten Seite,<br />
sowie gegebenenfalls als Sonderfall (für die Ableitung des leeren Wortes) für<br />
das Startsymbol eine "-Regel (S # ").<br />
Satz 3.21<br />
Für jede kontextfreie Sprache L gibt es eine kfG G in Chomsky-Normalform, die L<br />
erzeugt, d.h. mit L = L(G).<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [47]<br />
Chomsky Normalform – Beweis Satz 3.21<br />
Aufbauend auf den Sätzen 3.14 und 3.19 können wir davon ausgehen, dass es zur<br />
Sprache L eine erzeugende kfG G gibt, in der alle nutzlosen Symbole und alle "-<br />
Regeln (ausser im Fall " ! L, die Regel S # ") eliminiert sind.<br />
Wir haben zwei Typen von Regelumformungen durch zu führen:<br />
• Einer-Regeln, d.h. Regeln der Form A# B, mit A, B ! N, werden umgewandelt<br />
in Regeln mit zwei oder mehr Symbolen auf der rechten Seite.<br />
• Alle verbleibenden Regeln werden in die Normalform gebracht, d.h. in Regeln<br />
mit der zulässigen Länge der rechten Seite<br />
• Länge 2 für Regeln mit Nichtterminalen auf der rechten Seite<br />
• Länge 1 für Regeln mit Terminalen auf der rechten Seite<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [48]
Chomsky Normalform – Umwandlung von Einer-Regeln<br />
• Einer-Regeln, d.h. Regeln der Form A # B, mit A, B ! N, werden eliminiert; dafür<br />
werden aber neue Regeln eingeführt.<br />
• Für jede Regel B# u, mit u ! (! " N)*, bilden wir eine neue Regel A # u,<br />
ausser in den Fällen, in denen die Einer-Regel A # u schon eliminiert wurde.<br />
• Dieses Verfahren wird durchgeführt, bis alle Einer-Regeln beseitigt sind.<br />
• In der Regelmenge P gibt es nur eine endliche Menge von Regeln und<br />
insbesondere nur eine endliche Menge von Einer-Regeln.<br />
• Bei der Elimination von Einer-Regeln können zwar neue Einer-Regeln entstehen,<br />
aber nur für solche nichtterminale Symbole, zu denen noch keine Einer-Regeln<br />
eliminiert wurden. Daher terminiert der Prozess der Elimination von Einer-Regeln.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [49]<br />
Elimination von Einer-Regeln – Beweis von Satz 3.21 (Forts.)<br />
Beispiel<br />
Die Ausgangs-Regelmenge<br />
S 0 # S<br />
S # ASA | aB | a | SA | AS | S<br />
A# B | S<br />
B# b<br />
Elimination von S # S<br />
Elimination von S 0 # S<br />
Elimination von A# B<br />
Elimination der A# S<br />
S # ASA | aB | a | SA | AS<br />
S 0 # ASA | aB | a | SA | AS<br />
A# b<br />
A# ASA | aB | a | SA | AS<br />
Die resultierende Regelmenge:<br />
S 0 # ASA | aB | a | SA | AS<br />
S # ASA | aB | a | SA | AS<br />
A# b | ASA | aB | a | SA | AS<br />
B# b<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [50]
Elimination von Einer-Regeln – G-Stukturbaum vs. G'-Stukturbaum<br />
G-Stukturbaum<br />
G'-Strukturbaums<br />
Ableitungen, die auf Einer-Regeln basieren, können „abgekürzt“ werden.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [51]<br />
Abschliessende Konvertierung in Chomsky Normalform<br />
• Sei A # u 1 u 2 …u k , wobei k ! 3 und u i ! (! " N).<br />
Wir ersetzen diese Regel durch die Regeln<br />
A # u 1 A 1 , A 1 # u 2 A 3 , … A k-2 # u k-1 u k Die A i seine neue Variablen.<br />
• Jeder Anwendung der Regel A # u 1 u 2 …u k entspricht die sequentielle<br />
Anwendung der Regeln A # u 1 A 1 , A 1 # u 2 A 3 , … A k-2 # u k-1 u k .<br />
• Anschliessend ersetzen wir in allen Regeln der Form<br />
A # u i A j , in denen u i ! !, u i durch die neue Variable U i , d.h. modifizieren die<br />
Regel zu A # u i A j und führen die neue Regel A # U j ein (gleiche Terminale u i<br />
können durch gleiche neue Variable U i ersetzt werden).<br />
• Jeder Anwendung der Regel A # u i A j in G' entspricht die sequentielle<br />
Anwendung der Regeln A # U 1 A j und anschliessend A # U j in G''.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [52]
Erstellung von Regeln in Ch-Normalform – Beweis von Satz 3.21 (Forts.)<br />
Beispiel<br />
Die Ausgangs-Regelmenge<br />
S 0 # ASA | aB | a | SA | AS<br />
S # ASA | aB | a | SA | AS<br />
A# b | ASA | aB | a | SA | AS<br />
B# b<br />
Umformung von S 0 # ASA<br />
Umformung von S # ASA<br />
Umformung der Regeln mit rechter Seite aB<br />
Die resultierende Regelmenge<br />
nach 1. Teilschritt:<br />
S 0 # AA 1 | aB | a | SA | AS<br />
S # AA 1 | aB | a | SA | AS<br />
A# b | ASA | aB | a | SA | AS<br />
A 1 # SA<br />
B# b<br />
S 0 # AA 1 , A 1 # SA<br />
S # AA 1 , A 1 # SA<br />
X # UB , U# a<br />
Die resultierende Regelmenge<br />
nach 2. Teilschritt:<br />
S 0 # AA 1 | UB | a | SA | AS<br />
S # AA 1 | UB | a | SA | AS<br />
A# b | ASA | UB | a | SA | AS<br />
A 1 # SA<br />
U # a<br />
B# b<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [53]<br />
Chomsky Normalform – G-Stukturbaum vs. G'-Stukturbaum<br />
G'-Stukturbaum<br />
G''-Strukturbaums<br />
Ableitungen, die auf Nicht-Normalform-Regeln basieren, werden durch Sequenzen<br />
von Normalformableitungen durchgeführt.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [54]
Normalformen Zusammenfassung<br />
Aufgabe: Vereinfachung von kontextfreien Grammatiken<br />
Theoreme zu vereinfachten Grammatiken<br />
• Für jede kontextfreie Sprache L, d.h. L ! TYP2 $ , gilt, dass L – { " } durch eine kfG<br />
ohne "-Regeln erzeugt werden kann.<br />
• Zu jeder kfG G gibt es eine äquivalente kfG G' in Chomsky-Normalform, d.h.<br />
L(G) = L(G')<br />
Alle Regeln von G' haben die Form A # B C oder A # a mit A, B, C ! N und a<br />
! !. Falls " ! L = L(G), ist zusätzlich die Regel S # " zugelassen.<br />
Chomsky Normalform ist wichtig für Beweise, z.B. Pumpinglemma für kontextfreie<br />
<strong>Sprachen</strong>.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [55]<br />
<strong>Kellerautomaten</strong>: Grundidee<br />
Ergänzung des endlichen Automaten mit einem einfachen Speicher<br />
Zur Erinnerung: Der Speicher des endlichen Automaten<br />
• besteht allein aus dem Zustandsspeicher<br />
• entspricht einer Zelle mit endlicher Kapazität (einer von endlich viele Zuständen)<br />
Kellerspeicher: LIFO-Prinzip (last in – first out)<br />
• Im Prinzip unbeschränkte Kapazität (keine Beschränkung der Anzahl der<br />
Speicherzellen)<br />
• die einzelnen Speicherzellen des Kellers haben aber nur endliche Kapazität<br />
( = 1 Symbol aus dem (endlichen) Keller-Alphabet)<br />
• Es ist immer nur das 'oberste' Symbol des Speichers zugreifbar.<br />
• In der Beschränkung der Zugriffsmöglichkeit besteht der entscheidende Unterschied<br />
zu den Turingmaschinen.<br />
• Das Kelleralphabet und das Eingabealphabet können übereinstimmen, müssen es<br />
aber nicht.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [56]
Kellerautomat<br />
$<br />
0<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [57]<br />
Abb: © Vossen & Witt (2006)<br />
Definition (nichtdeterministischer) Kellerautomat<br />
Definition 13.22<br />
Ein (nichtdeterministischer) Kellerautomat K = (!, Q, 0, -, q 0 , 1, F), besteht aus:<br />
• ! : ein Alphabet (Eingabealphabet)<br />
• 0 : ein Alphabet (Kelleralphabet) $<br />
• Q : eine endliche Menge, die Menge<br />
der Zustände<br />
• - : Q ( (! " {2}) ( 0 # .(Q ( 0*)<br />
ist die Zustandsüberführungsfunktion<br />
von K.<br />
• q 0 ! Q : der Startzustand<br />
• 1 ! 0 : das Kellerboden-Symbol<br />
(initialer Kellereintrag)<br />
• F , Q : die Menge der Endzustände<br />
Die Definition des <strong>Kellerautomaten</strong> spezifiziert die 'endliche Kontrolle'.<br />
0<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [58]<br />
Abb: © Vossen & Witt (2006)
Zustandsüberführungsfunktion des <strong>Kellerautomaten</strong><br />
(q', k 1 …k n ) ! -(q, x, k) • Ist K im Zustand q,<br />
• liest auf dem Eingabeband das Symbol x<br />
• und auf dem Keller das Symbol k,<br />
• dann kann K in den Zustand q' wechseln<br />
• und k auf dem Keller durch k 1 …k n ersetzten,<br />
• wobei k 1 zum obersten Symbol wird.<br />
(q', 2) ! -(q, x, k) • Ist K im Zustand q,<br />
• liest auf dem Eingabeband das Symbol x<br />
• und auf dem Keller das Symbol k,<br />
• dann kann K in den Zustand q' wechseln<br />
• und k vom Keller löschen.<br />
(q', k 1 …k n ) ! -(q, 2, k) • Ist K im Zustand q,<br />
• und liest auf dem Keller das Symbol k,<br />
• dann kann K in den Zustand q' wechseln<br />
• und k auf dem Keller durch k 1 …k n ersetzten,<br />
• wobei k 1 zum obersten Symbol wird.<br />
(q', 2) ! -(q, 2, k) • Ist K im Zustand q,<br />
• und liest auf dem Keller das Symbol k,<br />
• dann kann K in den Zustand q' wechseln<br />
• und k vom Keller löschen.<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [59]<br />
Beispiel Kellerautomat<br />
K 1 = ({a, b}, {q 0 , q 1 , q f }, {1, 1}, - 1 , q 0 , 1, {q f }) mit<br />
- 1 (q 0 , 2, 1) = - 1 (q 1 , 2, 1) = {(q f , 2)}<br />
- 1 (q 0 , a, 1) = {(q 0 , 11)}<br />
- 1 (q 0 , a, 1) = {(q 0 , 11)}<br />
- 1 (q 0 , b, 1) = - 1 (q 1 , b, 1) = {(q 1 , 2)}<br />
- 1 (q 0 , 2, 1) = - 1 (q 0 , b, 1) = - 1 (q 1 , 2, 1) =<br />
- 1 (q 1 , a, 1) = - 1 (q 1 , a, 1) = - 1 (q 1 , b, 1) =<br />
- 1 (q f , 2, 1) = - 1 (q f , 2, 1) = - 1 (q f , a, 1) =<br />
- 1 (q f , a, 1) = - 1 (q f , b, 1) = - 1 (q f , b, 1) = /<br />
FGI-1 Habel / Eschenbach Kap 13 <strong>Kontextfreie</strong> <strong>Sprachen</strong> & Grammatiken [60]