Erst meine organisatorische Ansage, sie ist, glaube ich,
schon erfolgt. Heute Nachmittag ab 12 Uhr mittags ist
der DS Akademikus gedacht zum allgemeinen studentischen und akademischen Protest.
Für diese Aktionen sind alle Lehrveranstaltungen freigestellt. Was für sie dann bedeutet,
dass sie sich eine andere Übungsgruppe suchen müssen,
sofern sie eine Übungsgruppe 12, 14,
16 Uhr am heutigen Dienstag haben.
Die anderen Demosgruppen finden regulär statt. Die Übungsgruppen sind es
vermutlich verstärkt worden. In der nachfolgenden Szene und 10 Uhr
Übungsgruppe sind vielleicht noch ein paar parallel da
Donnerstag, Freitags, die beiden Gruppen wären auch noch da.
Die sind auch nicht zu überfüllt. Gut. Das dazu.
Und jetzt nach dem Logikteil kommen wir jetzt wieder zurück zum Automatenteil.
Vielleicht erinnern Sie sich daran, womit wir am letzten Mal aufgehört hatten.
Wir hatten aufgehört mit Kontext freien Sprachen und kontextfreie Sprachen
konnte man auf zwei Arten erkennen.
Man konnte sie entweder erzeugen durch eine kontextfreie Grammatik oder man
konnte sie durch einen Kellerautomaten akzeptieren.
Und wie funktionierte das ungefähr, das System eines Kellerautomaten?
Es funktionierte
Indem man eine Eingabe hatte, das hatten wir beim
endlichen Automaten auch. Wir hatten eine endliche Steuerung,
in der ein Staatszustand und mehrere ausgezeichnete Endzustände vorhanden waren.
Und was jetzt neu hinzukommt, dass diese Automat sich
etwas merken kann, er hat einen zusätzlichen Speicher.
Er hat also nicht nur die Möglichkeit in den Zuständen,
sich irgendetwas zu merken, sondern auch hier in diesem Keller.
Der Keller ist erstmal ein potenziell beliebig großer Speicher.
Er hat aber die Einschränkung,
dass der Automat immer nur auf die Informationen,
die ganz oben auf dem Keller abgelegt ist,
zugreifen kann
Und die Verarbeitungsmethode ist,
man schaut sich das oberste Element auf dem Keller an,
man schaut sich die aktuelle Eingabe an,
den aktuellen Zustand, konsumiert dann ein Zeichen der Eingabe,
entfernt das oberste Element des Kellers und legt eine beliebig lange Zeichenkette wieder oben auf den Keller drauf.
Um ein Beispiel dafür zu geben,
hatten wir uns diesen Kellerautomaten angesehen, der die Eigenschaft hat,
wann immer er ein A liest,
kann er zum Beispiel in diesem Zustand bleiben,
Er nimmt dann beispielsweise einen Großarm vom Keller und legt zwei Großa wieder zurück.
Effektiv wird also insgesamt ein Großa hinzugefügt. Denn das Erste,
Großa wird ja gelöscht, zwei werden hingelegt, Netto-Bilanz, eins mehr.
Und eine Möglichkeit besteht, dass er das Ganze am Anfang tut,
ganz am Anfang liegt auf dem Keller in ein spezielles Markierungssymbol,
in diesem Fall das Bottom.
Und wenn er das am Anfang vorfindet, dann legt er das
wieder zurück und ganz zu Oberst befindet sich dann ein Großa.
Also auch ein A mehr. Und mit diesen Merkmalen,
das ist ein endlicher Automat plus Keller, haben wir wieder
eine Sprache definieren können. Und das Einfachste war,
dass wir die mit Endzustand akzeptierte Sprache charakterisiert haben.
Das läuft ganz analog. Man betrachtet alle die Worte über
Sigmar Stern im Grundalphabet, die die Eigenschaft haben.
Zwei Dinge müssen jetzt passieren. Ich starte im Staatszustand,
das Eingabewort W ist im Eingabeband und der Keller enthält nur das Markierungszeichen Bottom.
Und danach führe ich mich die Berechnung des Automaten,
es kann viele geben, es nicht deterministisch,
in einen Endzustand, die Eingabe ist komplett gelesen,
Und die letzte Komponente ist ein Kellerinhalt, der mich aber nicht interessiert.
Also Quintessenz, es werden alle Worte erkannt,
die die Eigenschaft haben, bei komplett gelesener Eingabe bin ich in einem Endzustand.
Für den Automaten von eben bedeutet das,
wenn wir das grob uns anschauen, er hat hier die Möglichkeit,
As zu lesen und merkt sich das auf dem Keller,
macht hier einen Übergang mit A und dann erkennt man am zweiten Zustand,
Set-Strich,
dass nur noch Bs gelesen werden und bei jedem Lesevorgang mit deinem kleinen B wird entweder ein Großa oder zum Schluss das Kellerbodenzeichen Bottom gelöscht, denn es wird Epsilons zurückgelegt.
Also nichts. Das führt also dazu,
dass diese Automat sich erst merkt, ins Set,
er hat ganz viele kleinen As gelesen und macht dann mit einem kleinen A einen Übergang.
Das heißt, es werden schon mal mindestens ein A gelesen,
beliebig viele, sind möglich. Und wie viele As ich lese,
bestimmt den Keller inhalt, durch die Anzahl der Großas.
Und da ich dann in diesem Schritt den Kellerinhalt nicht verändere,
habe ich Sobald ich Z-Strich das erste Mal betrete,
genauso viele Kellerboden-Symbole auf dem Keller, wie ich Kleinas gelesen habe.
Das heißt, die Anzahl der Großass plus dem letzten Bottom
ist gleich der Anzahl der eingelesenen Zeichen bislang.
Und dann habe ich die Möglichkeit, für jedes B,
was dann noch kommen mag, das kann ich lesen,
sofern noch irgendwas auf dem Keller da ist.
Das heißt, ich darf höchstens so viele Bs lesen,
wie vorher Ass gekommen sind. Wenn ich versuche,
mehr Bs zu lesen, als zu Fuaars gekommen sind,
dann wird dieser Automat blockieren,
dann wird eine Eingabe,
eine Resteingabe
übrig bleiben
Es ist nichts mehr auf dem Keller,
weswegen aus Z-Strich ich keinen weiteren Zustandsübergang machen kann.
Denn sobald der Keller komplett gelehrt wurde, sogar das Kellerboden-Symbol Bottom entfernt wurde,
kann dieser Automat keine Bewegung mehr machen. Das führt dazu,
dass dieser Automat also genau die Wortmenge akzeptiert, aller Auch,
N-B-O-M mit der Eigenschaft, es muss mindestens ein A vorkommen,
also N muss größer gleich eins sein.
Und ich lese mindestens so viele As wie Bs,
also muss N größer gleich M sein.
Und das kann man sich auch anhand von Beispielrechnungen klar machen,
Wobei bei den Beispielrechnungen ich mehrere Möglichkeiten habe,
ein Wort der Sprache zu akzeptieren, beziehungsweise nicht zu akzeptieren.
Wir sehen hier ein Wort, dreimal das A, zweimal das B.
Das ist ein Wort der Sprache, müsste also akzeptiert werden,
denn es sind mehr As als Bs vorhanden.
Genau in dieser Reihenfolge. Und wir können feststellen,
was passiert hier? Ich habe die Möglichkeit,
wann immer ich ein A lese, einfachen Zustands-Set zu bleiben.
Ich mache also einen Übergang und packe dabei ein großer
auf den Keller
Das kann ich für jedes der kleinen Ars machen und lande in einer Konfiguration,
in dem ich immer noch im Zustand Z bin,
nur noch die B-Star habe und jetzt drei Ars und ein Bottom auf
dem Keller und stelle fest, jetzt blockiert der Automat.
Das heißt, es ist ein Konfigurationsübergang,
der führt mich zu einem Zustand Z mit Resteingabe B,
B und einem nicht leeren Keller und ich kann hier nicht weitermachen und ich betrachte mir diese Konfiguration,
stelle fest,
es ist schon mal kein Endzustand und es ist auch noch Restwort da,
also ist das eine herzlich uninteressante Konfiguration,
was das Akzeptieren anbelangt
Also, diese Art Konfirmationsübergänge zu machen, ist also ungeeignet
um das Wort, das ich ursprünglich hatte, zu akzeptieren.
Es gibt aber eine andere Rechnung, die geschickter rät,
ja, wir müssen nämlich dafür Sorge tragen,
dass beim letzten A das vorkommt, wir nicht in Z verharren,
sondern in den Übergang nach Z-Strich machen.
Und genau diese Konfirmation ist hier nochmal dargestellt,
wir lesen also das erste A,
packen einen Gruß auf den Keller, lesen das zweite A,
jetzt haben wir zwei große auf den Keller.
Und jetzt haben wir hier das letzte A,
das weiste Autobahn zwar nicht,
aber er kann trotzdem sich durch höhere Einsicht entscheiden,
jetzt den Übergang nach Z-Strich
zu machen
Dieser Konfirmationsübergang zurzeit Strich führt dazu, dass jetzt die Restworte,
das Restwort bestehen aus zwei Bs, jetzt gelesen werden kann.
Und dieser Automat kann ja im Zustand Z-Strich nur noch die Bs lesen.
Und wir sehen, bei jedem Übergang wird hier ein Zeichen
vom Keller entfernt. Ich komme also insgesamt zu Z-Strich,
die Eingabe ist komplett gelesen worden und es steht noch was auf
dem Keller in diesem Fall, nur noch das Kellerbund-Zeichen.
Und das ist jetzt eine Konfirmation,
in der das Wort komplett gelesen werden konnte.
Und ich befinde mich auch noch in einem Endzustand.
Also wissen wir, dieses Wort kann akzeptiert werden
Ja, das ist das Schöne am Nicht-Determinismus. Wir haben
immer verschiedene Möglichkeiten und klassische Definition ist eine Erfolgsmöglichkeit reicht.
Einmal die Möglichkeit haben, richtig zu raten, reicht für die Akzeptierung.
Was auf dem Keller dabei steht, ist irrelevant.
Zumindest für diese Art der Definition der akzeptierten Sprache, weil wir sagen, wir akzeptieren mit Enzystand. Wir hatten,
als wir uns diese Kellerautomaten angeschaut haben, noch gesehen,
wir können das jetzt auch anders benutzen,
wir können auch eine Sprache so charakterisieren, dass wir sagen,
uns interessiert gar nicht, was der Zustand ist,
der bei Ende eingenommen wird, sondern wir interessieren uns dafür,
wenn wir im Startzustand sind, das Wort haben und das Kellerbodensymbol,
wenn wir dann die Möglichkeit haben, das Wort komplett zu lesen,
die zweite Komponente ist,
also das leere Wort.
Und wir haben die Möglichkeit, den kompletten Keller leer zu machen.
Das heißt, in der dritten Komponente steht auch das leere Wort.
Dann wird dieses Wort auch akzeptiert und dabei ist es egal,
was für einen Zustand P, wir haben. Das heißt,
wir akzeptieren genau dann das Wort, wenn wir die Möglichkeit haben,
auf einem Konfigurationspfad den Keller komplett zu entleeren,
sogar das Kellerbohnzeichen zu entfernen.
Das gibt im Allgemeinen für denselben Automaten von eben eine andere Sprache.
Denn wir hatten eben gesehen, zum Beispiel im Beispielswort
3a2b war der Keller am Ende nicht leer. So,
jetzt können wir uns überlegen, welche Sprache wird dieser Automat akzeptieren können,
wenn wir als Akzeptanzkriterium Keller leer festsetzen.
Und dann stellen wir fest mit ähnlicher Überlegung,
hier wird der Keller erstmal gefüllt mit Großas.
Hier wird da unverändert gelassen
Und es gilt wieder, wie vorher, ich komme nach Z-Strich,
genau dann, wenn ich erst mal nur Ass gelesen habe.
Und wenn ich N-As gelesen habe,
dann habe ich jetzt N-Symbol auch auf dem Keller.
Das heißt, was ich jetzt schon weiß,
ich muss mindestens diese N-Symbole erst mal runternehmen, bevor ich akzeptieren kann.
Und das macht diese Automat in Z-Strich, er liest jetzt
nur noch Bs und entfernt jedes Mal ein Zeichen.
Das heißt, ich muss en mal diese Schleife durchlaufen,
genau dann ist der Keller leer.
Ich kann es nicht weniger machen,
dann ist er noch nicht leer und ich kann es
auch nicht end plus eins mal machen
Denn wenn auf dem Keller nichts drauf ist, ist hier
kein Konfirmationsübergang mehr möglich. Das heißt, im Endeffekt,
ich packe erst Ars auf dem Keller, muss die alle wieder runterlöschen.
Das führt dazu, dass ich genauso viele Ars am Anfang
gelesen habe, wie ich später Bs-Einlesung zuführen, Z-Strich.
Und das steht hier in Kürze, dass die Sprache L. Epsilon,
also die mit leerem Keller akzeptierte Sprache,
gleich auch NBO-Ennis für alle N,
größer gleich 1. Das größte gleich 1 kommt wieder daher,
dass ich einmal den Übergang von Z nach Z-Strich
machen muss.
Und was man hier insbesondere noch sehen kann, ist,
dass es überhaupt nicht notwendig ist,
dass ein Kellerautomat einen Endzustand hat, dieser Kellerautomat hat keinen Endzustand,
braucht man in dieser Definition auch nicht.
Wenn man natürlich sich fragen würde,
was dieser Kellerautomat für eine Sprache akzeptiert mit Endzustand,
ist Clark die leere Menge akzeptierter, weil er gar keinen Endzustand hat.
So, jetzt haben wir schon zwei Sprachfamilien kennengelernt bislang,
nämlich die regulären Sprachen und die kontextfreien Sprachen.
Und wir wollen noch mehr kennenlernen,
also in höchste Zeit, sich zu fragen,
was ist das eigentlich,
eine Sprachfamilie
Bislang hatten wir gesagt, das ist eine Menge von Sprachen,
also letztendlich eine Menge von Mengen.
Und da man Mengen von Mengen nicht sagt,
es spricht sich so schlecht, wenn man das immer,
eine Familie von Mengen, eine Mengen Familie.
Und da wir sprachen als spezielle Mengen betrachten,
Wortmengen heißt das Ganze, Sprachfamilie.
Und Sprachfamilie ist nicht irgendeine Mengenmenge, sondern die erste Bedingung sagt,
sie muss schon mal mindestens eine Sprache enthalten.
Nicht triviale Familien schließen wir aus,
mindestens eine Sprache gehört zur Familie
Das war bei den regulären schon mal der Fall,
denn dazu gehört nun unendlich viele Sprachen.
Also war die Menge schon mal nicht leer. Die dritte Bedingung,
nehmen wir uns mal vor, die besagt,
es gibt mindestens eine Sprache L in der Familie,
die die Eigenschaft hat, selbst nicht leer zu sein.
Bei den regulären war das zum Beispiel die Menge A,
Stern. Das ist eine nicht leere Menge. Also eine
nicht leere Menge hatten wir schon in den regulären drin.
Aber zum Beispiel wäre auch die Familie aller endlichen Mengen bislang
eine Sprachfamilie mit diesen Bedingungen, denn sie ist nicht leer.
Es gibt eine endliche Menge
Und es gibt sogar eine endliche Menge, die nicht die
leere Menge ist. Es gibt zum Beispiel eine einelementige Menge.
Was wir jetzt noch für Sprachfamilien haben wollen, ist,
dass das Ganze charakterisierbar ist über einem Alphabet.
Nun könnte ich folgendes machen. Ich habe eine Sprache,
die hat das Alphabet AB. Die zweite Sprache BC.
Die dritte CD. Dann DEF und immer so weiter.
Das heißt, alle Sprachen haben jeweils ein endliches Alphabet.
Aber wenn ich mir die Gesamtheit aller verwendeten Buchstaben anschaue,
bekomme ich durch diese Art der Konstruktion natürlich unendlich viele Buchstaben,
die darin vorkommen
Und das will ich nicht verbieten. Deswegen erlaube ich es,
dass es insgesamt so etwas gibt wie ein unendliches Alphabet.
Ich fordere aber, dass es abzählbar ist.
Und jetzt möchte ich, dass jede Sprache davon,
aber bitte nur eine endliche Teilmenge benutzt.
Also jede Sprache L aus der Familie benutzt ein endliches Alphabet Sigmar.
Und Sigmar ist eine Teilmenge von Gamma. Und L ist
eben Teilmenge von Sigmar Stern. Also zwei Sachen,
jede Sprache benutzt nur einen endlichen Anteil des Oberalphabets Gamma.
Und es gibt überhaupt ein solches Oberalphabet Gamma,
das abzählbar ist
Unendlich ist halt der Wehrmutstropfen, den wir in Kauf nehmen müssen.
Weniger geht nicht, weil es immer unvergleichliche Alphabete ist,
deren Vereinigung unendlich groß wird. So, und da sieht man,
ich kann nicht die Klasse aller Wortmengen betrachten,
das wäre keine Sprachfamilie, denn für alle Wortmengen,
die ich irgendwie nehmen könnte, da muss es kein gemeinsames,
endliches Alphabet geben für jede Sprache.
So, und nochmal zu wiederholen,
was wir über die Sprachfamilie der Kontext freien Sprachen wissen,
wiederholen wir nochmal, wir wissen bereits,
dass wir die kontextfreien Sprachen auf drei verschiedene Arten,
also eigentlich sogar vier verschiedene Arten charakterisieren können.
Wir wissen, wir können sagen, eine Sprache ist kontextfrei,
das ist äquivalent dazu, dass diese Sprache L, die akzeptierte,
und zwar mit Endzustand akzeptierte Sprache für einen irgendwie gearteten Kellerautomaten A ist.
Oder es gibt im Zweifelsfall einen anderen Automaten A,
der diese Sprache mit Leam Keller akzeptieren kann.
Und nach Definition ist eine Sprache ja kontextfrei dann,
wenn sie von einer kontextfreien Grammatik akzeptiert wird
Und was uns noch fehlte bei dieser Betrachtung, ist,
was passiert, wenn wir uns jetzt einschränken auf deterministische Automaten?
Bei den endlichen Automaten hatten wir festgestellt,
es macht keinen Unterschied, ob wir nicht deterministische,
endliche Automaten oder deterministische haben, die Potenzautomatenkonstruktion führte dazu,
dass die erkannten Sprachen als Familie betrachtet jeweils gleich sind,
nämlich die regulären Mengen.
Und jetzt betrachten wir, was passiert,
wenn wir unseren Kellerautomaten determinisieren
Ja, mehr bekommen können wir schon mal nicht,
das ist klar, Determinismus ist immer eine Einschränkung.
Vielleicht bekommen wir echt weniger. Und es wird
sich zeigen, ja, wir bekommen echt weniger.
Und dazu müssen wir erst mal gucken,
was heißt das überhaupt für einen Kellerautomaten, deterministisch zu sein.
Schauen wir erst mal, was heißt Nicht-Determinismus?
Wenn ich ihn sehe, erkenne ich ihn.
Das sieht man nämlich hier beispielsweise an dieser Schleife,
der Automat guckt nach, was kann ich jetzt von der Eingabe lesen?
Aha, ein kleines A. Was steht aktuell auf dem Keller
ganz oben
Vielleicht das Bottom, gut. Und ich bin in einem Zustand Z.
Diese drei Informationen sind wichtig für ihn, aktueller Zustand,
aktuell eingelesenes Zeichen und das oberste Zeichen des Kellers. Mehr Informationen hat er nicht,
all diese drei Elemente kann er heranziehen,
um zu scheiden, zu entscheiden,
was er als nächstes tun soll und man sieht schon,
hier gibt es genau zwei Kanten, die zu dieser Information passen,
nämlich zu einem Zustand und eine Eingabe und einem Kellerbodensymbol gibt es zwei verschiedene Übergänge,
die möglich sind.
Das heißt, Das wollen wir schon mal als Nicht-Determinismus bezeichnen.
Und im Prinzip ist genau das,
was wir ausschließen müssen, nur noch eine Kleinigkeit,
weil ein Kellerautomat auch nichts von der Eingabe lesen darf.
Ja, das müssen wir auch noch behandeln. Was machen wir,
wenn der Kellerautomat von der Eingabe nichts heranziehen kann und dadurch aufzulösen,
was die nächste Konfirmation sein soll?
Wir müssen also irgendwie eine Definition jetzt finden, die dafür sorgt,
dass zu einer gegebenen Konfiguration das Triple aus Zustand,
Resteingabe aktueller Kellerinhalt, dass dadurch eindeutig,
wenn überhaupt,
existent die nächste Konfirmation folgt
Ja, es soll also höchstens eine Nachfolgerkonfiguration geben.
Und das kann man einfach definieren. Man sagt also,
ein deterministischer Kellerautomat ergibt sich daraus, dass mir erstmal ein nicht deterministisch nehmen.
Und an denen noch zwei Zusatzbedingungen stellen. Wir nennen einen Kellerautomaten
deterministisch, wenn er folgende Bedingungen erstens und zweitens erfüllt.
Und die erste Bedingung für einen D-PDA,
die Terministic Pushdown Atomitan, sagt,
dass für jedes Triple Z XY Die Anzahl der möglichen Kanten,
die dazu passen, dass die kleiner gleich eins ist.
Also für je, ein solches Triebel gibt es höchstens,
eine Kante, die darauf passt.
Aktueller Zustand, aktuelle Eingabe, aktueller Keller und da nur
das oberste Symbol Y. Das ist eindeutig in dem Sinne,
dass es höchstens eine Kante gibt, die diese Information abbildet.
Und die zweite Bedingung ist jetzt noch wichtig,
um den Spezialfall abzufangen, dass ich von der Eingabe gar nichts lese.
Wenn ich von der Eingabe gar nichts lese,
also das leere Wort Epsilon,
dann kann ich schon mal die Eingabe nicht als Informationsquelle nutzen,
um zu entscheiden, wie die nächste Konfirmation aussieht.
Mir bleibt also nur noch der Keller als Information.
Und jetzt muss ich folgendes bedenken, ich könnte zum Beispiel
vom Keller jetzt ein Großa lesen und das als Information ranziehen.
Dann muss aber folgendes gewährleistet sein,
dann darf es keine anderen Übergang geben,
der auch ein Großa vom Keller liest, aber von der Eingabe etwas konsumiert.
Sonst wüsste der Kellerautomat jetzt nicht, aha,
es steht zwar ein Großa auf dem Keller,
aber soll ich jetzt etwas lesen von der Eingabe
oder soll ich nichts lesen von der Eingabe
So, und um diese Möglichkeit des Ratens auch auszuschließen,
um es wirklich deterministisch zu machen,
wird jetzt in der zweiten bedingt gefordert, dass,
wenn ich die Möglichkeit habe, es also eine Kante gibt,
die von der Eingabe nichts braucht,
zweite Komponente des Y. Wenn es da mindestens eine Kante gibt,
dann gilt,
dass für jedes andere Eingabesymbol X aus dem Alphabet Großsigma,
dass dann gilt, dass ich von diesem Zustand mit X nicht wegkomme.
Das heißt, die Menge der Kanten,
die von Z und X wegführen für irgendwas vom Keller,
und zwar das Gleiche wie das,
was ich auch fürs Y habe,
dass da
keine solche Kante existiert
Und das bedeutet nichts anderes, als dass es möglich ist,
wann immer ich hier ein Y vorfinde auf dem Keller,
dann gibt es keine konkurrierende Kante, die auch Y vom Keller lesen will.
Das heißt, sobald ich Y sehe auf dem Keller,
weiß ich genau, es kann nur dieser Übergang gemeint sein,
den ich jetzt machen muss, kein anderer Übergang wäre noch möglich.
Gut, das ist ein deterministischer Kellerautomat, bei dem es
jetzt wirklich gewährleistet, dass es höchstens eine Nachfolgekonfiguration gibt.
Blockieren kann er natürlich weiterhin. Und deterministische Kellerautomaten,
welche Sprache akzeptieren die, naja, solange wir nicht wissen,
wie das mit den Sprachfamilien aussieht, geben wir dem ganzen Namen,
wir sagen eine Sprache, heißt deterministisch Kontext frei,
wenn sie von einem deterministischen Kellerautomaten akzeptiert wird.
Und wir geben der ganzen Familie von Sprachen, auch einen Namen,
wir nennen das die Sprachfamilie, deterministisch kontextfreien Sprachen.
Das soll die Familie einer Sprachenelf von A sein,
wobei A, ein deterministischer Kellerautomat ist.
Das ist die Familie der deterministischen Kontextfreien Sprachen und in diesem Fall
wird es wichtig sein, dem Kind einen Namen zu geben,
wenn die Familie ist nicht identisch mit der Familie der Kontextfreien
Sprachen selbst
Sondern eine echte Timing. So, woran liegt das?
Das sieht man nicht so spontan.
Das kann man nur anhand von Eigenschaften, dieser Gesellschaft.
Und eine wichtige Eigenschaft von kontextfreien Sprachen ist die sogenannte Prefix-Freiheit.
Was ist ein Prefix, ein Prefix eines Wortes?
Es ist ein Anfangsstück des Wortes. Wobei Theoretiker da sehr generell sind,
das Wort W ist ein Prefix vom Wort W selbst.
Also jedes Wort ist Prefix von sich selbst. Wenn wir
sagen wollen, wir wollen so einen normalen Prefix haben,
dann sagen wir ein echter Prefix
Gut. Und wann nennen wir jetzt eine Sprache?
Prefixfrei? Ja, im Prinzip dann, wenn es,
wenn ein Wort drin ist, dann ist keiner seiner Prefixe drin.
Ja, Prefixfrei. Formal notiert sich das wie in Definition
17.3. Wir nehmen an, wir haben ein Wort weh,
das in der Sprache ist.
Und haben eine beliebige Sequenz über Sigma namens V.
Und jetzt nehmen wir mal an, das Wort weh.
V wäre in der Sprache. Dann hätten wir die Situation,
aha, weh, selbst war ja in der Sprache
WV ist jetzt in der Sprache. Das heißt,
wie ist ein Prefix von WV? Das sehen wir schon
mal. Wenn da noch das V hinten dran kommt,
dann ist das wie ein Prefix davon. So,
und jetzt will ich ja haben, dass das Ganze prefixfrei ist.
Also die Situation prefixfrei übersetzt sich da an, dass ich sage,
gut, dann muss das Wort V hinten das leere Wort sein.
Dann habe ich mich keinen echten Prefix,
dann steht hier hinten nämlich WV, also W Y,
also W. Das heißt, die einzige Möglichkeit,
das Wort W zu verlängern, dass wieder ein Wort der Sprache herauskommt,
ist,
hinten ein Äpfel ranzuhängen
Also nachdem das Wort W irgendwie schon erkannt wurde,
akzeptiert wurde beispielsweise von einem Automaten, wird kein Wort mehr,
dass dieses Wort W verlängert kommen, das auch akzeptiert würde.
Wenn die Sprache präfixfrei ist. Das ist ganz nett.
Bei präfixfreien Sprachen kann man aufhören,
sobald man das erste Mal durch den Endzustand durchgelaufen ist.
Danach muss man nichts mehr gucken,
denn eine Präfixfeiersprache hat ja die Eigenschaft,
sobald ein Wort erkannt wurde,
wird kein
echt längeres Wort
Mehr erkannt. Echt länger im Sinne von, das eine ist Briefix des anderen.
Wenn ich jetzt eine Spare habe, die nicht präfixfrei ist,
dann kann ich mir den präfixfreien Anteil herausfiltern.
Und das, nennen wir mal das Minimum einer Sprache,
das Minimum einer Sprache sollen alle Worte weh sein,
die die Eigenschaft haben, wenn sich weh irgendwie zerlegen lässt in UV,
US also ein Präfix von weh.
Und dieser Präfix ist in der Sprache
Denn soll das nur sein, wenn das, was da noch kommt,
das leere Wort ist, also die einzige Möglichkeit,
dass das Wort weh in diese Menge gelangt, ist,
dass das Wort weh selbst in der Sprache ist,
und es ist kein kürzeres Wort gibt,
das auch in der Sprache ist.
Also ich packe genau die Worte hinein, die die Eigenschaft haben,
dass keiner ihrer echten Präfixe auch noch in der Sprache ist.
So, wenn ich also alle Worte mit Präfix-Eigenschaften hintereinander schreiben würde,
nehme ich immer nur das Erste. Wenn ich mir jetzt
mal eine Menge anschaue, nämlich die Menge, Auch M-B-O-N.
Und die Eigenschaft fordere, dass ich mehr Ens,
also mehr Bs habe als ASN größer gleich M.
Das heißt, es kommen erst ein paar As und dann kommen
ein paar Bs, aber es kommen mehr Bs als As.
Und ich will jetzt den minimalen Anteil, also den Prefix-freien
Anteil dieser Menge M bestimmen. Da muss ich ja gucken,
was ist für jedes Wort A hoch M,
B-O-N. Das kürzeste, das akzeptiert wird.
Und ich stelle fest, wenn ich Ich muss ja
mindestens so viele Bs wählen wie As.
Also A, auch NBON ist schon mal ein interessanter Kandidat.
Und diese Worte sind auch genau die, die in diese Menge hineinkommen.
Denn zu jedem dieser Worte gibt es in M selbst ein Wort,
das die Eigenschaft hat, dort eine echte Verlängerung zu sein.
Nämlich das Wort, das die Eigenschaft hat,
auch NBON plus noch mehr Bs. Das ist ein Wort,
das auch in M ist. Dann ist ja gefordert,
die Anzahl der Bs ist mindestens so groß wie die Anzahl der As.
Das heißt, das kürzeste Wort von allen diesen, Krefix-Sortierung.
Das ist es eben genau, wo das größer gleich zu
einem gleich wird. An dieser Stelle finde ich den Anteil,
der denn Prefix ist, also keinen echten Prefix hat.
So, warum ist jetzt diese Eigenschaft interessant?
Prefixfreiheit heißt ja, wie ich schon gesagt habe,
dass ich nach dem ersten Akzeptieren gewissermaßen aufhören darf.
Wenn der ganze Automat deterministisch abläuft, wenn er nicht deterministisch ist,
könnte es noch einen anderen Konfigurationsablauf geben,
der vielleicht einen anderen Weg zu einem anderen Endzustand nimmt.
Aber wenn nicht einen deterministischen Automat habe, dann ist die Folge der Konfiguration festgelegt.
Und sobald das erste Mal ein Endzustand vorbeikommt, kann ich aufhören,
wenn ich weiß, dass die Sprache präfixfrei ist.
Und das lässt sich sogar noch ganz allgemein erfassen,
eine deterministische, kontextfreie Sprache L ist genau dann präfixfrei,
wenn es ein deterministischen Kellerautomaten gibt,
der diese Sprache mit leerem Keller akzeptiert
Durch die Eigenschaft, dass die Sprache L, deterministisch,
kontextfrei ist, weiß ich schon mal,
es gibt ein Kellerautomaten, der das mit Endzustand akzeptiert.
Das ist klar. So sind deterministisch, kontextfreien Sprachen definiert.
Wie sieht das jetzt aus? Jetzt wird gesagt,
wenn sie präfix-frei ist, dann hat das was mit akzeptieren,
mit Lea im Keller zu tun.
So, woran liegt das? Das liegt genau an dem,
was ich eben gesagt habe. Wenn die Sprache präfixfrei ist,
dann weiß ich ja, dass der Automat,
sobald er mal in einem Endzustand war, ich ihn nicht wieder verlassen muss.
Denn die Sprache ist präfixfrei, ein längeres Wort,
das danach folgen könnte, kann gar nicht mehr akzeptiert werden.
Das liegt in der Präfixfreiheit der Sprache selbst. Wenn ich also Folgendes mache,
dass sobald ich früher einen Endzustand hatte und ihn verlassen würde,
alle verlassenen Kanten kann ich jetzt wegschmeißen.
Und stattdessen mache ich eine Kante in einen neuen Zustand und dieser neue Zustand
hat nur noch die Aufgabe, den Keller komplett zu lernen.
Ja, das führt dazu,
sobald ich in einen Endzustand geraten bin vorher,
komme ich jetzt in einen Zustand,
in dem der Keller komplett leer wird
Das heißt, sobald ich eine Präfix-freie Sprache habe, deterministisch,
kontextfrei, dann gibt es ja einen Kellerautomaten dafür in deterministischen.
In diesen kann ich umbauen,
so dass dann ein anderer Kellerautomat draus wird,
der diese Sprache jetzt mit leerem Keller akzeptiert.
Gut, das ist die eine Implikationsrichtung. Präfix-freie Sprache,
dann existiert ein komplett lehrender, deterministischer Kellerautomat.
Die umgekehrte Richtung angenommen, man hat ein deterministischen Kellerautomaten,
der seinen Keller komplett lehrt,
um damit
die Sprache zu akzeptieren
Ja, warum ist die Sprache denn präfixfrei? Nehmen wir an,
er akzeptiert ein Wort weh, dann ist ja der Keller leer.
Dann kann aber auch dieser Automat keine weiteren Bewegungen mehr machen,
denn kein Kellerautomat kann noch irgendein Konfirmationsübergang machen,
sobald sein Keller komplett leer ist,
denn vom Keller muss immer etwas gelesen werden.
Das führt dazu, dass sobald das Wort akzeptiert wird,
kann es kein verlängertes Wort davon geben, dass danach akzeptiert werden könnte.
Das heißt, es wird immer bezüglich der Präfixordnung das kürzeste
Wort akzeptiert und danach nichts mehr. Also wissen wir,
dass die ganze Sprache, die er mit leerem Keller akzeptieren kann,
dass die eine Prefix-Freisprache sein muss.
Wunderbar. Und was haben wir jetzt? Da kamen eine
nette Eigenschaft, die wir aus ableiten können.
Wir können daraus mich ableiten, dass die Prefix-Reihen deterministischen,
kontextfreien Sprachen, also eine Teilmenge der deterministischen kontextfreien Sprachen,
dass die eine echte Teilmenge der deterministisch kontextfreien Sprachen bilden muss.
Woran liegt das? Das liegt daran, dass die sehr einfache Menge A-Stern-B-Stern
Dies deterministisch-Kontext frei. Das liegt daran, dass sie schon regulär ist.
Und deswegen von einem deterministischen, endlichen Automaten akzeptiert wird.
Und das ist nichts weiter eigentlich als ein Kellerautomat,
der eigentlich auf dem Keller nichts Vernünftiges tut,
sondern immer bottom liest und Botton zurückschreibt.
Also mit der Information des Kellers gar nichts anfängt.
Das heißt, diese Sprache wird von einem deterministischen Kellerautomaten akzeptiert.
So, nun ist diese Sprache,
weil sie ja beliebig viele As und Bs hintereinander enthält,
nicht mehr präfixfrei
Denn wir hatten es schon bei einem noch viel spezielleren Fall gesehen.
Da kommen erst paar As und dann paar Bs.
Und wenn es mehr Bs sind, als As,
dann ist es offensichtlich der Teil,
wo es genauso viele As wie Bs gibt, ein Präfix davon.
So. Diese Menge ist also nicht Präfix frei, aber deterministisch kontextfrei ist.
Also ein Beispiel dafür, dass ich eine echte Inklusion habe.
Es gibt also Sprachen, die sind deterministisch kontextfrei,
aber nicht Präfix frei
Das heißt, wir können schon mal hier etwas unterscheiden,
denn da wir wissen,
wir haben jetzt eine echte Teilmenge durch die Prefix-Freiheit.
Wissen wir aber auch, dass das ein Akzeptieren mit leerem Keller
etwas anderes sein muss, als das Akzeptieren mit Endzustand.
Denn nach Definition werden alle deterministisch kontextfreien Sprachen durch einen
deternimistischen Kellerautomaten akzeptiert, durch die Endzustandsdefinition.
So war die Definition. Und jetzt haben wir festgestellt,
wenn das Ganze noch prefixfrei ist,
dann wird es mit leerem Keller akzeptiert.
Das ist genau der Satz oben
Genau die Präfix-freien Sprachen, das sind genau die,
die ich mit leerem Keller akzeptieren kann. Und aus dem Korular
haben wir jetzt gesehen, dass das eine echte Teilmenge ist. Also,
wo wir noch vorher gesehen hatten, bei dem Nicht-Deterministischen,
Automaten, da wussten wir, es ist egal,
ob ich fordere, er soll mit Händzustand akzeptieren oder mit leerem Keller.
Das macht keinen Unterschied bezüglich der erkannten Sprachfamilie.
Da ist das beides mal die Menge der kontextfreien Sprachen.
Hier stellen wir fest, mal ganz flapsig formuliert,
dass das, was ich mit leerem Keller akzeptieren kann,
deterministisch, dass das nicht das Gleiche ist, wie das,
was ich mit Endzustand akzeptieren kann.
Sondern es ist weniger. Mit Lea im Keller kriege ich immer
eine Prefix-freie Sprache und mit Endzustand kriege ich auch einige Sprachen,
die nicht Prefix-frei sind.
Also an dieser Stelle sehen wir schon mal,
dass die Sprachfamilie deterministisch kontextfreien sich anders verhält als die kontextfrei.
Akzeptiere mit Endzustand und akzeptiere mit Lea im Keller,
ist nicht das Gleiche. Schon an dieser Stelle wissen wir also,
dass da wohl ein Unterschied besteht zu der Familie,
der kontextfreien Sprache, wo das das Gleiche ist.
Das heißt, es wird wohl herauskommen,
dass diese Sprachfamilie deterministisch kontextfrei eine echte Teilmenge ist.
Während sie gleich, dann müssten ja die beiden Akzeptierungsbedingungen gleich sein.
So, das kann man jetzt noch weiter rauspräparieren,
indem man sich zum Beispiel Abschlusseigenschaften der deterministisch kontextfreien Sprachen anschaut.
Die erste wichtige Eigenschaft ist, wenn ich eine deterministisch kontextfreie Sprache habe,
und betrachte jetzt den Prefix-freien Anteil, also Min von L.,
denn es ist das auch eine deterministisch kontextfreie Sprache.
Und wie geht das? Das geht sehr einfach.
Im Wesentlichen muss ich ja nur sagen,
ich will nur das bezüglich der Prefix-Sortierung kürzeste Wort akzeptieren.
Das heißt, beim ersten durchlaufenden Endzustand höre ich schlichtweg auf.
Alle kannten die aus Endzuständen rausführten, werden jetzt gestrichen.
Und dann wird eben nur der kürzeste Prefix akzeptiert,
also nur der minimale Anteil
Das klappt gut bei deterministischen Sprachen, wo ja die Konfigurationsfolge
eindeutig bestimmt ist. Was habe ich noch an interessanten Eigenschaften,
die anders ist als bei allgemein kontextfreien Sprachen?
Eine sehr schöne Eigenschaft. Hier vorne ein wenig verklausuliert.
Hier steht, wenn ich die Familie der deterministisch kontextfreien Sprachen
schneide mit der Familie der regulären Sprachen.
Und was soll das heißen? Wenn ich zwei Familien schneiden
möchte, dann kann ich nicht sagen,
ich nehme den Mengenschnitt
Ja, wenn ich da einfach schreiben würde,
L geschnitten mit K, dann gucke ich nach,
welche sind, welche Sprachen sind in beiden Mengen L und K.
Das will ich aber nicht, was ich haben will,
ist, ich möchte mir zwei Sprachen,
L und K nehmen und die miteinander schneiden.
Und alle solche Mengenschnitte möchte ich jetzt in diese Sprachfamilie packen.
Und dafür brauche ich halt ein neues Symbol,
das sagt Komponentenweise schneiden. Und das ist dieses Dreieck.
Heißt ausnahmsweise mal nicht und,
aber soll daran erinnern
Das ist der Schnitt auf Sprachfamilien. Ich nehme also
ein L aus der einen Menge, ein Chaos,
der anderen Menge, bilde da den Mengenschnitt, alles,
was ich so bilden kann, ist jetzt in Kalligrafie-L-Spitzes Dach, Kalligrafie-K.
So, also jeder mit jedem Mengen Schnitt als Operation.
Und was kann ich da jetzt machen,
um zu dem Satz 17.3 zurückzukehren?
Ich kann die Menge der deterministisch kontextfreien Sprachen mit den regulären
schneiden und stelle fest,
da kommt wieder etwas raus,
was deterministisch kontextfrei ist
Gut, also die Familie, der deterministisch kontextfreien Sprachens gegenüber
Durchschnittsbildung abgeschlossen. Das ist nicht so überraschend. Denn die
kontextfreien Sprachen waren auch abgeschlossen gegenüber Schnitt mit regulären Mengen.
Aber, das ist jetzt Folgendes zu beachten,
wenn ich eine kontextfreie Sprache mit einer regulären Menge schneide,
was kommt da raus?
Im Zweifelsfall eine kontextfreie Sprache
Damit ist noch lange nicht klar, dass wenn ich als
Spezialfall einen deterministisch kontextfreie Sprache mit einer regulären Menge schneide,
da weiß ich bislang nur, dass eine kontextfreie Sprache rauskommt.
Ich kann mir aber bislang noch nicht, konnte mir bislang
noch nicht sicher sein, dass sie auch deterministisch sein würde.
Dass sie wieder kontextfrei ist, das wussten wir schon,
denn diese Abschlusseigenschaft galt auch mal für kontextfreie Sprachen.
Aber das deterministisch geschnitten mit regulär wie der deterministisch kontextfrei ergibt,
das ist das Spannende.
Dass es deterministisch bleibt. Und wie man das macht,
das macht man mit einer sogenannten Produktautomatenkonstruktion.
Ich koppel die Übergänge,
die der Kellerautomat macht
Mit den Übergängen, die da endlich Automat macht.
Und nur wenn der eine Automat ein A lesen kann und der andere auch,
nur dann machen die zusammen den Übergang ansonsten nicht.
Und das führt dazu, bei der regulären Menge kann ich ja immer
einen deterministischen Automaten voraussetzen, dass die beide deterministische Übergänge machen.
Das heißt, das Ergebnis ist konsequenterweise ein deterministischer Kellerautomat und deswegen weiß ich,
was rauskommt, ist ein deterministischer Kellerautomat, also das Ganze deterministisch kontextfrei.
So, was wir jetzt noch nachliefern müssen, ist,
dass es tatsächlich Kontext freie Sprachen gibt,
die aber nicht deterministisch kontextfrei sind.
Am meisten geht das, wenn man eine Sprache angeben kann,
die die Eigenschaft hat. Und da ist schon mal eine
relativ handelsübliche Sprache dabei, die wir auch schon kennen.
Das ist die Sprache, die alle Worte enthält,
die Eigenschaft haben, dass sie Palindrome gerade der Länge sind.
Also jetzt kommt das Wort weh und dann das Wort
weh nochmal gespiegelt hinten dran.
Das heißt, von den Enden her gelesen bis zur Mitte
habe ich immer die gleichen Zeichen
Anfang und Ende, zweites und vorletztes, drittes und vorvorletztes immer so weiter.
Bis zur Mitte. Und da das Wort die Länge zweimal
Betrag von W hat, ist das ein Parlindrom gerader Länge.
Es gibt auch ein paar Lindrome, Ungraler Länge, die werden damit nicht betrachtet.
Sondern das Ganze soll ein Wort über dem Alphabet AB sein.
So, dafür kann man leicht eine kontextfreie Grammatik angeben.
Die erzeugt nämlich das letzte A und das letzte,
das erste und das letzte A in der Mitte ein S
und dann wird dieser Baum der Ableitungsbaum mal fortgesetzt,
sodass ich Immer paarig, gleiche Zeichen bis zum Schluss ergeben.
Das heißt, das ist eine sehr einfache Grammatik,
hier nochmal aufgeschrieben, es wird zu ASA, BSB,
also immer in der Mitte wird eingesetzt und ganz zum Schluss darf ich löschen.
Und diese Sprache ist sogar eindeutig. Es gibt nur ein
Ableitungsbaum für jedes Wort. Das liegt daran, dass sich
das Symbol S immer nur durch höchstens ein anderes Nonterminal ersetze.
Ich weiß das immer genau, was da zu tun ist.
Und jetzt überlegen wir uns, wir haben ja jetzt die Abschlusseigenschaften,
Und wir nehmen mal hypothetisch an, dass diese Sprache der Palindrome deterministisch kontextfrei wäre.
Was würde denn folgen mit der Abschlusseigenschaft gegenüber Schnitt mit regulären Mengen, wüssten wir?
Wie immer man da jetzt auch drauf kommen mag,
das sei mal dahingestellt,
dass die Sprache der Palindrome geschnitten mit diesem Klopper hier,
was eine reguläre Menge ist, ist ein regulärer Ausdruck.
Was da rauskommt, ist nach Abschlusseigenschaft eine deterministisch kontextfreie Sprache.
Das wissen wir schon mal.
Also K ist deterministisch kontextfrei
Was man da macht, ist, ja, da bleibt tatsächlich was über.
Also man fängt an mit A, B,
Plus und hier hinten hat man das rückwärts BA Plus,
also hier vorne mindestens eine A-B-Folge und hier auch was passendes.
BA-Folgen, A-B-Folgen, so, wunderbar.
Da kann ich mir ein paar Lindromen draus bauen.
Und hier ganz genauso nur Stern und Plus vertauscht,
also hier mindestens ein BA und ein A-B. Also hier zwinge ich letztendlich,
dass es mit A,
B anfängt und mit BA aufhört und hier erzwinge ich das
in der Mitte B-A-A-B steht.
So ganz grob
So diese Sprache, Karls, also deterministisch, kontextfrei.
Und wir wissen eine solche Sprache, die hat die Eigenschaft,
dass auch der Präfix-freie Anteil davon kontextfrei ist.
Haben wir auch gerade gehabt als Satz. Das heißt,
auch Minimum von K wäre jetzt deterministisch kontextfrei.
Und durch einfache, mehrstündige Überlegungen kann man dann feststellen,
dass diese Sprache Minimum vom K genau die Eigenschaft hat,
dass hier vorne ein AB-Block kommen muss.
Klar, ich schneide das mit sowas und dann kommt BA, AB.
Das ist also genau eine solche Form, das ist logisch.
Aber bei den Exponenten weiß ich auch,
dass hier M mal das Ganze kommen muss und an mir
Hinterem Ende auch. Und in der Mitte kommt das jeweils N-Mahl.
Und dann das Ganze, weil es Prefix frei ist,
kommt jetzt noch die Zusatzeigenschaft hinzu, dass N,
kleiner gleich M sein muss.
So. Diese Sprache kommt da jetzt raus. Und von dieser Sprache,
da wirft man jetzt das UVW XY-Theorie an und zeigt,
dass sie nicht mal mehr Kontext frei ist.
Dabei müsste sie sogar deterministisch kontextfrei sein. Aber wenn sie
nicht kontextfrei ist, ist sie erst recht nicht deterministisch kontextfrei.
Also schließen wir jetzt rückwärts, wo war der Fehler?
Aha, Palindrom ist nicht deterministisch kontextfrei
Gut. Ja. Und zwar ist doch eigentlich auch,
der kann extra dramatikundische Schnitten mit regulären Grammatiken selber und den Kontext von Grammatiken.
Also nicht bei den Grammatiken bei den Sprachen, ne?
Jetzt haben wir aber doch gerade, dass,
aber die Kalibrome sind ja die Kontext bei, ja,
Grammatik, Kontext bei den Sprachen.
Ja? Und bei Medias mit der regulären Sprache schneiden.
Da müsste doch eigentlich trotzdem die Termine, die kann der zweite Schlagzeug.
Ja, das ist auch richtig. Das ist auch nicht
das Problem. Achso, dann wirst du an.
Und wo ist dann das Problem? Jemand eine Ahnung?
Es liegt am Min. Ja, denn Minimum,
also Prefix freimachen ist bei, wir wissen ja,
wenn Palindrom ist Kontext freigeschnitten mit einer regulären Menge,
da kommt zumindest was Kontextfreies raus.
Aber Prefix freimachen davon
Das ist nur dann wieder deterministisch kontextfrei,
wenn ich auf was deterministisch kontextfreies reinstecke.
Bei der kontextfreien Sprache selbst kommt offensichtlich etwas raus,
was nicht unbedingt mehr kontextfrei sein muss.
Also das Minimum sehen wir ja auch gleich mit.
Offensichtlich keine Abschlusseigenschaft auf der Klasse der kontextfreien Sprachen selbst.
Da hakt das. Also wir nutzen hier eben noch die
Abschlusseigenschaften von Min auf, die nur auf dieser Familie wird.
Was können wir noch machen? Etwas,
das wir bei den kontextfreien Sprachen nicht konnten.
Wir hatten mal gesehen, Komplimentbildung und Durchschnitt sind bei kontextfreien Sprachen keine Abschlusseigenschaft.
Aber bei den deterministisch-kontextfreien Sprachen ist das so.
Das macht sie ganz interessant. Das ist eine Teilmenge,
bei denen die Abschlusseigenschaft gilt. Das heißt,
wenn ich eine deterministische Sprache L habe,
dann gilt auch, dass ihr Kompliment quer,
dass auch das wieder eine deterministisch-kontextfreie Sprache ist.
Bei endlichen Automaten konnte man das ganz einfach zeigen.
Wir haben
den Automaten deterministisch gemacht
Vollständig und mussten dann nur noch Endzustände und Nicht-Endzustände in ihren
Rollen vertauschen. Also alles, was in Endzustand war,
wurde ein normaler Zustand und die Nicht-Endzustände wurden plötzlich zu Endzuständen.
Das klappt hier nicht, weil es verschiedene Gründe für akzeptieren bzw. nicht akzeptieren gibt.
Nämlich etwas, was ich nicht ausschließen kann,
die Rechnung bricht irgendwann ab, weil der Keller leer ist.
Dann geht es nicht weiter. Dann könnte ich vielleicht von
der Eingabe was lesen oder müsste noch was lesen.
Aber da kann ich nicht weitermachen, weil der Keller leer ist.
Und das kann ich auch nicht so einfach voraussehen
Zweitens, das ganze Ding ist nicht vollständig, das heißt,
es gibt keine Nachfolgekonfiguration. Das ist auch ein Problem. Ja,
dann heißt mir mich nicht Endzustand oder Endkonfiguration nicht mehr das Gleiche wie beim Kompliment Endkonfiguration.
Oder drittens, noch problematischer, wir geraten eine Endlosschleife.
Wie kann das denn sein? Ja, das kann deswegen passieren,
weil der Kellerautomat ja von der Eingabe nichts lesen muss.
Da verändert er aber den Keller. Aber wenn der irgendwo in einem Bereich gefangen ist,
wo er im Preis läuft und auf dem Keller ein A durch ein B setzt ein B durch einen C,
ein D durch ein A und dabei nichts vom Keller liest,
dann ist er nur noch damit beschäftigt,
den Keller irgendwie umzuschaufeln, immer das oberste Symbol zu fairieren,
aber passieren tut er nichts mehr.
Wir haben Ton, toll. Ja, das heißt,
Endlosschleifen sind eine Möglichkeit, die es hier jetzt erstmals gibt,
das kann beim regulären,
bei regulären Sprachen
so nicht passieren
Also klar gibt es da auch Y-Übergänge,
aber die kriegte man ja durch allerlei um Konkonfigurationen,
um Schreiben immer zu einem Deterministischen Automaten.
Und der hat keine Endplosschleifen, die er läuft,
weil der immer ein Zeichen liest.
Aber hier kann das passieren. Und wenn wir das verbieten
würden, dann würden wir auch eine kleinere Sprachklasse kommen.
Oder auch nicht allzu schön eine Erfolgsrechnung,
aber der Kellautomat geht beim Lesen immer durch Endzustand,
nicht Endzustand, nicht Endzustand.
So, ohne das genau jetzt machen zu wollen,
was kann man da tun,
wie kann man
das reparieren
Der erste Problem, dass ich nicht mehr weiß,
was ich tun soll, ist relativ einfach.
Also wenn der Keller leer ist, ich schiebe einfach mal,
das hatten wir schon mal als Idee gehabt,
ein frisches Keller-Symboden-Bodensymbol, ganz nach unten.
Und wenn der alte Automat den Keller leer gemacht hätte,
dann findet der Neuautomater wenigstens ein Symbol vor und kann da noch was tun.
So, das erste. Wenn ich das Problem habe,
es gibt keine Nachfolgekonfiguration, dann können wir sowas machen wie eine neue Senke.
Und mit dieser Senke kann man dann arbeiten,
da gibt es dann Nachfolgekonfrontation.
Problematischer. Ich laufe in der Schleife. Eine Endlosschleife kommt
noch nicht raus. Und der schlimmere Fall,
A ist in der Epsilon-Schleife, wird der Keller nie kürzer.
Das heißt, er bleibt immer gleich lang,
aber es kommt ein Endzustand in dieser Schleife vor.
Wenn ich das feststelle, da kann ich einen Trick machen,
ich füge mir einen neuen Endzustand in das ganze System.
Und was mache ich dorthin, springe ich jetzt?
Und beginne dann den Keller zu leeren. Das heißt,
der Alte, der akzeptiert hätte, Der springt jetzt in einen richtigen Endzustand raus,
geht nicht mehr in dieser Endlosschleife und ist stattdessen in einen frischen Endzustand.
Akzeptiert also auch, macht das aber ohne im Kreis zu laufen. So,
und falls die Konfirmation, mit der ich starte,
eine Endlosschleife beginnen lässt, in der nie ein Endzustand vorkommt,
da kann ich eigentlich auch rausspringen und leer den Keller,
aber gehe dann eben nicht in einen Endzustand.
Habe ich auch nichts geändert. Also die Endlosschleifen kriege ich
auch weg
Und was endlos schleifen sind,
das kriege ich einfach dadurch raus, dass ich nachschaue,
welche Y-Kantenzüge ergeben sich als Kreisläufe in meinem Zustandsdiagramm.
Das kann ich also tatsächlich statisch überprüfen an der Spezifikation des Kellerautomat.
Und der Fall viertens, das Hin und Her machen,
das sparen wir uns mal in dieser Vorlesung. Insgesamt halten wir also fest,
wir kriegen mit diesen Konfigurationsschritten einen deterministischen Kellerautomaten hin,
der die Eigenschaft hat, bei Konfigurationen immer das ganze Wort durchzulesen,
Und dann kommt er entweder in einen Endzustand oder nicht.
Und dann muss ich nur noch die Eigenschaft Endzustand einmal umtauschen.
Und dann macht er die gleiche Konfigurationsfolge im Wesentlichen und genau mit komplementärer Akzeptanz.
Also wird das Kompliment auch deterministisch erkannt. Und deswegen ist Komplimentbildung
eine Abschlusseigenschaft. So, warum ist diese Sprache interessant?
Naja, sie hat ein paar andere Eigenschaften.
Das ist schon mal interessant an sich. Aber sie ist
auch von praktischer Relevanz. Denn wir hatten ja gesehen,
dass für den Compiler-Baus wichtig war,
dass Sprachen eindeutig sind
Zur Erinnerung, eine kontextfreie Sprache heißt eindeutig,
wenn es mindestens eine Grammatik dafür gibt, die eindeutig ist.
Und eine Grammatik war eindeutig, wenn sie die Eigenschaft hatte,
dass jedes Wort der Sprache nur von genau einem Ableitungsbaum erzeugt wird.
Das ist deswegen wichtig für den Compilerbau,
weil die Semantik eines Ausdrucks sich dadurch ergibt,
dass man sich anschaut, wie hätte dieser Ausdruck abgeleitet werden können.
Der Compiler versucht also im Hintergrund den Ableitungsbaum zu konstruieren,
So wie wir für die Logik beispielsweise,
die einen Thermaufbau von Formeln bestimmt haben, so einen Thermbaum.
Genau diese Eigenschaft, dass wir da dann verschiedene Sachen wie Evaluation,
Auswertung gut machen konnten auf diesen Thermenbäumen oder Quantoren, Bindungsskopus, all das.
Das macht auch ein Compiler, der versucht jetzt herauszufinden,
wie sieht das Gerüst aus eines Therms oder des ganzen Programms
und legt diese Mantik des gesamten Programms anhand dieses Baums fest.
Und natürlich ist es wichtig,
dass es zu jedem Programm nur einen Baum gibt,
damit die Bedeutung des Programms eindeutig ist,
wenn es zwei Bäume gäbe, hätte ich genau das Problem,
dass vielleicht dieser Ausdruck zwei verschiedene Abläufe beschreiben könnte.
Einen Ablauf, der aus dem ersten Baum generiert wird.
Und eine andere Bedeutung, die vielleicht ganz anders ist,
die sich aus dem zweiten Baum ergibt.
Deswegen ist es so wichtig, dass eine Grammatik eindeutig ist,
wenn sie einen Compiler zugrunde liegen soll.
So, und wir hatten gesehen, Eindeutigkeit ist nicht immer möglich.
Es gibt kontextfreie Sprachen, die von keiner kontextfreien Grammatik eindeutig erkannt werden.
Diese Sprachen hatten wir innerent mehr deutlich genannt.
Es gibt keine passende Grammatik
Und für uns ist jetzt interessant, dass bei
deterministisch kontextfreien Sprachen dieses Problem nicht auftritt. Das weiß,
wenn ich von vornherein eine Programmiersprache betrachte, die deterministisch kontextfrei ist,
dann stellt sich das Problem der Eindeutigkeit gar nicht mehr.
Muss ich nicht mehr drüber nachdenken. Das kann der Rechner
für mich machen. Und die Zutaten,
warum das eindeutig ist, die haben wir alle schon da.
Angenommen, wir haben eine Sprache, deterministisch kontextfrei.
Was mache ich dann? Ich packe jetzt neues Symbol dahinter
. Also ein C im Strich durch, ist einfach
nur ein frisches Symbol
Dieses frische Symbol sorgt dafür, dass die Sprache jetzt nicht nur deterministisch,
sondern sogar prefixfrei ist. Weil das Symbol frisch ist,
kommt es immer genau am Ende vor. Das heißt,
es gibt kein kürzeres Wort, das erkannt werden kann,
dem würde ja dieses neue Cent-Zeichen fehlen.
Diese Sprache wird jetzt, wir wissen das,
beterministisch kontextfrei und prefixfrei, das ist eine Sprache,
für die muss es einen deterministischen Kellerautomaten geben,
denn diese Sprache jetzt mit leerem Keller akzeptiert, hatten wir gesehen.
Das ist genau die Sprachfamilie ist, die von Kellerlehrenden DPDAs erkannt wird.
Sowas können wir jetzt machen. Wir hatten vor einigen Wochen
gesehen, wann immer ich eine Sprache habe,
die mit Lea im Keller erkannt wird.
Dann konnte ich mit der Triebelkonstruktion eine Grammatik erzeugen,
die die gleiche Sprache spricht. Also die gleiche Menge von Worten
erzeugen kann. Aha, hier ist der erste Punkt.
Ich kriege also hier eine Korrespondenz von Grammatik und Kellerautomat.
Sowas gibt es jetzt noch. Ich weiß ja,
es ist ein deterministischer Automat
Dessen Rechnung, also Konfirmationsübergänge, sind eindeutig. Wenn ich jetzt das übersetze,
will ich hier bei der Grammatik mal nachschauen und stelle fest,
wenn die Übergänge zwischen den Konfirmationen eindeutig sind,
führt das bei der Grammatik dazu,
dass die Linksableitung auch eindeutig ist.
Und wenn das Wort W-Cent akzeptiert ist,
also in dieser Sprache vorkommt, dann gibt es genau eine Erfolgsrechnung.
Das heißt, für die Grammatik nichts anderes,
als es gibt genau einen Ableitungsbaum
Genau eine Linksableitung, was inhaltlich das Gleiche ist. Das heißt,
für dieses Wort gibt es genau einen Ableitungsbaum. Für wen mit einem Endsymbol? So,
und da die Grammatik für diese Sprache mit dem Cent hinten eindeutig ist,
weiß ich, wenn ich das wieder streichen würde,
es kann ja höchstens einmal erzeugt werden,
wenn ich das also weglasse, wird es eben nicht erzeugt,
dann kriege ich eine Garmathe-G-Strich,
die dann auch eindeutig ist.
Wenn man das Wort W-Dollar eindeutig erzeugt werden kann und
nicht einfach auf das Vezent eindeutig erzeugt werden kann,
dann wird auch das Wort
Eindeutig erzeugt, wenn ich in der Grammatik einfach alle Cent-Zeichen wegstreiche.
So, das führt dazu, dass ich jetzt gegeben
eine deterministisch kontextfreie Sprache L immer eine Grammatik erzeugen kann,
die für jedes Wort der Sprache einen eindeutigen Ableitungsbaum hat.
Sogar ein algorithmisches Verfahren, um diese Grammatik zu erzeugen.
Das ist erst mal ganz nett, aber wenn man genau
drüber nachdenkt, hilft uns das überhaupt nicht weiter.
Warum? Ja, Programmiersprachen werden seltenst dadurch spezifiziert,
dass man einen deterministischen Kellerautomaten vorgibt und dann die Grammatik dafür erzeugt.
Ja, das ist äußerst unüblich. Eigentlich ist es eher andersrum.
Also man interessiert sich eigentlich dafür eindeutige Grammatiken zu haben.
So ein eindeutige Grammatiken. Ja, wissen wir jetzt,
wenn wir eine Sprache mit dem Kellerautomaten deterministisch erkennen, dann ist sie eindeutig.
Super. Umgekehrt wäre aber praktischer. Wir möchten eigentlich eher
die Grammatik vorgeben und hätten dann die Programmiersprache daraus abgeleitet.
Und jetzt hätten wir gerne dass die Grammatik von einem Typus ist,
bei dem ich leicht erkennen kann, aha, ist eindeutig.
Dass ich also hinterher nicht mehr fragen muss,
bist du eindeutig ja oder nein, sondern wenn ich diese Spezialgrammatik nehme,
dann kommt immer eine eindeutige Grammatik raus.
Also eine Unterklasse interessiert uns. Also die Frage,
gibt es einen Grammatiktypus, der die Eigenschaft hat?
Dass alle Grammatiken dieser Unterklasse immer eindeutig sind.
Und dass man zu denen auch immer diese Sprache parsenden,
deterministischen Kellerautomaten konstruieren kann.
Und es wäre auch ganz nett, wenn man
das schnell machen kann
Also wir suchen also eine Klasse von Grammatiken,
die eindeutig sind und das Parsing über den Kellerautomaten noch flott geht.
Gibt es solche? Ist ja noch nicht klar.
Wenn ich schon so frage, lautet die Antwort wohl,
ja, das muss wohl gehen.
Und diese Grammatiken, das sind die sogenannten LRK-Grammatiken.
Das sind Grammatiken, die sich von links nach rechts durcharbeiten.
Und dabei gewissermaßen K-Zeichen nach vorne luschern. Also die gucken
so ein bisschen, was sind die nächsten Zeichen,
die ich demnächst zu Parsen hätte.
So ein Fenster habe ich von K-Zeichen
Und stell dann fest, aha, dann muss ich jetzt diese und
jene Ableitung machen. Gucken wir uns das mal an.
Erstmal gucken wir mal, was macht so ein Compiler eigentlich?
Der hat so verschiedene Aktivitäten. Irgendwelche Zeichen,
hier steht das IFE, kleiner gleich N, wenn A,
wird geteilt durch iPlus 1 und so weiter und so fort.
Wenn ich einen Compiler in der Frühphase betrachte,
was macht er, macht eine lexikalische Analyse, zerlegt also,
das sind diese Trendstiche, Erst mal in kleinste Einheiten.
Und er stellt dann fest, die kleinste Einheit,
die er am Anfang findet, ist das If.
Ja, es sind zwar zwei Eski-Zeichen, ja,
aber nach der ersten lexikalischen Analyse wird daraus ein einziges Symbol gemacht, das If-Symbol.
Und aus I wird dann ein Symbol gemacht, ja,
dass mich dafür steht, es muss wohl irgendwie ein Bezeichner sein.
Kleiner, gleiches Einbezeichner. Das heißt, diese Trennung erfolgt,
dass er feststellen kann, okay, was sind jetzt zusammengehörige Zeichen?
Auf gut Deutsch, er kommt nicht auf den Gedanken,
kleiner ist ein, eine syntaktische Einheit und Gleiches.
Eine syntaktische Einheit, sondern er kennt,
so schlau ist er in dieser Frühphase,
kleiner gleich,
ist ein einziges etwas
Und das, was er da erzeugt,
sind sogenannte Token und diese Token sind dann gewissermaßen die Sachen,
mit denen man arbeiten möchte, jenseits der Repräsentation in der Textdatei.
Gut, das wird dann der nächsten Phase überbracht,
nämlich der syntaktischen Analyse. Da versucht man jetzt,
die einzelnen Programmzuweisungen, also beispielsweise IWITI plus 1,
das versucht man jetzt zu einem Ableitungsbaum umzuformen.
Und da sieht man,
aha, das Ganze ist ein Statement von der Form Variable
Bekommt eine Zuweisung auf der rechten Seite, steht da ein Ausdruck.
Ein Variable ist ein Identifier, der heißt irgendwie, nämlich I.
Und die Simple Expression ist eine Summe aus zwei Thermen und
so weiter und so fort. Das heißt, ein wichtiger Schritt,
nicht der einzige ist, diese synsaktischen Ablauf zu machen.
Was dabei zum Beispiel noch nicht gemacht wird, ist festzustellen,
ob das überhaupt sinnvoll ist, was da steht.
Wenn nämlich I zum Beispiel ein String ist,
dann ist I plus 1 kein sonderlich sinnvoller Ausdruck
Denn addieren plus eins auf Strings ist eben nicht definiert.
Das kann ich aber an dieser Stelle noch nicht feststellen.
Dein E ist erst mal ein Bezeichner. Und
das Typsystem steht uns in dieser Parsing-Frühphase nicht zur Verfügung.
Das hat Effizienzgründe. Ja, ich kann leider nicht
darauf zurückgreifen, welchen Typ Eigenschaft das Ganze hat.
Das kann ich kontextfrei nicht machen. Nur mit Tricks.
Deswegen macht man das typischerweise danach. Das heißt,
nach der syntaktischen Analyse, wo der Baum aufgebaut wird,
machen wir noch eine semantische Analyse
Da versuchen wir verschiedene Vereinfachungen zu treffen,
also den Aufbau ein bisschen zu verbessern, der Codebäume.
Wir versuchen auch vielleicht so ein bisschen, Typisierung auszunutzen.
Da bekommen wir letztendlich einen abstrakteren Syntaxbaum mit einer etwas verkürzteren Darstellung.
Und da gibt es auch Möglichkeiten der Normalisierung, denn ich weiß,
ip plus eins oder eins plus i, das kupfig gesprungen.
Und wenn mir das hilft,
nachher für die späteren Codeoptimierungsphasen, dass ich immer weiß,
wenn, dann wird es als iplus eins geschrieben,
dann kann ich alle,
die ja nicht so sind,
einfach umformen
Also 1 plus Evil, zu ePlus 1. So,
und jetzt interessiert uns, wie mache ich das Ganze?
Also Phase 4, Code-Optimierung, statt plus 1 kann ich noch Increment machen, ja.
Ich kann auch Laufschleifen-Optimierung machen. Mittlerweile gibt es auch Jump-Prediction
. Mittlerweile machen CPUs John Jump-Prediction, also kleine Exkurs.
Was immer teuer ist bei Abläufen auf der Semler-Ebene,
sind die Sprünge. Warum? Weil es relativ aufwendig ist,
Programm-Code aus dem Hauptspeicher zu laden, der Bus,
über den das Ganze rüber muss, ist verglichen mit dem,
was der Prozessor versucht, arbeiten kann, sehr, sehr langsam.
Also das Nachladen von Code aufwendig. Da man das weiß,
gibt es da einen gewissen Cash. Also eine Menge Speicher,
die dafür sorgt, ich halte mir mal Code,
von dem ich glaube, dass ich ihn demnächst ausführen könnte.
Da wird schon mal vorrätig gehalten. Das klappt auch gut,
solange man immer brav Assembler-Stückchen, Zeile für Zeile abarbeitet, also nacheinander folgen.
Jetzt steht da dummerweise ein Jump-If-Zero-Befehl dazwischen, also Springe,
sobald irgendein Register Null ist. Ich weiß das nicht,
aber ich weiß, wenn ich springen muss,
springe ich im Zweifelsfall ganz weit weg und ich habe nichts mehr im Cash drin,
Dass der Kot wäre, müsste also Kot nachladen.
Und aus diesem Grund versucht, nicht nur ein Compiler,
die Compiler versuchen das auch, Kot so zu gestalten,
dass die Sprünge möglichst kurz sind,
damit vielen den Cashpack in einfachen Fällen versucht,
mittlerweile sogar die CPU zu raten, was in den Cash muss,
also wie wahrscheinlich es ist, dass ein Sprung null ist.
Da versucht er ja mit Heuristiken zu raten, wie wahrscheinlich
es ist, dass er jetzt springen muss oder nicht.
Das ist gewissermaßen so der Stand der Kunst,
auf den man sich gerade bewegt.
Wir machen das Ganze jetzt
ein bisschen einfacher
Wir wollen jetzt nur uns ganz grob überlegen,
ohne zu sehr ins Detail zu gehen,
was muss ich machen, wenn ich einfache ausdrücke,
in diesem Fall nur mit Plus und Mal, parsen möchte.
Klar, man kommt auch noch vor.
Ja, dann habe ich folgende Darstellung. Ich sage,
ein Ausdruck ist ein Ausdruck plus einem Therm oder gleichen Therm.
Ein Therm ist irgendwie ein Therm multipliziert mit einem Faktor oder gleichen Faktor.
Ein Faktor ist entweder eine Variable oder ein geklammerter Ausdruck.
Ja, damit kann ich geklammerte Plus und Malausdrücke herstellen.
Also nichts weltbewegendes, aber wie wird sowas
jetzt gepasst
Dass die Hauptherausforderung zu wissen, wann welche Regeln angewendet werden soll.
Und das anhand von der Eingabe. Und im Prinzip
genau auf dieses Problem sind die LRK-Grammatiken zurechtgeschnitten worden.
Was habe ich nämlich? Ich habe ein Beispielprogramm, iPlus i mal i.
Das will ich jetzt lesen und ich starte da.
Und ich muss jetzt raten, wann ich welche Ableitungsschritte nachzuvollziehen habe.
Und wir machen jetzt eine LR,
Left-to-Ride-Analyse mit dem Parameter K gleich 1. Das heißt,
ich habe ein Look Ahead
Also ein Vorschau-Symbol in der Mitte und Spalte. Und dann
habe ich noch einen Kellerbodeninhalt. Und Kellerboden zu lesen,
Eingabe ganz vorne und Vorausschau soll jetzt reichen,
um das Ganze zu passen. Gut, erster Schritt,
wir starten. Da kann ich noch nicht viel machen.
Jetzt produziere ich mir ein Vorschau-Symbol. Aha,
jetzt weiß ich, da ist ein I in der Vorschau,
jetzt kommt ein Plus, weiß ich immer noch nicht,
was ich tun soll.
Schiebe ich also nochmal weiter. Jetzt habe ich
Plus und Is auf dem Keller, aha, Plus.
Bei Plus weiß ich ja so ein bisschen,
ich das sehe und ich, worauf kann das nur passen?
Da oben muss das irgendwas zu tun haben. Da muss
das herkommen. Aber ein I kann nur hierher kommen.
Ja, das sind so zwei Informationen. Ich muss da
oben hin zu einer Ableitung, eh wird zu irgendwas.
Und gerade habe ich ein I am Wickel. So,
wenn ich ein I am Wickel habe, kommt jetzt der spannende Schritt.
Diese letzte Regel, F wird zu I, die wende ich jetzt an.
Ich mache also eine Reduktion und habe jetzt das F auf
dem Keller. So, das heißt, dadurch,
dass jetzt was auf dem Keller steht,
weiß ich schon,
ich habe beim Parsing
eine Regel angewandt
Und dann geht das weiter. Ich habe jetzt ein Plus,
ein F und jetzt kommt noch ein E-Mail-I,
aber das weiß ich noch nicht nicht, aber ich weiß,
dass es Plus ist immer noch da.
Aber ich bin schon ja beim F. Und da will ich
oben hin, jetzt steht hier das F, naja,
da muss wohl vermutlich ein Tee kommen.
Dann mache ich diesen Übergang, habe ich immer noch T plus.
So. Und was musste dann eigentlich kommen? Ja,
dann müsste ich feststellen, es steht immer noch das Plus
da als Information. Ich habe jetzt hier gerade einen Tee,
damit ich an das Plus komme,
dann muss ich jetzt zum E hoch
Und das mache ich auch. Und dann geht das immer so weiter.
Man sieht, jetzt habe ich das E, das Plus,
das kann ich jetzt noch anwenden und schiebt das hier rüber.
Und so wächst das immer fleißig, bis die gesamte Eingabe gepasst wurde.
Und entsteht hier ganz viel. Und das kann ich jetzt
vom Keller wieder abarbeiten, um dort meine syntaktischen Ableitungsschritte zu machen.
Das heißt, so ganz grob wissen wir jetzt,
das ist Look Ahead Parsing, auf dem Keller mache ich die Ableitung.
Und das glauben wir jetzt einfach mal.
Die Information des Look Aheads reicht mir jetzt aus für viele
praktische Programmiersprachen
Zu erkennen, was ich als nächsten Ableitungsschritt machen muss.
Es gibt noch eine ganze Menge andere Gründe,
warum ich LR-Pasing benutzen sollte. Der erste Grund ist,
jede deterministisch-Kontext freie Sprache kann ich so analysieren.
Also es geht erstmal. Ich kriege die gesamte Klasse,
der deterministisch-Kontext freien Sprachen. Okay, der zweite Punkt ist
fast noch wichtiger. Es geht effizient. Das Pasing ist
nicht exponentiell, sondern bitteschön in Polynomzeit.
Das wäre ganz nett.
Kleines Polynom
Zweitens habe ich die Möglichkeit, Fehler zu erkennen in der Syntax und das so früh wie möglich.
Also bei nicht korrekten Programmen auch eine Rückmeldung zu liefern.
Das hat dazu geführt, dass es praktisch sehr verbreitet ist,
also Compiler, Compiler, Generatoren für Compiler, bieten,
an Verfahren zu erzeugen, aus einer Grammatik,
DLR ist, einen solchen Paser zu generieren.
Und wenn man eine Grammatik eingibt, schon mal zu überprüfen,
ob man tatsächlich eine LR-Grammatik auch erzeugt hat,
Also es gibt auch Verfahren, um einer Grammatik anzusehen,
ob sie eine LR-Kargrammatik ist oder nicht.
Und es gibt sogar Hilfestellungen aus Grammatiken, LRK-Grammatiken zu machen.
Und das hat dazu geführt, dass eigentlich das Standardverfahren ist,
um Programmsyntax zu analysieren. Man kennt da eine ganze Menge Ergebnisse,
eins hatte ich schon gesagt, alle LRK-Grammatiken haben die Eigenschaft,
sie sind eindeutig.
Es ist also gewährleistet, dass wenn ich eine Ableitung erkenne,
dann mache ich das auf genau eine Art und Weise
Die zweite Sache ist, man kann dieses K noch ein bisschen genauer fassen.
Das steht in diesem grünen Kasten, zumindest bei mir grün.
L ist präfixfrei deterministisch, wissen wir ja, genau dann,
wenn es von einem Kellerautomaten deterministisch mit leerem Keller erkannt wird.
Und das ist genau dann der Fall,
wenn das Ganze für eine LR-0-Grammatik erzeugt.
Von einer LR-0-Grammatik erzeugt werden kann. Also wenn ich
gar kein Look Ahead verwende,
dann erzeuge ich immer präfixfreie
deterministisch kontextfreie Sprache
Also eine echte Teilmenge. So, und die nächste Aussage ist,
angenommen, ich habe eine deterministisch kontextfreie Sprache,
die nicht präfixfrei ist, dann gilt,
es gibt eine LER1-Grammatik, die diese Sprache erzeugt.
Und die nächste Aussage ist, ein bisschen überraschend,
es gibt auch eine LRK-Grammatik für jedes beliebige Card, die das erzeugt.
So, da LRK-Grammatiken nur deterministisch kontextfreie Sprachen erzeugen,
heißt das, dass es erstmal aus theoretischer Sicht ab eins
gar keinen Unterschied mehr gibt.
Mit LR1 kann ich bereits
jede deterministisch kontextfreie Sprache erkennen
Die höheren Casts geben mir keine Sprachen, die irgendwie anders wären.
Mehr entzu. Das ist erstmal erstaunlich. Was heißt das im Umkehrschluss wohl?
Naja, das wird wohl von praktischer Relevant sein. Das heißt wohl,
das ist viele Programmiersprachen gibt, wenn man das nochmal anguckt,
bei denen es vielleicht in der LR15 oder so Grammatik schön kompakt,
aber eine LR12-Grammatik gibt es zwar, die das gleiche kann,
ist aber riesig groß.
So, von Theoretiker ist ja jetzt nicht die Frage,
wie groß ist die Grammatik in Anzahl der Regeln für
einen Praktiker schon
Und da es nicht so aufwendig ist,
den Looker-Head ein wenig größer zu machen,
da für eine sehr schön kleine Grammatik ist,
weggt man aus praktischen Gründen immer die Größe des Beobachtungsfensters,
das K, gegen die Anzahl der Regeln ab.
Man versucht man natürlich wenig in die Zukunft schauen
zu müssen und wenig Regeln irgendwie speichern zu müssen.
So, und irgendwo da liegt ein praktisches Optimum im Zweifelsfall.
Theoretisch gesehen ist es egal, für den Theoretiker reicht LR1 bereits aus,
für K größer, eins kommt nichts Neues hinzu.
Witzig ist aber, Es ist tatsächlich so,
dass diese Grammatiken tatsächlich mit dem K sinnvoll definiert sind.
Es gibt immer eine Grammatik, die für ein größeres K
nicht mehr eine Grammatik ist, für K-minus 1.
Also eine LRK-Grammatik existiert, die nicht LRK minus 1-Grammatik ist.
Also so taktisch macht das schon einen Unterschied. Es ist nicht so,
dass alle Grammatiken irgendwie ab einem gewissen Ende nur noch LRN-Grammatiken wären,
nein, ab einem K. Es gibt kein K,
wo da nicht irgendwie nochmal eine neue Grammatik hinzukäme.
Nur, es kommen keine neuen Sprachen hinzu,
das sind alles literministisch kontextfreie Sprache
So, gibt es denn noch mehr als die terministisch kontextfreie Sprache?
Aber sicher. Dann nehmen wir mal gleich
die allgemeinst möglichste Variante, Typ Nullgrammatik nach Romski.
Die funktionieren fast genauso wie kontextfreie Sprachen,
wenn man erstmal anguckt, was ich habe zur Verfügung.
Ich habe mich wieder ein Alphabet, endlich, das sind die Terminale.
Und ich habe wieder einen dazu des Jungtes, Alphabet,
der endliche Menge von Non-Terminalen.
Super. Und hier unten, ich habe auch immer
ein Startsymbol S. Also bis hier
noch keinen Unterschied
Muss ich also irgendwie bei den Produktionen um den Unterschied handeln? Ja,
das ist auch,
ich habe wieder eine endliche Menge von Produktionen,
aber der Unterschied ist jetzt, wobei Kontext freien,
auf der linken Seite mal genau ein Non-Terminal stand,
darf jetzt auf der linken Seite irgendwie eine Sequenz stehen.
Das heißt, hier darf neben dem Non-Terminal N irgendwie noch
was Beliebiges stehen und rechts davon auch.
Und die Idee ist, dass man diese Produktion,
diese Regel nur dann anwenden darf,
wenn links und rechts
das Geeignete steht
Bei Kontext Freien war egal, was da stand, da hat man einfach,
sobald man das Non-Terminal gefunden hat, einfach ersetzt irgendwie.
Jetzt müssen wir bei Typ Nullgrammatiken gucken,
was steht denn da links und rechts noch davon?
Die Konventionen sind genauso über kontextfreien Sprachen.
Wir nehmen typischerweise Großbuchstaben für Non-Terminale und Kleinbuchstaben für Terminale.
Und Produktionen schreiben wir lieber mit dem Pfeil-Symbol, anstatt als Paar.
Alternativen, wenn man senkrechten Strich abgekürzt, hat sich auch
nicht geändert. Und wenn wir diese Konventionen einhalten,
Und ess immer unser Staatssymbol ist,
dann ist es eine Grammatik vollständig, dadurch spezifiziert,
dass wir nur die Produktionen angeben, dann wissen wir ja,
Kleinbuchstaben sind Terminale, Großbuchstaben sind Non-Terminale.
Jetzt müssen wir noch definieren, was eine Ableitung ist.
Das ist fast genauso wie vorher, eine Ableitung,
ergibt sich dadurch, dass ich irgendwas durch was anderes ersetze,
wenn die Regel das erlaubt.
So, nur dass irgendwas und das Erlauben hat sich ein bisschen geändert.
Also, wir machen wieder, U leitet ab nach V.
In einem Ableitungsschritt. So,
was muss da jetzt gelten
Er muss gelten, dass UU sich zerlegen lässt in U1,
ein Wort wie L-Elfe links und U2. U1 und U2 lasse ich so.
Und WL passt zufälligerweise genau auf eine Produktion wie L wird so wie er.
Also die linke Seite der Produktion wird zur rechten Seite.
Und in V lasse ich den Kontext U1,
U2 stehen und ersetzt WL durch VR.
Von der Form her ist das fast genauso wie der Kontext
freien Sprachen. Der einzige Unterschied war, dass WL bei
kontextfreien Sprachen immer ein Non-Terminal war
Das ist der einzige Unterschied gewesen. Und jetzt kann VL etwas sein,
was ein Non-Terminal plus links und rechts noch eine Sequenz von sonstigem Zeichen ist.
Das heißt, ich kann im Zweifelsfall nur mehr machen.
Meine Ausdrucksmächtigkeit ist gestiegen, weil ich jetzt sagen kann,
nur wenn irgendwas Sonstiges noch da ist, dann darfst du ersetzen.
Gut, also ich habe das Leben ein bisschen komplizierter gemacht,
um im Zweifelsfall mehr ausdrücken zu können.
Und wie schon zuvor sage ich, okay,
was ich jetzt definiert habe, das kann ich erweitern,
Ableitung in endlich vielen Schritten mit einem Sternchen drüber,
reflexive,
transitive Hülle
Mehr Mächtigkeit, was kann ich damit machen?
Ich kann wieder die generierte Sprache definieren,
der ändert sich auch überhaupt nichts an der Definition,
denn ich betrachte wieder die Menge aller Worte weh,
die die Eigenschaft haben, dass ich vom Staatssymbol groß.
Er ist in endlich vielen Schritten dieses Wort weh ableiten kann.
Also wieder alle ableitbaren Worte sind die erzeugte Sprache.
So, und wenn man genau hinguckt,
ist ja jede Typ null Grammatik ein allgemeinerer Fall als die
kontextfreien Sprachen.
Die einen kontextfreien Grammatik
Spezialfall bestand darin, dass das, was links von
dem Non-Terminal steht, leer ist und das Rechte auch.
Also es ist jede kontextfreie Grammatik, ein Spezialfall der Typ Nullgrammatik.
Also wissen wir schon mal,
kontextfreie Sprachen sind immer in diesem Typ Null Sprachen,
so nennen wir die mal, enthalten.
Wir sagen wieder, alle Sprachen,
die ich jetzt mit Typ Nullgrammatiken erzeugen kann, sind Typ Null Sprachen.
So, man kann auch wieder zeigen tatsächlich,
dass Typ Nullgrammatiken mächtiger sind als kontextfreie Grammatiken.
Also ich kann damit tatsächlich
noch mehr machen
Aber man stellt fest, die sind sogar zu mächtig.
Deswegen sucht man noch nach gewissen Abschwächungen,
die ein bisschen weniger können, als diese Typ-Null-Grammatiken,
aber noch mächtiger sind als die kontextfreien Grammatiken.
Also irgendwie in der Ausdrucksstärke dazwischen liegen. Warum Typ null
Grammatiken uns zu mächtig sind, dazu kommen wir später.
Jetzt nehmen wir erstmal hin, darüber kann ich zu wenig
aussagen, treffen. Ich kann zu wenig sagen,
was da für eine Sprache rauskommt, welche schönen Eigenschaften sie habt.
Dafür gibt es zu wenig. Also ich möchte Eine
weniger erzeugungsstarke Grammatik haben mit noch ein paar netten Eigenschaften.
Kann nicht ganz so nett sein wie bei Kontext freien,
wenn es mächtiger sollen will. Immer wenn es Sprachfamilie mächtiger,
größer sein soll, dann wird es irgendwie aufwändiger,
da noch was drüber rauszukriegen.
Das ist immer so. Wenn ich mehr kann,
wird es schwieriger, etwas darüber herauszufinden.
Und diese Sprache heißt, wenig kreativ, eben hatten wir
Typ null. Jetzt haben wir es Typ 1 Grammatik.
Es gibt auch Typ 2 und 3, hatten wir schon.
Typ 2 sind nämlich die Kontext freien.
Und Typ 3 waren die Rechtslinearen Grammatiken
Und mehr gibt es nicht. Gibt nur 0, 1,
2, 3. Warum? Komski hatte sich irgendwann mal gedacht,
ich definiere mal vier Grammatiken, wollte ihnen keinen Namen geben.
Also hat er sie Grammatik vom Typ 1, 0,
1, 2, 3 genannt. Tiefsinniger ist das nicht
. Jetzt machen wir eine Einschränkung von Typ Null Grammatiken.
Und die Einschränkung, nennen wir dann kontext-sensitive Grammatik.
Manchmal wird die auch monoton genannt. Und da sind,
in der ersten Bedingung ist es ein alter Bekannter.
Erst nach Äpzilon ist die
einzig löschende Regel
Er hat die einzige Produktion, wo es kürzer wird.
Denn in zweitens fordern wir schon,
dass alle anderen Regeln die Eigenschaft haben,
dass die rechte Seite einer Regel mindestens so lang ist wie die linke Seite.
Das heißt, in jedem Ableitungsschritt wird das zumindest schon mal nicht kürzer.
Im Zweifelsfall sogar echt länger. Im schlimmsten Fall bleibt es
genauso gleich lang. Verändert sich irgendwie,
aber was wir damit schon mal hinkriegen, ist,
dass die Länge wächst bei Ableitung.
Vielleicht nicht streng monoton, aber zumindest monoton.
Abnehmen tut sie nicht. Die einzige Ausnahme ist eben
die Regel,
es geht nach
Naja, da wird es kürzer. Da wird etwas
der Länge 1 auf die Länge null verkürzt.
Und was haben wir denn noch? Wir haben keine Regel
wie Links VR, wo es auf der rechten Seite vorkiel.
Also das Staatssymbol können wir nie wieder erzeugen. Das heißt,
sobald es nach Y mal eine Verkürzung gemacht hat,
ist das die einzige Möglichkeit.
Also entweder wird das leere Wort am Anfang einmal produziert und
da ist nie auf einer rechten Seite vorkommt,
wird es auch nie wieder vorkommen können, das Essen.
Und deswegen wird auch nie wieder eine löschende Produktion verwendet
Das ist die dritte Bedingung, brauche ich, um sicherzustellen,
dass die Produktion es wird zum leeren Wort,
entweder am Anfang angewendet wird oder sonst nie.
Und deswegen haben alle Ableitungen die Eigenschaft, monoton zuzunehmen.
Deswegen heißen die Grammatiken auch monotone Grammatik. So,
und was jetzt gilt, was nicht sofort offensichtlich ist,
ist folgendes, jede Kontext freie Sprache ist auch Kontext sensitiv.
Warum ist das nicht mehr offensichtlich
Weil kontextfreie Sprachen nicht diese Eigenschaft haben, dass die rechte Seite
immer mindestens so lang ist mit der Ausnahme des Staatssymbols.
Denn da habe ich beliebig löschende Produktionen.
Das ist so das eine. Aber Gott sei Dank,
haben wir schon mal gesehen, diese Äbsodon-Produktion brauchen wir nicht.
Ich kriege zu jeder Grammatik G eine äqualente Grammatik G-Strich,
die Kontext sensitiv ist, weil sie keine Äbsodon-Produktion mehr auf
der rechten Seite hat. Und dann ist es einfach,
Dann muss ich mich nur noch sehen,
dass sie länger wird oder gleich bleibt,
aber da auf der linken Seite ein Zeichen steht und auf
der rechten Seite auch mindestens ein Zeichen wird,
schon mal nicht kürzer.
Das hatten wir bei Kontext Freiensprache. Gut,
dann bis zum nächsten Montag,
dann machen wir da weiter und dann mit Turing Machine