Formale Systeme
Postâsche Produktionssysteme
Ein Postâsches Produktionssystem ist eine spezielle Art von formalem System. Sie bestehen aus einem Axiom, d.h. einer bestimmten Kombination von Zeichen, die als gegeben angenommen werden und einer Menge von Regeln, die bestimmt, in welche Zeichenfolge eine gegebene Zeichenfolge umgewandelt werden kann. Die durch die Regeln aus dem Axiom erzeugbaren Zeichenketten nennt man SĂ€tze des Produktionssystems.
Beispiel:
Axiom: Regeln:
Im genannten Beispiel stehen , und fĂŒr Symbole aus dem System, wĂ€hrend die Zeichen und fĂŒr Variablen stehen, die durch beliebige Zeichenketten aus dem System ausgetauscht werden können. , und werden hierbei Terminale, und Nichtterminale genannt (âTerminalâ â , und können nicht mehr ersetzt werden).
Endliche Automaten
Endliche Automaten können als âBlack Boxâ betrachtet werden, die sich aufgrund einer Folge von Eingaben in einem bestimmten Zustand befindet. Je nach aktuellem Zustand und Eingabe geht der endliche Automat (EA) in einen weiteren Folgezustand ĂŒber. Der EA besitzt zudem einen oder mehrere ausgezeichnete ZustĂ€nde (EndzustĂ€nde). Wenn der endliche Automat nach einer Folge von Eingaben einen Endzustand erreicht, wird diese Eingabe vom Automaten akzeptiert.
Zustandsdiagramm
Einen EA kann auch visuell dargestellt werden. Ein Zustandsdiagramm fĂŒr einen Automaten, der den Eintritt in einem Schwimmbad kontrolliert, sieht so aus:

Hierbei kostet der Eintritt 2âŹ. Der Automat akzeptiert 50 Cent sowie 1âŹ- und 2âŹ-MĂŒnzen. Sobald mindestens 2⏠eingeworfen sind, öffnet der Automat das Drehkreuz (befindet sich in einem akzeptierenden Endzustand).
Die ZustĂ€nde des Automaten sind als Kreise dargestellt. Die ĂbergĂ€nge zwischen den Kreisen sind die Pfeile, die Eingaben, die zum Ăbergang fĂŒhren, sind die Symbole an den Pfeilen. Der Startzustand ist der Kreis mit dem Eingangspfeil, der Endzustand der Doppelkreis.
Formale Definition
Ein EA kann definiert werden durch:
Die Symbole stehen fĂŒr:
- : Endliche Menge von ZustÀnden
- : Endliches Eingabealphabet
- : Die Ăbergangsfunktion
- : Der Anfangszustand
- : Die Menge der akzeptierenden EndzustÀnde
Die Eingabe der Ăbergangsfunktion ist ein Paar bestehend aus dem aktuellen Zustand und dem gelesenen Symbol . Die Ausgabe ist genau ein Folgezustand .
EAs mit Ausgabe
Bei endlichen Automaten mit Ausgabe gibt es zwei Möglichkeiten, diesen Auszugeben: Mit dem erreichten Zustand und mit dem durchgefĂŒhrten Ăbergang.
Moore-Automat
Bei einem Moore-Automat wird beim Erreichen eines Zustands eine Ausgabe gemacht. Er kann definiert werden als:
Wobei:
- : Endliche Menge von ZustÀnden
- : Endliches Eingabealphabet
- : Endliches Ausgabealphabet
- : Die Ăbergangsfunktion
- : Die Ausgabefunktion
- : Der Anfangszustand
Mealy-Automat
Der Mealy-Automat hingegen macht eine Ausgabe, wenn ein Ăbergang durchlaufen wird. Er kann definiert werden als:
Wobei:
- : Endliche Menge von ZustÀnden
- : Endliches Eingabealphabet
- : Endliches Ausgabealphabet
- : Die Ăbergangsfunktion
- : Die Ausgabefunktion
- : Der Anfangszustand
Die Mealy- und Moore-Automaten unterscheiden sich ausschlieĂlich darin, dass der Moore-Automat technisch gesehen bereits im Startzustand eine Ausgabe macht. Anderweitig sind sie equivalent. Zu jedem Moore-/Mealy-EA findet man einen Mealy-/Moore-EA, der fĂŒr alle Eingabeketten dieselbe Ausgabe liefert (insofern die Ausgabe des Startzustandes vernachlĂ€ssigt wird).
(Fehlend hier: Zeichnungen)
Beispiel zu einem Mealy-Automat zur Berechnung des Modulo 3:

Akzeptierte Folgen
Wenn eine Eingabe komplett gelesen ist und der Zustandsspeicher einen Endzustand enthÀlt ist die Zeichenfolge akzeptiert.
Alphabete, Wörter und Sprachen
Symbole
Die bisherigen Eingaben fĂŒr z.B. den Eintrittsautomaten (50, 100, 200) waren atomare Symbole fĂŒr GeldstĂŒcke. Der Lesekopf liest das Eingabeband symbolweise. Die Eingabesymbole zusammen ergeben ein Eingabewort. Man kann Symbole auch Buchstaben nennen.
Alphabete
Die Menge der möglichen Eingabesymbole bildet das Eingabealphabet. Formal wird meist verwendet, also:
Allgemein können die Symbole bis verwendet werden:
Wörter
Die endlich langen Zeichenfolgen, die ĂŒber einem Alphabet gebildet werden können, heiĂen Wörter ĂŒber . Sie werden durch die Aneinanderreihung von Symbolen oder bereits existierenden Wörtern erzeugt.
Wörter können:
- Konkateniert werden (aneinandergereiht werden)
- Potenziert werden (, )
- Umgekehrt werden ( (Wort wird rĂŒckwĂ€rts gelesen))
Die Menge aller Wörter ĂŒber wird geschrieben:
- Jeder Buchstabe ist auch ein Wort ĂŒber , also
- Sind , so ist auch
- ist das leere Wort ĂŒber jedem Alphabet . Es gilt
Beispiel:
AuĂerdem kann die LĂ€nge eines Wortes mit bezeichnet werden:
Aber Obacht! Es geht immer um die LĂ€nge der Symbole, nicht der Zeichen/Ziffern. Beim Eintrittsautomaten beispielsweise gilt:
Lexikographische Ordnung
Beim Sortieren von Wörtern wird folgende Ordnung verwendet (angenommen, es gibt zwei Wörter und ):
- falls
- Falls : Nach Buchstaben innerhalb des Wortes ()
Sprachen
Eine Sprache ĂŒber einem Alphabet ist eine Menge von Wörtern ĂŒber . L ist also eine Teilmenge von ().
Folgende Operationen können auf Sprachen ausgefĂŒhrt werden:
- Konkatenation:
- Potenz: ,
- Reverse:
Kleensche & positive HĂŒlle
Die Kleensche HĂŒlle eines Alphabets oder einer formalen Sprache ist die Menge aller Wörter, die durch beliebige Konkatenation von Symbolen des Alphabets bzw. von Wörtern der Sprache gebildet werden können, wobei das leere Wort inbegriffen ist. Die positive HĂŒlle hingegen enthĂ€lt das leere Wort nur dann, wenn die Sprache selbst das leere Wort beinhaltet. Wenn also , ist auch
RegulĂ€re AusdrĂŒcke & Grammatiken
Die von endlichen Automaten akzeptierten Sprachen lassen sich durch einfache AusdrĂŒcke beschreiben, die man als regulĂ€ren AusdrĂŒcke bezeichnet.
Die Menge der regulĂ€ren AusdrĂŒcke (ĂŒber dem Alphabet ) ist definiert durch:
- ist ein regulÀrer Ausdruck
- ist ein regulÀrer Ausdruck
- FĂŒr jedes ist ein regulĂ€rer Ausdruck
- Sind und regulĂ€re AusdrĂŒcke, so auch
- â Vereinigung
- â Konkatenation
- â Kleene Stern
Falls nicht geklammert ist gilt vor und vor |.
Semantik regulĂ€rer AusdrĂŒcke
Ein regulÀrer Ausdruck stellt eine Sprache wie folgt dar:
- fĂŒr alle
Beispiele
aâ Einfaches Symbol:a1x gematched(a|b)âaoderbwird 1x gematchedabâabwird 1x gematcheda*âawird 0-mal bis â-mal gematcheda+âawird 1-mal bis â-mal gematched(a|b)*âaoderbwird 0-mal bis â-mal gematched (jegliche Kombination ausaundb, da sich der Kleene Stern auf die Klammer bezieht)ab*âawird 1x gematched,bwird 0-mal bis â-mal gematched(ab)âabwird 1-mal bis â-mal gematched (abababab...)aa* | bb*â Erst wird ein einzelnesagematched, dann 0 bis â-vieleaâs oder einb, dann 0 bis â-vielebâs
Experimentieren mit regulĂ€ren AusdrĂŒcken
Auf der Seite regex101.com kann man gut mit regulĂ€ren AusdrĂŒcken experimentieren. Mithilfe der Seite können Texte auf regulĂ€re AusdrĂŒcke ĂŒberprĂŒft werden!
RegulĂ€re AusdrĂŒcke und endliche Automaten
Zu jedem regulĂ€ren Ausdruck gibt es einen endlichen Automaten, den man aus dem regulĂ€ren Ausdruck hinaus erschlieĂen kann.

Es ist auch möglich, die Automaten zwei regulĂ€rer AusdrĂŒcke zu verknĂŒpfen. Formell wird dies mit dem leeren Wort gemacht:

Das leere Zeichen kann dann in einem zweiten Schritt entfernt werden:

Beim Konstruieren dieser Automaten ist es wichtig, darauf zu achten, dass leere Wörter immer eliminiert werden.
Syntaxdiagramme
Ein regulÀrer Ausdruck lÀsst sich mit einem Syntaxdiagramm graphisch darstellen:

Minimierung endlicher Automaten
Zum Minimieren von EAs kann folgender Algorithmus verwendet werden:
- Stelle eine Tabelle aller Zustandspaare von auf, mit ungleich
- Markiere alle Paare mit genau einem Endzustand
- FĂŒr jedes unmarkierte Paar , teste fĂŒr jedes Symbol ob markiert
- Falls ja, markiere auch
- Wiederhole 3. bis sich keine Ănderung mehr ergibt
- Verschmelze alle unmarkierten Zustandspaare zu einem neuen Zustand
Zuerst stellt man eine Tabelle auf, in der Angekreuzt wird, von welchem Zustand man welchen anderen Zustand erreichen kann. In den Zeilen wird der Startzustand weggelassen, in den Spalten der Endzustand:
| Z0 | Z1 | Z2 | Z3 | Z4 | |
|---|---|---|---|---|---|
| Z0 | ------ | ------ | ------ | ------ | ------ |
| Z1 | ------ | ------ | ------ | ------ | |
| Z2 | ------ | ------ | ------ | ||
| Z3 | ------ | ------ | |||
| Z4 | ------ |
Dann werden alle Paare, bei denen einer der beiden ein akzeptierender Endzustand ist, markiert:
| Z0 | Z1 | Z2 | Z3 | Z4 | |
|---|---|---|---|---|---|
| Z0 | ------ | ------ | ------ | ------ | ------ |
| Z1 | ------ | ------ | ------ | ------ | |
| Z2 | ------ | ------ | ------ | ||
| Z3 | ------ | ------ | |||
| Z4 | x | x | x | x | ------ |
Als nĂ€chstes wird ĂŒberprĂŒft, was passiert, wenn bei jedem Zustand eines unmarkierten Zustandspaares die selbe Eingabe gemacht wird. Man erhĂ€lt ein neues Paar . Wenn das neue Paar bereits markiert ist, bedeutet das, dass nach Lesen des Symbols a die ZustĂ€nde in einen bereits bekannt unterschiedlichen Zustand ĂŒbergehen. Man markiert .
| Z0 | Z1 | Z2 | Z3 | Z4 | |
|---|---|---|---|---|---|
| Z0 | ------ | ------ | ------ | ------ | ------ |
| Z1 | x | ------ | ------ | ------ | ------ |
| Z2 | x | ------ | ------ | ------ | |
| Z3 | x | x | ------ | ------ | |
| Z4 | x | x | x | x | ------ |
Nachdem dies fĂŒr den Rest der Tabelle wiederholt wurde, sind alle markierten Paare sicher verschieden. Alle unmarkierten Paare sind Ă€quivalent und können kombiniert werden. Hier wird aus ein neuer Zustand und aus wird , da beide bei den selben Eingaben gleich reagieren. Visuell kann man sich Vorstellen, dass die Kreise âĂŒbereinander geschoben werdenâ, da die Pfeile zu den jeweiligen Kreisen des Automaten fĂŒr den neuen Kreis einfach kombiniert werden.
Nichtdeterministische endliche Automaten (NEA)
Ein nichtdeterministischer endlicher Automat (NEA) ist ein Automat, bei dem aus einem Anfangszustand mit einer Eingabe mehrere ZustĂ€nde erreicht werden können. Es ist also nicht eindeutig festgelegt, in welchem der passenden ZustĂ€nde man landet. Ein NEA kann sozusagen also âhellsehenâ, d.h. er weiĂ immer, welcher der möglichen Wege zu wĂ€hlen ist (eigentlich macht das ein Backtracking-Algorithmus, aber egal).
Ein NEA wird formell definiert durch
wobei:
- die endliche Menge von ZustÀnden darstellt
- fĂŒr das endliche Eingabealphabet steht
- die Ăbergangsrelation symbolisiert
- der Anfangszustand ist
- die Menge der akzeptierenden EndzustÀnde verkörpert
Umformung NEA zu DEA
Jeder NEA lĂ€sst sich durch die Potenzmengenkonstruktion auch in einen DEA umstrukturieren. Dabei wird angenommen, dass ein Zustand des DEA alle ZustĂ€nde, in denen sich der NEA nach einer Eingabe befinden könnte, kodiert. Die Zustandsmenge des DEA ist dabei Teil der Potenzmenge der Zustandsmenge des NEA - daher der Name. (Problem: DEAs, die auf diese Art konstruiert werden, werden meist sehr groĂ.)
Bei der Potenzmengenkonstruktion wird ein DEA
zu einem NEA
aufgebaut:
- Die Zustandsmenge und die Menge der akzeptierenden EndzustÀnde werden als leere Mengen gewÀhlt.
- . FĂŒge zu hinzu.
- Konstruiere den Folgezustand fĂŒr alle aus und fĂŒr alle aus als Menge aller ZustĂ€nde, die der NEA in dieser Situation erreichen könnte.
- FĂŒge zu hinzu, falls noch nicht enthalten
- ErgĂ€nze die Ăbergangsfunktion
- Wiederhole Schritt 3 bis 5, bis sich und nicht mehr Àndern
- WÀhle die Menge der FinalzustÀnde als diejenige Teilmenge von , deren ZustÀnde einen Finalzustand aus enthalten.
â Der DEA kann am ende bis zu ZustĂ€nde haben!
Beispiel
NEA:

Als erstes wird fĂŒr der Startzustand als ĂŒbernommen:

Bei Eingabe zum Zustand wĂŒrde der NEA zwischen und entscheiden mĂŒssen. Beim DEA wird dafĂŒr ein neuer Zustand erstellt:

Bei Eingabe hingegen wechselt der NEA zu . Dieses Verhalten wird als ĂŒbernommen:

Nun ist jedoch bei die Eingabe einer nicht Eindeutig, deswegen benötigen wir eine weitere Schleife (schlieĂlich wissen wir nicht, ob wir uns in oder befinden, solange wir in sind):

Zu guter Letzt wird die Eingabe im âQuantenzustandâ eingebaut:

Da nun alle Ăbergange eingebaut sind, können die EndzustĂ€nde gewĂ€hlt werden:

In tabellarischer Darstellung sieht dieser Algorithmus folgendermaĂen aus:
| Von ( = / ) | NEA | DEA |
|---|---|---|
| Start | ||
| = / | / | |
| = / | ||
| / | / | |
| / |
RegulÀrer Ausdruck aus NEA
Mit der Zustandselimination kann aus einem NEA ein regulĂ€rer Ausdruck erzeugt werden. Die Zustandselimination verwendet sog. verallgemeinerte NEAs (VNEAs), um den regulĂ€ren AusdrĂŒck möglichst einfach zu erreichen (links ist ein NEA, rechts ein VNEA):

Bei der Zustandselimination wird folgendes gemacht:
- Wandle den NEA in einen VNEA um
- Wiederhole fĂŒr alle EndzustĂ€nde :
- Eliminiere (iterativ, also nacheinander, nicht gleichzeitig!) alle ZustĂ€nde auĂer dem Startzustand und .
- Bilde einen regulÀren Ausdruck aus dem finalen Automaten
- Vereinige die AusdrĂŒcke fĂŒr alle EndzustĂ€nde q
- Bilde die Summe aller entstandenen regulĂ€ren AusdrĂŒcke
Beispiel
NEA:

VNEA:

1. Elimination fĂŒr Endzustand C & D:

2. Elimination fĂŒr Endzustand C:

2. Elimination fĂŒr Endzustand D:

Kombination:
- Endzustand C:
(0|1)*1(0|1) - Endzustand D:
(0|1)*1(0|1)(0|1) - Kombiniert:
(0|1)*1(0|1)|(0|1)*1(0|1)(0|1) - Optimiert:
(0|1)*1(0|1)(Δ|(0|1))
Kellerautomaten
Ein EA kann sich nur bestimmt viele ZustĂ€nde âmerkenâ. Eine Sprache, bei der man ZĂ€hlen muss und bei der die Obergrenze nicht bekannt ist, lĂ€sst sich also nicht darstellen. Ein Kellerautomat ist ein Automat, der Zugriff auf einen âKellerspeicherâ (Stack) hat. Er kann also Dinge speichern. Der Stack ist zudem theoretisch unendlich, was bedeutet, dass er z.B. zum ZĂ€hlen verwendet werden kann.
Ein Kellerautomat ist definiert als:
Symbole:
- : Endliche Menge von ZustÀnden
- : Endliches Eingabealphabet
- : Endliches Kelleralphabet
- : Ăbergangsrelation
- : Anfangszustand
- : Keller-Bottomsymbol
- : Endzustandsmenge
â Ein Standard-Kellerautomat ist nichtdeterministisch! Nur wenn die Ăbergangsrelation eindeutig ist spricht man von einem deterministischen Kellerautomaten (DKA/DPDA). Im Gegensatz zu normalen endlichen Automaten sind ein KA und DKA nicht Ă€quivalent, d.h. der DKA erkennt nur eine echte Teilmenge der vom KA erkannten Sprachen.
Kellerautomaten können auch ohne Endzustandsmenge () definiert werden. Dann akzeptiert der KA eine Eingabe, falls nach der Abarbeitung der Eingabe der Keller leer ist. Wenn der KA nichtdeterministisch ist, sind die beiden Varianten (mit und ohne Endzustandsmenge) Ă€quivalent. Zu jedem KA existiert auĂerdem ein Ă€quivalenter KA ohne Δ-ĂbergĂ€nge.
ZustandsĂŒberfĂŒhrung
Die ZustandsĂŒberfĂŒhrung bei Kellerautomaten funktionieren so:
Bedeutet:
- Wenn sich der Kellerautomat gerade im Zustand befindet,
- gerade das Zeichen liest und
- das oberste Kellersymbol ist,
- dann kann der Kellerautomat in den Zustand wechseln
- und dabei durch das Wort ersetzen
Dies lÀsst sich am einfachsten Schreiben als:
Bedeutung der Symbole:
- : Aktueller Zustand
- : Gelesenes Zeichen
- : Oberstes Kellersymbol
- : Neuer Zustand
- : Neues Wort, wodurch ĂŒberschrieben wird
Konfiguration
Jeder Kellerautomat benötigt auĂerdem eine Konfiguration , die den aktuellen Zustand , das noch zu verarbeitende Suffix des Eingabewortes und den aktuellen Kellerinhalt beinhaltet:
KonfigurationsĂŒbergĂ€nge
Ein KonfigurationsĂŒbergang ist festgelegt durch die Relation . Wenn also eine ZustandsĂŒberfĂŒhrung Teil der Ăbergangsrelation ist, ist automatisch ein valider Ăbergang, durch den das oberste Kellersymbol () gelöscht und durch ein neues Wort ersetzt wird.
Akzeptierte Sprachen
Eine von einem Kellerautomat akzeptierte Sprache ist definiert als:
ErklÀrung der Symbole:
- : Ein Eingabewort muss in der Summe aller Wörter enthalten sein.
- : Es muss möglich sein, vom Startzustand mit dem Eingabewort bei einem leeren Keller () auf einen Endzustand zu gelangen, bei dem das Eingabewort gÀnzlich gelesen wurde () und etwas () im Keller steht.
- : Der Endzustand muss in der Zustandsmenge des Automaten enthalten sein
- : Das Wort im Keller muss im Kelleralphabet enthalten sein
Falls der Automat auch bei leerem Keller akzeptieren soll, kann die Sprache definiert werden als:
â Der Zustand, der nach Einlesen des Wortes erreicht ist, muss Teil der definierten ZustĂ€nde des Kellerautomaten sein.
Ăbergangsrelationen
Eine einfachere Schreibweise fĂŒr die Ăbergangsrelationen des Kellerautomaten lautet:
- Aktueller Zustand: Der aktuelle Zustand, in dem sich der Kellerautomat befindet
- Symbol: Das eingelesene Symbol
- Kellersymbol 0: Das oberste Kellersymbol
- Neuer Zustand: Der Zustand, in den der Automat wechseln soll
- Input fĂŒr Keller: Was anstelle von Kellersymbol 0 geschrieben werden soll (Kellersymbol 0 wird beim Lesen entfernt)
â Wenn sich der Kellerautomat im aktuellen Zustand befindet, Symbol eingelesen wird und das oberste Kellersymbol gleich Kellersymbol 0 ist, soll der Automat in den neuen Zustand ĂŒbergehen und den neuen Input in den Stack schreiben.
Kontextfreie Sprachen
Mit einer kontextfreien Sprache lassen sich die regulĂ€ren Sprachen (aber auch weitere Sprachen) ausdrĂŒcken. Eine Kontextfreie Sprache kann z.B. durch eine kontextfreie Grammatik beschrieben werden.
Grammatik
Eine Grammatik ist ein Tupel :
- : Terminal-Alphabet
- : Nonterminal-Alphabet (Variablen)
- : Produktionenmenge (Regelmenge)
- : Startsymbol
GroĂbuchstaben sind Variablen, S ist (meist) das Startsymbol. Kleinbuchstaben sind Terminale. Die GroĂbuchstaben , und sind Symbole, die als Terminale und Variablen genutzt werden können.
Die Kleinbuchstaben bis sind Zeichenketten aus anderen Terminalen und die griechischen Kleinbuchstaben , , , ⊠sind Zeichenketten aus Variablen und Terminalen (beide sind Variablen fĂŒr gröĂere Zeichenketten).
FĂŒr die Darstellung einer Grammatik genĂŒgt die Angabe der Produktionen, da die Konventionen aus den Variablen, Terminalen und dem Startsymbol hergeleitet werden können.
AuĂerdem können Produktionen zusammengefasst werden:
kann mit dem ODER-Operator geschrieben werden als
Eine Grammatik heiĂt kontextfrei, falls fĂŒr ihre Regelmenge gilt:
d.h. falls jede Regel die Form hat.
Kontextfreie Sprache
Eine Sprache heiĂt kontextfrei, wenn es eine kontextfreie Krammatik mit gibt (Solche Sprachen werden auch Typ-2-Sprachen genannt).
Ableitung
Eine Ableitung beschreibt, wie man vom Startsymbol zu einem Wort der Sprache kommt. Ein Ableitungsschritt () ist hierbei die Ersetzung eines Nichtterminals durch eines oder mehrere (Nicht-) Terminale. Die Ableitung endet, wenn keine Nichtterminale mehr auftreten.
Transitive HĂŒlle
Die transitive HĂŒlle des Ableitungsschritts bezeichnet die gesamte Ableitung bis zu einem Wort:
Es gilt also:
â FĂŒr jedes Wort der Grammatik muss man aus einem Zustand irgendwie das Wort erreichen können.
Links-/Rechtsableitung
Eine Links- bzw. Rechtsableitung beschreibt eine Ableitung, bei der immer nur das am weitesten links/rechts stehende Nichtterminal ersetzt wird.
Linksableitung:
Rechtsableitung:
AbleitungsbÀume
Zu einer kontextfreien Grammatik kann ein Baum erstellt werden, der die Ableitung symbolisiert. Damit ein Baum als Ableitungsbaum bezeichnet werden darf, mĂŒssen folgende Bedingungen erfĂŒllt sein:
- Die Wurzel muss mit markiert sein
- Jeder Knoten ist mit (einem (Nicht-) Terminal) markiert
- Jeder innere Knoten ist mit einem (einem Nichtterminal) markiert
- Wenn ein innerer Knoten mit (einem Nichtterminal) markiert ist und seine Nachfolger von links nach rechts mit (einem Terminal), dann muss sein.
- Wenn ein Knoten mit markiert ist, ist ein Blatt und der einzige Sohn seines Vaters
Beispiel:
Ableitungsbaum fĂŒr die Linksableitung

Ein Ableitungsbaum ist eine natĂŒrliche Beschreibung fĂŒr die Ableitung einer bestimmten Satzform der Grammatik G, die man erhĂ€lt, wenn man die Markierungen aller BlĂ€tter von links nach rechts liest. Diese Zeichenkette wird auch Front des Ableitungsbaumes genannt:

Achtung!
Zu einer Satzform können mehrere AbleitungsbÀume existieren.
Mehrdeutigkeit
Eine kontextfreie Grammatik heiĂt mehrdeutig, falls es fĂŒr mindestens ein Wort zwei (oder mehr) verschiedene AbleitungsbĂ€ume gibt, oder falls mindestens ein Wort mehr als eine Links-/Rechtsableitung hat. Eine kontextfreie Sprache, die fĂŒr jede kontextfreie Grammatik.
Vereinfachungen
Ziel bei der Vereinfachung ist, das Format der Produktionen einzuschrĂ€nken, ohne deren FĂ€higkeit zur Erzeugung von Sprachen zu beschneiden. Eine kontextfreie Grammatik lĂ€sst sich durch folgende MaĂnahmen vereinfachen:
- Eliminierung von Δ-Regeln: Es gibt keine Produktionen der Form wenn
- Eliminieren nutzloser Symbole: Jede Variable und jedes Terminal von erscheint in der Ableitung mindestens eines Wortes aus
- Eliminieren von Kettenregeln: Es gibt keine Produktionen der Form , wenn und Variablen sind
Eliminieren von Δ-Regeln
- Bestimme alle Nichtterminale, die in ein Δ umgewandelt werden können:
- Bestimme alle Nichtterminale, aus denen das leere Wort ableitbar ist:
- FĂŒr jede Regel, deren Rechte Seite ein Nichtterminal aus enthĂ€lt, fĂŒgen wir eine Regel ohne dieses Nichtterminal hinzu.
- Eliminiere alle Δ-Regeln (entferne das Δ aus allen Umformungen und entferne die Umformung selbst, falls das Δ nicht verodert ist)
Beispiel:
Hier fĂŒhrt zu einem leeren Wort, also âmarkierenâ wir es im 1. Schritt. Da sich aus ableiten lĂ€sst, markieren wir auch dies. In Schritt 3 wird umgeformt, da wir das in der Ableitung dort markiert haben:
Im letzten Schritt entfernen wir das Δ aus der Ableitung von :
Eliminieren nutzloser Symbole
Beim Eliminieren von nutzlosen Symbolen wird darauf geachtet, welche Symbole nĂŒtzlich fĂŒr die Grammatik sind. Ein Symbol heiĂt nĂŒtzlich, wenn mit seiner Hilfe mindestens ein Terminalwort erzeugt werden kann, also wenn gilt:
mit und .
Beim Eliminieren von nĂŒtzlichen Symbolen wird also darauf geachtet, dass zwei Aspekte der NĂŒtzlichkeit fĂŒr jedes Symbol gegeben sind:
- Aus muss eine Terminalzeichenkette ableitbar sein (Lemma 1)
- muss Teil einer Zeichenkette sein, die aus ableitbar ist (Lemma 2)
Lemma 1 beschÀftigt sich mit der Erreichbarkeit von Symbolen. Ein Symbol muss erreichbar sein, also vom Startsymbol aus in einer Folge von Produktionen irgendwann erzeugt werden. Bei Lemma 1 werden alle Symbole, die niemals vom Startsymbol aus erreicht werden können, eliminiert. Der Algorithmus hierzu sieht so aus:
- Merke dir alle Nichtterminale, die per Ableitung in ein Terminal verwandelt werden können ( â A muss ein Nichtterminal produzieren, was in der Menge aller Wörter steht)
- PrĂŒfe, welche Ableitungen zu den gemerkten Nichtterminalen fĂŒhren, und markiere diese, bis alle Ableitungen durchlaufen sind. Sobald alle anderen Ableitungen angeschaut und markiert sind, entferne alle nicht markierten Ableitungen.
Lemma 2 hingegen eliminiert nicht erzeugende Symbole. Ein Symbol ist erzeugend, wenn es ein Wort bestehend aus nur Terminalsymbolen ableiten kann. Alle Symbole, die kein terminales Wort erzeugen können, sind ebenfalls nutzlos.
- Starte bei und durchlaufe alle möglichen Ableitungen, um zu sehen, welche Nichtterminale erreicht werden können. Entferne alle Ableitungen, die nicht erreicht werden können.
Eliminieren von Kettenregeln
Kettenregeln sind Regeln mit folgender Form:
Sie tragen zur Erzeugung eines Wortes nichts bei. Kettenregeln können mit 3 Schritten eliminiert werden:
- Entfernen von Zyklen: Gibt es Nichtterminale, die einen Zyklus erzeugen (z.B. ), fĂŒgen wir ein neues Nichtterminal hinzu und ersetzen alle durch .
- Umnummerierung: hat nun Elemente. Wir bezeichen diese mit , so dass gilt: Wenn , dann ist
- Ersetzen von Kettenregeln: Wenn noch Regeln wie dann kann jede Regel ersetzt werden durch
Im folgenden Beispiel gibt es keine Zyklen, daher mĂŒssen diese nicht entfernt werden (Lemma 1 nicht zutrefflich). Auch Lemma 2 ist nicht zutrefflich, da alle Nichtterminale von aus erreicht werden können.
Allerdings existieren Kettenregeln, die entfernt werden können: ist equivalent zu . AuĂerdem kann vereinfacht werden zu .
Damit ist die Vereinfachung abgeschlossen.
Chomsky-Normalform (CNF)
Eine kontextfreie Grammatik ist in CNF, wenn alle ihre Produktionen eine der folgenden Formen haben:
- (nur vorhanden, wenn das leere Wort erzeugt)
(mit und )
â Zu jeder kontextfreien Sprache lĂ€sst sich eine Grammatik in CNF angeben, so dass ist.
Zum Erzeugen der CNF einer Grammatik muss die Grammatik maximal vereinfacht vorliegen. Man beachte die Produktionen :
- Wenn vorhanden ist: Ersetze durch , fĂŒge neue Produktion hinzu, ersetze alle anderen durch .
- Wenn kein vorhanden ist: Betrachte die Produktion und ersetze dies durch die Produktionen .
Wortproblem & CYK-Algorithmus
Wenn eine kontextfreie Grammatik in der CNF sowie ein Wort gegeben sind, stellt sich die Frage, ob das Wort Teil der Sprache ist (). Dies kann mit dem Cocke-Younger-Kasami-Algorithmus (CYK) beantwortet werden.
Die Idee lautet wiefolgt: FĂŒr jedes Teilwort der Sprache wird die Menge der Nichtterminale berechnet, die benötigt werden, um das Wort zu erzeugen. Man dringt hierbei von kleineren zu immer gröĂeren Teilwörtern vor. Am Einfachsten ist dies Tabellarisch zu erreichen.
Beispiel
- Gesuchtes Wort
- Produktionen:
Es wird eine Tabelle mit Zeilen und Spalten aufgestellt, wobei :
| 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ------ | |||||
| 3 | ------ | ------ | ||||
| 4 | ------ | ------ | ------ | |||
| 5 | ------ | ------ | ------ | ------ | ||
| 6 | ------ | ------ | ------ | ------ | ------ |
Entlang der Hauptdiagonalen werden dann die Terminale von eingetragen:
| 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|
| 1 | b | |||||
| 2 | ------ | b | ||||
| 3 | ------ | ------ | a | |||
| 4 | ------ | ------ | ------ | b | ||
| 5 | ------ | ------ | ------ | ------ | a | |
| 6 | ------ | ------ | ------ | ------ | ------ | a |
Dann werden die Terminale durch die möglichen Nichtterminale, durch die sie direkt erzeugt werden können ersetzt:
| 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|
| 1 | B | |||||
| 2 | ------ | B | ||||
| 3 | ------ | ------ | A, C | |||
| 4 | ------ | ------ | ------ | B | ||
| 5 | ------ | ------ | ------ | ------ | A, C | |
| 6 | ------ | ------ | ------ | ------ | ------ | A, C |
Hier beginnt der Algorithmus. Zuerst schauen wir uns an. Da es keine Produktion gibt, die erzeugt, tragen wir â{}â ein:
| 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|
| 1 | B | {} | ||||
| 2 | ------ | B | ||||
| 3 | ------ | ------ | A, C | |||
| 4 | ------ | ------ | ------ | B | ||
| 5 | ------ | ------ | ------ | ------ | A, C | |
| 6 | ------ | ------ | ------ | ------ | ------ | A, C |
Bei hingegen gibt es Produktionen, die entweder oder erzeugen, weshalb wir die Terminale fĂŒr die Produktionen () dort eintragen:
| 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|
| 1 | B | {} | ||||
| 2 | ------ | B | S, A | |||
| 3 | ------ | ------ | A, C | |||
| 4 | ------ | ------ | ------ | B | ||
| 5 | ------ | ------ | ------ | ------ | A, C | |
| 6 | ------ | ------ | ------ | ------ | ------ | A, C |
Weiter geht es danach mit , , , , , usw. Nachdem die ganze Tabelle ausgefĂŒllt wurde, sieht sie wie folgt aus:
| 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|
| 1 | B | {} | A | S, C | B | A, S |
| 2 | ------ | B | S, A | S, C | B | A, S |
| 3 | ------ | ------ | A, C | S, C | B | S, A |
| 4 | ------ | ------ | ------ | B | S, A | {} |
| 5 | ------ | ------ | ------ | ------ | A, C | B |
| 6 | ------ | ------ | ------ | ------ | ------ | A, C |
Nachdem die Tabelle gefĂŒllt ist, muss in der oberen rechten Ecke das Startsymbol zu finden sein. Falls es vorhanden ist, ist das Wort in der Sprache enthalten.
RegulÀre Grammatiken
Bisher wurden regulÀre Sprachen und kontextfreie Sprachen behandelt. Zur Wiederholung, eine regulÀre Sprache ist beschrieben durch einen regulÀren Ausdruck oder ein Syntaxdiagramm und wird akzeptiert durch endliche Automaten. Eine kontextfreie Sprache hingegen wird durch eine kontextfreie Grammatik beschrieben und von (nichtdeterministischen) Kellerautomaten akzeptiert.
RegulÀre Sprachen können aber auch durch eine eigene Grammatik beschrieben werden.
â Eine Sprache ist genau dann regulĂ€r, wenn sie durch eine regulĂ€re Grammatik erzeugt wird.
Links-/RechtslinearitÀt
Eine kontextfreie Grammatik, deren Produktionen alle die Form
besitzen, heiĂt linkslinear. Genauso heiĂt eine kontextfreie Grammatik, deren Produktionen alle die Form
besitzen rechtslinear.
â ==Eine Grammatik heiĂt regulĂ€r, wenn sie rechtslinear oder linkslinear ist.==
Grenzen kontextfreier Sprachen
(TODO)
Linear bandbeschrÀnkte Automaten (LBA)
RegulĂ€re Sprachen haben ebenfalls Grenzen. Eine Sprache bei der man âzĂ€hlenâ muss und bei der die Obergrenze nicht bekannt ist, lĂ€sst sich nicht als regulĂ€re AusdrĂŒcke darstellen. Die Sprache
beispielsweise kann nicht durch eine kontextfreie Grammatik erzeugt werden. Das Hauptproblem liegt darin, dass bei den Kellerautomaten und bei kontextfreien Sprachen das Lesen aus dem Stack das gelesene Element zerstört. Es ist also nicht möglich, eine Information vom Stack zu lesen und fĂŒr spĂ€ter aufzuheben.
Die Lösung hierfĂŒr sind linear bandbeschrĂ€nkte Automaten (LBAs). Anstelle des Stacks verwenden sie ein âBandâ als Speichermedium, Ă€hnlich einem Magnetband. Das Band wird von einem endlichen Automaten mit âSchreib-Lese-Kopfâ gelesen und beschrieben. Der Kopf steht immer ĂŒber einem Feld des Bandes. In einem Schritt:
- liest der Kopf das Symbol auf dem Band,
- schreibt, falls nötig, ein neues Symbol,
- Àndert seinen Zustand und
- fĂŒhrt eine Bewegung nach rechts oder links aus
Zu Beginn der Verarbeitung befindet sich die Eingabe auf dem Band selbst. Wie der Name des Automaten vermuten lĂ€sst, ist er nach rechts und links beschrĂ€nkt, seine LĂ€nge ist also endlich. Dies wird ĂŒber Start- und Ende-Zeichen realisiert, die nicht ĂŒberschrieben werden können. Die formale Definition des Automaten lautet:
Wobei:
- die endliche Menge an ZustÀnden symbolisiert
- fĂŒr das endliche Eingabealphabet steht ()
- das Symbol fĂŒr das endliche Bandalphabet ist
- die Ăbergangsrelation
- der Anfangszustand ist ()
- das Leerzeichen darstellt ()
- fĂŒr die linke Endmarkierung steht
- fĂŒr die rechte Endmarkierung steht
- die Endzustandsmenge verkörpert ( S)
Weitere Symbole, die nicht direkt in der Definition enthalten sind:
- ist das erweiterte Bandalphabet inklusive der Start- und Endsymbole ()
Die Ăbergangsrelationen bei diesen Automaten werden wie folgt geschrieben:
Eine einzelne Ăbergangsrelation (hier genannt) aus einem Zustand bei einem gelesenen Zeichen zu Zustand , bei der nichts (das leere Wort) geschrieben wird, und sich der Schreib-Lese-Kopf nach rechts bewegt, sieht also so aus:
Kontextsensitive Sprachen
Der LBA ist equivalent zu einer kontextsensitiven Grammatik. Eine Grammatik gilt als kontextsensitiv, wenn ihre Produktionen die Form
haben: das Nichtterminal kann nur im Kontext ersetzt werden! und dĂŒrfen auch leer sein, eine kontextsensitive Grammatik kann also auch kontextfreie Produktionen zulassen.
Eine kontextsensitive Grammatik ist monoton, wenn ihre Produktionen die Form
mit haben.
Sprache
Eine Sprache heiĂt kontextsensitiv, wenn es eine kontextsensitive Grammatik mit gibt. Kontextsensitive Sprachen (Grammatiken) werden auch Typ-1-Sprachen (-Grammatiken) genannt.
Rekursiv aufzÀhlbare Sprachen
Eine Grammatik ist ein Semi-Thue-System, wenn ihre Produktionen die Form
haben. Die Besonderheit bei einem Semi-Thue-System ist, dass eigentlich keine Unterscheidung zwischen Terminalen und Nichtterminalen existiert. Es werden zwar Nichtterminale verwendet, allerdings sind die Produktionen in keiner Weise eingeschrÀnkt. Rekursiv aufzÀhlbare Sprachen werden von Turing-Maschinen akzeptiert.
Die Turing-Maschine
Die Turing-Maschine hat, genau wie der LBA:
- Ein âBandâ als Speichermedium
- Einen Schreib-Lese-Kopf
Der Kopf steht auch hier immer ĂŒber einem Feld des Bandes und liest in einem Schritt das Symbol, schreibt optionaler ein neues Symbol, Ă€ndert seinen Zustand und fĂŒhrt eine Bewegung aus. Auch bei der Turing-Maschine befindet sich die Eingabe zu Beginn bereits auf dem Band. Es gibt jedoch folgende Unterschiede zum LBA:
- Das Band ist nach rechts und links unbeschrÀnkt (es ist unendlich lang)
- Alle Zellen auĂer der Eingabe sind mit âBlankâ gefĂŒllt
Eine Turing-Maschine ist definiert als:
Wobei:
- die endliche Menge an ZustÀnden symbolisiert
- fĂŒr das endliche Eingabealphabet steht ()
- das Symbol fĂŒr das endliche Bandalphabet ist
- die Ăbergangsrelation
- der Anfangszustand ist ()
- das Leerzeichen darstellt ()
- die Endzustandsmenge verkörpert ( S)
Eine Ăbergangsrelation (hier ) bei einer Turing-Maschine sieht so aus:
Bei einem Zustand , gelesenem Symbol und einem darauffolgenden ZustandsĂŒbergang in , wobei ein geschrieben wird und der Kopf sich nach links bewegt, sieht die Ăbergangsrelation so aus:
Darstellung
Eine Turing-Maschine kann auch visuell dargestellt werden:

Die Ăbergange auf den Pfeilen werden gelesen als: .
Erweiterungen von Turing-Maschinen
Das âProgrammierenâ von Turing-Maschinen ist schwierig, aber es gibt Möglichkeiten, um die TM effizienter zu programmieren. Keine dieser Möglichkeiten erweitert die FĂ€higkeiten der Turing-Maschine, alle akzeptieren dieselbe Menge von Sprachen wie das Basismodell. Mögliche Erweiterungen fĂŒr die TM sind:
- Das Speichern einer endlichen Datenmenge im Zustand
- Ein Band aus mehreren Spuren
- UnabhÀngig bewegbare Schreib-/Leseköpfe auf mehreren BÀndern
Nichtdeterministische Turing-Maschinen
Turing-Maschinen können Nichtdeterministisch sein. Wie bei einem NEA können fĂŒr jeden Zustand und fĂŒr jedes Bandsymbol mehrere Ăbergange existieren. Die NTM wĂ€hlt immer den geeigneten Ăbergang aus (Hellsehen / Backtracking.)
Berechenbarkeit mit Turing-Maschinen
Mithilfe einer Turing-Maschine kann man Probleme auf ihre Berechenbarkeit untersuchen. Dazu benötigt man eine TM, die in einen akzeptierenden Zustand ĂŒbergeht und anhĂ€lt, sobald sie ein Wort als zu einer Sprache zugehörig erkennt. Wenn ein Wort nicht zu einer Sprache gehört, also abgelehnt werden soll, geht sie in einen nicht akzeptierenden Zustand ĂŒber und hĂ€lt ebenfalls an. Das Anhalten signalisiert das Ende der Berechnung.
Die von einer TM akzeptieren Sprachen heiĂen rekursiv aufzĂ€hlbar. Bei einem Wort, das zur Sprache gehört, hĂ€lt die TM nach endlich vielen Schritten an. Allerdings gibt es keine Festlegung, was die TM macht, wenn ein Wort nicht zur Sprache gehört. Es gibt also eventuell Wörter, die zur nicht zur Sprache gehören, fĂŒr die die TM aber auch nie anhĂ€lt.
Rekursive Sprachen
Eine Sprache heiĂt rekursiv, wenn fĂŒr die Turing-Maschine gilt:
- Wenn das Wort zur Sprache gehört, akzeptiert nach endlich vielen Schritten und hÀlt an.
- Wenn das Wort nicht zur Sprache gehört, hĂ€lt nach endlich vielen Schritten ebenfalls an, geht aber in keinen akzeptierenden Zustand ĂŒber.
Die rekursiven Sprachen sind eine echte Teilmenge der rekursiv aufzÀhlbaren Sprachen. Eine TM, die eine rekursive Sprache akzeptiert, entspricht der Definition eines Algorithmus, also einer Berechnung, die nach endlich vielen Schritten anhÀlt.
â Rekursive Sprachen Rekursiv aufzĂ€hlbare Sprachen!
Berechenbarkeit
Bei der Berechenbarkeit geht es um die Frage von Alan Turing, was Computer theoretisch berechnen können, und was nicht. Dabei geht es immer um die Ein- und Ausgabemöglichkeiten der Computer. Eingaben können beispielsweise von Tastatur und Maus kommen, und Ausgaben können ĂŒber Bildschirme und Lautsprecher gemacht werden. Die Kernkompetenz eines Programms liegt also darin, Eingaben in Ausgaben abzubilden.
Formal kann man diese Abbildung definieren als:
( ist das Eingabealphabet, das Ausgabealphabet.)
Falls die Funktion nicht sÀmtliche mögliche Eingaben akzeptiert, sondern nur eine Teilmenge davon, spricht man von einer partiellen Funktion:
Wenn eine Eingabe nicht abbildbar ist, schreibt man:
()
Eine partielle Funktion nennt man berechenbar, falls es einen Algorithmus gibt, der diese Funktion berechnet. Wie die Alphabete und dabei tatsĂ€chlich aussehen ist eigentlich egal. Man kann sie immer durch ein BinĂ€rwort kodieren. Die Art der Kodierung ist nicht vorgeschrieben und kann fĂŒr jedes Ein- und Ausgabealphabet anders definiert sein.
Algorithmus
Es gibt nicht wirklich einen einzigen Algorithmus zum Lösen solcher Probleme. Vielmehr gilt: Wenn es möglich ist, eine Funktion in irgendeiner Programmiersprache zu programmieren, ist die Funktion sicher berechenbar.
Satz von Cantor
Der Satz von Cantor besagt, dass fĂŒr jede Menge die Menge ihrer Teilmengen (Die Potenzmenge ) strikt gröĂer ist als selbst ()
Nicht berechenbare Funktionen
Da Programme einen endlichen Quelltext besitzen, muss es (sehr viele) Funktionen geben, die nicht durch ein Programm berechnet werden können. Die Berechenbarkeit ist davon abhÀngig, was ein Algorithmus kann / darf.
Churchâsche These
âJede PrĂ€zisierung des Begriffes Algorithmus fĂŒhrt auf die gleiche Menge berechenbarer Funktionen.â
â Man kann prinzipiell auf jedem Rechner jeden anderen Rechner simulieren. Die Hardware ist nicht entscheidend fĂŒr die Berechenbarkeit einer Funktion. Die Programmiersprache ist ebenfalls nicht entscheidend.
Halteproblem der TM
Es ist nicht möglich, einen Algorithmus zu definieren, der fĂŒr jede Turing-Maschine und fĂŒr jede Eingabe berechnet, ob die Turing-Maschine mit dieser Eingabe anhĂ€lt.
Fehlend: Stoff von Folien 452 bis 461!
Turing-Maschinen in BinÀrdarstellung
Eine Turing-Maschine kann in eine BinÀrzeichenkette umgewandelt werden, indem allen Symbolen, ZustÀnden und Richtungen eindeutige BinÀrcodes zugewiesen werden.
Jede Ăbergangsfunktion wird als BinĂ€rfolge kodiert:
â Niemals zwei Einsen hintereinander!
Dann werden alle Ăbergangscodes durch zwei Einsen zusammengefĂŒgt:
kodiert so die Turing-Maschine .
Compilerbau
TODO: Noch nicht in der Vorlesung gehört.
Klausurthemen
- Sprache/Automat in Chomsky-Hierarchie einordnen
- Umwandlung NEA/DEA
- RE â NEA â DEA â RE
- Ăbergangsdiagramm â> Syntaxdiagramm (Darstellung)
- Sprache (alle Wörter) aus RE/RG erzeugen
- lexikographische Ordnung
- Spache in Automat (dreierrest BinÀrzahl)
- AbleitungsbÀume
- Pumping Lemma, Halteproblem TM â Multiple Choice
- Compilerbau (nur Grob) â LL(1)-Grammatiken, FIRST/FOLLOW
- Algorithmen:
- Potenzmengenkonstruktion
- Baukastenmethode (RE â NEA â DEA â RE)
- Zustandselimination
- Minimierung EA
- Minimierung von kfG, Erzeugung CNF aus kfG
- CYK-Alg. (Wortproblem)
TODO
- Pumping Lemma
- Berechenbarkeit
- Halteproblem
- Compilerbau
- EinfĂŒhrung
- Definition
- Compiler-Phasen
- Frontend
- Backend
- Vergleich zu Interpreter
- Programmtext
- Lexikalische Analyse
- Probleme & heutiger Ansatz
- Syntaxanalyse
- Parser
- Grammatik
- Ableitung
- Eindeutige Grammatiken
- TermbÀume
- Recursive Descent Parset
- LL(1)-Grammatiken
- Top-Down Parsing
- Shift-Reduce-Parser
- LR(1)-Grammatiken
- Parsergeneratoren
- Bison
- Fehlererkennung
- Symboltabellen
- Codeoptimierung
- EinfĂŒhrung