cards-deck: 100-199_university::111-120_theoretic_cs::112_complexity_theory

Deterministische endliche Automaten (DFA)

anchored to 112.00_anchor_overview proceeds from 112.01_Sprachen and leads to 112.02_deterministische_automaten


Overview

Viele Systeme im Alltag haben die Grundidee, dass sie zwischen diversen Zuständen traversieren, etwa weil sie erst einen bestimmten Zustand brauchen, um dann von diesem zu einem anderen übergehen zu können. Einfach Beispiele dafür wären etwa:

  • Waschmaschinen, die zwischen “warten”, spülen, heizen, und öffnen bzw. Ende traversieren -> In diesem Beispiel ist ersichtlich, dass diverse Zustände von anderen abhängig sind bzw nur als Folgerungen von einem zum anderen Zustand springen können.

Konstruieren möchten wir diese Idee dieses Konzept unter Anwendung von Automaten.


Definition

Wir möchten den Automaten als Konstruktion eines Tupels erzeugen / darstellen.

[!Definition] deterministischer endlicher Automat Wir beschreiben einen DFA unter Anwendung eines Tupels folgend:

Was bedeuten die einzelnen Symbole des Tupels? #card

Bedeutungen dieser einzelnen Werte:

  • beschreibt die endliche Menge deren Elemente Zustände genannt werden –> also wir fassen alle Zustände, die unser Automat haben kann zusammen
  • beschriebt die Menge des Alphabets –> dabei wird die Eingabe aus den Symbolen, die das Alphabet definiert, bestehen –> Wort ()
  • beschreibt dabei die ganzen Übergangsfunktionen, also –> die Übergangsfunktion gibt an nach welcher Bedingung wir dann zu einem anderen Zustand springen können (also die Pfeile )
  • beschriebt den Startzustand bei welchem wir starten und dann von diesem zu anderen Zuständen springen können.
  • beschreibt dann die Menge von akzeptierenden Zuständen –> also da, wo unser Automat eine Eingabe dann akzeptieren kann! ^1720638270057

[!Tip] totale Übergangsfunktion Wenn für jeden Zustand und jedes Symbol ( aus dem Alphabet) ein Übergang existiert, dann weist ein DFA folgend eine totale Übergangsfunktion auf.

Was gilt damit dann? #card

Ferner gilt also:

[!Warning] partielle Übergangsfunktionen sind demnach diese, die nicht für alle Symbole eine Übergangsfunktion definiert haben. Also wenn man einen Zustandsautomat aufschreibt, der nicht jede Kombination von Zustand und Symbole (aus dem Alphabet) abdeckt und so “Lücken bestehen”. ^1720638270092

[!Tip] Überführung einer partiellen Übergangsfunkion

Wir können eine partielle Übergangsfunktion relativ einfach in eine totale Übergangsfunktion überführen, indem wir folgend vorgehen:

Welche Schritte müssen wir durchlaufen, um das umzusetzen? #card

Für die Symbole, die noch nicht abgedeckt werden, definieren wir einen Zustand = undefined, sodass dann für die Kombinationen (also (Zustand,Symbol) ) ein Zustand existiert, wohin geleitet wird. Bild

Also einfach gesagt haben wir einfach einen neuen Zustand - der dann den DFA “in sich fängt und nicht mehr herauslässt” - (ein schwarzes Loch!), was alle nicht explizit genannten Übergange in sich beschreibt ^1720638270096

Berechnung eines Automaten

Ferner möchten wir definieren, wie ein Automat ausgewertet und somit dann evaluiert werden kann, ob das Wort akzeptiert wird oder nicht.

Wir wollen entsprechend definieren:

[!Definition] Berechnung (eines Automaten)

Wir nennen jetzt eine Folge von Zuständen die Berechnung des Automaten auf dem Wort wenn gilt:

Welche Zwei Aspekte müssen hierbei gelten? #card

  • - also die Auswertung kann am Startzustand des Automaten starten und dann von da weiter “die Zuständen abhängig von der Übergangsfunktion berechnen”
  • gilt dann für die Elemente der Folge: ( Also der nächste Zustand ergibt sich aus der Anwendung der Übergangsfunktion mit den derzeitigen Zustand und dem nachfolgenden Symbol aus dem Wort) ^1720638270099

Betrachten wir folgendes Beispiel:

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

Wir können daraus folgende Information über den Automaten entnehmen: , , Wir können diesen Sachverhalt auch als Tabelle darstellen:

01
-> lesen können wir die Tabelle so, dass im linken Zustand unter Anwendung der Übergangsfunktion und der Eingabe (Spalten-köpfe, also 0 oder 1) dann folgender nächster Zustand folgen wird.
Also wenn wir etwa im Zustand sind, anschließend als Eingabe haben, dann wird resultieren, wir sind also im entsprechenden Zustand gelandet.

Ferner kann man auch ein Wort dadurch “berechnen”: wäre jetzt hier: ( was kein akzeptierter Zustand ist!) wäre:


erweiterte Übergangsfunktion:

[!Definition] erweiterte Übergagnsfunktion Sei hier wieder eine Übergangsfunktion. Wir definieren die erweiterte Übergangsfunktion folgend:

Wie definieren wir sie? Wozu brauchen wir dieses Konstrukt, was wird uns damit ermöglicht? #card

Damit folgt dann beispielsweise für das leere Wort ( was ja ist) folgend: Wir können damit einfach immer vom Anfang, wo noch kein Wort anliegt ( quasi das leere Wort der einzige “Input” ist) schrittweise das gegebene / neue Wort durchlaufen ( also Buchstabe für Buchstabe bzw Symbol). Also ferner: können wir dann folgend setzen:

(Wir expandieren also die “Auswertung” indem wir immer den zuvor herrschenden Zustand ( welcher ja auch aus der Übergangsfunktion berechnet wird) einsetzen und quasi “rekursiv” agieren).

Hierbei ist etwa der Zustand, der nach der Eingabe von ( wir haben ja konstruiert, was zwei Wörter einfach konkateniert hat!) eintritt ( und dann die Eingabe von folgen wird!)

Wenn jetzt nicht definiert ist, dann setzen wir es auf undefined ^1720638270103

Mit dieser Definition können wir jetzt die Berechnung eines Automaten kompakter darstellen. Also für ein Wort nicht mehr nach und nach die Zustände aufschreiben, sondern mit aufschreiben ( was sich dann in der obigen Definition selbstständig rekursiv aufsplittet und einzelne Berechnungsschritte beschreibt!)

akzeptierte Worte und Sprachen

Hier wird jetzt eine erste Abhängigkeit zu der Idee von 112.03_reguläre_sprachen gesetzt, weil man diese benötigt, um sie zu beweisen ( Die beiden Dinge sind stark miteinander verbunden, in der Betrachtung, dass durch die eine Struktur das andere begründet bzw bewiesen werden kann).

Wir sagen, dass eine Berechnung ein Wort akzeptiert, falls also falls die Berechnung auf das Wort anschließend in einem akzeptierten Zustand enden wird / endet.

Dadurch können wir also eine Menge von Wörtern konstruieren, die unser Automat dann akzeptieren kann/muss. Ferner bildet sich daraus eine Bildungsvorschrift und somit auch eine akzeptierte Sprache!

[!Definition] akzeptierte Sprache eines DFA

Die von einem DFA akzeptierte Sprache - geschrieben: - ist die Menge der Wörter, die von akzeptiert werden.

Wie definieren wir sie demnach? #card

Ferner definieren wir sie dann mit:

Aus der Menge von allen Wörtern, der kleenschen Hülle nehmen wir jetzt die Teilmenge, die “existiert” und zusätzlich vom Automaten erkannt wird. Das bildet dann eine Menge von Wörtern, die eine Sprache bilden kann / wird. ^1720638270106

[!Important] in akzeptiert wird akzeptiert

Sofern eine Berechnung vor Abschluss in den akzeptierenden Zustand ein- und wieder austreten wird, muss sie nicht zwingend akzeptiert werden.

Warum ? (relativ einfach) #card

Es ist wichtig dass der Zustand nach dem letzten Buchstaben akzeptierend sein muss, sonst wird das Wort nicht akzeptiert.

Folgend ein Beispiel: Betrachte das Wort , was in dem folgenden Automat eine bestimmte Abfolge von Zuständen einnehmen wird / kann. Es wird hier nicht akzeptiert und ist somit nicht valide, obwohl es “mal in einem akzeptierten Zustand war” Der Automat dazu:

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

^1720638270109

Zusammenhang von Sprachen und Automaten

Wir sehen hier jetzt schon, dass scheinbar eine gewisse Abhängigkeit zwischen diesen beiden Konstrukten gefunden werden kann.

Wir können sagen, dass ein Automat eine Sprache identifizieren kann, dadurch definiert, welche Worte dieser akzeptieren kann. Also: (Alle Worte, die in der Ausführung mit der Übergangsfunktion einen akzeptierten Zustand haben werden). –> beschreibt ferner also die Sprache, die der Automat “sprechen kann”, bzw. die Sprache, bei welcher jedes Wort akzeptiert wird.

[!Question] Gibt es für jede Sprache einen Automaten, der sie spricht/sprechen kann?

Falls nicht, wie sieht die Sprache dann aus?

Grundsätzlich werden wir jede reguläre Sprache erkennen können, also solche, die man mit einem endlichen, deterministischen Automaten bestimmen / definieren kann.

Da diese deterministischen Automaten beispielsweise keinen Speicher haben, werden also Evaluierungen, ob etwa mit gleichem existiert nicht ganz möglich sein, weil das der Automat nicht einfach zählen kann! (das wird dann die theo2_TuringMaschineBasics können!)

Da hier die Bindung zu regulären Sprachen sehr hoch ist, wird das der nächste Schwerpunkt sein: 112.03_reguläre_sprachen