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 ):

  1. falls
  2. 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:

  1. ist ein regulÀrer Ausdruck
  2. ist ein regulÀrer Ausdruck
  3. FĂŒr jedes ist ein regulĂ€rer Ausdruck
  4. Sind und regulĂ€re AusdrĂŒcke, so auch
    1. → Vereinigung
    2. → Konkatenation
    3. → 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: a 1x gematched
  • (a|b) → a oder b wird 1x gematched
  • ab → ab wird 1x gematched
  • a* → a wird 0-mal bis ∞-mal gematched
  • a+ → a wird 1-mal bis ∞-mal gematched
  • (a|b)* → a oder b wird 0-mal bis ∞-mal gematched (jegliche Kombination aus a und b, da sich der Kleene Stern auf die Klammer bezieht)
  • ab* → a wird 1x gematched, b wird 0-mal bis ∞-mal gematched
  • (ab) → ab wird 1-mal bis ∞-mal gematched (abababab...)
  • aa* | bb* → Erst wird ein einzelnes a gematched, dann 0 bis ∞-viele a’s oder ein b, dann 0 bis ∞-viele b’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:

  1. Stelle eine Tabelle aller Zustandspaare von auf, mit ungleich
  2. Markiere alle Paare mit genau einem Endzustand
  3. FĂŒr jedes unmarkierte Paar , teste fĂŒr jedes Symbol ob markiert
    1. Falls ja, markiere auch
  4. Wiederhole 3. bis sich keine Änderung mehr ergibt
  5. 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:

Z0Z1Z2Z3Z4
Z0------------------------------
Z1------------------------
Z2------------------
Z3------------
Z4------

Dann werden alle Paare, bei denen einer der beiden ein akzeptierender Endzustand ist, markiert:

Z0Z1Z2Z3Z4
Z0------------------------------
Z1------------------------
Z2------------------
Z3------------
Z4xxxx------

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 .

Z0Z1Z2Z3Z4
Z0------------------------------
Z1x------------------------
Z2x------------------
Z3xx------------
Z4xxxx------

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:

  1. Die Zustandsmenge und die Menge der akzeptierenden EndzustÀnde werden als leere Mengen gewÀhlt.
  2. . FĂŒge zu hinzu.
  3. 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.
  4. FĂŒge zu hinzu, falls noch nicht enthalten
  5. ErgĂ€nze die Übergangsfunktion
  6. Wiederhole Schritt 3 bis 5, bis sich und nicht mehr Àndern
  7. 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 ( = / )NEADEA
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:

  1. Wandle den NEA in einen VNEA um
  2. Wiederhole fĂŒr alle EndzustĂ€nde :
    1. Eliminiere (iterativ, also nacheinander, nicht gleichzeitig!) alle ZustĂ€nde außer dem Startzustand und .
    2. Bilde einen regulÀren Ausdruck aus dem finalen Automaten
  3. Vereinige die AusdrĂŒcke fĂŒr alle EndzustĂ€nde q
    1. 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.

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

  1. Bestimme alle Nichtterminale, die in ein Δ umgewandelt werden können:
  2. Bestimme alle Nichtterminale, aus denen das leere Wort ableitbar ist:
  3. FĂŒr jede Regel, deren Rechte Seite ein Nichtterminal aus enthĂ€lt, fĂŒgen wir eine Regel ohne dieses Nichtterminal hinzu.
  4. 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:

  1. Aus muss eine Terminalzeichenkette ableitbar sein (Lemma 1)
  2. 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:

  1. 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)
  2. 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.

  1. 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:

  1. Entfernen von Zyklen: Gibt es Nichtterminale, die einen Zyklus erzeugen (z.B. ), fĂŒgen wir ein neues Nichtterminal hinzu und ersetzen alle durch .
  2. Umnummerierung: hat nun Elemente. Wir bezeichen diese mit , so dass gilt: Wenn , dann ist
  3. 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:

  1. (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 :

123456
1
2------
3------------
4------------------
5------------------------
6------------------------------

Entlang der Hauptdiagonalen werden dann die Terminale von eingetragen:

123456
1b
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:

123456
1B
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:

123456
1B{}
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:

123456
1B{}
2------BS, 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:

123456
1B{}AS, CBA, S
2------BS, AS, CBA, S
3------------A, CS, CBS, A
4------------------BS, A{}
5------------------------A, CB
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.

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