Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
faecher:informatik:oberstufe:automaten:kellerautomaten:start [21.11.2024 06:17] – [Ablaufprotokoll eines Kellerautomaten] Frank Schiebel | faecher:informatik:oberstufe:automaten:kellerautomaten:start [11.02.2025 11:21] (aktuell) – [Aufgaben] Marco Kuemmel | ||
---|---|---|---|
Zeile 5: | Zeile 5: | ||
=== (A1) Vorüberlegungen === | === (A1) Vorüberlegungen === | ||
- | **(A)** Konstruiere einen endlichen Automaten, der die Sprache L< | + | **(A)** Konstruiere einen endlichen Automaten, der die Sprache L< |
Zur Sprache gehören z.B. | Zur Sprache gehören z.B. | ||
(()), ()(), (), (()()) | (()), ()(), (), (()()) | ||
Zeile 44: | Zeile 44: | ||
Wir erweitern den endlichen Automaten um einen **Speicher**, | Wir erweitern den endlichen Automaten um einen **Speicher**, | ||
- | aufnehmen kann. Für kontextfreie Sprachen reicht als Speicher ein **Stack** -- dieser wird auch als " | + | aufnehmen kann. Für **kontextfreie Sprachen**((Kontextfreie Sprachen sind diejenigen, die von einem Kellerautomaten erkannt werden können.)) |
Für unsere Klammersprache könnte ein erster Entwurf eines Kellerautomaten so aussehen - der Kellerspeicher ist hier mit 6 " | Für unsere Klammersprache könnte ein erster Entwurf eines Kellerautomaten so aussehen - der Kellerspeicher ist hier mit 6 " | ||
Zeile 50: | Zeile 50: | ||
{{ : | {{ : | ||
- | Zu Beginn ist der Kellerspeicher leer - das wird durch das Symbol **#** gekennzeichnet - der Ablauf | + | Zu Beginn ist der Kellerspeicher leer - das wird durch das Symbol **#** gekennzeichnet - der Ablauf |
Um Komplikationen beim Aufschreiben der Klammern zu vermeiden, verwenden wir von nun an für eine öffnende Klammer das Symbol **a**, für eine schließende Klammer ein **z**. Wir wollen nun nachvollziehen, | Um Komplikationen beim Aufschreiben der Klammern zu vermeiden, verwenden wir von nun an für eine öffnende Klammer das Symbol **a**, für eine schließende Klammer ein **z**. Wir wollen nun nachvollziehen, | ||
Zeile 234: | Zeile 234: | ||
++++ Lösung (C) | | ++++ Lösung (C) | | ||
L = { a< | L = { a< | ||
- | ++++ | ||
+ | |||
+ | {{ : | ||
+ | ++++ | ||
---- | ---- | ||
{{: | {{: | ||
Zeile 244: | Zeile 246: | ||
* **(A)** L = { a< | * **(A)** L = { a< | ||
* **(B)** L = { a< | * **(B)** L = { a< | ||
- | * **(C)** L = { w ∈ {a, b}* | #a = #b } die alle Wörter enthält, die aus gleich vielen a und b bestehen, die – im Gegensatz zur Sprache aus Aufgabenteil a) - in beliebiger Reihenfolge auftreten dürfen | + | * **(C)** L = { w ∈ {a, b}* | #a = #b } die alle Wörter enthält, die aus gleich vielen a und b bestehen, die – im Gegensatz zur Sprache aus Aufgabenteil a) - in beliebiger Reihenfolge auftreten dürfen. (Hinweis: #a bezeichnet die Anzahl der a´s in dem betreffenden Wort.) |
+ | * **(D)** L = { a< | ||
+ | |||
+ | |||
+ | ++++ Lösung 4(A) | | ||
+ | Die Sprache ist kontextfrei (aber nicht regulär) – für jedes " | ||
+ | ++++ | ||
+ | |||
+ | ++++ Lösung 4(B) | | ||
+ | Die Sprache ist nicht kontextfrei – dies ist leicht einzusehen, wenn man versucht, festzulegen, | ||
+ | ++++ | ||
+ | |||
+ | ++++ Lösung 4(C) | | ||
+ | Diese Sprache ist kontextfrei. Man kann mit zwei Zeichen im Stackalphabet arbeiten: ist ein " | ||
+ | ++++ | ||
+ | |||
+ | ++++ Lösung 4(D) | | ||
+ | Diese Sprache ist kontextfrei: | ||
+ | ++++ | ||
+ | |||
+ | ---- | ||
+ | {{: | ||
+ | === (A5) Zusatzaufgabe === | ||
+ | |||
+ | Implementiere in Java zunächst einen endlichen Automaten der die Klammersprache L< | ||
+ | |||
+ | * Die Eingabe soll als Parameter beim Erstellen des Automaten erfragt werden. | ||
+ | * Modelliere die Zustände des Automaten und gib bei der Bearbeitung der Eingabe die Zustandswechsel auf den Konsole aus, so dass der Ablauf bei der Verarbeitung der Eingabe erkennbar ist. | ||
+ | * Erweitere den Automaten um einen Stack, um unendlichen Klammertiefen zu erkennen. Erstelle bei der Verarbeitung der Eingabe ein Ablaufdiagramm wie oben, das du auf der Konsole ausgibst. | ||
+ | - //Tipp 1: Importiere den Stack mit '' | ||
+ | - //Tipp 2: Um das oberste Element zu prüfen (ohne es zu entfernen), rufe '' | ||
===== Material ===== | ===== Material ===== |