cards-deck: university::theo_complexity

Reguläre Ausdrucke - Regular Expressions :

part of [[112.00_anchor_overview]] requires 112.01_Sprachen


historische Einschätzung:

Reguläre Ausdrücke wurden von Stephen Cole Kleene (1909 - 1994) begründet und für diese auch ein Beweis geliefert: Lemma 1 Sprache durch regex –> ist regulär und [Lemma 2 Sprache ist regulär –> die die Sprache beschreibt.](#Lemma%202%20Sprache%20ist%20regulär%20–>%20%20die%20die%20Sprache%20beschreibt.) Resource: Representation of Events in Nerve Nets and Finite Automata (USAF RAND project Research Memorandum RM-704, 15.12. 1951)

Intuition zu Regulären Ausdrücken:

Reguläre Ausdrücke kommen in vielen Variationen, Umgebungen statt - beispielsweise Bash / Unix - und können mehrere Aussagen in kleinen Ausdrücken beschrieben. Das heißt, sie können viele Möglichkeiten durch Angabe von Verallgemeinerten Definitionen beschreiben. Beispielsweise:

grep -r '[Vv]orlesung * 20[0-2][0-9]'

Als Kommando, welches alle Dateien anzeigt welche entweder V oder v anzeigen, weiterhin Vorlesung gefolgt von irgendwelchen Informationen darstellt. und diese von 2000 bis 2029 heraussuchen kann. Das heißt wir haben eine große Menge von Wörtern mit einem einzigen Ausdruck definieren und beschreiben können.

Definition - Reguläre Ausdrücke :

Nenne die Definition eines regulären Ausdruckes unter der Prämisse, dass ein Alphabet beschreibt. Welche speziellen Fälle treten weiterhin auf? #card Sei ein Alphabet. Dann sind und reguläre Ausdrücke, obwohl sie leer sind ( leere Sprache, leeres Wort) Weiterhin sind Alle Buchstaben aus reguläre Ausdrücke.

[!Definition] regulärer Ausdruck was wird benötigt, welche drei Grundlagen können wir daraus bilden? #card

Sei ferner ein Alphabet, dann gilt für dieses folgend (um eine regex zu bilden):

  • - die leere Sprache, aber auch - leeres Wort bilden jeweils reguläre Ausdrücke
  • alle Buchstaben sind reguläre Ausdrücke Ferner können wir jetzt drei Grundlagen für die regulären Ausdrücke festlegen/ definieren, Seien dafür reguläre Ausdrücke, dann sind auch die folgenden wieder reguläre Ausdrücke:
  1. –> Vereinigung, beschrieben mit
  2. –> Verkettung beschrieben mit
  3. –> der Kleen’sche Abschluss, beschrieben mit

Hieraus können wir ferner verschiedene Operationen - alle möglichen - umsetzen. –> Diese drei Operatoren bilden ein Operatorensystem

Erweiterung | syntactic sugar

Da diverse Operationen in ihrer Notation sehr aufwendig werden können, wollen wir ferner diverse Abkürzungen definieren, die dabei helfen, diverse Strukturen einfacher zu beschreiben.

[!Tip] wie kann man es mit den drei grundlegenden Operatoren darstellen? #card

erkennt ob das vorherige Zeichen vorkommt: Also anders dargestellt wäre es:

[!Tip] wie kann man es mit den drei grundlegenden Operatoren darstellen? #card erkennt 1 oder mehrer Vorkommen eines vorherig genannten Zeichens. Also wird erkennen. anders beschrieben mit

[!Attention] wie kann man es mit den drei grundlegenden Operatoren darstellen? #card

Mit geben wir an, dass ein beliebiges Zeichen des Alphabets erkannt werden kann. Also wird und anders beschrieben als:

[!Information] wie kann dieser Ausdruck mit grundlegenden Operatoren dargestellt werden? #card Mit [^abcd…] wird eine Verneinung beschrieben, also die Zeichen, die in der Klammer genannt werden, nicht erkannt. Ferner können wir folgenden Operator also so umschreiben:

[!Information] wie kann dieser Ausdruck mit grundlegenden Operatoren dargestellt werden? #card Dieser Operant wird genutzt, um Vorkommen des vorherigen Zeichens erkennen zu können. Das heißt es ist ähnlich zur Wiederholung mit jedoch mit einem gegebenen Intervall! Dargestellt werden kann es aus einer Konkatenation aller Wiederholungen, die erlaubt sind:

[!Information] wie kann dieser Ausdruck mit grundlegenden Operatoren dargestellt werden? #card Mit diesem Operant erkennen wir, wie im vorherigen, die -malige Wiederholung des vorangegangenen Wortes. Ferner entspricht dieser Ausdruck dann folgender Darstellung:

Beispiele :

Der Ausdruck beschreibt hiermit alle Ausdrücke, die (welche Ausdrücke gehören dazu?) :: anfangs beliebig viele 0 beinhaltet, dann von einer 1 gefolgt wird und anschließend noch beliebige 0 an gehangen werden können. Damit werden also 00100000, 010, 10, 00100 etc. beschrieben

_was wird mit folgendem ausdruck beschrieben?_ #card

Er beschreibt alle Wörder mit mindestens einer 1 inbegriffen. Da wir die Kleene’sche Hülle definieren, können wir also alle Wörter beschreiben, sofern sie in der Mitte eine 1 beinhalten. –> 1110, 0001000, 010101010101000 sind valide Aussagen

[!Tip] Konvention der Chronologie von Konkatenationen #card

Wie bei anderen System, gelten hier auch Konventionen zur Chronologie der Verarbeitung: Zuerst , dann , dann

Algebraische Regeln :

Seien reguläre Ausdrücke. Dann gelten unter Betrachtung der Konkatenation : welche algebraischen Regeln? #card

  • ist diese Assoziativ, kommutativ und hat als neutrales Element.
  • ist assoziativ, nicht kommutativ, hat als neutrales Element. Distributivgesetz: Die Erzeugung einer Kleene’schen Hülle von einer Kleene’schen Hülle, resultiert mit der gleichen Kleene’schen Hülle: –> Alle Wörter, die wir aus einer leeren Menge bilden können, sind leere Wörter selbiges Prinzip bei Verwendung eines leeren Wortes

Induzierte Sprache

Die von - also einem regulären Ausdruck - induzierte Sprache beschreibt also die Menge welche alle möglichen Wörter beschreibt, welche unter Anwendung des regulären Ausdruckes beschrieben werden können. Das heißt, wie obig alle möglichen Beispiele, die bestimmte Wörter beschreiben können. welche Schlüsse können wir daraus ziehen, wie wird eine induzierte Sprache nun definiert? Sei ein regulärer Ausdruck. Dann ist die von induzierte Sprache folgend definiert: #card für ein
–> Ein regulärer Ausdruck, welcher sich aus mehreren zusammenfasst, kann genauso aufgegliedert werden. , –> wir können hiermit und durch die Konkatenation dieser Sprachen dann wahrscheinlich auch die ganzen anderen regulären Sprachen erkennen, die wir sonst mit einer normalen Sprache, wie wir sie in 112.03_reguläre_sprachen definiert haben!

[!Attention] reguläre Sprache regulärer Ausdruck Wir werden herausfinden / wissen, dass die Sprachen, die reguläre Ausdrüçke beschreiben können, die gleiche Menge abdecken wird, die durch reguläre Sprachen - also wenn wir sie mit einem finite state automata darstellen können - abdeckt.

Aus dieser Betrachtung heißt das also, dass wir Regex mit einem Automaten darstellen können! Und das heißt, dass wir sie mit Maschinen umsetzen und verwenden können.

Satz - Regulärer Ausdruck reguläre Sprache

was besagt diese Aussage? #card Eine Sprache ist genau dann regulär, wenn - nur dann tatsächlich - sie durch einen regulären Ausdruck beschrieben wird. ( werden kann). Sie muss durch eine reguläre 112.08_grammatiken beschrieben werden (können). Beweisen kann man diese Struktur durch das Betrachten beider “Richtungen” und daraus lassen sich zwei Lemmata bilden!

Lemma 1 | Sprache durch regex –> ist regulär:

[!Lemma] Lemma 1 | Sprache durch regex –> ist regulär: Wenn eine Sprache durch einen regulären Ausdruck beschrieben wird, dann ist sie regulär!, also

Konstruktion von RegEx zu NFA | DFA

Beweis | Sprache durch regrex beschrieben -> regulär

Dafür hat Kleene einen entsprechenden Beweis geliefert:

Es wird eine strukturelle Induktion angewandt:

Induktionsanfang: IA: Alle Sprachen der Länge Falls -> also wir können einen Automat konstruieren, der die Regex erkennt! Folgend etwa: Ist , dann gilt nach Definition - die wir zuvor betrachtet haben - und ferner gibt es einen Automat, der als Regex erkennen kann. Folgend etwa; Falls dann gilt nach Definition und wir können wieder einen Automat beschreiben, der die Regex erkennt. Folgend etwa:

Konstruieren wir ferner die Induktionsannahme:

Induktionsannahme: Sei jetzt reguläre Ausdrücke, für die wir bereits FAs konstruiert haben - kennen.

Induktionsschluss: Mit der Grundlage der vorherigen FAs für die grundlegenden Strukturen von - Regex - können wir jetzt für folgende Strukturen andere FAs konstruieren (durch elementare Operationen):

  • , denn ist under abgeschlossen!
  • weil unter abgeschlossen ist!
  • , denn ist under abgeschlossen. –> Daraus folgt dann ferner: !

Lemma 2 | Sprache ist regulär –> die die Sprache beschreibt.

[!Lemma] Lemma 2 | Sprache ist regulär –> die die Sprache beschreibt. Wenn eine Sprache regulär ist, dann wird sie durch einen regulären Ausdruck beschrieben.

Beweisidee | Sprache ist regulär –> die die Sprache beschreibt.

[!concept] Konzeptueller Beweis: Als Konzept möchten wir den Automaten so aufteilen, dass wir sie in klein klein Regex aufsplitten können und so dann viele kleine RegEx für eine Verbindung von bilden ( das soll für alle Paare gelten!) und dadurch kann man die einzelnen Teile damit darstellen. Anschließend muss man jetzt diese einzelnen RegEx nachfolgend verknüpfen, um daraus den entsprechenden Ausdruck bilden zu können

Sei dafür jetzt ein Automat, der eine Sprache erkennt: Ohne Beachtung des Allgemeinen: Der Automat hat folgende Zustände Wir möchten jetzt zwei beliebige Zustände anschauen ( ). Wir suchen jetzt alle Worte mit denen von übergeht (also wir schauen, welche Wörter diesen beschriebenen Übgergang aufweisen/haben). Das ist durch eine Induktion möglich: Betrachten wir dafür die Menge von Zwischenzuständen bei dem Übgergang von . Für den Anfang: und somit suchen wir nur die Worte mit direktem Übergang von ( diese Beschreiben ferner eine Klasse von Wörtern: ) –> wir wollen jetzt die Menge aller Klassen finden, die quasi Wörter mit bis zu Übergängen akzeptiert. Ferner also: Aus dieser Betrachtung können wir jetzt ferner die Sprache konstruieren: Also die obig benannte Menge an Übergängen, um Worte von Zustand beschreiben zu können! Ferner können wir die Menge von Wörtern, also die Sprache, die der Automat erkennt folgend zusammenfassen: Wir beschreiben mit diesem Term also den regulären Ausdruck, der den Automaten darstellen/beschreiben kann. Das beschreibt die konzeptuelle Idee hinter dem Beweis dieser Äquivalenz, jedoch müssen / wollen wir es entsprechend formalisieren!

Beweis | Sprache ist regulär –> die die Sprache beschreibt.

Aus vorheriger Betrachtung haben wir nun wieder einen Automaten der eine Sprache erkennen kann. Wir definieren wieder Ohne Beachtung der Allgemeinheit die Zustände als Zustände des Automaten - es ist quasi egal, wie wir sie da definieren / bezeichnen.

Wir können nun induktiv die einzelnen regulären Ausdrücke konstruieren, die folgende Eigenschaft einhalten:

[!Important] Voraussetzung: Wir setzen also eine Voraussetzung, das wir ein Wort betrachten, welches ein Präfix, was nicht leer und weiter nicht gleich dem Wort selbst ist, aufweist, und sagen dafür aus, dass die erweiterte Übergangsfunktion vom Start zu diesem Präfix kleiner als die Menge an Zustandssprüngen, die wir erlauben ist. Also

Unter dieser Betrachtung können wir nun den Anfang der Induktions beschreiben: Induktionsanfang: Sei dafür , also wir haben keinen Zwischenzustand zwischen den Übergängen, also wir betrachten nur die direkten Übergänge von Wir betrachten zwei Fälle:

  • Sei .Falls es einen direkten Link von gibt, seien dann die Buchstaben auf diesem direkten Link ( die also den direkten Übergang ermöglichen!) Dann können wir jetzt als die “Reguläre Expression” setzen, um von diesen Punkt zum nächsten zu kommen! (Also wir sagen aus, was es brauch um von einem Punkt zum nächsten zu kommen. Dabei sind die erlaubten Symbole als eine Vereinigung zu betrachten, um so die RegEx bilden zu können!) Wenn es keinen direkten Link gibt, setzen wir
  • Sei jetzt . Falls es einen direkten Link - zu sich selbst, also ein Cycle - gibt, seien dann die Buchstaben auf diesem Link ( die den Übergang erlauben!) Wir können jetzt wieder die Regex beschreiben mit : Wenn es keinen direkten Link gibt, setzen wir ferner einfach Aus dieser initialen Betrachtung ist die obige Voraussetzung erfüllt:

Induktionsannahme: Seien jetzt alle so konstruiert, dass dann die Voraussetzung erfüllt wird.

Induktionsschritt: Aus dem obigen Anfang und der Annahme können wir jetzt folgende Konstruktion durchsetzen: Wir konstruieren jetzt für alle Kombinationen von die entsprechenden Mengen folgend: (Also wir konstruieren die nächste Menge indem wir zuvor bekannte Menge von Sprüngen von betrachtet haben und für die nächsten Sprünge werden wir also einfach die alten Zustände nehmen und den neuen Pfad konstruieren, indem wir von dem alten Zustand über den neuen Zustand, also zu unserem Zielzustand springen, also Dadurch lässt sich jetzt der neue Sprung beschreiben). Grafisch folgende Idee:

Durch dies Struktur wird jetzt die Konstruktion erfüllt und wir können den Automaten als eine Regex darstellen!


((Alternativer Beweis, den man in Sippser finden kann!)) Dafür definiert man in dem Kontext dann einen GNFA - generalisierter nichdeterministischer endlicher Automat.

Betrachten wir dafür noch ein Beispiel:

Beispiel der Anwendung | Automat als RegeEx

betrachten wir folgenden Automaten:

stateDiagram-v2
	Direction LR
[*] --> 1
1 --> 1:a,b
1 --> 2:b
2 --> 3:a,b
1 --> 3:b

Wir können jetzt hier mit Also wieder die Verbindung aus dem alten Zuständen mit einem bestimmten mit den neuen Zuständen, die von den alten ausgehen und dann aber ein anderes Ziel anstreben.

Dafür müssen wir jetzt also einfach alle möglichen Kombinationen berechnen und anschließend vereinigen!:

Damit können wir jetzt die volle Vereinigung erzeugen: Wir haben hier jetzt alle möglichen Übergänge vom Anfangs zum Zielzustand beschrieben, und dabei alle möglichen Kombinationen betrachtet und vereinigt!

[!Tip] Wenn wir hier von “Unter Verwendung von ” beschrieben mit meinen wir, dass wir über einen bestimmten Zustand traversieren möchten!. Der Pfad von muss also über Sprünge verlaufen! Das fordert die Konstruktion dieser RegEx!

Definition | GNFA = Generalisierter nichtdeterministischer endlicher Automat

Im Beweis von Kleenes Algorithmus - [Satz - Regulärer Ausdruck reguläre Sprache](#Satz%20-%20Regulärer%20Ausdruck%20%20reguläre%20Sprache) - ist die generalisierte Übergangsfunktion sehr wichtig/ zentral. Wir können diese unter der Definition eines Generalisierten nichtdeterministischen endlichen Automaten formaler präziser beschreiben.

Wir werden GNFAs folgend so definieren, dass sie keine Übergänge auf haben und somit auch keine Übergänge von wegen haben werden. Sonst haben sie von jedem Zustand zu einem anderen einen Übergang!

[!Definition] GNFA Wir beschreiben einen generalisierten nichtdeterministischen endlichen Automaten (GNFA) wieder mit einem 5-Tupel:

wobei wir folgend beschreiben: endliche Menge von Zuständen Alphabet ist die Übergangsfunktion mit folgender Definition: Ferner beschreiben wir mit den Start und Endzustand

Besonderheit Übergangsfunktion:

Die Definition von legt fest, dass wir, wie obig beschrieben, keinen Pfeil, der zum Start zeigt und keinen Pfad der vom Ende wegzeigt haben werden.

Die Übergänge werden mit REGEX, als regulären Ausdrücken beschrieben!

Berechnung |

Wir möchte noch anschauen, wann ein GNFA ein Wort akzeptiert oder nicht:

[!Important] | Berechnung Wir sagen, dass ein GNFA ein Wort mit genau dann akzeptiert, wenn es eine Folge von Zuständen gibt, von sodass:

  • Also ist in der Sprache des regulären Ausdrucks ( der den Übergang beschreibt!) des Übergangs von

Folgerungen aus GNFAs |

Wir möchten jetzt zeigen, warum jeder DFA zu einem GNFA überführt werden kann:

Man kann mit GNFAs wieder zeigen, dass eine reguläre Sprache - als Automat - mit einer RegEx dargestellt werden kann. (Also genau diese Übertragung von DFA( hat Automat!) zu GNFA (hat RegEx in seiner Übergangsfunktion))

[!Important] Ansatz zur Überführung:

  1. Füge einen neuen Startzustand hinzu, der mit einem -Übergang auf den alten Startzustand zeigt. - denn
  2. Füge einen neuen Endzustand hinzu, von dem alle alten Endzustände mit -Übergängen erreicht werden ( ähnlich zu Aufgabe 4a)
  3. Wir ersetzen jetzt alle Übergänge durch reguläre Ausdrücke. Übergänge mit mehrerenBuchstaben werden dann durch eine vereinigung von Regex, als dargestellt. Übergänge mit nur einem Buchstabe übernehmen diesen (ist ja immernoch Regex)
  4. Wir fügen alle fehlenden Übergänge hinzu und markieren sie mit (also quasi die nicht relevanten Übergänge, damit alles abgedeckt wird). Durch diesen Schritt wird die Sprache von nicht verändert, da solche Übergänge nicht genommen werden.

Beweis | Konstruktion GNFA von DFA

[!Tip] Konstruktion von ist formal die Reduktion eines GNFA

Ansatz: Als Beweisidee möchten wir folgend vorgehen: Das können wir diesmal über die Größe des Zustandraumes betrachten und dadurch dann den Automat nach und nach aufteilen und in REG umformen / verkleinern.

Wir wollen hier konzeptuell den Automaten nach und nach verkleinern - bis wir nur noch start und end Zustände haben - und dadurch werden wir die Übergänge immer weiter kombinieren / verdichten, sodass im Endzustand eine einzige Bedingung die als REGEX angibt, wie man vom Start in den Endzustand kommt!

–> In jedem Schritt nehmen wir also einen Zustand heraus und versuchen dann den leeren Übergang - also Kante ohne Knoten als Ziel - in einen anderen Zustand zu mergen und somit auch die Übergangsfunktion dessen zu erweitern bzw so zu adaptieren, dass dann ein Übergang möglich ist.

Wenn ein GNFA genau Zustände hat - den start und endzustand! - dann ist der reguläre Ausdruck dieser Sprache - bzw der von diesem GNFA beschrieben wird - gleich dem Übergang von start zum ende –> danach fertig.

Wenn ein GNFA nun Zustände hat, müssen wir anderweitig verfahren: Wir nehmen einen beliebigen Zustand und “rupfen” diesen jetzt aus dem Automaten. Anschließend reparieren wir ihn so, dass die Kanten zu dem Zustand zusammengefasst in einen anderen Zustand gehen –> wir dafür also eine RegEx basteln. Wir konstruieren hier also

Wie wir bereits aus der vorherigen Betrachtung wissen:

[!Tip] Jede reguläre Sprache wird von einem regulären Ausdruck beschrieben.

Formaler Beweis:

Sei jetzt der DFA, der die Spraceh erkennen kann. Wir wollen jetzt einen äquivalenten GNFA unter Betrachtung der vorherigen Konstruktion bauen:

[!Definition] Wir Verwenden dafür den CONVERT Algorithmus um den regulären Ausdruck zu finden, der die Sprache beschreibt ( also ). wie ist der CONVERT Algorithmus aufgebaut? #card

Sei jetzt folgend: die Zahl der Zustände . Wir betrachten jetzt folgende Fälle:

  1. Falls dann ist . Gebe jetzt den RegEx an. Danach sind wir fertig!
  2. Falls wählen wir einen beliebigen Zustand (ungleich Start/End) . Wir erzeugen jetzt einen GNFA: mit und die Übergangsfunktion wird angepasst: (Eigenschaft, dass start und ende nicht erreicht / verlassen wird) Ferner beschreiben wir hier: Wir setzen weiter und weiterhin (also reduzieren Schritt für Schritt!) Wir Wiederholen jetzt nochmals. Behauptung: Via Induktion zeigen wir, dass unter Anwendung des Algorithmus umgewandelt werden kann und G und das Ergebnis äquivalent sein wird. Für ist die Aussage offentsichtlich.

Sei jetzt , und es gelte die Behauptung für :

  1. Sei ein Wort, das von akzeptiert wird. Dann gibt es eine akzeptierende Folge von Zuständen . Falls diese Folge nicht enthält, dann wird auch von akzeptiert. Falls diese Folge enthält, seien die Nachbarinnen dieses Zustands in der Folge. Dann enthält jetzt eine akzeptierende Regel in entweder direkt oder über . In beiden Fällen wird das Wort von akzeptiert ( wir haben ja den Pfad übernommen und angepasst).
  2. Sei nun umgekehrt ein Wort, dass von akzeptiert wird. Dann gibt es eine akzeptierende Regel in entweder direkt, oder über . Auch hier wird in beiden Fällen von akzeptiert.
  3. Dadurch ist die Äquivalenz gezeigt, wenn man dem Prozedere folgt, um so nach und nach einen Automaten zu transformieren.

Ausblick |

Man sieht hier schon, dass eine unendliche reguläre Sprache trotz ihrer unendlichen Menge von Worten dennoch durch eine RegEx beschrieben werden kann. Das lässt uns ferner herausfinden, dass diese Sprachen dann die Limitierungen von RegEx haben wird –> Beispielsweise nicht zählen kann!

Weiterführende Themen: