Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Endliche Automaten einfach erklärt

Nach dieser Lektion: Ich kann einen endlichen Automaten Zeichen für Zeichen verfolgen und sagen, welche Wörter er akzeptiert.

Lektion, 55 Min.5 BefehleLab für Compilerbau und Rechnerarchitektur: gcc, flex, bison und RISC-V in einer VM

Genau drei Euro am Getränkeautomaten

Ein endlicher Automat ist die einfachste Rechenmaschine: Er liest ein Wort Zeichen für Zeichen und sagt am Ende „ja“ oder „nein“. Mit ihm lässt sich zum Beispiel prüfen, ob ein Getränkeautomat in der Mensa genau drei Euro bekommen hat.

Der Automat merkt sich nur eines: wie viel schon eingeworfen wurde. Das reicht für diese Aufgabe. Es zeigt auch, was eine Maschine mit so wenig Gedächtnis kann und was nicht.

Am Ende dieser Lektion

Notiz

Ich kann einen endlichen Automaten Zeichen für Zeichen verfolgen und sagen, welche Wörter er akzeptiert.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Zustanddas, woran sich der Automat gerade erinnerts1
Übergangdie Regel, in welchen Zustand ein gelesenes Zeichen führt
Startzustandder Zustand, in dem jeder Lauf beginnt
Akzeptierender Zustandein Zustand, in dem „ja“ gilt, wenn das Wort endet
Eingabewortdie Zeichenfolge, die der Automat liest12
Sprachedie Menge aller Wörter, die ein Automat akzeptiert

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein Automat besteht aus Zuständen und Übergängen

Ein Zustand ist das, woran sich der Automat gerade erinnert. Beim Getränkeautomaten ist das der Betrag, der schon im Schlitz liegt: 0, 1, 2 oder 3 Euro.

Jedes gelesene Zeichen löst einen Übergang aus. Bei „1 Euro“ im Zustand 0 Euro geht es zu 1 Euro. Der Startzustand ist 0 Euro. Der akzeptierende Zustand ist 3 Euro.

Dieselben Regeln als Tabelle

ZustandMünze 1 EuroMünze 2 Euro
0 Euro (Start)1 Euro2 Euro
1 Euro2 Euro3 Euro
2 Euro3 Eurokeine Regel: abgelehnt
3 Euro (akzeptiert)keine Regel: abgelehntkeine Regel: abgelehnt

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein Wort wird Zeichen für Zeichen verfolgt

Zum Verfolgen beginnen Sie im Startzustand. Für jedes Zeichen suchen Sie die Regel und gehen in den neuen Zustand.

Wenn das Wort zu Ende ist, sehen Sie nach, wo Sie stehen. Ein akzeptierender Zustand heißt „ja“, jeder andere „nein“. Fehlt unterwegs eine Regel, bleibt der Automat stehen und lehnt das Wort ab.

Zwei Wörter im Vergleich

WortSchritteEndzustandErgebnis
120 Euro, dann 1 Euro, dann 3 Euro3 Euroja
220 Euro, dann 2 Euro, dann keine Regelabgebrochennein
10 Euro, dann 1 Euro1 Euronein, zu wenig
1210 Euro, 1 Euro, 3 Euro, dann keine Regelabgebrochennein, zu viel

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Der Automat als Python-Programm

Code: python
# Ein Getraenkeautomat nimmt 1- und 2-Euro-Muenzen. Er will genau 3 Euro.
regeln = {
    "s0,1": "s1", "s0,2": "s2",
    "s1,1": "s2", "s1,2": "s3",
    "s2,1": "s3",
}
wort = "12"
zustand = "s0"
for muenze in wort:
    schluessel = zustand + "," + muenze
    if schluessel not in regeln:
        zustand = "FEHLER"
        break
    zustand = regeln[schluessel]
    print("Muenze", muenze, "-> Zustand", zustand)
print("Akzeptiert:", zustand == "s3")
# Aendern Sie wort in "21", "111" und "22" und fuehren Sie jedes Mal aus.

Ein häufiger Fehler

Warnung

Viele denken, ein Automat sagt „ja“, sobald er einmal einen akzeptierenden Zustand berührt. Das stimmt nicht. Es zählt nur der Zustand nach dem letzten Zeichen. Das Wort 121 berührt 3 Euro, endet aber im Nichts und wird abgelehnt.

Auch ein Lexer ist ein Automat

Echte Software nutzt Automaten oft. Der Lexer eines Compilers erkennt Zahlen, Namen und Zeichen mit Automaten. Das Werkzeug flex schreibt ihn aus Mustern und macht daraus Tabellen mit Zuständen.

Die Befehle zeigen zwei kleine Beispiele. Das erste zählt Einsen mit einem Automaten aus nur zwei Zuständen. Das zweite ist der Rechner calc, der 007 als eine einzige Zahl liest.

Einsen in 1011 zählen

Befehl
echo 1011 | tr -cd 1 | wc -c

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Der Automat gerade oder ungerade

Befehl
python3 -c "from functools import reduce; t={('g','0'):'g',('g','1'):'u',('u','0'):'u',('u','1'):'g'}; print(reduce(lambda z,c:t[(z,c)],'1011','g'))"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

In den Ordner compiler wechseln

Befehl
cd ~/compiler

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Rechner bauen

Befehl
make

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Führende Nullen in einer Zahl

Befehl
echo "007 + 1" | ./calc

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Weiterführend

Zeichnen Sie einen Automaten, der Wörter aus a und b akzeptiert, wenn sie auf ab enden. Schreiben Sie die Übergangstabelle mit drei Zuständen auf.

Prüfen Sie ihn mit aab, abb und bab von Hand. Prüfen Sie ihn danach mit Ihrer Funktion akzeptiert.

Über dieses Lab und seinen Quellcode: Lab für Compilerbau und Rechnerarchitektur: gcc, flex, bison und RISC-V in einer VM

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.