3.7 KiB
3.7 KiB
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 alleq,q' ∈ Q, x ∈ Σ
mitq' ∈ δ(q,x)
- für alle Übergänge, welche in einen anderen Zustand übergehen, wird eine Regel der Form
Ausgangszustand → Übergang Endzustand
formuliert
- für alle Übergänge, welche in einen anderen Zustand übergehen, wird eine Regel der Form
- Regel
q → ε
für alleq ∈ Q_a
- alle akzeptierenden Zustände erhalten die Regel
Zustand → ε
- Grammatik darf beendet werden ohne weitere Übergänge
- "Variable einfach entfernen"
- alle akzeptierenden Zustände erhalten die Regel
- Regel
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
- Bspw:
- Aufsplitten in mehrere Regeln mit je einem Terminal und einer Variable
- 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)} → ε
- Bspw:
- Für alle Regeln der Form
V→W
- Ersetzen durch
V → β
für alle RegelnW → β
- Bspw:
V → aV | cX | W
W → bX | ε
- wird zu
V → aV | cX | bX | ε
W → bX | ε
- Bspw:
- Ersetzen durch
Reguläre Grammatik → NEA
- Normalisiere Grammatik
- 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
undx ∈ Σ
giltq' ∈ δ(q,x)
existiert Regelq → xq'
in R- Terminale werden zu Übergängen
- Nicht-Terminale sind der Zielzustand
- für alle
Beispiel
Wortproblem für reguläre Sprachen
Der natürliche Algorithmus
- konstruiere NEA
- konstruiere Potenzmengenautomat A
- minimiere A und erhalte DEA
- ü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
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)
- weglassen des
- 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]