This commit is contained in:
David Schirrmeister
2025-06-15 16:30:49 +02:00
parent ecc7ab358e
commit 195bce294a
6 changed files with 166 additions and 1 deletions

View File

@ -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]