faecher:informatik:oberstufe:automaten:kellerautomaten:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
faecher:informatik:oberstufe:automaten:kellerautomaten:start [21.11.2024 06:19] – [Aufgaben] Frank Schiebelfaecher: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<sub>Klammer2</sub> aller Klammerausdrücke der Tiefe 2 erkennt.+**(A)** Konstruiere einen endlichen Automaten, der die Sprache L<sub>Klammer2</sub> aller Klammerausdrücke bis zur Tiefe 2 erkennt.
 Zur Sprache gehören z.B.  Zur Sprache gehören z.B.
   (()), ()(), (), (()())   (()), ()(), (), (()())
Zeile 44: Zeile 44:
  
 Wir erweitern den endlichen Automaten um einen **Speicher**, der (potentiell) unbegrenzt viele Daten Wir erweitern den endlichen Automaten um einen **Speicher**, der (potentiell) unbegrenzt viele Daten
-aufnehmen kann. Für kontextfreie Sprachen reicht als Speicher ein **Stack** -- dieser wird auch als "Keller" bezeichnet, aus diesem Grund nennt man solche um einen Stack erweiterten DEAs "Kellerautomat".+aufnehmen kann. Für **kontextfreie Sprachen**((Kontextfreie Sprachen sind diejenigen, die von einem Kellerautomaten erkannt werden können.)) reicht als Speicher ein **Stack** -- dieser wird auch als "Keller" bezeichnet, aus diesem Grund nennt man solche um einen Stack erweiterten DEAs "Kellerautomat".
  
 Für unsere Klammersprache könnte ein erster Entwurf eines Kellerautomaten so aussehen - der Kellerspeicher ist hier mit 6 "Speicherplätzen" gezeichnet, kann aber durch weiteres "auf den Stack legen" beliebig erweitert werden:  Für unsere Klammersprache könnte ein erster Entwurf eines Kellerautomaten so aussehen - der Kellerspeicher ist hier mit 6 "Speicherplätzen" gezeichnet, kann aber durch weiteres "auf den Stack legen" beliebig erweitert werden: 
Zeile 50: Zeile 50:
 {{ :faecher:informatik:oberstufe:automaten:kellerautomaten:ka01.drawio.png |}} {{ :faecher:informatik:oberstufe:automaten:kellerautomaten:ka01.drawio.png |}}
  
-Zu Beginn ist der Kellerspeicher leer - das wird durch das Symbol **#** gekennzeichnet - der Ablauf beginn beim markierten Startknoten. Der Automat befindet sich also zu Beginn im Zustand **q<sub>0</sub>,#**+Zu Beginn ist der Kellerspeicher leer - das wird durch das Symbol **#** gekennzeichnet - der Ablauf beginnt beim markierten Startknoten. Der Automat befindet sich also zu Beginn im Zustand **q<sub>0</sub>,#**
  
 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, ob das Wort **aazazz** vom Automaten akzeptiert wird - und vor allem, was der Automat dabei alles "tun" muss. 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, ob das Wort **aazazz** vom Automaten akzeptiert wird - und vor allem, was der Automat dabei alles "tun" muss.
Zeile 246: Zeile 246:
   * **(A)** L = { a<sup>n</sup>b<sup>n</sup> | n ≥ 0 }   * **(A)** L = { a<sup>n</sup>b<sup>n</sup> | n ≥ 0 }
   * **(B)** L = { a<sup>n</sup>b<sup>n</sup>c<sup>n</sup> | n ≥ 0 }   * **(B)** L = { a<sup>n</sup>b<sup>n</sup>c<sup>n</sup> | n ≥ 0 }
-  * **(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<sup>n</sup>b<sup>m</sup>c<sup>n</sup> | n, m ≥ 0 } 
 + 
 + 
 +++++ Lösung 4(A) | 
 +Die Sprache ist kontextfrei (aber nicht regulär) – für jedes "a" der Eingabe legt man einen Marker auf den Keller, für jedes  "b" nimmt man einen herunter. Ist der Keller am Ende leer, wird das Wort akzeptiert. 
 +++++ 
 + 
 +++++ Lösung 4(B) | 
 +Die Sprache ist nicht kontextfrei – dies ist leicht einzusehen, wenn man versucht, festzulegen, wann der Stack auf- und wann er abgebaut wird. Man wird annehmen, dass "a" den Stack aufbaut. Dann könnte "b" den Stack abbauen, aber für "c" gibt es damit keine Zählmöglichkeit mehr. Wir würden also einen weiteren Stack benötigen, um diese Sprache zu erkennen. Dann könnte man auf beide Stacks bei Lesen von "a" ein Zeichen legen und bei Lesen von "b" Stack 1, bei Lesen von "c" Stack 2 abbauen. 
 +++++ 
 + 
 +++++ Lösung 4(C) | 
 +Diese Sprache ist kontextfrei. Man kann mit zwei Zeichen im Stackalphabet arbeiten: ist ein "a" auf dem Stack und kommt ein weiteres "a", wird dieses obenauf gelegt. Folgt hingegen ein "b", wird das "a" abgebaut. Ist bei Eingabe "b" kein "a" zum abbauen vorhanden, wird das "b" auf den Stack gelegt und seinerseits von "a"s abgebaut. 
 +++++ 
 + 
 +++++ Lösung 4(D) | 
 +Diese Sprache ist kontextfrei: beim Lesen von "a" wird ein Zeichen auf den Stack gelegt, bei Lesen von "b" bleibt der Stack unverändert und bei Lesen von "c" wird der Stack abgebaut. Da gleich viele "a" und "c" enthalten sein müssen, ist mindestens ein Kellerautomat notwendig -- die Sprache ist daher nicht regulär. 
 +++++ 
 + 
 +----   
 +{{:aufgabe.png?nolink  |}} 
 +=== (A5) Zusatzaufgabe === 
 + 
 +Implementiere in Java zunächst einen endlichen Automaten der die Klammersprache L<sub>2</sub> aus dem Eingangsbeispiel erkennt, Arbeite mit a und z für Klammer auf und Klammer zu. 
 + 
 +  * 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 ''import java.util.Stack;'' und denke anschließend an das Initialisieren.// 
 +     - //Tipp 2: Um das oberste Element zu prüfen (ohne es zu entfernen), rufe ''peek()'' auf dem Stack auf.// 
  
 ===== Material ===== ===== Material =====
  • faecher/informatik/oberstufe/automaten/kellerautomaten/start.1732169966.txt.gz
  • Zuletzt geändert: 21.11.2024 06:19
  • von Frank Schiebel