• Keine Ergebnisse gefunden

4. Grammatiken 4.1. Grundlegende Definitionen Wie lassen sich formale Sprachen beschreiben? im endlichen Fall: Aufzählung der Wörter der Sprache im unendlichen Fall: akzeptierende Automaten, Mengenausdrücke: z.B. {a

N/A
N/A
Protected

Academic year: 2022

Aktie "4. Grammatiken 4.1. Grundlegende Definitionen Wie lassen sich formale Sprachen beschreiben? im endlichen Fall: Aufzählung der Wörter der Sprache im unendlichen Fall: akzeptierende Automaten, Mengenausdrücke: z.B. {a"

Copied!
1
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

4. Grammatiken

4.1. Grundlegende Definitionen

Wie lassen sich formale Sprachen beschreiben?

im endlichen Fall: Aufzählung der Wörter der Sprache

im unendlichen Fall: akzeptierende Automaten, Mengenausdrücke: z.B. {an | n Primzahl}, reguläre Ausdrücke (für reguläre Sprachen) oder Grammatiken

Def.: Eine Grammatik G = (V, , P, S) besteht aus 1. einer endlichen Menge V von Variablen,

2. einer endlichen Terminalalphabetwobei gelten muss: V   = ,

3. einer endlichen Menge P von Regeln, d.h. Elementen aus (V  (V   4. einer Startvariable S  V.

Regeln (auch: Produktionen) werden oft in der Form linke Seite -> rechte Seite notiert.

Def.: Seien u, v  (V  G = (V, , P, S) eine Grammatik.Wir definieren:

u =>G v (u geht unter G direkt in v über) falls gilt:

1. u = xyz, 2. v = xy'z,

3. (y, y')  P. (alternative Schreibweise: y -> y'  P).

Sei =>G* die reflexive und transitive Hülle von =>G. (die kleinste Relation, die =>G enthält und reflexiv und transitiv ist; in anderen Worten: die Relation, die genau die Wortpaare enthält, die man durch Hintereinanderausführen einer beliebigen Anzahl (einschließlich 0) von direkten Übergängen erhält.)

Die von G erzeugte Sprache ist L(G) = {w  * | S =>G* w}.

Beispiel: G = (V, , P, S) mit V = {S, B, C}

= {a, b, c}

P = {S -> aSBC, S -> aBC, CB -> BC, aB -> ab, bB -> bb, bC -> bc, cC -> cc}

Beispielableitung (falls G aus Kontext klar, lassen wir den Index =>G weg):

S => aSBC => aaBCBC => aabCBC => aabBCC => aabbCC => aabbcC => aabbcc L(G) = {an bn cn | n > 0}

Bei Ableitungen obiger Art gibt es in vielen Schritten Alternativen, z.B. hätte man von S aus auch in aBC übergehen können, von aSBC in aaSBCBC etc. Die möglichen Ableitungen bilden einen Baum (genannt kompletter Ableitungsbaum) mit Wurzel S. Knoten sind mit Wörtern beschriftet. Nachfolgerknoten beschreiben jeweils alle möglichen direkten Übergänge.

Es kann Sackgassen geben:

(2)

S => aSBC => aaBCBC => aabCBC => aabcBC kein Nachfolger!

4.2 Die Chomsky-Hierarchie Spezialfälle von Grammatiken:

Typ Bezeichnung zusätzliche Einschränkung

Typ 0 keine

Typ 1 kontextsensitiv für alle Regeln w1 -> w2 gilt |w1|  |w2|

Typ 2 kontextfrei wie Typ 1 und w1  V

Typ 3 regulär wie Typ 2 und: w2    V

Die Beispielgrammatik für an bn cn ist kontextsensitiv, aber nicht kontextfrei, da einige Regeln mehr als 1 Variable auf der linken Seite haben.

Sonderregelung für :

1. Das leere Wort  kann nach obiger Definition nicht aus Typ 1, 2, 3 Grammatiken hergeleitet werden. Das ist unschön. Man erlaubt deshalb den Sonderfall S -> unter der Voraussetzung, dass S nicht auf der rechten Seite einer Regel vorkommt.

Sei L(G) die Sprache einer Grammatik G = (V, , P, S) mit   L(G). Sei S' ein neues Startsymbol. Die Grammatik

G = (V  {S'}, , P {S' -> S' -> S}, S') erzeugt L(G)  {} und erfüllt obige Bedingungen.

2. Für kontextfreie und reguläre (nur diese!) Grammatiken ist die Verwendung von Regeln der Form V -> unproblematisch, denn man kann sie eliminieren, falls   L(G), bzw. auf die in 1. genannte Form beschränken, falls   L(G).

Die Elimination von Regeln V -> lässt sich folgendermaßen durchführen:

a) Zerlege die Variablen in disjunkte Teilmengen V1 und V2, so dass V1 diejenigen Variablen enthält, aus denen das leere Wort hergeleitet werden kann. V1 ist die kleinste Menge, für die gilt:

(1) A ->  P impliziert A  V1,

(2) B -> C1... Ck P und Ci  V1 für alle i impliziert B  V1.

b) Lösche alle -Regeln und füge für jede Regel D -> w, in der mindestens eine Variable aus V1 auf der rechten Seite vorkommt, alle Regeln der Form D -> w' hinzu, wobei w' ein

nichtleeres Wort ist, das durch Weglassen von Variablen aus V1 in w entsteht.

Zu beachten: wenn auf der rechten Seite mehrfach Variablen aus V1 vorkommen, so müssen alle Möglichkeiten, diese wegzulassen, berücksichtigt werden.

(3)

Beispiel: D -> AaBbA, A, B  V1

neue Regeln: D -> aBbA, D -> AabA, D -> AaBb, D -> abA, D -> aBb, D -> Aab, D -> ab also: falls k Variablen aus V1 vorkommen, 2k-1 neue Regeln!

c) Falls S  V1 erweitere die Grammatik entsprechend 1.

Beispiel:

S -> A A -> aBb B -> bAa A ->  B ->  (mit den Konventionen:

S Startsymbol, Großbuchstaben Variablen, Kleinbuchstaben Terminalsymbole, V und  enthalten genau die in den Regeln vorkommenden Variablen bzw. Terminalsymbole

reichen die Regeln allein für die vollständige Spezifikation der Grammatik) V1 = {S,A,B}

neue Grammatik (Startsymbol S'):

S' ->  S' -> S S -> A A -> aBb A -> ab B -> bAa B -> ba (L(G) = (ab)*: reguläre Grammatik: S -> S-> aB, B -> bA, B -> b, A -> aB)

Eine Sprache L heißt vom Typ i (0  i  3), wenn es eine Grammatik G vom Typ i gibt mit L(G) = L. Die Bezeichner kontextsensitiv, kontextfrei, regulär werden auch für die

entsprechenden Sprachen verwendet.

Da eine Typ j Grammatik jeweils ein Spezialfall einer Typ i Grammatik ist wenn i < j, bilden die Sprachen eine Hierarchie. Wir werden später zeigen, dass es sich jeweils um eine echte Inklusion handelt, also

Typ 3 Sprachen  Typ 2 Sprachen  Typ 1 Sprachen  Typ 0 Sprachen

Warum die Beschränkung bei Typ-1 Sprachen, dass rechte Seite mindestens so lang sein muss wie linke?

garantiert Entscheidbarkeit des Wortproblems:

Wortproblem: gegeben Grammatik G, w  *, gilt w  L(G)?

Satz: Das Wortproblem für Typ-1 Sprachen ist entscheidbar, d.h. es gibt einen Algorithmus, der bei Eingabe einer kontextsensitiven Grammatik G und eines Wortes w  * entscheidet, ob w  L(G).

Beweis: Sei |w| = n. Da die Länge eines einmal erzeugten Wortes aus (V  sich nicht wieder reduzieren kann, genügt es, den kompletten Ableitungsbaum so weit zu erzeugen, dass alle weiteren Ableitungen entweder zu bereits erzeugten Wörtern oder zu Wörtern einer Länge > n führen würden. Da es nur endlich viele Wörter in(V  der Länge m  n gibt, ist dieser Baum endlich. Es gilt w  L(G) gdw. ein Knoten des so erzeugten Baums mit w beschriftet ist.

(4)

Beispiel: obige Grammatik. Ist abab L(G)? Baum aller Ableitungen bis Länge 4:

S'

 S

A

aBb ab

abab

Jede weitere Ableitung führt zu Länge > 4.

Da abab im Baum vorkommt, gehört es zur Sprache, abba dagegen gehört nicht zur Sprache.

5. Reguläre Grammatiken und reguläre Sprachen

Wir müssen noch zeigen, dass die Bezeichnung "reguläre Sprachen" für die von regulären Grammatiken erzeugten Sprachen gerechtfertigt ist:

Satz: Jede von einem endlichen Automaten akzeptierte Sprache wird von einer regulären Grammatik erzeugt.

Beweis: Sei A = (, z0, F) ein DEA. Wir definieren eine Typ-3 Grammatik G, so dass L(A) = L(G).

G = (V, , P, S) mit V = Z, S = z0, und P besteht aus folgenden Regeln:

falls (z1,a) = z2 dann z1 -> az2  P falls (z1,a) = z2 und z2  F dann z1 -> a P falls  L(A) dann z0 ->  P

Jetzt gilt:

a1a2 ... an  L(A) gdw.

 es gibt Folge z0z1 ... zn mit z0 Startzustand, zn  F, und für alle 0 < i  n: (zi-1,ai) = zi

 es gibt Folge z0z1 ... zn-1 mit z0 Startvariable und es gilt:

z0 => a1z1 => ... => a1... an-1zn-1 => a1a2 ... an

 a1a2 ... an  L(G).

Beispiel:

(5)

P besteht aus:

q0 -> q0 q0 ->  q0 -> 1q1 q1 -> q1 q1 -> 1q0 q1 -> 1 q0 -> 

Satz: Jede von einer regulären Grammatik erzeugte Sprache wird von einem NEA (und damit auch von einem DEA) akzeptiert.

Beweis: Sei G = (V, , P, S). G sei bereits in die unter Sonderregelungen beschriebene Form überführt ( höchstens in der Regel S -> und dann S nicht rechts in Regel.Wir definieren einen NEA A = (, z0, F), so dass L(A) = L(G), wie folgt:

Z = V {X} X neues Symbol z0 = S

F = {S,X} falls S ->   P, {X} sonst B  (A,a) falls A -> aB  P

X  (A,a) falls A -> a  P

Jetzt gilt für n > 0 (der Fall n=0, also w = ist offensichtlich):

a1a2 ... an  L(G) gdw.

 es gibt Folge A0A1 ... An-1 von Variablen mit:

S => a1A1 => ... => a1... an-1An-1 => a1a2 ... an

 es gibt Folge A0A1 ... An-1 von Zuständen mit:

A1  (S,a1), A2  (A1,a2), …, X  (An-1,an),

 a1a2 ... an  L(A).

Beispiel:

S -> aS S -> aB B -> bB B -> b wird zu:

a b

a b

S B X

(6)

6. Kontextfreie Grammatiken

6.1 Syntaxbäume

Ein Syntaxbaum (auch Parsebaum, nicht zu verwechseln mit dem oben verwendeten

kompletten Ableitungsbaum) repräsentiert eine konkrete Ableitung in einer Typ-2 (oder Typ- 3) Grammatik auf folgende Weise: Sei

S => x0 => ... => xn

eine Ableitung des Wortes x. Die Wurzel des Baumes ist mit S beschriftet. Falls in der Ableitung ein Übergang von xi zu xi+1 erfolgt, wobei die Variable V durch w ersetzt worden ist, so gibt es im Baum | w | Nachfolgeknoten von V, die mit den Symbolen in w markiert sind.

Syntaxbaum für aabb, Grammatik des obigen Beispiels:

S

a S

a B

b B

b

Syntaxbäume für reguläre Grammatiken haben immer die Form einer solchen Kette.

Im Allgemeinen können Syntaxbäume mehrere Ableitungen repräsentieren:

S -> S * S S -> S + S S -> x S -> y S -> z S

S + S

x y

repräsentiert:

1) S => S + S => x + S => x + y 2) S => S + S => S + y => x + y

Eine Linksableitung ist eine Ableitung, bei der jeweils die am weitesten links stehende Variable ersetzt wird. Jedem Syntaxbaum entspricht genau 1 Linksableitung (hier 2).

Manchmal gibt es mehr als 1 Syntaxbaum für dasselbe Wort:

(7)

S

S + S

x S * S y z

S

S * S

S + S z y z

Eine Grammatik heißt mehrdeutig, wenn es verschiedene Syntaxbäume für ein Wort gibt.

Eine Sprache L heißt inhärent mehrdeutig, wenn L(G) = L impliziert: G ist mehrdeutig.

6.2 Backus-Naur-Form

Die Backus-Naur-Form (BNF) verwendet abkürzende Schreibweisen für kontextfreie Grammatiken:

A -> w1 | w2 | ... | wn | Abkürzung für. A -> w1

A -> w2

… A -> wn

A -> w1[w2]w3 Abkürzung für. A -> w1w2w3

A -> w1w3

A -> w1{w2}w3 Abkürzung für. A -> w1Bw3

A -> w1w3

B -> w2

B -> w2B

Da alle Abkürzungen in die ursprüngliche Form rücküberführt werden können, lassen sich durch Grammatiken in BNF nicht mehr Sprachen erzeugen als durch die üblichen

kontextfreien Grammatiken.

(8)

6.3 Chomsky Normalform

Def.: Eine kontextfreie Grammatik G mit   L(G) ist in Chomsky Normalform (CNF), falls alle Regeln die Form A -> BC oder A -> a haben, wobei A,B,C Variablen sind und a ein Terminalsymbol.

Satz: Zu jeder kontextfreien Grammatik G mit   L(G) gibt es eine äquivalente Grammatik G' in CNF.

Beweis: Wir erzeugen G' aus G durch folgende Schritte:

1. Eliminieren von  -Regeln nach bereits bekanntem Verfahren.

2. Eliminieren von Regeln der Form A -> B, wobei A,B Variablen sind:

a) Ersetzen von Variablen A1, ..., Ak, für die gilt A1 -> A2, ..., Ak-1 -> Ak, Ak -> A1, durch eine einzige Variable A.

b) Sortieren der verbleibenden Variablen, so dass Vi -> Vj impliziert i < j. Jetzt können, bei der letzten Variable beginnend, schrittweise Regeln Vi -> Vj ersetzt werden durch Vi -> x1, ..., Vi -> xk, wobei Vj -> x1, ..., Vj -> xk die Regeln sind, bei denen Vj auf der linken Seite vorkommt.

3. Es gibt jetzt nur noch Regeln der Form A -> a sowie A -> x mit |x| > 1. Füge für jedes Terminalsymbol a eine neue Variable Va ein, füge Regeln Va -> a hinzu und ersetze jedes Vorkommen eines Terminalsymbols in x durch die entsprechende Variable.

4. Nur noch Regeln der Form A -> B1B2...Bk sind nicht in CNF. Füge neue Variablen C2, ..., Ck-1 ein und ersetze obige Regel durch

A -> B1C2

C2 -> B2C3

… Ck-1 -> Bk-1Bk

Beispiel: S -> ab, S -> aSb

Schritte 1,2 hier irrelevant. Schritt 3: neue Variablen für a und b: Va, Vb

S -> VaVb Va -> a S -> VaSVb Vb -> b Schritt 4: neue Variable C benötigt S -> VaVb Va -> a S -> VaC Vb -> b C -> SVb

Anmerkung: es gibt eine weitere Normalform, die sogenannte Greibach-Normalform. Hier haben alle Regeln die Form A -> aB1...Bn, n  0.

(9)

6.4 Der CYK-Algorithmus (Cocke, Younger, Kasami)

effizienter Algorithmus für das Wortproblem kontextfreier Sprachen, wobei diese in Form von CNF Grammatiken gegeben sein müssen.

Grundidee: Wort x = a der Länge 1 kann nur durch einmalige Anwendung einer Regel A -> a abgeleitet werden, Wort x der Länge n > 1 nur durch Anwendung einer Regel A -> BC, wobei B Anfangsstück von x ableitet, C Endstück. Also: systematisch alle Teilworte von x der Länge 1,..., n-1 erzeugen und prüfen, ob sie erzeugbar sind. Dann prüfen, ob es eine Regel gibt mit BC auf der rechten Seite, so dass x aus dieser Regel erzeugt wird.

Sei xi,j das Teilwort von x, das an Position i beginnt und Länge j hat. Wir konstruieren schrittweise eine Tabelle, die an Position i,j die Variablen enthält, aus denen Teilwort xi,j des gesuchten Wortes abgeleitet werden kann.

obiges Beispiel:

S -> AB A -> a S -> AC B -> b C -> SB

zu testen: aabb Tabelle:

i ->

a a b b

j A A B B

Hier sind zunächst die Variablen eingetragen, aus denen Teilwörter der Länge 1 hergeleitet werden können. Als nächstes betrachten wir Teilwörter der Länge 2, die sich aus Regeln mit 2 passenden Variablen auf der rechten Seite erzeugen lassen (es gibt nur eins):

i ->

a a b b

j A A B B

S

Wörter der Länge 3 und 4:

(10)

i ->

a a b b

j A A B B

S C S

Da S das gesamte Wort erzeugt, gehört dieses zur Sprache.

Im Allgemeinen können mehrere Variablen dasselbe Teilwort erzeugen.

Algorithmus:

Eingabe: x = a1 ... an

for i := 1 to n do T[i,1] := {A  V | A -> ai  P}end; Initialisierung, j = 1 for j := 2 to n do

for i := 1 to n+1-j do T[i,j] := ;

for k := 1 to j-1 do

T[i,j] := T[i,j] {A  V | A -> BC  P, B T[i,k], C T[i+k,j-k]}

end;

end;

end;

if S  T[1,n] then "Eingabewort herleitbar" else "Eingabewort nicht herleitbar".

Komplexität O(n3), da 3 ineinander verschachtelte for-Schleifen existieren.

(11)

6.5 Das Pumping Lemma für kontextfreie Sprachen

Satz: Sei L eine kontextfreie Sprache. Dann gibt es eine Zahl n, so dass sich alle Wörter z mit

|z|  n zerlegen lassen in z = uvwxy, wobei gilt:

1. |vx|  1, 2. |vwx|  n,

3. für alle i  0 gilt: uviwxiy  L.

Beweis: Sei G CNF-Grammatik für L -{}, k die Anzahl der Variablen in G. Wähle n = 2k. Der Syntaxbaum eines Wortes z  L(G) ohne den jeweils letzten Ableitungsschritt (Variable

 Terminalsymbol) ist ein Binärbaum. Sei |z|  n. Da der Binärbaum  n Blätter hat, gibt es mindestens einen Pfad der Länge  k, d.h. an dem Pfad liegen  k+1 Variablen. Also kommt mindestens eine Variable A doppelt vor. Sei w das Wort, das aus dem (vom Blatt aus

gesehen) ersten Vorkommen von A abgeleitet wurde, vwx das aus dem zweiten Vorkommen.

Auf das obere A muss eine Regel der Form A -> BC angewendet worden sein, deshalb kann vx nicht leer sein (Bed. 1.).

Da der Abstand des oberen A von den Blättern höchstens k ist, kann vwx höchstens die Länge 2k = n haben (Bed. 2).

Im Syntaxbaum können wir den Teilbaum, der am unteren A beginnt, gleich am oberen A einfügen. Man erhält so uwy. Man kann aber auch am unteren A den (alten) Teilbaum des oberen A einfügen und erhält uv2wx2y. Das kann man beliebig oft wiederholen und erhält uviwxiy (Bed. 3).

Skizzen:

S

A A

u v w x y

S

A

u w y

S

(12)

A A

u v A x y v w x

Das Pumping Lemma für kontextfreie Sprachen wird genauso verwendet wie das für reguläre Sprachen:

Um zu zeigen, dass eine Sprache L nicht kontextfrei ist, wähle Wort aus L (abhängig von Pumping-Zahl n), so dass aufgrund des Pumping Lemmas ein anderes Wort w' auch in L sein müsste, was aber nach Definition von L nicht der Fall ist. Damit kann L nicht kontextfrei sein.

Standardbeispiel: L = {ambmcm | m  1} ist nicht kontextfrei.

Beweis: Angenommen, L wäre kontextfrei. Sei n die Pumping-Zahl von L und betrachte anbncn. Dieses Wort müsste sich zerlegen lassen in uvwxy mit |vwx|  n. vwx kann deshalb nicht sowohl aus a's wie aus b's wie aus c's bestehen, sondern mindestens eines der

Terminalsymbole kommt nicht vor. Nach dem Pumping Lemma müsste uwy ebenfalls in L sein, was aber unmöglich ist, denn das nicht in vwx enthaltene Terminalsymbol kommt in uwy öfter vor als mindestens eines der anderen Symbole.

7. Kellerautomaten

7.1 Kellerautomaten und akzeptierte Sprachen

Endliche Automaten haben, abgesehen von den Zuständen, kein "Gedächtnis" und können sich nicht "merken", wie sie in einen bestimmten Zustand gekommen sind.

Kellerautomaten (PDA: Push down automaton) verfügen zusätzlich über einen Speicher, der in Form eines Kellers organisiert ist: gelesen wird jeweils nur das oberste Zeichen, und bei einem Zustandsübergang wird dieses ersetzt und möglicherweise mehrere neue Zeichen im Keller gespeichert.

Ein Hinweis zu verschiedenen Definitionen in der Literatur:

man kann die von einem PDA akzeptierten Wörter wie bisher durch akzeptierende Zustände, aber auch durch leeren Keller definieren. Im ersteren Fall (etwa Hopcroft, Motwani, Ullman) sind PDAs 7-Tupel, im zweiten Fall (Schöning) 6-Tupel. Die Ansätze sind äquivalent, hier wollen wir den zweiten verwenden.

Def.: Ein (nichtdeterministischer) Kellerautomat ist ein 6-Tupel M = (Z, , , , z0, #) hierbei ist:

Z endliche Zustandsmenge

(13)

 Eingabealphabet

 Kelleralphabet

 : Z x (  {}) x  -> Powf(Z x *) die Überführungsfunktion (Powf(X) ist die Menge aller endlichen Teilmengen von X)

z0 Startzustand

#   unterstes Kellerzeichen

Intuitiv heißt (z', B1...Bk)  (z,a,A):

wenn M in Zustand z Eingabe a liest und A ist oberstes Kellerzeichen, so kann M in z' übergehen, wobei A überschrieben wird mit B1...Bk (B1 oberstes neues Kellerzeichen).

Die üblichen PUSH und POP-Operationen bei Stacks lassen sich simulieren (PUSH(B) hier durch Wahl von B1...Bk = BA, POP durch B1...Bk = 

Es kann auch spontane -Übergänge geben.

Es gibt keine Endzustände! w wird akzeptiert, wenn nach Abarbeitung von w Keller leer ist!

Notation: wir schreiben zaA -> z'B1..Bk, falls (z', B1..Bk)  (z,a,A) (a  oder a = 

Def.: Eine Konfiguration eines Kellerautomaten ist ein Element (z,w1,w2) aus Z x * x *.

Hierbei ist z der aktuelle Zustand, w1 das noch zu verarbeitende Restwort, w2 der Kellerinhalt.

Wir definieren die Konfigurationsübergangsrelation wie folgt:

(z, a1...an, A1...Am) |-- (z', a2...an, B1..BkA2...Am) falls za1A1 -> z'B1..Bk

(z, a1...an, A1...Am) |-- (z', a1...an, B1..BkA2...Am) falls zA1 -> z'B1..Bk

Sei |--* die reflexive und transitive Hülle von |--. Die durch einen Kellerautomaten M = (Z, , , , z0, #)

(durch leeren Speicher) akzeptierte Sprache ist:

N(M) = {x  * | (z0, x, #) |--* (z, , ) Beispiel: M = ({z0,z1}, {a,b,$}, {A,B,#}, , z0, #) mit:

z0a# -> z0A# z0aA -> z0AA z0aB -> z0AB z0b# -> z0B# z0bA -> z0BA z0bB -> z0BB z0$# -> z1# z0$A -> z1A z0$B -> z1B z1aA -> z1 z1bB -> z1 z1# -> z1 M akzeptiert z.B. ab$ba, denn:

(z0, ab$ba, #) |-- (z0, b$ba, A#) |-- (z0, $ba, BA#) |-- (z1, ba, BA#)

|-- (z1, a, A#) |-- (z1, , #) |-- (z1, , )

(14)

M akzeptiert nicht ab$ab, denn:

(z0, ab$ab, #) |-- (z0, b$ab, A#) |-- (z0, $ab, BA#) |-- (z1, ab, BA#) hier geht es nicht weiter!

akzeptierte Sprache: {c1...cn$cn...c1 | ci  {a,b}}

M ist deterministisch: es gibt jeweils höchstens 1 Nachfolgekonfiguration. Im allgemeinen Fall kommt man mit deterministischen nicht hin, z.B. bei der Sprache

{c1...cncn...c1 | ci  {a,b}}

Da das $ in der Mitte fehlt, muss man jetzt "raten", ob man in der Mitte ist. Das lässt sich nur durch Nichtdeterminismus erreichen, hier etwa durch Ersetzen von

z0$# -> z1A# z0$A -> z1A z0$B -> z1B durch: z0# -> z1 z0aA -> z1 z0bB -> z1 Herleitung von bbbb:

(z0, bbbb, #) |-- (z0, bbb, B#) |-- (z0, bb, BB#) |-- (z1, b, B#)

|-- (z1, , #) |-- (z1, , )

Hier wurde die richtige Auswahl getroffen (d.h. die Mitte des Wortes richtig geraten). Man hätte als zweiten Übergang auch wählen können: (z0, bbb, B#) |-- (z1, bb, #). Man wäre dann aber nicht zur Zielkonfiguration gekommen.

Im Allgemeinen bilden die möglichen von der Startkonfiguration erreichbaren Konfigurationen einen Baum.

7.2 Kellerautomaten und kontextfreie Sprachen

Satz: Eine Sprache L ist kontextfrei genau dann, wenn L von einem PDA erkannt wird.

Beweis: (=>)

Zur Motivation: Betrachte folgende Grammatik:

S -> AB A -> a | aA B -> b | bB

Linksableitung von aab:

S => AB => aAB => aaB => aab Modellierung mit PDA?

a a b

(15)

z S

a a b

A

z B

a a b

a A

z B

a a b

A

z B

a a b

a

z B

a a b

z B

a a b

z b

a a b

z

Es entspricht jeweils der bereits abgearbeitete Teil der Eingabe gefolgt vom Kellerinhalt dem in der Linksableitung aktuell abgeleiteten Wort.

Um das hinzukriegen brauchen wir einen -Übergang für jede Regel der Grammatik:

zS -> zAB zA -> zaA zA -> za zB -> zbB zB -> zb

Außerdem brauchen wir Übergänge, die uns erlauben, in der Eingabe vorzurücken, wenn das passende Terminalsymbol oben im Stack steht:

zaa -> z

zbb -> z

Hier der eigentliche Beweis (Sketch):

Sei G = (V, , P, S) kontextfreie Grammatik für L. Wir definieren Kellerautomaten M, so dass durch M Ableitungen von G simuliert werden:

M = ({z}, , V  , , z, S) wobei  wie folgt definiert wird:

(16)

für jede Regel A ->   P,   (V  )*: (z, )  (z, , A)

für alle a  : (z, )  (z, a, a)

Es gilt für alle x  *:

x  L(G)

 es gibt Linksableitung in G der Form S => ... => x

 es gibt Konfigurationsübergänge (z,x,S) |-- ... |-- (z,,)

 x  L(M)

Begründung: betrachte Linksableitung in G. Ein während der Ableitung erzeugtes Wort entspricht jeweils dem Stackinhalt von M zusammen mit dem bereits abgearbeiteten Teil der Eingabe x.

weiteres Beispiel:

G:

S -> aSb S -> aCb S -> ab C -> cC C -> c M:

zaa -> z

zbb -> z

zcc -> z

zS -> zaSb zS -> zaCb zS -> zab zC -> zcC zC -> zc

(Links-)Ableitung von aacbb:

S => aSb => aaCbb => aacbb

entsprechende Konfigurationsübergänge:

(z, aacbb, S) |-- (z, aacbb, aSb) |-- (z, acbb, Sb) |-- (z, acbb, aCbb) |-- (z, cbb, Cbb)

|-- (z, cbb, cbb) |-- (z, bb, bb) |-- (z, b, b) |-- (z,,)

Länge der G-Ableitung plus Länge von x = Länge der Konfigurationsfolge

Beweis (<=):

(17)

Sei L die von

M = (Z, , , , z0, #)

akzeptierte Sprache. Wir nehmen an, dass für jedes zaA -> z’B1...Bk gilt: k  2. Diese Annahme ist keine Einschränkung, denn falls k > 2 können wir k-2 neue Zustände z1,,...,zk-2

einführen und zaA -> z’B1...Bk ersetzen durch : zaA -> z1Bk-1Bk

z1Bk-1 -> z2Bk-2Bk-1

...

zk-2B2 -> z’B1B2

Wir konstruieren Grammatik G, die Rechenschritte von M durch Linksableitungen simuliert:

G = (V, , P, S) mit V = {S}  Z   Z

P = {S -> (z0, #, z) | z  Z} 

{(z,A,z’) -> a | (z’, )  (z, a, A)} 

{(z,A,z’) -> a(z1, B, z’) | (z1, )  (z, a, A), z’ Z} 

{(z,A,z’) -> a(z1, B, z2) (z2, C, z’) | (z1, C)  (z, a, A), z’, z2  Z}

Grundidee: Regeln für Variable (z, A, z’) so definiert, dass man alle Wörter herleiten kann, deren Eingabe im Automaten im Zustand z bei oberstem Kellerelement A dazu führen, dass das von A belegte Feld im Stack wieder freigemacht wird, wobei nach dem Freimachen in den Zustand z’ übergegangen wird.

Erläuterung zu den Regeln in P:

1. Teilmenge: aus S muss alles herleitbar sein, was man in M vom Startzustand aus durch Entfernen des untersten Stackelementes # herleiten kann, wobei in beliebigen Zustand übergegangen werden darf.

2. Teilmenge: wenn M bei Lesen von a in z’ übergeht und dabei A aus dem Stack löscht, so gehört a zu den Wörtern, deren Eingabe im Zustand z mit oberstem Stacksymbol A zu Freigeben der Position von A und Übergang in z’ führt.

3. Teilmenge: wenn M bei Lesen von a in z1 übergeht und dabei A im Stack durch B ersetzt, so gehört a gefolgt von jedem aus (z1, B, z’) herleitbaren Wort (d.h. jedem Wort, dessen Eingabe in z1 zu Leeren der Position von B und Übergang in z’ führt), zu den Wörtern, deren Eingabe im Zustand z mit oberstem Stacksymbol A zu Freigeben der Position von A und Übergang in z’ führt.

4. Teilmenge: wenn M bei Lesen von a in z1 übergeht und dabei A im Stack durch BC ersetzt, so gehört a gefolgt von jedem aus (z1, B, z2) herleitbaren Wort gefolgt von jedem aus (z2, C, z’) herleitbaren Wort (hier ist z2 ein beliebiger Zustand) zu den Wörtern, deren Eingabe im Zustand z mit oberstem Stacksymbol A zu Freigeben der Position von A und Übergang in z’

führt.

Es lässt sich nun zeigen:

(z, A, z’) =>* x genau dann wenn (z, x, A) |--* (z’, , )

Beweis durch Induktion über Anzahl der Rechenschritte von M (<=) bzw. die Länge der Linksableitung von x (=>).

(18)

(hier nicht: Interessenten seien auf Schöning verwiesen) Mit dieser Aussage ergibt sich:

x  N(M) <=> (z0, x, #) |--* (z, , ) für ein z  Z

<=> S => (z0, #, z) =>* x für ein z  Z

<=> x  L(G)

Beispiel: Automat für L = an$an

M = ({z0,z1}, {a, $}, {A, #}, , z0, #) mit:

z0a# -> z0A# z0aA -> z0AA z0$# -> z1# z0$A -> z1A z1aA -> z1 z1# -> z1 Wir konstruieren Grammatik G mit

V = {S,(z0, A, z0), (z0, A, z1), (z1, A, z0), (z1, A, z1), (z0, #, z0), (z0, #, z1), (z1, #, z0), (z1, #, z1)}

P:

S -> (z0, #, z0) S -> (z0, #, z1)

(z1, A, z1) -> a wegen z1aA -> z1 (z1, #, z1) ->  wegen z1# -> z1 (z0, #, z0) -> $(z1, #, z0) wegen z0$# -> z1# (z0, #, z1) -> $(z1, #, z1)

(z0, A, z0) -> $(z1, A, z0) wegen z0$A -> z1A (z0, A, z1) -> $(z1, A, z1)

(z0, #, z0) -> a(z0, A, z0) (z0, #, z0) wegen z0a# -> z0A#

(z0, #, z0) -> a(z0, A, z1) (z1, #, z0) (z0, #, z1) -> a(z0, A, z0) (z0, #, z1) (z0, #, z1) -> a(z0, A, z1) (z1, #, z1)

(z0, A, z0) -> a(z0, A, z0) (z0, A, z0) wegen z0aA -> z0AA (z0, A, z0) -> a(z0, A, z1) (z1, A, z0)

(z0, A, z1) -> a(z0, A, z0) (z0, A, z1) (z0, A, z1) -> a(z0, A, z1) (z1, A, z1) Konfigurationsübergänge für aa$aa:

(z0, aa$aa, #) |-- (z0, a$aa, A#) |-- (z0, $aa, AA#) |-- (z1, aa, AA#) |-- (z1, a, A#)

|-- (z1, , #) |-- (z1, , ) Entsprechende Linksableitung in G:

S => (z0, #, z1)

=> a(z0, A, z1) (z1, #, z1)

=> aa(z0, A, z1) (z1, A, z1) (z1, #, z1)

=> aa$(z1, A, z1) (z1, A, z1) (z1, #, z1)

(19)

=> aa$a (z1, A, z1) (z1, #, z1)

=> aa$aa (z1, #, z1)

=> aa$aa

Korollare aus dem Beweis dieser Proposition:

1. Jeder Kellerautomat kann in einen äquivalenten Kellerautomaten mit genau 1 Zustand überführt werden (konstruiere Grammatik für N(M), erzeuge wie in Beweis Kellerautomat für diese Grammatik).

2. Für jede kontextfreie Sprache gibt es eine Grammatik, in der alle Regeln die Form A -> a A -> aB A -> aBC

haben (erzeuge PDA M für Grammatik G, erzeuge wie in Beweis Grammatik für M).

7.3 Deterministisch kontextfreie Sprachen

Def.: Ein Kellerautomat M heißt deterministisch, falls für alle Zustände z, Eingabesymbole a und Kellersymbole A gilt:

|(z, a, A)| + |(z, , A)|  1 Akzeptieren per leerem Keller/ per Endzustand:

Ein per Endzustand akzeptierender PDA ist ein Tupel M = (Z, , , , z0, #, F)

wobei F Menge der Endzustände ist. Die von M per Endzustand akzeptierte Sprache ist L(M) = {w | (z0, w, #) |--* (z, W), z  F, W  *}

Im allgemeinen Fall macht es keinen Unterschied, ob man die von einem PDA akzeptierte Sprache über den leeren Keller oder über Endzustände definiert: wenn es einen per leerem Keller akzeptierenden PDA für L gibt, dann gibt es auch einen per Endzustand akzeptierenden PDA und umgekehrt.

Begründung: Sei M per Endzustand akzeptierender PDA. Wir erzeugen aus M einen per leerem Keller akzeptierenden Automaten. Um zu verhindern, dass im neuen Automaten Eingaben akzeptiert werden, für die M ohne zu akzeptieren in eine Konfiguration mit leerem Keller kommt, muss zuerst ein neues unterstes Stacksymbol #' eingeführt werden: ein neuer Anfangszustand z0' wird nur dazu verwendet, das neue Symbol unter das alte Symbol # zu schreiben und in den ursprünglichen Anfangszustand z0 zu gehen: z0'# -> z0##'. Des weiteren wird ein neuer Zustand q benötigt, in den man aus jedem Endzustand per -Übergang

kommen kann. In diesem Zustand wird nur noch der Keller geleert, was durch Hinzufügen von Regeln der Form qB -> q für alle Kellersymbole B erreicht wird.

Auch für die umgekehrte Richtung muss man zuächst wie oben beschrieben ein neues unterstes Stacksymbol #' unter # "schieben". Durch Hinzufügen eines neuen, akzeptierenden

(20)

Zustandes q und Einfügen von Regeln der Form z#' -> q (für alle z  Z) entsteht ein äquivalenter per Endzustand akzeptierender Automat.

Für deterministische PDAs (DPDAs) gilt diese Äquivalenz nicht!

Per leerem Keller akzeptierende DPDAs sind ziemlich uninteressant, denn es können nicht einmal alle regulären Sprachen von ihnen akzeptiert werden:

Def.: Ein Sprache L heißt präfixfrei, wenn a1...an  L impliziert: für alle k < n, a1...ak  L.

Satz: Sei L = N(M) für einen per leerem Keller akzeptierenden DPDA. L ist präfixfrei.

Beweis: Sei L nicht präfixfrei. Es gibt ein Wort w mit Präfix w'  L. Da der Keller von M nach Abarbeiten von w' leer ist, wird w nicht akzeptiert.

Viele sehr einfache reguläre Sprachen sind nicht präfixfrei, etwa a*. Alle diese Sprachen können nicht von einem DPDA per leerem Keller erkannt werden.

Deshalb betrachtet man per Endzustand akzeptierende DPDAs.

Deterministisch kontextfreie Sprache: durch DPDA (per Endzustand) erkannt.

Standardbeispiel: a1...an$an...a1 (deterministisch) versus a1...anan...a1 (nichtdeterministisch) Deterministisch kontextfreie Sprachen sind echte Obermenge der regulären Sprachen:

Satz: Jede reguläre Sprache kann durch einen DPDA (per Endzustand) erkannt werden.

Beweis: offensichtlich, da ein DPDA, der den Stack nicht berücksichtigt und unverändert lässt, sich genauso verhält wie ein DEA.

Wie das Beispiel a1...an$an...a1 zeigt, lassen sich auch nicht reguläre Sprachen erkennen.

Bei deterministischen Kellerautomaten gibt es für jede Konfiguration höchstens 1 Nachfolgekonfiguration. Deshalb ist das Wortproblem für deterministisch kontextfreie Sprachen in linearer Zeit lösbar. Aus diesem Grunde spielen sie bei der Definition von Programmiersprachen und im Compilerbau eine erhebliche Rolle.

Satz: Die deterministisch kontextfreien Sprachen sind unter Komplementbildung abgeschlossen.

Die kontextfreien Sprachen sind nicht unter Schnitt abgeschlossen:

L1 = {anbncm | n, m > 0} kontextfrei L2 = {anbmcm | n, m > 0} kontextfrei

L1  L2 = {anbncn | n > 0} nicht kontextfrei (Pumping Lemma)

Da L1 und L2 deterministisch kontextfrei sind (Übungsaufgabe), bilden sie auch ein Gegenbeispiel für Nichtabgeschlossenheit unter Schnitt für deterministisch kontextfreie Sprachen.

(21)

Damit gilt auch Nichtabgeschlossenheit unter Vereinigung: mit Komplement und Vereinigung könnte Schnitt gebildet werden:

L1  L2 = L1  L2

Satz: Die deterministisch kontextfreien Sprachen sind nicht unter Schnitt und Vereinigung abgeschlossen.

Satz: Der Schnitt einer (deterministisch) kontextfreien Sprache mit einer regulären Sprache ist eine (deterministisch) kontextfreie Sprache.

Beweis: Sei M1 = (Z1, , , 1, z01, #, E1) (deterministischer) Kellerautomat (mit Endzuständen E1), der (deterministisch) kontextfreie Sprache L1 akzeptiert. Sei M2 = (Z2, , 2, z02, E2) DEA, der reguläre Sprache L2 akzeptiert. Der (deterministische) Kellerautomat

M3 = (Z1  Z2, , , 3, (z01, z02), #, E1  E2)

mit ((z1’, z2’), B1…Bk)  3((z1,z2),a,A) gdw. (z1’, B1…Bk)  1(z1,a,A) und 2(z2,a) = z2’ erkennt L1  L2.

Referenzen

ÄHNLICHE DOKUMENTE

1) Geben Sie f¨ ur jedes der W¨ orter a, c und abc jeweils ein weiteres Wort an, das zu dem jeweiligen Wort ¨ aquivalent ist. Geben Sie außerdem ein Wort an, dass zu keinem der..

Put your solutions in the letterbox labeled Automaten und formale Sprachen adjacent to room lf , or hand them in through the online moodle -platform. If you hand in online,

Bitte werfen Sie Ihre Abgabe in den mit Automaten und formale Sprachen beschrifteten Briefkasten neben Raum lf , oder geben Sie sie online ab ¨ uber die moodle-Plattform.. Wenn

Put your solutions in the letterbox labeled Automaten und formale Sprachen adjacent to room lf , or hand them in through the online moodle -platform. If you hand in online,

Put your solutions in the letterbox labeled Automaten und formale Sprachen adjacent to room lf , or hand them in through the online moodle -platform.. If you hand in online,

Put your solutions in the letterbox labeled Automaten und formale Sprachen adjacent to room lf , or hand them in through the online moodle -platform. If you hand in online,

Put your solutions in the letterbox labeled Automaten und formale Sprachen adjacent to room lf , or hand them in through the online moodle -platform. If you hand in online,

Bitte werfen Sie Ihre Abgabe in den mit Automaten und formale Sprachen beschrifteten Briefkasten neben Raum lf , oder geben Sie sie online ab ¨ uber die moodle -Plattform. Wenn