Aufgabenblock — AFB III
Begründen statt nur ausführen: Automaten selbstständig entwerfen, Behauptungen widerlegen, Grenzen beweisen, Entwürfe und Tests beurteilen. Formulieren Sie Ihre Antwort vollständig, bevor Sie die Musterlösung aufklappen.
Eine vereinfachte E-Mail-Adresse besteht aus einem Namen (mindestens ein Buchstabe), dem Zeichen @ und einer Domain aus mindestens zwei Teilen, die durch Punkte getrennt sind; jeder Teil besteht aus mindestens einem Buchstaben. Beispiele: anna@schule.de, max@mail.nds.de. Verwenden Sie \(\Sigma=\{B,\,@,\,.\}\), wobei B für einen beliebigen Buchstaben steht.
Entwerfen Sie einen DEA, der genau diese Adressen akzeptiert. Geben Sie für jeden Zustand seine Bedeutung an und testen Sie Ihren Automaten mit geeigneten Wörtern, auch mit Grenzfällen.
Musterlösung anzeigen (zählt als erledigt)
Nicht eingezeichnete Übergänge führen in den Fehlerzustand zF.
| Zustand | Bedeutung |
|---|---|
| z0 | noch nichts gelesen |
| z1 | Name mit mind. einem Buchstaben |
| z2 | @ gelesen |
| z3 | erster Domain-Teil begonnen |
| z4 | Punkt gelesen — Teil fehlt noch |
| z5 | mind. zwei Domain-Teile, letzter nicht leer |
| Testwort | Ergebnis |
|---|---|
anna@schule.de | ✓ akzeptiert |
max@mail.nds.de | ✓ akzeptiert |
anna@de | ✗ abgelehnt |
a.b@c.de | ✗ abgelehnt |
@x.de | ✗ abgelehnt |
a@b..de | ✗ abgelehnt |
anna@schule. | ✗ abgelehnt |
Wichtig: z3 darf kein Endzustand sein (anna@de hat nur einen Domain-Teil), z4 auch nicht (Adresse endet auf Punkt). Der Rückweg z5 –.→ z4 erlaubt beliebig viele Domain-Teile, verhindert aber zwei Punkte hintereinander.
Ein Mitschüler behauptet: „Mein Automat akzeptiert genau die Binärzahlen, die durch 4 teilbar sind.“
Widerlegen Sie die Behauptung und geben Sie an, welche Sprache der Automat tatsächlich erkennt. Beschreiben Sie, wie ein korrekter Automat aussehen müsste.
10 (Wert 2) endet in z1 und wird akzeptiert. Der Automat merkt sich nur die letzte Ziffer; für Teilbarkeit durch 4 braucht er die letzten zwei.Musterlösung anzeigen (zählt als erledigt)
Gegenbeispiel: z0 \(\xrightarrow{\text{1}}\) z1 \(\xrightarrow{\text{1}}\) z2 \(\xrightarrow{\text{0}}\) z1 — 110 (Wert 6) wird akzeptiert, 6 ist nicht durch 4 teilbar. Die Behauptung ist falsch.
z1 bedeutet „letzte Ziffer 0“, z2 „letzte Ziffer 1“. Der Automat erkennt \(L(A)=\{\,w\in\{0,1\}^*\mid w \text{ endet auf } 0\,\}\), also die geraden Binärzahlen (führende Nullen zugelassen).
Korrektur: Eine Binärzahl ist genau dann durch 4 teilbar, wenn sie auf 00 endet (oder 0 ist). Der Automat muss sich die letzten zwei Ziffern merken: ein zusätzlicher Zustand „endet auf 00“ als einziger Endzustand neben „nur 0 gelesen“; z1 („endet auf genau eine 0“) ist dann kein Endzustand mehr.
Gegeben ist die Sprache \(L=\{\,w\in\{a,b\}^*\mid w \text{ enthält gleich viele } a \text{ wie } b\,\}\), z. B. aabb, ba, \(\varepsilon\).
Beweisen Sie, dass es keinen DEA gibt, der \(L\) erkennt.
Musterlösung anzeigen (zählt als erledigt)
Annahme: Ein DEA \(A\) mit \(k\) Zuständen erkennt \(L\).
Schubfach: Die \(k+1\) Wörter \(a^0,a^1,\dots,a^k\) können nicht alle in verschiedenen Zuständen enden. Also gibt es \(i<j\), sodass \(A\) nach \(a^i\) und nach \(a^j\) im selben Zustand \(z\) ist.
Gleiches Urteil: Ab \(z\) liest \(A\) bei \(a^ib^i\) und bei \(a^jb^i\) dieselben Zeichen \(b^i\) und endet im selben Zustand. Er akzeptiert also beide oder keines.
Widerspruch: \(a^ib^i\) enthält \(i\) mal a und \(i\) mal b, liegt also in \(L\); \(a^jb^i\) enthält \(j\ne i\) mal a, liegt nicht in \(L\). Die Annahme ist falsch — kein DEA erkennt \(L\), gleichgültig wie groß \(k\) ist.
Gegeben ist ein DEA über \(\Sigma=\{a,\,b\}\).
Formulieren Sie die Sprache \(L(A)\) präzise in Worten und als Menge \(L(A)=\{\,w\in\Sigma^*\mid\dots\,\}\). Begründen Sie Ihre Beschreibung mit den Bedeutungen der Zustände.
Musterlösung anzeigen (zählt als erledigt)
| Zustand | Bedeutung |
|---|---|
| z0 | die letzten zwei Zeichen enthalten kein a (bzw. noch nichts gelesen / nur b) |
| z1 | letztes Zeichen a, davor kein a (oder nichts) |
| z2 | Wort endet auf ab |
| z3 | Wort endet auf aa |
\(L(A)=\{\,w\in\{a,b\}^*\mid |w|\ge 2 \text{ und das vorletzte Zeichen von } w \text{ ist } a\,\}\)
Begründung: z2 und z3 sind genau die Zustände, in denen das vorletzte gelesene Zeichen ein a war (…ab bzw. …aa). Jedes weitere Zeichen verschiebt das Fenster: z3 –b→ z2 (aus …aa wird …ab), z2 –a→ z1 (aus …ab wird …ba) usw. Wörter mit weniger als zwei Zeichen enden in z0 oder z1 und werden abgelehnt.
Gegenprobe: ε ✗, a ✗, ab ✓, ba ✗, bab ✓, abb ✗, baa ✓
Der Automat aus A4 (vorletztes Zeichen ist a) soll in einem Programm verwendet werden. Wörter können auch Zeichen außerhalb von Σ enthalten.
Implementieren Sie eine Klasse, die die Übergangstabelle als zweidimensionales Feld speichert, eine Methode spalte für die Zeichennummer und eine Methode akzeptiert besitzt. Begründen Sie, warum Ihre Tabelle keine Zeile für einen Fehlerzustand braucht.
spalte den Wert −1, bricht akzeptiert sofort mit false ab. Sonst zustand = delta[zustand][s]; am Ende auf 2 oder 3 prüfen.Musterlösung anzeigen (zählt als erledigt)
public class VorletztesA { // a b private int[][] delta = { {1, 0}, // z0 {3, 2}, // z1 {1, 0}, // z2 (Endzustand) {3, 2} }; // z3 (Endzustand) private int zustand; private int spalte(char c) { if (c == 'a') { return 0; } if (c == 'b') { return 1; } return -1; // Zeichen nicht in Σ } public boolean akzeptiert(String wort) { zustand = 0; for (int i = 0; i < wort.length(); i++) { int s = spalte(wort.charAt(i)); if (s == -1) { return false; } // ungültiges Zeichen zustand = delta[zustand][s]; } return zustand == 2 || zustand == 3; } }
Der Automat selbst hat keinen Fehlerzustand: Aus jedem Zustand ist ein Endzustand erreichbar. Ungültige Zeichen fängt akzeptiert mit dem Sofort-Abbruch ab — ohne diese Prüfung würde delta[zustand][-1] eine Ausnahme auslösen. Wichtig ist außerdem zustand = 0; zu Beginn jedes Aufrufs.
Das Treppenhauslicht (Zustände aus, an2, an1; T Taster, t eine Minute vergangen) soll zwei neue Funktionen erhalten:
- Eine Minute vor dem Ausschalten flackert das Licht kurz (Ausgabe flackern), damit man rechtzeitig erneut drücken kann.
- Ein Hausmeisterschalter
Dschaltet Dauerlicht ein; ein weiteresDschaltet das Licht sofort aus.
Erweitern Sie den Mealy-Automaten und geben Sie die vollständige Übergangstabelle an. Testen Sie mit der Eingabe T t t D t D.
Musterlösung anzeigen (zählt als erledigt)
| Zustand | T | t | D |
|---|---|---|---|
| aus | an2 / an | aus / ε | dauer / an |
| an2 | an2 / ε | an1 / flackern | dauer / ε |
| an1 | an2 / ε | aus / aus | dauer / ε |
| dauer | dauer / ε | dauer / ε | aus / aus |
\(\Omega=\{\text{an},\,\text{aus},\,\text{flackern}\}\), \(4\cdot 3=12\) Übergänge. D im Zustand an2/an1 gibt \(\varepsilon\) aus, weil das Licht bereits brennt.
| Schritt | Zustand | Eingabe | Ausgabe | Folgezustand |
|---|---|---|---|---|
| 1 | aus | T | an | an2 |
| 2 | an2 | t | flackern | an1 |
| 3 | an1 | t | aus | aus |
| 4 | aus | D | an | dauer |
| 5 | dauer | t | ε | dauer |
| 6 | dauer | D | aus | aus |
Ausgabewort: an, flackern, aus, an, aus — die Minute t im Dauerbetrieb bleibt ohne Wirkung.
Ein Verschlüsselungsgerät verschiebt Buchstaben im Alphabet abwechselnd um 1 und um 2 Stellen: Der erste Buchstabe wird um 1 verschoben, der zweite um 2, der dritte wieder um 1 usw. Nach Z geht es mit A weiter. Es gilt \(\Sigma=\Omega=\{A,\,B,\,\dots,\,Z\}\).
Entwickeln Sie einen Mealy-Automaten für das Verschlüsseln und einen für das Entschlüsseln. Verschlüsseln Sie HALLO und begründen Sie, warum ein Mealy-Automat mit nur einem Zustand hier nicht ausreicht.
Musterlösung anzeigen (zählt als erledigt)
Jeder Pfeil steht für 26 Übergänge (einer je Buchstabe), insgesamt \(2\cdot 26=52\).
HALLO: H+1 = I, A+2 = C, L+1 = M, L+2 = N, O+1 = P → Ausgabewort ICMNP.
Entschlüsseln: gleicher Aufbau, Beschriftungen x / x−1 und x / x−2. Probe: ICMNP → HALLO.
Ein Zustand reicht nicht: Das zweite L in HALLO wird zu N, das erste zu M — dieselbe Eingabe, verschiedene Ausgaben. Bei nur einem Zustand hinge die Ausgabe allein vom Eingabezeichen ab.
Auftrag: Ein Mealy-Automat soll nach jedem gelesenen Bit ausgeben, ob die Anzahl der bisher gelesenen Einsen ungerade (Ausgabe 1) oder gerade (Ausgabe 0) ist. Eine Schülerin legt folgenden Entwurf vor.
Überprüfen Sie den Entwurf mit geeigneten Testeingaben. Geben Sie jeden Fehler an und korrigieren Sie ihn.
11: Soll 10, Ist 11. Der Pfeil u –1→ g muss 0 ausgeben: Nach der zweiten Eins ist die Anzahl gerade.Musterlösung anzeigen (zählt als erledigt)
Bedeutung: g = „bisher gerade Anzahl Einsen“, u = „ungerade Anzahl“. Die Ausgabe muss die Parität nach dem Lesen angeben.
| Pfeil | Entwurf | Soll | Befund |
|---|---|---|---|
| g –0→ g | 0 | 0 | ✓ |
| g –1→ u | 1 | 1 | ✓ |
| u –0→ u | 1 | 1 | ✓ |
| u –1→ g | 1 | 0 | ✗ Fehler |
Testeingabe 0110: Soll 0100, Ist 0110 — Abweichung im dritten Zeichen, genau beim Pfeil u –1→ g. Korrektur: Beschriftung 1 / 0. Eingaben ohne zwei Einsen (z. B. 100) hätten den Fehler nicht aufgedeckt.
Für den DEA, der Dezimalzahlen wie 12,5 prüft (Ziffern, höchstens ein Komma, auf beiden Seiten des Kommas mindestens eine Ziffer), schlägt ein Schüler folgende Testliste vor: 12,5, 3,14, 100, 7,0. Erwartung: alle akzeptiert.
Bewerten Sie die Testliste. Stellen Sie eine verbesserte Liste mit erwarteten Ergebnissen auf.
,5, 3,, 1,2,3.Musterlösung anzeigen (zählt als erledigt)
Bewertung: Alle vier Wörter sollen akzeptiert werden — die Liste prüft nur, dass nichts Gültiges abgelehnt wird. Ein Automat, der jedes Wort akzeptiert, oder einer, bei dem z2 fälschlich Endzustand ist, bestünde sie. Grenzfälle fehlen völlig. Die Liste ist deshalb unzureichend.
| Testwort | erwartet | prüft |
|---|---|---|
7 | ✓ | kürzestes gültiges Wort |
12,75 | ✓ | Normalfall, benutzt beide Ziffern-Schleifen |
ε | ✗ | leeres Wort |
,5 | ✗ | Komma am Anfang |
3, | ✗ | Komma am Ende (z2 kein Endzustand) |
1,2,3 | ✗ | zweites Komma |
1,,2 | ✗ | zwei Kommas hintereinander |
Mit dieser Liste wird jeder Übergang aus z0 bis z3 mindestens einmal benutzt, und zu jedem Endzustand gibt es ein akzeptiertes und zu jedem anderen Zustand ein abgelehntes Wort, das dort endet.
Ein Team möchte für einen Editor prüfen, ob in einem Quelltext alle runden Klammern korrekt geschlossen sind. Ein Teammitglied schlägt vor, dafür einen DEA zu verwenden, weil DEAs schnell sind und leicht zu implementieren.
Erörtern Sie den Vorschlag.
Musterlösung anzeigen (zählt als erledigt)
Pro: Ein DEA liest jedes Zeichen genau einmal, braucht keinen Zusatzspeicher und ist mit einer Tabelle schnell implementiert. Für eine feste Höchsttiefe (z. B. 10) gibt es einen DEA: je Tiefe 0 bis 10 ein Zustand, dazu zF für „zu viele schließende Klammern“ oder „zu tief“.
Contra: Allgemein korrekt geklammerte Ausdrücke sind nicht regulär. Wie bei \(L=\{a^nb^n\mid n\ge 0\}\) müsste der Automat beliebig viele offene Klammern mitzählen; mit \(k\) Zuständen landen die Vorgeschichten (i und (j für ein Paar \(i<j\) im selben Zustand, und (i)i und (j)i würden gleich beurteilt. Ein reiner DEA prüft also nicht jeden Quelltext korrekt.
Fazit: Als alleiniges Werkzeug ist ein DEA ungeeignet. Vertretbar ist er nur mit einer dokumentierten Tiefenbegrenzung; sonst braucht das Programm zusätzlich einen unbeschränkten Zähler für die offenen Klammern — also mehr als endlich viele Zustände.
