Im letzten Teilkapitel haben wir den CYK-Algorithmus kennengelernt. Dieser verwendet
das Prinzip des Dynamic Programming, um für eine allgemeine kontextfreie
Grammatik und ein Eingabewort einen Ableitungsbaum zu finden (oder
festzustellen,
dass es
keinen gibt und somit ).
In diesem Teilkapitel werden wir sehen, dass viele Sprachen gar nicht kontextfrei sind, und
werden
hoffentlich ein Gefühl dafür entwickeln, welche Konstruktionen Kontextfreiheit verhindern,
ähnlich wie
"Verschachtelung" eine Sprache nicht-regulär macht.
Beispiel 6.11.1
Betrachten wir die Sprache
Ein Kellerautomat könnte nun alle auf den Stack legen und dann, wenn die
beginnen, den Stapel abarbeiten. Allerdings hätte er dann, wenn die kommen,
vergessen, wieviele es denn waren. Irgendwie scheinen Kellerautomaten nicht für
geeignet. Dies ist natürlich nur eine Intuition. Vielleicht kennen wir einfach nicht alle
Tricks,
die man mit Kellerautomaten (und somit mit kontextfreien Grammatiken) anstellen kann.
Wir werden nun beweisen, dass nicht kontextfrei ist; dass es also für keine
kontextfreie Grammatik gibt. Wir gehen wie folgt vor: wir nehmen eine kontextfreie
Grammatik , die jedes Wort ableiten kann. Dann sehen wir uns den
Ableitungsbaum
für ein "sehr langes" an und werden sehen, dass wir in andere Wörter
ableiten
können, die nicht in sind. Somit haben wir gezeigt, dass keine korrekte
Grammatik
für ist. Als erstes verlangen wir, dass in Chomsky-Normalform vorliegt.
Dann schauen wir uns für ein den Ableitungsbaum an:
Nun betrachten wir in diesem Ableitungsbaum den längsten Pfad von zu einem
Nichtterminalknoten, der direkt über den Terminalen steht. Wenn dieser Länge hat (also
Kanten lang ist), dann hat der Baum höchstens Blätter, also .
Wenn nun ist, dann gibt es einen Pfad der Länge
von diesem aufwärts richtung . Auf diesem liegen Nichtterminalsymbole,
mehr als es in gibt; also muss ein Terminalsymbol zweimal vorkommen:
Der Pfad vom oberen zum unteren hat höchstens Länge (so haben wir diesen Pfad
gewählt),
und somit hat das Unterwort höchstens Zeichen.
Wenn wir nun das Wort für ein sehr großes betrachten, sagen wir
, dann kann das Wort nicht alle drei Symbole enthalten;
sonst würde es ja alle Symbole und noch weitere enthalten, wäre also länger als
; allerdings haben wir ja gesehen, dass gilt.
Nehmen wir nun also der Einfachheit halber an, dass nicht das Symbol enthält:
(der andere Fall ist symmetrisch und kann mit den gleichen Argumenten wie
unten
behandelt werden).
Nun holen wir zum entscheidenden Schlag aus: wir "pumpen" das Wort auf, indem
wir die Teilbäume mit an der Wurzel wiederholen. Konkret besagt ja oberer Baum,
dass wie folgt hergeleitet wurde:
Insbesondere heißt das, dass gilt. Wir können diesen
Schritt also wiederholen:
und somit das Wort und ganz allgemein jedes Wort
ableiten, für jedes . Selbst für geht das:
Betrachten wir nun das Wort . Wir haben ja gesehen, dass in
alle -Symbole rechts von liegen, also in .
Das Wort hat also immer noch viele -Symbole. Allerdings hat
es die Symbole in und verloren! Wir wissen nicht, wieviele davon und
waren,
aber eines ist ganz klar: in kommen die Symbole nicht mehr gleich
häufig vor, und somit .
Wir haben also gezeigt, dass die kontextfreie Grammatik nicht die Sprache
erzeugt: wenn wir alle erzeugen kann, dann
kann sie auch Wörter wie erzeugen. Da unsere Argumentation keine
Annahmen über getroffen hat, außer, dass sie kontextfrei ist, haben wir gezeigt:
ist keine kontextfreie Sprache.
Vorsicht! Wir haben angenommen, das weniger Zeichen hat
als , weil ja und fehlen. Kann aber eintreten?
Dies würde unsere Argumentation zerstören. Hier kommt wieder die
Chomsky-Normalform zur Hilfe: es gibt keine Produktionen ,
(außer vielleicht für das Startsymbol , welches dann aber nicht auf einer rechten Seite
auftreten dürfte). Ganz allgemein: wenn eine Grammatik in Chomsky-Normalform ein
Wort herleitet und , dann kommt in der Ableitung keine
-Produktion zur Anwendung.
Die obige Argumentationslinie ist als Pumping Lemma für kontextfreie Sprachen bekannt:
Theorem 6.11.2(Pumping Lemma für kontextfreie Sprachen)
Für jede kontextfreie Grammatik gibt es eine Zahl , so dass jedes
Wort der Länge zerlegt werden kann in
wobei gilt und nicht beide sind, so dass
gilt, für alle .
Die Zahl kann zum Beispiel als gewählt werden, wobei
die
Anzahl der Nichtterminale in einer zu äquivalenten Chomsky-Normalform ist.
Übungsaufgabe 6.11.1
Sei die Sprache aller Wörter
In Worten: rechts und links vom in der Mitte muss das gleiche Teilwort stehen.
Zeigen Sie analog zu dem vorherigen Beweis, dass nicht kontextfrei ist.
Übungsaufgabe 6.11.2
Sie die Sprache aller Wörter, deren Länge
eine Zweierpotenz ist:
Also . Zeigen Sie, dass nicht
kontextfrei ist.
Mengenoperationen auf kontextfreien Sprachen
Im Kapitel über reguläre Sprachen hatten wir folgende Abschlusseigenschaften:
Theorem 6.11.3
Wenn reguläre Sprachen sind, dann sind die folgenden
Sprachen auch regulär:
. Das war einfach: wir kombinieren die Grammatiken
und fügen die Startproduktionen hinzu.
. Das war schon schwieriger, ging aber auch irgendwie.
. Das ging ähnlich zum vorherigen.
, die Komplementsprache. Das ist einfach,
sobald man einen endlichen Automaten für gebaut hat: man tauscht akzeptierende
und nicht-akzeptierende Zustände aus.
, die Sprache, die entsteht, wenn man jedes Wort in von rechts nach
links liest. Dies ist gar nicht so offensichtlich, wenn man reguläre Grammatiken oder
endliche Automaten ansieht. Wenn man aber für einen regulären Ausdruck
gebaut
hat, wird es zur Trivialität: einfach den Ausdruck umdrehen.
. Hierfür könnte man für jeweils endliche Automaten
bauen und die dann "parallel" laufen lassen; man muss nun sehen, dass man
dieses parallele Laufen
mit einem Automaten simulieren kann: dieser hat als Zustandsmenge ,
merkt sich also in einem Zustand, in welchen Zuständen und
sind.
Oder man macht es sich einfach:
Nach Punkt 4 sind und regulär.
Nach Punkt 1 daher auch ist regulär.
Nach Punkt 4 ist daher wiederum regulär,
was
nach den De-Morganschen Gesetzen die gleiche Menge ist wie .
Wie sieht es nun aus, wenn kontextfreie Sprachen sind? Welche der
obigen Kombinationen sind dann ebenfalls kontextfrei?
Übungsaufgabe 6.11.4 6.11.3
Seien kontextfrei. Zeigen Sie, dass die folgenden Sprachen auch kontextfrei
sind:
Überspringen wir ; dieses ist nämlich im Allgemeinen nicht kontextfrei.
Überspringen wir ; dieses ist nämlich im Allgemeinen nicht
kontextfrei.
Tip: dies ist viel einacher als für reguläre Grammatiken.
Wie schon angedeutet, geben uns Komplement und Schnittmenge im Allgemeinen keine kontextfreie
Sprache.
Das Gegenbeispiel haben wir schon fast gesehen:
Beobachtung 6.11.5
Der Schnitt zweier kontextfreier Sprachen
ist im Allgemeinen nicht kontextfrei.
Ein Beispiel ist
Diese sind beide kontextfrei (schreiben Sie jeweils eine Grammatik, wenn Sie's nicht glauben).
Der
Schnitt allerdings ist
genau diejenige Sprache, für die wir oben gezeigt haben, dass sie nicht kontextfrei ist.
Beobachtung 6.11.6
Das Komplement einer kontextfreien Sprache ist im Allgemeinen nicht kontextfrei.
Warum? Wenn er es wäre, dann wäre mit Hilfe von Punkt 1 auch
kontextfrei, was es aber im Allgemeinen nicht ist. Befriedigender wäre es allerdings, wenn wir
ein konkretes Beispiel hätten.
Übungsaufgabe 6.11.4
Sei . Wir wissen bereits, dass nicht kontextfrei ist.
Zeigen Sie, dass kontextfrei ist.
Die Sprache ist somit ein Beispiel für eine kontextfreie Sprache,
deren Komplement, also , nicht kontextfrei ist.
Tip. Listen Sie alle Möglichkeiten auf, wie ein Wort nicht
in sein kann: (1) es hat nicht die Form ; (2) es hat die Form,
hat aber mehr als es hat; (2) es hat mehr als es hat...