TIB: Kontextfreie Sprachen und Kellerautomaten (Lernziele KE7 1/3)
Update: Flüchtigkeitsfehler rausgenommen.
Das ist nun die letzte Kurseinheit der theoretischen Informatik B. Traurig? 😉
In dieser Kurseinheit geht es um kontextfreie Sprachen (also Sprachen, die Typ-2 und -3 erzeugen). Am besten man betrachtet die letzten drei Kurseinheiten gemeinsam, ggf. erstelle ich eine kleine Zusammenfassung der Kernaussagen bei Gelegenheit um aus den Puzzleteilen wenigstens teilweise ein Gesamtbild zu bekommen.
Lernziel 1
Wann ist eine Grammatik in Chomsky-Normalform und wie konstruiert man eine solche aus einer beliebigen kontextfreien Grammatik?
Zunächst geht es um die Eliminierung von -Regeln. Unserem leeren Wort, welches als Abschluss einer Ableitung fungiert, indem man ein Nonterminal durch ersetzt. D.h. was wir wollen, ist es die -Regeln (z.B. ) loszuwerden um eine "effektive" Notation zu bekommen. Aber der Reihe nach:
Chomsky Normalform:
Eine Chomsky Normalform liegt dann vor, wenn alle Regeln/Produktionen die Form oder besitzen mit und .
D.h. wir dürfen hier keine -Regeln haben und die rechte Seite der Produktion darf entweder nur aus einem Symbol (noch aus mehreren) aus unserem Alphabet oder aus einer Kombination von maximal zwei Nonterminalen bestehen.
Die Frage ist: wie kommen wir von einer kontextfreien Grammatik zu einer in Chomsky Normalform? Ich finde, dass so etwas am besten an einem Beispiel (aus dem Buch von Dirk W. Hoffmann) gezeigt wird.
Beispiel: Grammatik mit Regelmenge
1. Elimination der -Regeln
Hier entfernen wir zunächst alle Regeln der Form . Wir man sehen kann, wird das Nonterminal in unseren regeln durch ersetzt. Diese Ersetzung können wir durch Hinzufügen neuer Regeln "vorwegnehmen".
Hätten wir z.B. mit der initialen Regelmenge die Ableitungssequenz (Regel 2, Regel 6), so haben wir nun nur noch die Sequenz: (Regel 4). Die Ersetzung von durch wurde durch neue Regeln obsolet und wir sind der Chomsky Normalform, wo eben kein Teil der Sprache ist, ein Schritt näher.
2. Elimination von Kettenregeln
Nun kümmern wir uns um die Kettenregeln. Regeln, die von einem Nonterminal auf ein Nonterminal () zeigen sind ebenfalls unnötig. Wir gehen vor wie in Schritt eins.
3. Separation von Terminalzeichen
Jetzt sind die Terminalzeichen dran. Wir brauchen auf der rechten Seite nur Zweier-Kombinationen aus Nonterminalen oder ein einzelnes Terminal. Wir ersetzen also z.B. durch , wobei ein neues Nonterminal ist, welches mit einer neuen Regel auf zeigt. Aus wird also und .
4. Elimination der Nonterminalketten
Letzter Schritt: zu lange Nonterminalketten auf die Maximallänge von verkleinern. Das Vorgehen kennt ihr ja schon, es wird einfach eine neue Zwischenregel eingefügt. Aus werden also und :
Fertig! Aus eindeutigen Grammatiken lassen sich auch eindeutige Chomsky-Grammatiken erstellen.
Vorteile? Jedes Wort mit braucht Ableitungsschritte, da jeder Ableitungsbaum (bis auf die letzte Ebene) für die Chomsky-Normalform ein Binärbaum ist und wg. Blättern genau innere Knoten hat!
(Weiterhin im Skript wurde die Greifach-Normalform angesprochen. Ebenso eine reduzierte Grammatik. Die reiche ich später nach, da sie nicht Teil der Lernziele sind.)
Antwort zum Lernziel: Eine Grammatik ist in Chomsky Normalform wenn alle Regeln/Produktionen die Form oder besitzen mit und ist. Aus einer beliebigen kontextfreien Grammatik lässt sich eine Chomsky Normalform-Grammatik erstellen indem man die - und Kettenregeln eliminiert, die Terminalzeichen separiert und die Nonterminalketten mit mehr als drei Nonterminalen mittels Zwischenregeln auf maximal zwei Nonterminale verkürzt.
Lernziel 2
Was besagt das Pumping-Lemma für kontextfreie Sprachen und wie wendet man es an?
Wie in dem letzten Beitrag zu KE6 angedroht, gibt es auch ein Pumping-Lemma für kontextfreie Sprachen. Wir erinnern uns: mit dem Pumping-Lemma können wir ein Teilwort , der Zerlegung eines Wortes durch einen Zyklus im endlichen Automaten beliebig aufpumpen. Jedes Wort einer (unendlichen) regulären Sprache verfügt ab einer bestimmten Wortlänge über diese Eigenschaft. Bei endlichen Wortlängen können wir es uns einfacher machen, indem wir für jedes Wort einen akzeptierenden Zustand definieren und Zack! ist die Sprache regulär. Das ist der Grund warum alle endlichen Sprachen regulär sind.
Kümmern wir uns nun um das Pumping-Lemma für kontextfreie Sprachen (nicht vergessen: auch reguläre Sprachen sind kontextfrei, aber nicht alle kontextfreien Sprachen sind regulär - reguläre Sprachen sind eine echte Teilmenge der kontextfreien Sprachen). Ich schreibe die Definition (wieder aus dem Buch von Dirk W. Hoffmann) einfach mal hin und dann schauen wir sie uns genauer an:
Für jede kontextfreie Sprache existiert ein , so dass sich alle Wörter mit in der folgenden Form darstellen lassen:
mit und .
Mit ist auch für alle in enthalten.
Alle Wörter ab einer gewissen Länge (unsere Pumping Zahl) enthalten Teilwörter und , die sich aufpumpen lassen und eines davon ist nicht leer (). Seht Ihr den Unterschied zum Pumping Lemma für reguläre Sprachen? Dort haben wir gefordert, dass wir in der Zerlegung nur beliebig aufpumpen können. Hier müssen es und sein. Das liegt an der evtl. fehlenden rechtslinearen Struktur der Ableitungsbäume, die nur reguläre Sprachen inne haben. Im Beispiel weiter unten wird das gleich deutlicher.
Achtung: um zu zeigen, dass eine Sprache kontextfrei ist, müssen wir nur eine kontextfreie Grammatik die sie erzeugt oder einen Kellerautomaten (kommt im nächsten Beitrag) angeben, der sie erkennt. Das Pumping Lemma ist aber dazu gedacht eine Sprache als nicht kontextfrei zu erkennen (was leider auch nicht immer klappt, dazu gleich mehr).
Erklärung
Wir haben schon massive Vorarbeit geleistet und den Ableitungsbaum einer kontextfreien Sprache in Chomsky-Normalform als binären Baum entlarvt. Seine Eigenschaften erlauben es uns einige Eigenschaften für ein Wort abzuleiten, dass wir für das Pumping Lemma brauchen. Nehmen wir zunächst eine Grammatik in Chomsky Normalform. Durch diese Normalform hat der Baum im Inneren die Form eines Binärbaums mit Blättern. Wir können also einen Pfad wählen, der min. die Länge aufweist. Mit dem Startsymbol zusammen haben wir auf dem Pfad min. Nonterminale, so dass eines davon mehrfach aufgetaucht sein muss (erinnert Ihr euch? Unser Zyklus im Automaten!).
Zur Erinnerung: Das ist unsere Pumping Zahl. Jeder Ableitungsschritt ist ein durchlaufener Zustand in der Maschine, so dass wir bei einer unendlichen Länge an Worten irgendwann durch einen Zyklus bei der Erzeugung eines Wortes laufen müssen. Im Ableitungsbaum haben wir somit tatsächlich mehrmals ein Nonterminal stehen. Nennen wir das Nonterminal einfach mal und unterteilen das Wort in .
Um also aus dem Nonterminal noch einmal ein herzustellen, muss min. ein Ableitungsschritt durchlaufen werden. D.h. eines der Segmente oder hat min. ein Terminal drin. Das folgt aufgrund der Regelstruktur in der Chomsky Normalform.
Wie oder aussehen, haben wir keine Ahnung. Macht aber nichts, denn aufgrund dem Doppelvorkommen von können wir die Teilworte und aufpumpen und beliebige Worte der Form erzeugen indem wir die Ableitungssequenz, ausgehend von unserem Nonterminal mehrfach für das Mittelstück wiederholen.
Dabei wird jedoch nicht nur ein Teil (wie beim Pumping-Lemma für reguläre Sprachen) wiederholt, sondern zwei.
Ein Beispiel wäre wohl sinnig, oder?
Beispiel:
Die Sprache besteht aus einer unendlichen Kombination aus und ist sogar regulär, d.h. wir hätten darauf auch das Pumping-Lemma für reguläre Sprachen anwenden können. Da reguläre Sprachen aber auch kontextfrei sind (und ich zu faul bin mir was neues auszudenken), klappt das Pumping Lemma für kontextfreie Sprachen hier auch.
Wir suchen also eine Zerlegung , so dass gilt , mit wobei und ruhig leer sein dürfen. Außerdem muss gelten und .
Dazu brauchen wir unsere Pumping Zahl , die als Mindestlänge für das Wort fungiert. Wollen wir einfach mal nehmen. Unser Wort der Länge sieht also wie folgt aus: . Wir zerlegen das willkürlich (jede andere Zerlegung, die die Voraussetzungen erfüllt ist möglich) in und prüfen ob die oben genannten Voraussetzungen gelten:
(passt) und
(passt auch)
Muss auch nur noch (ich klammere für Übersichtlichkeit aus)
mit
gelten. Aber das prüfen wir zuletzt.
Eine Regelmenge in Chomsky Normalform, die diese Sprache erzeugt wäre z.B. die folgende:
Es ist zwar nicht notwendig sie anzugeben, aber ich würde euch gerne den Ableitungsbaum für das zu zerlegende Wort zeigen. Das verdeutlicht das Lemma etwas besser.
Mal nebenbei: aus diesem Grund werden reguläre Grammatiken auch rechtslineare Grammatiken genannt: der Baum kippt, wie Ihr sehen könnt, nach rechts weg. Das ist der Grund, warum wir im Pumping Lemma für reguläre Sprachen nicht zwei, sondern nur ein Teilwort aufpumpen müssen.
Es ist leicht einzusehen, dass wir hier bereits ab einen Zyklus haben, der sich bis durchzieht. und könnten aber auch leer sein, wäre für unser Lemma egal. Wichtig ist, dass wir und wie im Lemma gefordert aufpumpen können und das Wort immer noch in liegt.
Und was würde passieren wenn wir oder entfernen () oder beliebig aufpumpen () um die letzte Voraussetzung mit zu erfüllen? Probieren wir das mal aus (ich klammere der Übersichtlichkeit halber aus):
Und? Sind die Worte in ? Ja, sie sind es. Damit ist die Sprache kontextfrei.
Wichtig: meine der Faulheit geschuldete Wahl einer regulären Sprache als Beispiel ist aufgrund der rechtslinearen Struktur des Baumes vielleicht nicht optimal gewesen, denn genau das macht - wie eiter oben erwähnt - den Unterschied zwischen den beidem Lemmata aus.
Während bei einer regulären Sprache der Ableitungsbaum nach rechts kippt und wir nur das , d.h. den rechten Teilbaum in der Zerlegung betrachten müssten, so könnte bei einer kontextfreien (aber nicht regulären und damit auch nicht rechtslinearen) Sprache der Ableitungsbaum gleichzeitig nach links und rechts aufspannen. Das ist der Grund, warum wir den Baum nicht in drei, sondern in fünf Teile zerlegen (nämlich ) und beide Äste, links und rechts, mit und betrachten müssen.
Denn bei den regulären Sprachen wird mit nur der rechte Teilbaum aufgepumpt (wir haben ja aufgrund der rechtslinearen Struktur der regulären Sprachen keinen anderen), während es bei den kontextfreien (aber nicht unbedingt regulären) Sprachen möglich sein muss beide Teilbäume und verlängern zu können. Soweit klar? Evtl. reiche ich ein anderes Beispiel nach um es zu verdeutlichen.
Lust auf ein Negativbeispiel?
Beispiel:
Auch hier suchen wir einer Zerlegung mit den oben genannten Eigenschaften:
,
und
, mit
Wir brauchen wieder unsere Pumping Zahl , aber zunächst schauen wir uns die Worte doch einmal an für :
Fällt euch schon etwas auf? Versucht doch einmal eine Zerlegung (denn und dürfen ja ruhig leer sein) z.B. von mit den oben genannten Kriterien anzugeben. Ich mache einfach mal ein paar Beispielzerlegungen für das Wort der Länge , d.h. :
Während Ihr die ersten beiden Kriterien und noch erfüllen könnt, sieht es mit , mit schon sehr düster aus. Versuchen ( und bleiben einfach mal leer, die sind uns egal. Ich klammere wieder für die Übersichtlichkeit aus)?
Zerlegung Nr. 1:
Bereits mit klappt es nicht. Das erzeugte* Wort ist nicht in unserer untersuchten Sprache. (*was ist das Gegenteil von aufgepumpt? Abgepumpt?)
Hier geht es noch. Ist aber auch kein Wunder, denn das ist ja unser von Anfang an ausgesuchtes Wort, dass wir zerlegen wollten.
Und ab hier geht es dann nicht mehr weiter. Seht Ihr warum? Wir müssen bei der Erhöhung von zwei Teile des Wortes verlängern: und . Dabei bleibt aber ein Teil auf der Strecke, der nicht mit verlängert wird: . Das sind unsere . Das ist aber Voraussetzung, denn in der Sprache sind nur Worte, die die gleiche Anzahl wie und haben.
Zerlegung Nr. 2:
Auch hier: nix.
Wie gerade eben: unser ausgesuchtes Wort, was natürlich funktioniert.
Wieder eine unterschiedliche Anzahl an , und . War also wieder nichts.
Zerlegung Nr. 3:
Nope.
Erneut: unser ausgesuchtes Wort, was wieder funktioniert.
Auch hier: Wieder eine unterschiedliche Anzahl an , und . Keine Chance.
Ich will euch nicht weiter quälen: Ihr seht, dass es einfach nicht funktioniert, egal welche Pumping Zahl und welche Zerlegung wir wählen. Während wir zwei Teilworte und für das Lemma verlängern müssen, bleibt eine immer auf der Strecke. D.h. die Zusammensetzung der Elemente ist abhängig von Ihrer Umgebung, ihrem Kontext! Damit ist die Sprache nicht kontextfrei, sondern kontextsensitiv.
Etwas will ich euch aber nicht vorenthalten: denn das Pumping Lemma funktioniert nicht immer. Es gibt kontextsensitive Sprachen, die das Lemma dennoch erfüllen! Das Problem liegt in der Startposition der Teilwörter der Zerlegung. Denn dazu macht das Lemma keine Aussage (Prefix und Suffix können ja leer sein). Gelingt es uns den kritischen Abschnitt im Wort (in unserem Beispiel war das ) irgendwie zu umgehen, so haben wir eine evtl. kontextsensitive Sprache, die unser Pumping Lemma trotzdem erfüllt. Ein Beispiel hierzu ist die Sprache:
Hier versagt das Pumping Lemma für kontextfreie Sprachen, den erfüllt bei einer geschickten Wahl von und einer Zerlegung alle drei Lemma-Kriterien. Ich möchte hier nicht näher darauf eingehen, da das im Skript nicht behandelt wurde (tue es bei Gelegenheit aber trotzdem wenn etwas Zeit ist). Aber mit Ogdens Lemma kann man diese kontextsensitive Sprache auch als eine solche erkennen!
Antwort zum Lernziel: Das Pumping Lemma für kontextfreie Sprachen besagt, dass es bei einem Wort mit Mindestlänge eine Zerlegung geben muss, die folgende Kriterien erfüllt:
,
und
, mit
Dabei werden die Teilworte und beliebig aufgepumpt. Sollte keine Zerlegung diese Kriterien erfüllen, so ist die Sprache auch nicht kontextfrei.
Angewandt wird es, indem man sich zunächst ein Wort aus der zu untersuchenden Sprache sucht und eine Zerlegung angibt, welche die oben genannten Kriterien für alle erfüllt. Liegt das neue Wort mit den aufgepumpten Teilworten und dann nicht in der Sprache, zu der das Ursprungswort gehörte, so ist die Sprache auch nicht kontextfrei.
Es gibt jedoch Sprachen, die nicht kontextfrei sind und das Lemma dennoch erfüllen. Mit Ogdens Lemma kann man diese jedoch als nicht kontextfrei nachweisen.
Das war Teil 1 von 3 der Kurseinheit 7.
Bei Fehlern wieder die große Bitte: ab damit in die Kommentare damit ich das schleunigst berichtigen kann. Vor allem in mathematischen Kursen sind Fehler eine ungemein frustrierende Lernbehinderung, wie ich in Computersysteme 1 und 2 erfahren durfte: da zweifelt man schon tagelang an seinem Rechenweg weil im Skript ein anderes Ergebnis rauskommt. Das ist nervig!
Sie können zum Ende springen und ein Kommentar hinterlassen. Pingen ist im Augenblick nicht erlaubt.
Juni 5th, 2013 11:39
Hallo Anton,
super Zusammenfassung, aber 2 Kleinigkeiten:
1.) Hast du bei Lernziele 2 bei deinem "Nagativbeispiel" zwei mal "Zerlegung Nr. 2" geschrieben.
2.) Ganz unten: "Das war Teil 1 von 3 der Kurseinheit 6" -> statt 7.
Wie gesagt, Kleinkram. Ich wollt's nur gesagt haben.
Beste Grüße aus Kiel.
Juni 5th, 2013 15:56
Fixed! Danke.