MINT lernen

Übung AFB III

Entwerfen, beweisen, erörtern: Hier entscheiden Ihre Begründungen — vom Kellerautomaten bis zur mehrdeutigen Grammatik.

Ihr Fortschritt:
0 / 0 Aufgaben
3

Aufgabenblock — AFB III

Begründen statt nur ausführen: Grammatiken und Kellerautomaten entwerfen, Behauptungen widerlegen, Grenzen beweisen, Vorschläge bewerten. Formulieren Sie Ihre Antwort vollständig, bevor Sie die Musterlösung aufklappen.

A1
Kommazahlen mit Vorzeichen
AFB III

Eine Kommazahl besteht aus einem optionalen Vorzeichen v, mindestens einer Ziffer z und optional einem Komma k, auf das mindestens eine Ziffer folgt, z. B. z, vzz, zkz, vzkzz. Entwerfen Sie eine reguläre Grammatik über T = {v, z, k}, geben Sie die Bedeutung jedes Nichtterminals an und testen Sie mit gültigen und ungültigen Wörtern.

Strategie: Gehen Sie das Wort von links nach rechts durch und fragen Sie nach jedem Teilstück: Was ist schon da, was darf noch kommen?Warum so? Jede Stelle, an der andere Zeichen erlaubt sind, braucht ein eigenes Nichtterminal.
Lösungsskizze: S → vA | zB, A → zB, B → zB | kC | ε, C → zD, D → zD | ε.
Musterlösung anzeigen (zählt als erledigt)
N = {S, A, B, C, D}
T = {v, z, k}
Startsymbol: S
Produktionsregeln:
S → vA | zB
A → zB
B → zB | kC | ε
C → zD
D → zD | ε
NichtterminalBedeutung
Snoch nichts erzeugt
AVorzeichen erzeugt, Ziffer fehlt
Bmindestens eine Ziffer vor dem Komma — fertig möglich
CKomma erzeugt, Ziffer fehlt
Dmindestens eine Ziffer nach dem Komma — fertig möglich
TestwortErgebnis
vzkzzS ⇒ vA ⇒ vzB ⇒ vzkC ⇒ vzkzD ⇒ vzkzzD ⇒ vzkzz ✓
zS ⇒ zB ⇒ z ✓
vnach vA keine ε-Regel ✗
zknach zkC keine ε-Regel ✗
zkzkzD hat keine Regel mit k ✗
kzS hat keine Regel mit k ✗

ε-Regeln nur bei B und D — genau dort darf die Zahl enden.

A2
Kontextfrei heißt nicht regulär
AFB III

Jemand behauptet: „Jede Sprache, die eine kontextfreie Grammatik erzeugt, erkennt auch ein DEA — man braucht nur genug Zustände.“ Widerlegen Sie die Behauptung.

Strategie: Ein einziges Gegenbeispiel genügt: eine kontextfreie Grammatik, deren Sprache kein DEA erkennt.Warum so? Eine Allaussage ist falsch, sobald ein Fall sie verletzt.
Lösungsskizze: S → aSb | ε erzeugt {aⁿbⁿ | n ≥ 0}; Schubfach mit aⁱ und aʲ, dann bⁱ anhängen.
Musterlösung anzeigen (zählt als erledigt)

Gegenbeispiel: G mit S → aSb | ε ist kontextfrei und erzeugt \(L=\{a^nb^n\mid n\ge 0\}\).

Kein DEA: Hätte ein DEA k Zustände, würden zwei der Vorgeschichten \(a^0,\dots,a^k\), etwa \(a^i\) und \(a^j\) mit \(i<j\), im selben Zustand enden. Dann behandelt er \(a^ib^i\in L\) und \(a^jb^i\notin L\) gleich — Widerspruch. „Genug Zustände“ hilft nicht, weil das Argument für jedes k gilt.

Also: Jede reguläre Sprache ist kontextfrei, aber nicht umgekehrt.

A3
a hoch n, b hoch 2n
AFB III

Beweisen Sie, dass kein DEA die Sprache \(L=\{a^nb^{2n}\mid n\ge 0\}\) erkennt.

Strategie: Widerspruchsbeweis mit dem Schubfachprinzip wie bei \(a^nb^n\).Warum so? Ein DEA kann nur endlich viele Vorgeschichten unterscheiden.
Lösungsskizze: Annahme k Zustände → \(a^0..a^k\) → \(a^i, a^j\) gleicher Zustand → \(b^{2i}\) anhängen → Widerspruch.
Musterlösung anzeigen (zählt als erledigt)

Annahme: Ein DEA A mit k Zuständen erkennt L.

Schubfach: Die k + 1 Vorgeschichten \(a^0, a^1, \dots, a^k\) enden in nur k Zuständen; zwei davon, \(a^i\) und \(a^j\) mit \(i<j\), im selben Zustand z.

Gleiches Urteil: Ab z liest A bei \(a^ib^{2i}\) und \(a^jb^{2i}\) dieselben Zeichen, endet also im selben Zustand — beide werden akzeptiert oder beide abgelehnt.

Widerspruch: \(a^ib^{2i}\in L\), aber \(a^jb^{2i}\notin L\), da \(2i\ne 2j\). Die Annahme ist falsch: Kein DEA erkennt L. (Ein Kellerautomat schafft es, siehe S → aSbb | ε.)

A4
Summe im Keller
AFB III

Entwickeln Sie einen deterministischen Kellerautomaten in der Notation der Anlage für \(L=\{a^nb^mc^{n+m}\mid n,m\ge 1\}\). Testen Sie ihn mit abcc, aabbccc und abc.

Strategie: Überlegen Sie zuerst, was der Keller speichern soll: Für jedes a und jedes b muss später ein c kommen.Warum so? Ein Kellerplan macht die Übergänge fast zwangsläufig.
Lösungsskizze: Ein A für jedes a und jedes b ablegen, je c ein A entnehmen; Phasen z1 (a), z2 (b), z3 (c), dann (#,ε):# nach z4.
Musterlösung anzeigen (zählt als erledigt)

Σ = {a, b, c}, Γ = {A, #}, Endzustand z4.

vonÜbergangnach
z0(#,a):A#z1
z1(A,a):AAz1
z1(A,b):AAz2
z2(A,b):AAz2
z2(A,c):εz3
z3(A,c):εz3
z3(#,ε):#z4
WortKeller nach jedem ZeichenErgebnis
abccA#, AA#, A#, # → z4akzeptiert
aabbcccA#, AA#, AAA#, AAAA#, AAA#, AA#, A#abgelehnt (ein A bleibt)
abcA#, AA#, A#abgelehnt

Deterministisch: Von z3 geht der ε-Übergang nur mit # aus, alle anderen Übergänge von z3 haben A oben. Das Wort aabbcccc wird akzeptiert.

A5
Programmiersprachen prüfen
AFB III

„Programmiersprachen sind durch kontextfreie Grammatiken festgelegt. Ein Kellerautomat kann deshalb jedes Programm vollständig auf Korrektheit prüfen.“ Erörtern Sie diese Aussage.

Strategie: Trennen Sie Syntax (Aufbau) und weitere Regeln, die ein Compiler prüft.Warum so? Eine Erörterung braucht Argumente für beide Seiten und ein Fazit.
Lösungsskizze: Pro: Klammern, Blöcke, Ausdrücke sind kontextfrei. Contra: Deklaration vor Benutzung, Typen, Anzahl der Parameter — und „korrekt“ heißt nicht „tut das Richtige“.
Musterlösung anzeigen (zählt als erledigt)

Pro: Die Syntax — geschachtelte Blöcke, Klammern, Ausdrücke mit Punkt vor Strich — wird mit kontextfreien Grammatiken beschrieben; ein Parser (im Kern ein Kellerautomat) prüft sie für beliebige Schachtelungstiefe.

Contra: Viele Regeln hängen vom Kontext ab: Eine Variable muss vor ihrer Verwendung deklariert sein, Typen müssen passen, ein Methodenaufruf braucht so viele Argumente wie Parameter. Das ähnelt \(\{a^nb^nc^n\}\) und geht über einen Keller hinaus; Compiler prüfen es mit Symboltabellen in einer eigenen Phase. Außerdem sagt syntaktische Korrektheit nichts darüber, ob das Programm das Gewünschte tut.

Fazit: Ein Kellerautomat prüft die Syntax vollständig, nicht aber die gesamte Korrektheit.

A6
Mehrdeutige Klammern
AFB III

Die Grammatik S → SS | (S) | ε erzeugt alle korrekt geklammerten Ausdrücke. Beurteilen Sie, ob sie sich als Grundlage für einen Parser eignet, und geben Sie gegebenenfalls eine bessere Grammatik an.

Strategie: Suchen Sie ein kurzes Wort mit zwei verschiedenen Ableitungsbäumen.Warum so? Ein Parser soll zu jedem Wort genau eine Struktur liefern.
Lösungsskizze: ()(): Wurzel S → SS mit (S)… — oder S → SS mit ε links. Besser: S → (S)S | ε.
Musterlösung anzeigen (zählt als erledigt)

Mehrdeutig: Für ()() gibt es mehrere Bäume, z. B. S → SS mit den Teilen () und (), oder S → SS mit links S → ε und rechts S ⇒* ()(). Wegen S → SS und S → ε gibt es sogar unendlich viele Bäume für jedes Wort.

Beurteilung: Die Sprache ist richtig beschrieben, aber ein Parser kann keine eindeutige Struktur bestimmen — ungeeignet.

Besser: S → (S)S | ε. Das erste Zeichen entscheidet: „(“ erzwingt S → (S)S, sonst S → ε. Zu jedem Wort gibt es genau einen Baum; das ist auch die Grundlage des deterministischen Kellerautomaten.

A7
Ohne Regeln A → a
AFB III

Zeigen Sie: Zu jeder regulären Grammatik mit Regeln der Form A → aB, A → a und A → ε gibt es eine Grammatik mit derselben Sprache, die nur Regeln der Form A → aB und A → ε verwendet.

Strategie: Ersetzen Sie jede Regel A → a durch zwei Regeln mit einem neuen Nichtterminal.Warum so? Ein konstruktiver Nachweis gibt ein Verfahren an, das immer funktioniert.
Lösungsskizze: Neues Nichtterminal E mit E → ε; jede Regel A → a wird zu A → aE.
Musterlösung anzeigen (zählt als erledigt)

Konstruktion: Füge ein neues Nichtterminal E mit der einzigen Regel E → ε hinzu und ersetze jede Regel A → a durch A → aE.

Gleiche Sprache: Jeder Ableitungsschritt … ⇒ wA ⇒ wa der alten Grammatik wird zu … ⇒ wA ⇒ waE ⇒ wa; umgekehrt kann E nur verschwinden, also entsteht nichts Neues. Alle anderen Regeln bleiben gleich.

Deutung am DEA: E ist genau der zusätzliche Endzustand zE, der bei der Umwandlung Grammatik → DEA entsteht.

A8
Grammatik als Java-Klasse
AFB III

Die reguläre Grammatik S → xA | yS, A → xA | yB, B → xS | yB | ε beschreibt gültige Codewörter über {x, y}. Implementieren Sie eine Java-Klasse mit einer Methode boolean akzeptiert(String wort), die genau diese Wörter akzeptiert.

Strategie: Wandeln Sie die Grammatik zuerst in einen DEA um: S, A, B werden Zustände, B ist Endzustand.Warum so? Einen DEA kann man direkt mit einer Zustandsvariable und switch implementieren.
Lösungsskizze: Attribut int zustand; Schleife über die Zeichen; switch über den Zustand; Rückgabe zustand == 2.
Musterlösung anzeigen (zählt als erledigt)
Java · Klasse Codewort
public class Codewort {
    // Grammatik: S → xA | yS, A → xA | yB, B → xS | yB | ε
    // Zustände: 0 = S, 1 = A, 2 = B
    private int zustand;

    public boolean akzeptiert(String wort) {
        zustand = 0;
        for (int i = 0; i < wort.length(); i++) {
            char c = wort.charAt(i);
            if (c != 'x' && c != 'y') return false;
            switch (zustand) {
                case 0:
                    if (c == 'x') zustand = 1;
                    break;
                case 1:
                    if (c == 'y') zustand = 2;
                    break;
                default:
                    if (c == 'x') zustand = 0;
            }
        }
        return zustand == 2;
    }
}

Test: xy, yxyy, xxyyy → true; xyx, das leere Wort und xz → false. Die Sprache: Wörter, die auf x und mindestens ein y enden.

A9
Eine Million Zustände
AFB III

Ein Team schlägt vor, Klammerausdrücke in Formeln mit einem DEA mit 1 000 000 Zuständen zu prüfen: „Tiefere Schachtelungen kommen in der Praxis nie vor.“ Bewerten Sie den Vorschlag.

Strategie: Unterscheiden Sie, was theoretisch unmöglich ist, und was praktisch genügt.Warum so? Ein Urteil braucht Kriterien: Korrektheit, Aufwand, Wartbarkeit.
Lösungsskizze: Für jede feste Tiefe t geht es mit t + 2 Zuständen — aber nicht für alle Ausdrücke; ein Zähler oder Keller ist einfacher.
Musterlösung anzeigen (zählt als erledigt)

Theorie: Die Sprache aller korrekten Klammerausdrücke ist nicht regulär; jeder DEA scheitert an einer genügend großen Tiefe. Beschränkt man die Tiefe auf t, genügen t + 1 Zustände für die Tiefen 0 bis t und zF — die Sprache ist dann regulär.

Praxis: Für eine Tiefe bis 999 998 funktioniert der Vorschlag korrekt, ist aber absurd groß: Die Zustände unterscheiden sich nur in einer Zahl. Ein Programm mit einer Zählvariablen (ein Keller mit einer Symbolart) leistet dasselbe ohne Grenze und in wenigen Zeilen.

Bewertung: Korrekt nur mit Einschränkung, unnötig aufwendig — ein Zähler bzw. Kellerautomat ist die bessere Lösung, zumal mit mehreren Klammerarten ohnehin ein Keller nötig ist.

A10
b setzt zurück
AFB III

Der Mealy-Automat aus AFB II, A2 gibt nach jedem dritten a ein X aus. Neu soll jedes b den Zähler zurücksetzen: X kommt nur nach drei a unmittelbar hintereinander. Erweitern Sie den Automaten und geben Sie das Ausgabewort zu aabaaaab an.

Strategie: Die Zustände bleiben q0, q1, q2 — nur die b-Übergänge ändern sich.Warum so? Eine Erweiterung ändert möglichst wenig am bestehenden Entwurf.
Lösungsskizze: b führt aus jedem Zustand nach q0 mit Ausgabe ε.
Musterlösung anzeigen (zählt als erledigt)
Zustandab
q0q1 / εq0 / ε
q1q2 / εq0 / ε
q2q0 / Xq0 / ε

Zu aabaaaab: q0 –a→ q1 –a→ q2 –b→ q0 –a→ q1 –a→ q2 –a/X→ q0 –a→ q1 –b→ q0. Ausgabewort: X (vorher XX). Die ersten beiden a zählen nicht mehr, weil das b dazwischen zurücksetzt.