cards-deck: university::theo_complexity date-created: 2024-02-21 12:07:35 date-modified: 2024-09-22 02:47:20
Grammatiken
part of [[112.00_anchor_overview]]
Overview
Chomsky ist noch die einzig lebende Person, die hier betrachtet und relevant ist, weil er eine Hierarchie von verschiedenen Grammatiken erörtert / gefunden hat.
Historische betrachte von Informatik: -> Es war damals schon eine zentrale Frage, warum Maschinen genau, wie Menschen, Sprache verstehne und verarbeiten können.
[!Tip] Wie schwer ist menschliche Sprache?
Grammatiken sind eine weitere Technik, um Sprachen zu beschreiben. Sie kommen aus der Linguistik und beschreiben die Erzeugung von Sätzen durch Regeln und Variablen, in die am Schluss Wörter eingesetzt und so Sätze und Satzstrukturen erstellt werden können.
Eine mögliche Grammatik für einfache Sätze: ![[Pasted image 20230503225725.png|448]] oder aber auch folgende Struktur:
auf der linken Seite sitzt nur ein Wort / eine Variable!, und auf der rechten Seite kann eine Variable
Wir finden eine Variable und gemäß der Regeln können wir die dann übersetzen. Dabei ist es irrelevant, was sich um diese Variable befindet – also Literale oder andere Variablen: Wir können diese Variable unabhängig des Kontextes jetzt ersetzen, gemäß der Regeln!
[!info] Diese Struktur erinnert an EBNF - die Enhanced Bakus Naurs-Form - die zur Beschreibung einer Programmiersprache genutzt wird!
Als Beispiel einer Grammatik Betrachte alle Wörter über dem Alphabet die durch die folgenden Regeln beschrieben werden:
- Das leere Wort ist in
- Falls , dann auch
Grammatik | Intuition
[!Intuition] Grammatik
Eine Grammatik ist ein Satz an Ersetzungsregeln, die man auch als die Produktion bezeichnet.
Eine Grammatik gibt dabei also an, wie man eine gewisse Struktur (vielleicht einen Ausdruck mit mehreren Variablen und Mustern, passend in einen validen Wert umschreiben kann (welcher durch die Produktionsregeln erzeugt wird))
Beispielhaft etwa:
_Unter Betrachtung der obigen Beispielssprache und Idee, wie ist eine Produktionsregel aufgebaut, in welche Teile gliedert sie sich? Wie kann man jetzt Wörter unter Betrachtung einer Grammatik erzeugen, welche wäýen in der obigen Grammatik möglich? #card
Eine Produktionsregel baut sich also darauf auf, dass sie links eine Variable stehen hat und rechts einen String bestehend aus Variablen und Terminalen (was einfach Symbole des Alphabets sind, etwa a,b,c, (keine Variablen!))
Unter Dieser Vorbetrachtung kann man dann eine Grammatik folgend nutzen, um Wörter zu erzeugen:
- Beginne den String mit der Startvariable:
- Finde im String, der von der Startvariable erzeugt wird, eine weiter Variable, zu welcher eine Produktion existiert und ersetze sie mit dieser Regel!
- Das wiederholen wir, bis wir keine Variablen mehr im String haben!
Im obigen Beispiel wären das etwa folgende Wörter: da:
[!question]
Die Sprache, die von einer kontextfreien Grammatik erzeugt wird, nennen wir kontextfreie Sprache (context-free-language (CFL))
Grammatik | Definition
Während wir zuvor die Intuition und Idee einer Grammatik beschrieben haben, möchten wir sie nun formal definieren, sodass eine Beschreibung und Anwendung dieser möglich ist.
[!Definition]
Wir möchten jetzt ferner eine kontextfreie Grammatik definieren:
Wir beschreiben eine solche Grammatik mit einem 4-Tupel: wobei diese jeweils folgende Eigenschaften haben:
was beschreibt das Tupel?, Wie sind die Inhalte von aufgebaut und zu verstehen? #card
- ist eine endliche Menge von Variablen (also es sind die Einträge, die wir später durch Terminal ersetzen werden)
- beschreibt die endliche Menge von Terminalsymbolen. Wobei ferner gilt, dass sie sich nicht mit den Variablen-Beschreibungen überschneiden, also ( Grundlegend sind das also die niedrigsten Bausteine, die dann ein Wort wild, etwa a,b,c,d,e,f… (gleich zum Alphabet bei Sprachen))
- beschreibt die Regel (die Produktionsregeln), wobei hier einfach beschrieben wird, dass eine Teilmenge der Variablen ist und immer ein Tupel existiert (also eine Regel, wie aus einer Variable ein neuer Term erstellt wird)
- beschreibt die Startvariable!
Ferner beschreiben wir noch, $u \implies_{G}~ v$ “ geht unter (der Grammatik) unmittelbar über in ”, bei falls es eine Regel in gibt und weiter , sodass dann folgt:
Also wir haben eine Regel, die unseren Term nicht stark verändert, aber ihr einen neuen Inhalt / Wert gibt.
Wir schreiben ferner $u \implies_{G}^{*} ~v$ (also einfach, dass man von u nach v kommen kann), wenn es eine Folge von Schritten gibt, und sagen dann dass aus abgeleitet wird ( u in v übergeht)
Damit haben wir die Grundlage gesetzt und können jetzt beliebige Grammatiken beschreiben, aufbauen und damit Wörter und auch ganze Sprachen erzeugen!
Sprachen aus Grammatiken
Dass man jetzt eine Sprache mittels einer Grammatik beschreiben kann ist klar, da wir mit dieser ja eine gewisse Menge von Wörter erzeugen können.
[!Definition]
Se nun eine Grammatik
Wie beschreiben wir die erzeugte Sprache?was beschreibt die Satzform? #card
Die von erzeugte Sprache ist einfach beschrieben mit $L(G) = { w \in \Sigma^{}\mid S \implies_{G}^{} ~w }$ ( also sie sit die Menge aller Wörter, die man von der Startvariable ableiten kann)
Man beschreibt eine Ableitung von ferner so, dass man sie von der Startvariable über diverse Umformungen erreichen kann, also
Wir nennen ein Wort das noch Variablen enthält eine Satzform
Beispiele
Wir betrachten in Aufgabe 2 Grammatiken diverse Grammatiken beispielhaft
Beispiel | Dyck-Sprache
Walther von Dyck (1856 - 1934, München)
[!Definition] DYCK-Sprache Die folgende Sprache bezeichnen wir als Dyck-Sprache: über Und somit beschreiben wir Sprachen, die beliebige Klammerpaare haben kann.
Wie können wir diese Grammatik beschreiben? #card
und
Ein weiteres Beispiel:
wobei die Übergangsfunktion bzw gibt sie an, wie übersetzt werden kann. Das heißt wir können die Variable mit einem der Literalen-Kombination ersetzen
Formal können wir die Grammatik unter Verwendung von Ableitungsregeln beschreiben:
[!idea] Jede Grammatik beschreibt dabei eine Sprache, die Wörter die durch einen solchen Satz Regeln erzeugt werden können, zusammenfässt:
Allgemeine Grammatiken
Wir haben uns bis jetzt nur Kontextfreie Grammatiken angeschaut, die also etwa keine kontext-sensitivien Grammatiken beschreiben können. Wir möchten also verallgemeinern:
[!Definition] Allgemeine Grammatiken
Wir beschreiben eine allgemeine Grammatik wieder mit einem 4-Tupel und geben dieser folgende Eigenschaften:
Wie beschreiben wir die vier Parameter diesmal? Was ist der Unterschied zur allgemeinen Grammatik? #card
- ist eine endliche Menge von Variablen
- ist eine endliche Menge von Terminalsymbolen. Wieder gilt
- (Also wir erlauben jetzt auch, dass auf der linken Seite Terminalsymbole stehen können!)
Durch diese Konstruktion der Regeln erlauben wir jetzt dass eine Ersetzung durch einen vorher geschaffenen Kontext (also Buchstaben, die da aufgetreten sind (etwa , wir vertauschen 3 gegen 3 b)) passieren bzw modelliert werden kann.
Das ist der Unterschied zu Kontextfreien Grammatiken: -> Ihre Produktion ersetzt nur Variablen mits String, kann dabei aber keinen Kontext - der durch die Terminal gegeben werden könnte - erkennen / anwenden
Chomsky-Hierarchie:
[!Feedback] Motivation
Wir sehen hier jetzt schon, dass kontextfreie Grammatiken wahrscheinlich weniger modellieren und erzeugen können, weil ihnen die Möglichkeit vom Kontext nicht gegeben ist.
Diese Hierarchie kann man jetzt durch ein linguistisches Modell von Chomsky besser beschreiben:
![[Pasted image 20230503230143.png]]
[!Definition] Chomsky-Hierarchie
Grundlegend schränkt die Chomsky-Hierarchie Grammatiken aufgrund der Form ihrer Regeln ein und gibt ihnen eine hierarchische Einordnung.
Eine Grammatik ist vom Typ , falls alle Regeln in der Form sind und folgende Parameter / Einschränkungen aufweisen: Wir unterteilen in 0-4 Typen!
Was sind die Eigenschaften die für folgende Typ 0,1,2,3 Grammatiken gelten müssen? Welche Aussnahme erlauben wir ferner? #card
- Typ 0 hat keine Einschränkung (allgemeine Grammatik)
- Typ 1 gibt an, dass ( also von unserem Start-Wort können wir nicht kleiner werden, sondern nur noch mehr hinzufügen)
- Typ 2 gibt an, dass sie Typ 1 und ist ( also wir fangen bei einer Variable an und erhalten anschließend einen String von Terminalen und auch Variablen) (wir haben “links” niemals eine Variable stehen) (kontextfreie Grammatik)
- Typ 3 gibt an, dass sie Typ 2 und ist –> Also sie folgt der strikten Struktur, dass man nur Zwischenformen der erzeugen können, wo links Terminale und rechts eine Variable steht! (dann ist sie Links-erzeugend)
( Es gilt die Sonderregel, dass erlaubt ist, man also ein leeres Wort direkt erzeugen kann)
Eine Sprache heißt jetzt vom Typ , wenn es also eine Grammatik vom Typ gibt, die sie erzeugen kann.
[!Important] Erkenntnis der Hierarchie Die Erkenntnis über diese Hierarchie war ein immenser Durchbruch, weil somit erkennen werden konnte, das man diverse Inhalte anders darstellen und translatieren konnte. Ferner ist es also technisch möglich sehr komplexe Sprachen doch erzeugen / darstellen zu können!
Reguläre Grammatiken
[!Definition]
Womit beschreiben wir eine reguläre Grammatik, was folgt dazu mit regulären Sprachen? #card
Eine reguläre Grammatik ist also eine Grammatik mit Produktionen der Form:
(Das heißt man baut nach und nach ein Wort auf, was maximal am rechten Ende eine Variable stehen hat, sonst sind es nur Terminal!)
Zu jeder regulären Sprache gehört eine reguläre Grammatik!
Die Menge aller Sprachen die von regulären Grammatiken erzeugt werden, ist genau 112.03_reguläre_sprachen (sowie reguläre Ausdrücke oder endliche Automaten)
Zu jedem DFA gehört eine reguläre Grammatik:
[!Satz]
Jede reguläre Sprache - alle die von DFAs erkannt werden - sind von Typ3-Grammatiken erzeugbar:
Wie zeigen wir das? #card
Sei eine Sprache und ferner ein DFA der die Sprache erzeugt.
Ein Wort ist genau dann in der Sprache, wenn man nach einer Folge vom Startzustand über die Berechnung von in einen Endzustand fallen wird.
Weiterhin muss gelten: Es gibt eine Folge von Zuständen mit und ferner haben wir Übergangsfunktionen, die diese Berechnung darstellen kann. Es gibt dann jetzt eine Folge von Variablen wobei der Startzustand: gleich der Startvariable ist!
Dadurch lässt sich bilden: und somit haben wir die Konstruktion durch Variablen gefunden. und somit !
Andere Richtung: Wir gehen von einer Grammatik aus und jetzt konstruieren wir jetzt einen DFA Dabei ist
- –> denn X wird der akzeptierende Zustand!
- Wir traversieren also nach und nach die Übergangsfunktion: und geben dann immer das entsprechende Symbol heraus und somit kann ein Wort verarbeitet und processed werden.
Chomsky Normalform
Dinge mit : Links Variable und rechts beliebige Menge von Variablen
[!Definition] Chomsky Normalform eine kontextfreie Grammatik ist in Chomsky Normalform (CNF), wenn alle Regeln von der Form: Hierbei sind Terminalvariablen und beliebige Variablen (Aber wir bilden nie wieder auf die Startvariable ab)
wir haben also die Möglichkleit eine Konstruktion, die von vielen Variablen auf wenige abbildet, immer in eine bestimmte Minimalform umwandeln zu können.
Satz |
[!Satz]
Zu jeder kontextfreien Sprache gibt es eine kontextfreie Grammatik in CHomsky Normalform welche sie generieren kann.
Wie können wir das beweisen, welche Punkte muss man hierbei beachten? #card
Nur als Idee: Sei die allgemeine kontextfreie Grammatik welche die Sprache generiert. Wir finden eine Reihe von Umformungen zur Chomsky-Normalform folgend:
- Wir fügen eine neue Startvariable ein, die auf die alte Startvariable zeigt (damit verhindern wir den Loop auf sich selbst)
- wir entfernen alle Regeln der Form (das sind unnötige Regeln, weil sie nur einen Variablennamen ersetzen). Dafür können wir auch neue Variablen einfügen.
- Alle verbleibenden Regeln sind jetzt nur noch zu alng, also von der Form wobei Variablen oder Terminale sind.
- Diese können dann auch rekursive auf Chomsky Normalform gebracht werden indem wir sie mit neuen Variablen ersetzen.
[!Feedback] Nutzen der Normalform
Der Nutzen der Normalform ist, dass sie verschiedene Beweise vereinfachen kann, weil nur die beiden Arten von Regeln berücksichtigt werden müssen (und das verallgemeinert). Insbesondere Ableitungen in eine CNF-Grammatik kann man auch immer durch binäre Bäume darstellen!
Folglich möchten wir den Algorithmus dazu betrachten:
Konvertieren kontextfreier Grammatik zur Chomsky Normalform
Ferner betrachten wir hier einen Algorithmus welcher uns dabei hilft eine kontextfreie Grammatik in 5 Schritten zu der äquivalenten Chomsky-Normalform umwandeln zu können:
[!Satz] Algorithmus zum Umwandeln in eine Chomsky-Normalform:
Betrachten wir eine Grammatik der Form: mit
Wie gehen wir vor, um sie jetzt entsprechend in eine Chomsky-Normalform bringen zu können? Spezifisch möchten wir die 5 Schritte auflisten und erklären, warum sie umgesetzt werden #card
- neue Startvariable einfügen Da wir verbieten, dass die Startvariable auf sich selbst zeigt, fügen wir eine neue ein welche dann auf die alte zeigt, sodass die Grundsemantik der Grammatik nicht verletzt wird. Also
- löschen von Regeln der Form , Wir wollen bei der Normalform nur zulassen, dass die Startvariable auf das leere Wort abbilden kann. Ferner werden wir also alle Übergänge einer Variable / eines Nicht-Terminal in terminieren bzw. entfernen. Anschließend müssen wir aber die neue Struktur bei allen anderen Regeln anpassen. Wenn jetzt gestrichen wurde, dann werden Regeln, wie anders aussehen können. Wir müssen also jetzt für jede Regel, die die Entfernten beinhaltet die Form anbringen, wenn sie wäre / also leer. Das heißt, dass etwa für folgend adaptiert wird: wird zu (also die Kombinationen, wo eventuell leer wäre)
- Löschen von Terminalen auf sich zeigend: Bei der Normalform möchten wir keine Formen haben, wo ein Nicht-Terminal auf einen einzelnen anderen zeigt, sondern nur o.ä. Demnach möchten wir jetzt alle Regeln der Form entfernen und dann so ausbauen, dass es die Übergänge von einfach übernimmt. -> Wir komprimieren also doppelte Übergänge, die keinen Mehrwert in der Betrachtung bieten. Also Für ein wird dann und die vorherigen von
- Ersetzen von langen Verkettungen Wir möchten jetzt Regeln der Form mit bzw aufteilen. Dafür werden wir sie in folgende Form aufteilen und entsprechend neue Variablen einfügen: also wir splitten in Teile von auf, sodass wir der Struktur der Normalform näher kommen!
- Entfernen von Nicht-Terminalen/Terminalen Verbindungen Es kann jetzt noch auftreten, dass ein Übergang auftritt, also hier auf der “rechten Seite” ein Terminal und Nicht-Terminal steht. Das wird in der Normalform nicht erlaubt, weil wir ja nur 2er-Verkettungen von Variablen und sonst einzelne Terminale erlauben. Das heißt jetzt, dass wir folgend einfach jeden Terminal mit einem neuen Zustand ersetzen, der auf den Terminal zeigt: Also
Wir können jetzt herausfinden, dass es auch in Kontextfreien-Sprachen ein Pumping-Lemma gibt. Also wir werden sehen, dass auch kontextfreie Sprachen in ihrer Mächtigkeit der Konstruktion und Darstellung limitiert sind und wir somit auch ans Limit stoßen!
Pumping Lemma von Bar-Hillel
Limits von context-free-automata
Zu Beginn gingen wir davon aus, dass 06_kontextfreie_grammatiken Automaten mächtiger seien / sind, als reguläre Grammatiken, jedoch sehen wir, dass wir schon relativ schnell an einer “einfachen” Sprache scheitern.
Abschlusseigenschaften von kontextfreien Sprachen
Wir können die Abschlusseigenschaften der kontextfreien Sprachen nochmals betrachten:
[!Definition] Vereinigung
Es gilt: Wenn kontextfrei sind, so ist es auch
Wie können wir das beweisen? #card
Seien die beiden Grammatiken, die die Sprachen erzeugen Wir konstruieren nun eine neue Grammatik mit (als neue Starvariable) und ferner (also wir gehen vom Start entweder in den Start von ! )
Dann ist offensichtlich
Schnitt:
[!hinweis] Schnitt
Es gibt kontextfreie Sprachen für die nicht kontextfrei ist (Also sind sie da nicht abgeschlossen!)
Wie zeigen wir das? #card
Betrachten wir etwa Dann ist was genau die nicht kontextfreie Sprache ist, wie wir zuvor gezeigt haben!
[!Important] Kontextfreie Sprachen mit nicht kontextfreien Komplement. Es gibt kontextfreie Sprachen, deren Komplement nicht kontextfrei ist Es folgt aus der Umformung:
Also das Komplement kann dann plötzlich nicht mehr kontextfrei sein. Die alte Konstruktion, dass man einfach die Zustände mit den akzeptierenden vertauscht, wird bei dem neuen Automaten 112.09_kellerautomaten nicht funktionieren! –> denn einen Speicher kann man nicht einfach invertieren –> was wäre das Komplement eines Wortes??
Stellen sie sich vor, es ist 1956 und sie müssen einen neuen Rechner erfinden, der das zeigen / konstruieren kann. Also eine nicht-kontextfreie Sprache, die das bearbeiten / erkennen kann.
Further:
und nun geht es weiter mit Turing-Maschinen, um die mächtigsten Automaten beschreiben zu können [[theo2_TuringMaschineBasics]]