7 Allgemeine Grammatiken (nicht im Sommersemester 2025)
Wir haben nun ausführlich über kontextfreie Grammatiken gesprochen und auch Sprachen gesehen, die nicht mit kontextfreien Grammatiken zu beschreiben (und somit auch nicht mit Parsern oder allgemein mit Kellerautomaten) zu entscheiden sind. Da stellen sich die folgenden Fragen:
- Wie mann man die Definition kontextfreier Grammatiken sinnvoll erweitern,
so dass sie beispielsweise auch Sprachen wie
umfassen? - Gibt es eine natürliche Barriere, jenseits derer es keinen vernünftigen Begriff des "Beschreiben könnens" gibt? Oder kann man immer noch allgemeinere Regelwerke zulassen?
- Gibt es für die (noch zu definierende) allgemeinere Art von Grammatiken auch eine Art Automat, so wie die endlichen Automaten für die regulären Grammatiken und die Kellerautomaten für die kontextfreien?
Allgemeine formale Grammatiken
Die Definition formaler Grammatik umschließt offensichtlich die der kontextfreien:
sie verbietet nicht, dass alle linken Seiten
Nun schauen wir uns eine Beispielableitung an:
Die obige Beispielableitung illustriert, dass allgemeine formale Grammatiken etwas können, das kontextfreie Grammatiken nicht bieten konnten: das Vertauschen von Symbolen. Das mag nicht als besonders viel erscheinen, wird sich aber als Game Changer herausstellen.
Sobald wir eine Wortform erreicht haben, die nur aus Terminalsymbolen
besteht (also ein Wort geworden ist), muss unsere Ableitung
aufhören: wir können keine weitere Produktion anwenden, da jede
linke Seite mindestens ein Nichtterminal enthält. Diese Einschränkung
in der Definition allgemeiner formaler Grammatiken ist nicht wirklich
notwenig, sie macht Dinge allerdings klar, wo eine Ableitung zu Ende ist / sein muss.
Es handelt sich also gewissermaßen um das Gegenteil von Syntax-Antizucker (mir ist
gerade keine Substanz eingefallen, deren Geschmack universell als abstoßend empfunden wird).
Wir können Grammatiken, die verbotene Produktionen der Form
Nachdem also unser erster Versuch gescheitert ist, unternehmen wir einen
zweiten. Wir stellen uns die Ableitung als aus zwei Phasen
bestehend vor. In der ersten wird eine Wortform
: will in umwandeln: Zu jedem Zeitpunkt können wir beschließen, nun keine in mehr umzuwandeln, sondern nun -Symbole zu erwarten: : will in umwandeln oder mit fortfahren:-
: will in umwandeln. Wir können aber auch einfach aufhören, zum Beispiel wenn wir den rechten Rand erreicht haben:
Nun müssen wir zeigen, dass die Grammatik die Sprache
Als zweites müssen wir zeigen, dass jedes abgeleitete Wort
Die erste Beobachtung ist: solange
- Außer
enthält höchstens ein weiteres Symbol, und dies ist in . - Wenn
das Symbol enthält, dann ist . Wenn es enthält, dann ist . Wenn es enthält, dann ist es . In allen drei Fällen enthält keine Terminalsymbole. -
Wenn es kein Symbol in
enthält, dann ist es von der Form und enthält keine Terminalsymbole.
Die Behauptung kann man beispielsweise mit Induktion über die
Länge der Ableitung zeigen. Intuitiv gesprochen: Sie gilt unmittelbar,
nachdem
Wenn nun also
Dies geht sogar nohc einfacher als die obigen Sprachen. Wir
schaffen eine Startregel:
Wagen wir ein letztes Beispiel: die Sprache aller Wörter, deren Länge eine Quadratzahl ist. Spätestens dieses Beispiel sollte Sie davon überzeugen, dass allgemeine formale Gramatiken, im Gegensatz zu kontextfreien und regulären, nicht nur Formate syntaktisch beschreiben, sondern komplizierte Rechnungen durchführen können. Sie stellen somit ein völlig andersartiges Biest dar.
- Wir können
nur loswerden, indem wir es in das Killersymbol umwandeln. Das Killersymbol kann nur bei verschwinden. Dazwischen kann es nur die Zeichen passieren. Zum Zeitpunkt, wo wir anwenden, darf die Wortform also keine -Symbole mehr enthalten. -
Wir können eine
nur verschwinden lassen durch und nur auf diese Weise entstehen lassen. Wir produzieren also, wenn wir mit beginnen, im Laufe der Ableitung genau mal ein . -
Um ein
wieder verschwinden zu lassen, muss es den ganzen -Block durchlaufen und produziert damit insgesamt viele (\tilde{C}\). -
Da wir insgesamt
viele produzieren und jedes insgesamt viele produziert, werden insgesamt viele erzeugt. -
Jedes
kann nur in ein umgewandelt werden. Es entstehen also insgesamt viele .
In einer leichten Variation können wir auch die Sprache
Die Sprache \{a^m b^n c^{m+n}\} können wir eh: die ist sogar kontextfrei. Wir können also Arithmetik mit formalen Grammatiken "programmieren".
List.member x listdie überprüft, ob
Sie haben sicherlich gemerkt, dass wir die Grammatikproduktionen nun nicht mehr nur zum Erzeugen verwenden wie bei kontextfreien Sprachen, sondern zum Umformen, Rumschieben, Kopieren etc. Es ist nun an der Zeit, die Welt der Grammatiken zu verlassen und zu formalisieren, was man mit Umformen, Rumschieben, Kopieren erreichen kann. In anderen Worten: eine Formalisierung des Begriffs des Berechnens.