Durch 3 teilbar
13 BEAFB I–IIEin Prüfbaustein liest Binärzahlen von links nach rechts und akzeptiert genau die, deren Wert durch 3 teilbar ist; führende Nullen sind erlaubt, das leere Wort gilt als 0. Der Zustand ri bedeutet „der bisher gelesene Wert hat bei Division durch 3 den Rest i“.
- Geben Sie die Zustandsfolgen für
110und111an und entscheiden Sie jeweils, ob das Wort akzeptiert wird. (3 BE) - Stellen Sie die zugehörige reguläre Grammatik in der Notation N, T, Startsymbol, Produktionsregeln auf. (4 BE)
- Stellen Sie die Ableitung von
1001dar und ordnen Sie jedem Schritt den Zustand des DEA zu. (3 BE) - Das leere Wort soll nicht mehr erzeugt werden, alle anderen Wörter der Sprache schon. Erläutern Sie, wie die Grammatik dafür geändert werden kann. (3 BE)
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
Hinweis zu Aufgabe d)
11 oder 0. Ein neues Startsymbol hilft.Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
110: r0 → r1 → r0 → r0 — akzeptiert (Wert 6).
111: r0 → r1 → r0 → r1 — nicht akzeptiert (Wert 7, Rest 1).
Erwartungshorizont zu Aufgabe b)
N = {S, A, B} mit S = r0, A = r1, B = r2; T = {0, 1}; Startsymbol: S
S → 0S | 1A | ε
A → 0B | 1S
B → 0A | 1B
Erwartungshorizont zu Aufgabe c)
S ⇒ 1A ⇒ 10B ⇒ 100A ⇒ 1001S ⇒ 1001
Zustände: r0 (S) → r1 (A) → r2 (B) → r1 (A) → r0 (S); der letzte Schritt nutzt S → ε, weil r0 Endzustand ist. 1001 hat den Wert 9.
Erwartungshorizont zu Aufgabe d)
S → ε wird gebraucht, weil jedes durch 3 teilbare Wort über S endet. Man führt deshalb ein neues Startsymbol Z ein, das die Regeln von S ohne die ε-Regel übernimmt: Z → 0S | 1A. S, A und B bleiben unverändert. Aus Z entsteht kein leeres Wort, aber z. B. Z ⇒ 0S ⇒ 0 und Z ⇒ 1A ⇒ 11S ⇒ 11. (Im DEA: neuer Startzustand, der kein Endzustand ist.)
Fahrprogramme für einen Roboter
17 BEAFB II–IIIEin Lernroboter führt Programme aus den Befehlen v (vorwärts), l (links drehen), r (rechts drehen) und s (stopp) aus. Gültige Programme werden durch die Grammatik G beschrieben:
T = {v, l, r, s}
Startsymbol: S
Produktionsregeln:
S → vS | lA | rA | s
A → vS
- Zeichnen Sie den Zustandsgraphen eines DEA, der genau die von G erzeugten Programme akzeptiert. Nicht eingezeichnete Übergänge dürfen mit Vermerk in einen Fehlerzustand führen. (5 BE)
- Begründen Sie, warum Ihr Automat deterministisch ist und warum er einen Zustand braucht, der keinem Nichtterminal entspricht. (3 BE)
- Implementieren Sie in Java eine Methode
boolean gueltig(String prog), die den DEA simuliert. (5 BE) - Damit der Roboter auch zweimal hintereinander drehen kann, ergänzt ein Entwickler bei A die Regeln A → lA | lS. Beurteilen Sie diese Änderung im Hinblick auf die Umwandlung in einen DEA und geben Sie eine Grammatik ohne dieses Problem für dieselbe Sprache an. (4 BE)
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
switch über den Zustand. Ungültige Zeichen führen in den Fehlerzustand.Hinweis zu Aufgabe d)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
Nicht eingezeichnete Übergänge führen in den Fehlerzustand zF.
z0 = S, z1 = A (nach einer Drehung muss v folgen), zE = neuer Endzustand für S → s.
Erwartungshorizont zu Aufgabe b)
Für jedes Nichtterminal beginnt höchstens eine Regel mit einem bestimmten Befehl (S: v, l, r, s; A: v) — also hat jeder Zustand für jedes Zeichen höchstens einen Pfeil; fehlende Pfeile führen nach zF. Die Regel S → s endet ohne Nichtterminal; nach dem Stopp ist das Programm fertig. Dafür braucht man einen eigenen Endzustand zE ohne ausgehende Pfeile.
Erwartungshorizont zu Aufgabe c)
// Zustände: 0 = S, 1 = A, 2 = zE, 3 = zF public static boolean gueltig(String prog) { int z = 0; for (int i = 0; i < prog.length(); i++) { char c = prog.charAt(i); switch (z) { case 0: if (c == 'v') z = 0; else if (c == 'l' || c == 'r') z = 1; else if (c == 's') z = 2; else z = 3; break; case 1: if (c == 'v') z = 0; else z = 3; break; default: z = 3; } } return z == 2; }
Test: vvlvs → true, lrvs → false (nach l muss v folgen), vsv → false (nach dem Stopp darf nichts folgen).
Erwartungshorizont zu Aufgabe d)
Mit A → vS | lA | lS gibt es zwei Regeln mit l bei A. Der Zustand A hätte zwei Pfeile mit l (nach A und nach S) — das ist kein DEA mehr; die direkte Umwandlung scheitert.
Abhilfe: ein neues Nichtterminal X für „nach l in A: A oder S“. X übernimmt die Regeln von A und S: X → vS | lX | rA | s, und A → vS | lX. Zu jedem Nichtterminal und Befehl gibt es wieder höchstens eine Regel, die Sprache bleibt gleich.
