Vorlesung | Übungsaufgabe | vom |
Thümmel: Formale Syntax | Keller-Automaten: Palindrome | 15. Jan. 1998 |
Ein Kellerautomat, der die Sprache L akzeptiert, sieht wie folgt aus:
K | {q0, q1} | endliche, nicht leere Menge von Zuständen |
V | {a, b} | endliche, nicht leere Menge von Eingabesymbolen |
s | q0 | Anfangszustand s ÎK |
F | {q0, q1} | Menge von Endzuständen |
D | (q0, a, e) -> (q0, X)
(q0, a, Y) -> (q0, YX) (q0, b, Y) -> (q1, e) (q0, b, e) -> (q0, Y) (q0, b, X) -> (q0, XY) (q1, a, X) -> (q1, e) (q0, a, X) -> (q1, e) (q1, b, Y) -> (q1, e) |
Teilmenge von K x V* x G* x K x G*
Übergang von qi zu qj Dabei kann der Automat
|
- | - | Kellerspeicher |
G | {X, Y} | Speicheralphabet |
Die erste Hälfte der Eingabe wird dadurch in den Kellerspeicher gebracht, daß dem Kellerspeicher das das Eingabesymbol repräsentierende Symbol hinzugefügt wird, wenn es nicht gerade vom Kellerspeicher gelesen werden kann. Sei die Eingabe z.B. abaaba. Beim Einlesen des zweiten Buchstaben ist im Keller ein X. Daher kann die Regel (q0, b, X) -> (q0, XY) angewendet werden. Die Regel (q0, b, e) -> (q0, Y) kommt in dieser Situation nicht in Frage, da nach Konvention die leere Kette nur aus dem Kellerspeicher gelesen werden kann, wenn der Speicher leer ist, also nur die leere Kette enthalten ist. Das nächste Zeichen der Eingabe ist ein a. Im Kellerspeicher kann Y gelesen werden, so daß ein weiteres X hinzugefügt wird. Beim folgenden a findet jetzt die Regel (q0, a, X) Anwendung, und der Automat geht in den Zustand q1 über. Nun wird der Rest der Folge wie oben beschrieben abgearbeitet.
Bemerkung: Könnte e immer gelesen werden, wären zwar die ersten beiden Regeln gleichbeteutend. Aber wo sonst die vorletzte Regel greifen würde, könnte man auch die erste Regel anwenden. So wäre der Automat nicht mehr deterministisch.
abaaba gehört nicht zur Sprache L. Zwar muß das x in xxR
für den Automaten eine Kette aus abwechselnden a und b sein, aber
dafür gibt es mehr Möglichkeiten als die Wiederholung der Kette
"ab". Z.B. akzeptiert der Automat neben abaaba auch aa, bb, baab, babbab
und babaabab. Die Sprache müßte lauten:
L3 = { xxR | x = [b](ab)*[a] }, wobei [] bedeuten
sollen, daß der so geklammerte Teil fehlen darf.
L | { xxR | x = (ab)* } | leer Kette, abba, ababbaba, abababbababa usw. |
L2 | { x Î {a, b}* | x = xR } | alle Palindrome in V*, also auch z.B. abbaabba und aaaaa |
L3 | { xxR | x = [b](ab)*[a] } | Palindrome, in denen außer in der Mitte nie gleiche Buchstaben nebeneinander stehen |
Im Überblick:
L | { xxR | x = (ab)* } | S -> e
S -> abSba |
Typ 0, da
(S -> e) Î R und S Î y |
L2 | { x Î {a, b}* | x = xR } | S -> e
S -> aSa S -> bSb S -> a S -> b |
Typ 0, da
(S -> e) Î R und S Î y |
L3 | { xxR | x = [b](ab)*[a] } | S -> A
S -> B A -> bAb B -> aBa A -> e B -> e A -> abAba B -> baBab |
Typ 0, da
lg(A) > lg(e) |
L | { xxR | x = (ab)* } | S -> e
S -> A A -> abba A -> abAba |
Typ 1nr,
Typ 1e und Typ 2 |
L | { xxR | x = (ab)* } | S -> e
S -> A A -> BC C -> AD A -> BD B -> aE E -> b D -> bF F -> a |
Typ 3,
Normalform, rechtslinear, rechtsprädikativ, allerdings mit w2 Î VN* |
L2 | { x Î {a, b}* | x = xR } | ||
L3 | { xxR | x = [b](ab)*[a] } |