Omzetting van een automaat naar een reguliere expressie
We laten zien hoe je een willekeurige eindige automaat omzet naar een reguliere expressie.
Beschrijving van het algoritme
De invoer is een NFA A. Eerst maken we er een GNFA van. In de tweede fase verwijderen we in elke stap één toestand, passen we de overgangsfunctie op de juiste manier aan en herhalen we dat tot er nog maar twee toestanden overblijven — de begin- en de eindtoestand. Daartussen loopt een pijl met als label een reguliere expressie, en die is het resultaat van het hele algoritme. De hele werkwijze bestaat dus vooral uit het verwijderen van een toestand en het daaropvolgend herstellen van de automaat, zodat we een equivalente automaat krijgen.
Het verwijderen van één toestand
Hoe je één toestand verwijdert, kunnen we laten zien aan een eenvoudig voorbeeld. Stel dat een deel van onze automaat er zo uitziet:
waarbij Ri reguliere expressies zijn. Hoe zou de automaat eruitzien als we toestand qr verwijderden? We kunnen het ons zo voorstellen dat we in toestand qi zitten en ons afvragen welke woorden we op dit stuk allemaal kunnen genereren. Als we vanuit toestand qi rechtstreeks naar toestand qj gaan, zijn dat alle woorden die overeenkomen met de reguliere expressie R4.
Gaan we echter naar toestand qr, dan kunnen we woorden van de vorm R1 genereren. In toestand qr kunnen we echter rondlopen voor de reguliere expressie R2, dus eigenlijk kunnen we woorden van de vorm
Nu weten we dat uit dit deel van de automaat woorden van de vorm R4 of van de vorm
Nu kunnen we toestand qr eenvoudig verwijderen en alleen de twee toestanden qi en qj laten staan, en in plaats van R4 schrijven we de zojuist berekende reguliere expressie:
Deze werkwijze passen we toe op elke pijl vanuit elke toestand qi naar een toestand qj, inclusief lussen, dus ook in het geval dat qi = qj.
Na het verwijderen van één toestand krijgen we een equivalente automaat — een automaat die dezelfde taal herkent.
Het hele algoritme
De invoer is een NFA A = ⟨Q, Σ, δ, q0, F⟩.
- We zetten de NFA A om in een GNFA Z = ⟨Q′, Σ, δ′, q0′, qf′⟩. Met de letter k geven we hierna het aantal toestanden in Z aan.
- Als k = 2, stopt het algoritme en staat op de pijl tussen de begin- en de eindtoestand de resulterende reguliere expressie.
- Als k>2, kiezen we een willekeurige toestand qr die verschilt van de begin- en de eindtoestand, dus qr ≠ q0′ en qr ≠ qf′. Vervolgens maken we een nieuwe GNFA Z′ = ⟨Q′′, Σ, δ′′,q0′,qf′⟩ waarvoor zal gelden:
en voor alle qi ∈ Q′′ ∖ {qf′} en voor alle qj ∈ Q′′ ∖ {q0′} laat waarbij R1 = δ′(qi,qr), R2 = δ′(qr,qr), R3 = δ′(qr, qj), R4 = δ′(qi, qj). Ga verder met stap 2.
Voorbeeld
Neem als invoer deze eindige automaat:
Eerst zetten we hem om in een GNFA (onnodige ∅-overgangen tekenen we niet):
Nu passen we het tweede deel van het algoritme toe en verwijderen we een knoop. We beginnen met knoop q2. We verwijderen knoop q2 en voegen een overgang toe van toestand q1 naar toestand qf. Deze overgang labelen we met b(a|b)∗, want vanuit knoop q1 komen we in toestand q2 voor woorden van de vorm b, dan kunnen we rondlopen voor a|b, zo krijgen we (a|b)∗ en tot slot gaan we met behulp van de epsilonregel naar qf. Daarbij geldt b(a|b)∗ϵ = b(a|b)∗. We krijgen de automaat:
We hoeven alleen nog de laatste toestand, q1, te verwijderen. We voegen een pijl toe van toestand qs naar toestand qf. Hoe labelen we die? Naar toestand q1 komen we via de epsilonregel, die kunnen we meteen weglaten. Dan kunnen we rondlopen voor a, dus we krijgen de reguliere expressie a∗. En tot slot komen we via de pijl in qf, dus de expressie concateneren we nog met b(a|b)∗. De pijl labelen we dus met de reguliere expressie a∗ b(a|b)∗.
De automaat heeft nog maar twee toestanden, dus het algoritme stopt. Op de pijl staat de resulterende reguliere expressie.
Bronnen
- Het voorbeeld en de beschrijving van het algoritme zijn afkomstig uit M. Sipser: Introduction to the Theory of Computation
Hoofdstukken: Reguliere expressies, Omzetting van een reguliere expressie naar een automaat, Gegeneraliseerde niet-deterministische eindige automaat, Omzetting van een automaat naar een reguliere expressie