date-created: 2024-04-18 02:58:15 date-modified: 2024-07-10 09:21:28

Reguläre Sprachen |

anchored to 112.00_anchor_overview requires 112.02_deterministische_automaten


Reguläre Sprachen | REG

reguläre Sprachen sind Teilmengen von der kleenschen Hülle, bei welchen wir einen 112.02_deterministische_automaten finden können, der diese Sprache akzeptieren kann! Also

[!Definition] Ferner heißt dann die Menge aller regulären Sprachen heißt

(tatsächlich kann man auch noch anders definieren, was sie so interessant macht, weil dadurch Abhängigkeiten zwischen den einzelnen Definitionen möglich werden ( also wenn das eine geht, das andere auch, kann man womöglich eine transitive Betrachtung anstellen))

[!Example] leere Sprache (regulär?)

ist sie regulär? Warum(nicht)? #card

Die Sprache ist regulär, denn wir können einen DFA bilden, sodass nur das leere Wort akzeptiert wird.

stateDiagram-v2
  [*] --> [q0]
  [q0] --> [u]: 0,1

Wichtig ist, dass alle anderen Eingaben nicht akzeptiert werden dürfen. Also wäre folgender Automat nicht ganz richtig ( zumindest wenn wir totale Übergangsfunktionen voraussetzen):

stateDiagram-v2
[*] --> [q0]

-> denn es wird jedes Wort akzeptiert, weil wir uns von dem Endzustand nicht mehr wegbewegen können / werden

Auch die leere Menge wäre eine reguläre Sprache, weil wir einen Automat definieren können, der direkt nichts akzeptiert (bzw nie etwas akzeptiert).

[!Important] endliche Sprachen sind immer regulär.

Warum? #card

Weil wir jetzt einen Automaten bauen können, sodass wir dann für jedes Symbol des Alphabets einen weiteren /nächsten Zustand finden bzw. definieren können.

Diesen Automaten kann man sich als Baum vorstellen, in welchem dann nach in jeder Höhe alle Symbole abgedeckt werden. Man sieht dabei auch, dass sie sehr schnell groß werden würden ( und das macht sie nicht so cool xd)

Wenn wir uns die Regulären Sprachen anschauen, möchten wir schauen, ob wir sie mit mathematischen Operationen ausstatten können und ferner damit bestimmte Operationen möglich sind.

Abgeschlossenheit von unter Komplementbildung

Wir möchten einfach annehmen, dass abgeschlossen ist, unter Komplementbildung. Also wir behaupten, dass wenn eine reguläre Sprache über ist, dann muss auch

Also wir können zu irgendeiner Sprache ( ) einen deterministischen endlichen Automaten betrachten und ferner dann überlegen, wie wir die komplementäre Sprache darstellen können.

Beweis

[!Beweis]

Wir behaupten, dass wenn eine reguläre Sprache über ist, dann muss auch

Was wäre ein Ansatz das zu zeigen, wie würden wir dabei vorgehen? #card

Die Grundlegende Idee, um das zu zeigen, möchte wir folgend aufstellen:

Wir können einfach die akzeptierenden Zustände und die nicht akzeptierenden Zustände aus unserem Automaten - der sonst die Sprache akzeptieren kann - setzen, weil dann genau das Komplement der Sprache erkannt werden kann. ( Das geht nur , wenn total ist, sonst könnten da Probleme bzw _zu wenige Zustände entstehen und somit nicht die ganze Sprache erkannt werden.)

Wir folgern aus der Idee jetzt:

Da ein DFA der dann akzeptieren kann.

-> Wir können daher dann einen neuen Automaten definieren: wobei hier dann also die akzeptierten Zustände ist

-> Dabei ist dann eine tatsächliche Teilmenge von ! Denn wir haben ja jetzt einfach alle Zustände genommen, die zuvor nicht akzeptierend waren und sie als “akzeptierend angesetzt”.

Es folgt jetzt hieraus entsprechend:

Abgeschlossenheit der Vereinigung ()

[!Req]

Wir möchten ferner auch noch annehmen, dass abgeschlossen ist unter der Vereinigung.

Seien dabei also: , dann möchten wir herausfinden, ob (bzw. dass!)

Wie würden wir dabei vorgehen, um das zu zeigen? #card

Die Vereinigung deutet hier darauf hin, dass wir einen kombinierten Automaten bauen können / wollen, der sowohl die Wörter aus dem einen und dem anderen Automaten - weil wir können die Sprachen ja als Automat darstellen - akzeptieren kann / soll.

Wir möchten also zwei Automaten zu einem neuen bauen und dafür für die vorhandenen Sprachen die Automaten definieren:

Gegeben ist also: und somit existieren DFAs, die diese beschreiben:

Um jetzt herauszufinden, welcher der Automaten ein eingegebenes Wort akzeptieren könnte, müssen wir sie irgendwie kombinieren.

Dieses zusammenbasteln wird schnell komplex, weil man von jedem Zustand zu einem anderen aus dem anderen Automaten switchen kann / teils muss, was schwer ist.

-> Das nacheinander Ausführen ist nicht möglich, denn dann müssten wir uns die Eingabe merken, erst in dem ersten und danach im zweiten Automaten berechnen, weil jeder Automat ja die Eingabe “verspeist”.

(Weiterhin wäre bei so einer Nacheinanderausführung dann der Zustandsraum unendlich), weil es unendlich viele Worte gibt.

Einfacher ist dabei: wir führen beide Automaten parallel aus, um dann entsprechend eine Entscheidung treffen zu können, ob wir jetzt einen akzeptierten Zustand “irgendwo” erreicht haben, oder nicht.

Dafür bauen wir jetzt einen Produktautomaten auf, der genau diese Eigenschaft erfüllen kann. Dieser Automat hat jetzt alle möglichen Zustandspaare der beiden Automaten, also

[!Tip] Größe der Zustände bei Produktautomat? #card

Größe der Zustände wobei jeweils die akzeptierenden Zustände der Automaten sind.

Wichtig hier ist dabei, bzw das was wir sehen können: -> Wir wollen am Ende nur die akzeptierten Zustände des Automaten betrachten bzw in der Konstruktion dessen nur diese brauchen, wo mindestens ein akzeptierender Zustand dabei ist –> also nur bei der Vereinigung, da es hier die Bildungsvorschrift ist!


Anleitung | Produktautomaten

Wir möchten die Idee jetzt unter Konstruktion des angesprochenen Produktautomaten beweisen.

Gegeben ist also: und somit existieren DFAs, die diese beschreiben:

Wir definieren jetzt den Produktautomaten wie folgt: -> Übergangsfunktion: Wenn hier in einem der beiden Alphabete nicht definiert ist, dann ersetzen wir es mit “undefined”, also geben einen nicht definierten Zustand als Alternative an, um dennoch beides bilden zu können.

Wir sehen weiter, dass wir sonst die Grundlagen -> also Zustände, Alphabete, Startzustände zusammenlegen, um dann den Automaten zu definieren.

[!Tip] Endzustände Die Endzustände sind hier so definiert, dass man immer die vorhandenen Endzustände eines Automaten () mit allen anderen Zuständen des anderen Automaten kreuzt. –> Denn bei der Vereinigung möchten wir alles akzeptieren, was mit dem ersten und auch dem zweiten Automaten akzeptiert wird.

Wir können jetzt diese Definition an die erweiterte Übergangsfunktion knüpfen und müssen beweisen, dass dann die Grundidee - das Anzeigen einer Berechnung für ein Wort über diese weiterhin funktioniert!

Wir behaupten dafür folgend: gilt dann jetzt: -> also wir können diese Umsetzung aufsplitten, sodass der Prozess für beide gleichzeitig durchgeführt wird und am Ende die Tupel der akzeptierten Zustände erreicht werden kann.

Auch das können wir wieder unter Anwendung der Induktion beweisen ( wie es bei der “normalen” Übergangsfunktion funktionierte).

Damit hat man die Umformung, muss aber noch entsprechend anpassen!

-> Wir haben definiert, dass immer dann ein Wort akzeptiert, genau wenn es akzeptieren.

o.B.d.A gilt dann, wenn , folgendes: (Also hier ) beispielsweise ein akzeptierender Zustand im ersten Teil, also getroffen, weil dieses Wort akzeptiert. (Selbiges gilt dann auch für )

Wir möchten ferner noch ein Beispiel dazu betrachten: Seien dafür zwei Automaten gegeben:

stateDiagram-v2
[*] --> s1
s1 --> [s2]:0,1
[s2] --> s1:0,1
[**] --> q1
q1 --> [q3]: 0
q1 --> q2:1
q2 --> q1:0
q2 --> [q3]:1
[q3] --> [q3]:0,1

Wir wissen, dass wir hier jetzt beim neuen Automaten Zustände haben können, die wir betrachten müssten. Weiter sehen wir aber auch, dass es Zustände geben wird, wo beide nicht akzeptieren ( und wir somit die anderen weglassen könnten)

Das macht man sich am einfachsten via Tabelle klar:

Zustand
Aus der Definition sehen wir aber, dass nur Dinge mit und “drin” ein akzeptierter Zustand sind
Daraus folgt jetzt folgender Automat:
stateDiagram-v2
[*] --> (s1,q1)
(s1,q1) --> [(s2,q3)]:0
(s1,q1) --> [(s2,q2)]:1
[(s2,q2)] --> (s1,q2):0
[(s2,q2)] --> [(s1,q3)]:1
[(s2,q3)] --> [(s1,q3)]:0,1
[(s1,q3)] --> [(s2,q3)]:0,1

Abgeschlossenheit des Schnitts und Differenz ()

Wir behaupten jetzt: Seien Dann sind auch und ferner auch

Beweisidee:

Wir könnten ähnlich, wie bei [Abgeschlossenheit der Vereinigung ()](#Abgeschlossenheit%20der%20Vereinigung%20()) die akzeptierenden Zustände anpassen und dadurch die Idee neu konstruieren. (Wenn man nur verändert, muss man die Induktion nicht nochmal beweisen, da das unabhängig davon agiert / funktioniert)

Alternativ könnte man das auch über Mengenlehre betrachten und lösen:

Möglicher Beweis (Mengenlehre)

Mittels Umformungen (boolesche Umformungen) gilt: ( und weil wir die Vereinigung schon gezeigt haben!) ist somit auch regulär!

Alternativ können wir wieder einen Produktautomaten konstruieren, der dann akzeptiert. Hierbei unterscheidet sich zum Beweis nicht viel, bis auf die akzeptierten Zustände: -> es müssen also beide Automaten akzeptieren, damit der neue Zustand des Tupels akzeptiert!