David Schirrmeister 195bce294a update
2025-06-15 16:30:49 +02:00

3.7 KiB
Raw Blame History

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

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

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]