diff --git a/Writerside/images/image_920.png b/Writerside/images/image_920.png new file mode 100644 index 0000000..3566d11 Binary files /dev/null and b/Writerside/images/image_920.png differ diff --git a/Writerside/images/image_921.png b/Writerside/images/image_921.png new file mode 100644 index 0000000..c19e763 Binary files /dev/null and b/Writerside/images/image_921.png differ diff --git a/Writerside/images/image_922.png b/Writerside/images/image_922.png new file mode 100644 index 0000000..5b9fab2 Binary files /dev/null and b/Writerside/images/image_922.png differ diff --git a/Writerside/in.tree b/Writerside/in.tree index 05bf5bc..66eb1d8 100644 --- a/Writerside/in.tree +++ b/Writerside/in.tree @@ -149,6 +149,7 @@ + diff --git a/Writerside/topics/04/Theoretische Informatik/05_GrundlagenGrammatiken.md b/Writerside/topics/04/Theoretische Informatik/05_GrundlagenGrammatiken.md index 571b094..7f486c9 100644 --- a/Writerside/topics/04/Theoretische Informatik/05_GrundlagenGrammatiken.md +++ b/Writerside/topics/04/Theoretische Informatik/05_GrundlagenGrammatiken.md @@ -18,7 +18,7 @@ - rekursiv - leeres Wort -## Funktion einer formalen Grammatik +#### Funktion einer formalen Grammatik - Bilden von Wörtern durch Ableitungen - starte mit dem Startsymbol $S$ - solange noch Variablen vorkommen oder man Lust hat: @@ -26,3 +26,50 @@ - das Ergebnis ist eine Zeichenkette $w ∈ Σ^*$ - ein aus $G$ abgeleitetes Wort +## Komplexität von Grammatiken +- Je mehr Variablen links UND rechts stehen, desto schwerer wird es sie zu verstehen + - Dadurch wird auch das Wortproblem schwerer + + +## Übersicht Grammatiken +![image_920.png](image_920.png) + +| Typ | Erlaubte Regeln | Was kann man damit beschreiben? | Beispielregel | Beispielsprache | +|---------------------------|----------------------------------------------------------------|-------------------------------------------------|-------------------------------------------|------------------------------| +| **Regulär (RG)** | A → aB
A → a | Nur ganz einfache Muster, **kein Zählen** | A → aB
B → b | aⁿb (z.B. ab, aab, aaab) | +| **Kontextfrei (CFG)** | A → γ (γ ist beliebige Folge aus Terminals und Nichtterminals) | **Einfache Klammerungen und Zählen** | S → aSb
S → ε | aⁿbⁿ (z.B. ab, aabb, aaabbb) | +| **Kontextsensitiv (CSG)** | αXβ → αwβ (w darf nicht kürzer sein als X) | **Mehr Kontextabhängigkeit, z.B. 3-mal Zählen** | aXb → abb (wenn X zwischen a und b steht) | aⁿbⁿcⁿ (z.B. abc, aabbcc) | + +### Erklärungen: +- **Regulär**: Nur ganz einfache Strukturen – keine verschachtelten oder abhängigen Teile. +- **Kontextfrei**: Kann einfache Paare wie aⁿbⁿ beschreiben (z.B. gleich viele a und b). +- **Kontextsensitiv**: Kann komplexe Abhängigkeiten darstellen – z.B. gleich viele a, b und c. + +## Reguläre Grammatiken +- Einfachste Grammatiken + +### (Rechts-)reguläre Grammatiken +- für alle $ α → β$ aus $R$ gilt + - $ α ∈ V$ + - links steht genau eine Variable + - $ β = u*v$ mit $u ∈ Σ^*, v ∈ V ∪ \{ε\}$ + - rechts steht wenn überhaupt, dann nur genau eine Variable am Ende +- Worte wachsen _von links nach rechts_ + +## Kontextfreie Grammatiken +- Hauptsache α ist ein Teil der Variablen + +## Kontextsensitive Grammatiken +- für alle $ α → β$ aus $R$ AUßER $S→ε\}$ gilt: + - $ α = u * X * v$ mit $u,v ∈(Σ ∪ V)^*$ und $X ∈ V$ + - Symbol nur ersetzen, wenn bestimmte andere Symbole davor und danach stehen + - Symbole davor und danach sind der Kontext + - $ β = u*w*v$ mit $w ∈ (Σ ∪ V)^+$ + - Beim Ersetzen muss das neue Stück mindestens so lang sein wie das alte, also das Wort darf nicht kürzer werden. + - $S$ kommt nicht in $ β$ vor + - S steht nie auf der rechten Seite + +## Monotone Grammatiken +- Wenn $|β| ≥ |α|$ +- Keine Grammatik, die das leere Wort erzeugt ist monoton + diff --git a/Writerside/topics/04/Theoretische Informatik/06_ReguläreSprachen.md b/Writerside/topics/04/Theoretische Informatik/06_ReguläreSprachen.md new file mode 100644 index 0000000..155fe15 --- /dev/null +++ b/Writerside/topics/04/Theoretische Informatik/06_ReguläreSprachen.md @@ -0,0 +1,117 @@ +# Reguläre Sprachen +> Eine Sprache ist dann regulär, wenn der Nerode-Index endlich ist +- Bedeutet auch: + - Für alle NEAs existiert eine reguläre Grammatik + - Für alle regulären Sprachen existiert ein NEA + +## NEA → reguläre Grammatik +- **Gegebener NEA** + - $N=(Σ,Q,q_s,Q_a,δ)$ +- **Definierbare Grammatik** + - $G_N=(Σ,V,S,R)$ + - $V=Q$ + - $S=q_s$ + - $R$ + - Regel `q → x q'` für alle $q,q' ∈ Q, x ∈ Σ$ mit $q' ∈ δ(q,x)$ + - für alle Übergänge, welche in einen anderen Zustand übergehen, wird eine Regel der Form `Ausgangszustand → Übergang Endzustand` formuliert + - Regel `q → ε` für alle $q ∈ Q_a$ + - alle akzeptierenden Zustände erhalten die Regel `Zustand → ε` + - Grammatik darf beendet werden ohne weitere Übergänge + - "Variable einfach entfernen" + + +## Normalisieren einer Grammatik +- Alle Regeln, die mehrere Terminale und eine Variable besitzen (_bspw. V→aaaX, V→abcX_) + - Aufsplitten in mehrere Regeln mit je einem Terminal und einer Variable + - Bspw: + - $V → abcX$ + - wird zu + - $V → aV_1^{(abcX)}$ + - $V_1^{(abcX)} → bV_2^{(abcX)}$ + - $V_2^{(abcX)} → cX$ +- Alle Regeln, die ≥1 Terminale besitzen und keine Variablen (_bspw. V→aab, V→acb_) + - Aufsplitten in mehrere Regeln mit je einem Terminal und einer Variable + - Hinzufügen einer Regel, die zu ε führt + - Bspw: + - $V → abc$ + - wird zu + - $V → aV_1^{(abc)}$ + - $V_1^{(abc)} → bV_2^{(abc)}$ + - $V_2^{(abc)} → cV_3^{(abc)}$ + - $V_1^{(abc)} → ε$ +- Für alle Regeln der Form $V→W$ + - Ersetzen durch $V → β$ für alle Regeln $W → β$ + - Bspw: + - $V → aV | cX | W$ + - $W → bX | ε$ + - wird zu + - $V → aV | cX | bX | ε$ + - $W → bX | ε$ + +## Reguläre Grammatik → NEA +1. Normalisiere Grammatik +2. erstelle NEA + - $Q = V$ + - $q_s = S ∈ Q$ + - $Q_a := \{q ∈ Q | q → ε) ∈ R\}$ + - Alle Variablen, die einen Übergang nach ε haben, sind akzeptierte Zustände + - $ δ$ + - für alle $q, q' ∈ Q$ und $x ∈ Σ$ gilt + - $q' ∈ δ(q,x)$ existiert Regel $q → xq'$ in R + - Terminale werden zu Übergängen + - Nicht-Terminale sind der Zielzustand + +### Beispiel +![image_921.png](image_921.png) + + +## Wortproblem für reguläre Sprachen +### Der natürliche Algorithmus +1. konstruiere NEA +2. konstruiere Potenzmengenautomat A +3. minimiere A und erhalte DEA +4. überprüfe ob DEA Eingabe akzeptiert + +Vorteile: +- einfache, allgemeine Lösung +- Wiederverwendung des DEAs + +Nachteile: +- Punkt 2 ist kostspielig + - exponentiell in Grammatikgröße + - insbesondere für einzelne Eingabe + +### NEA-basierter Algorithmus +1. konstruiere NEA +2. prüfe ob NEA Eingabe akzeptiert + - aktuellen Metazustand merken, weiterrechnen, ... + - ![image_922.png](image_922.png) + +Vorteile: +- kein Potenzmengenautomat + - keine exponentielle Laufzeit + +Nachteile: +- teuer für wiederholtes Wortproblem + - NEA Wortproblem in O(|Q|²*|S|) + - DEA Wortproblem in O(|S|) + +## Reguläre Ausdrücke +> rekursiv definierte Zeichenkette über dem Alphabet $Σ ∪ \{(,),|,.,*\}$ + +- ε ist regulärer (Basis-) Ausdruck +- für jedes $x ∈ Σ$ ist x ein regulärer (Basis-) Ausdruck +- sind α und β reguläre Ausdrücke, dann auch + - $(α | β)$ (α oder β) + - $(α * β)$ (α und β) + - $ (α*)$ (kleensche Hülle (beliebig oft das Zeichen)) +- Zusätzlich erlaubt: + - weglassen des `*` + - weglassen unnötiger Klammern + - kleensche Hülle > Konkatenation > Vereinigung (Hoch vor Punkt vor Strich) +- Zusätzliche syntaktische Merkmale + - $(a)^+$: mind. 1x a + - $(a)^?$: ggf. 1x a + - $[acfw]$: $a | c | f | w$ = a oder c oder f oder w + - $[^acfw]$: nicht eins von denen + - $[1-4]$: [1234] \ No newline at end of file