✖

Automata átalakítása reguláris kifejezéssé

Megmutatjuk, hogyan alakíthatunk át tetszőleges véges automatát reguláris kifejezéssé.

Az algoritmus leírása

A bemeneten van egy NVA-nk, jelöljük A-val. Először belőle ÁNVA-t csinálunk. A második fázisban minden lépésben elhagyunk egy állapotot, megfelelően módosítjuk az átmeneti függvényt, és ezt addig ismételjük, amíg csak két állapot marad – a kezdő- és a végállapot. Köztük egy él fut, amelynek a címkéje egy reguláris kifejezés, és ez lesz az egész algoritmus eredménye. Az egész eljárás tehát főként egy állapot elhagyásából áll, majd az automata olyan kijavításából, hogy ekvivalens automatát kapjunk.

Egy állapot elhagyása

Hogyan hagyunk el egy állapotot, azt egy egyszerű példán szemléltethetjük. Tegyük fel, hogy az automatánk egy része így néz ki:

ahol az Ri valamilyen reguláris kifejezések. Hogyan nézne ki az automata, ha elhagynánk a qr állapotot? Képzeljük el, hogy a qi állapotban vagyunk, és azt kérdezzük: milyen szavakat tudunk előállítani ezen a szakaszon? Ha a qi állapotból egyenesen a qj állapotba megyünk, akkor ezek mind az R4 reguláris kifejezésnek megfelelő szavak.

Ha viszont a qr állapotba megyünk, akkor R1 alakú szavakat állíthatunk elő. A qr állapotban azonban az R2 reguláris kifejezés szerint körözhetünk is, vagyis tulajdonképpen R1∘(R2∗) alakú szavakat állíthatunk elő. És mivel a qr állapotból még el is juthatunk a qj állapotba, ehhez hozzávesszük az R3 reguláris kifejezést is. Ezen az úton tehát összesen R1∘(R2∗)∘R3 alakú szavakat kaphatunk.

Most már tudjuk, hogy az automata ezen részéből R4 alakú vagy R1∘(R2∗)∘R3 alakú szavak keletkezhetnek. Ezt természetesen felírhatjuk reguláris kifejezésként is: (R4)|(R1∘(R2∗)∘R3).

Most már egyszerűen elhagyhatjuk a qr állapotot, csak a qi és a qj állapot marad, és az R4 helyére éppen a kiszámított reguláris kifejezést írjuk:

Ezt az eljárást elvégezzük minden qi állapotból minden qj állapotba vezető éllel, a hurkokat is beleértve, vagyis azt az esetet is, amikor qi = qj.

Egy állapot elhagyása után ekvivalens automatát kapunk – olyan automatát, amely ugyanazt a nyelvet ismeri fel.

A teljes algoritmus

A bemeneten van egy NVA: A = ⟨Q, Σ, δ, q0, F⟩.

  1. Az A NVA-t átalakítjuk a Z = ⟨Q′, Σ, δ′, q0′, qf′⟩ ÁNVA-vá. A továbbiakban k jelöli a Z állapotainak számát.
  2. Ha k = 2, az algoritmus véget ér, és a kezdő- és a végállapot közötti élen van a végeredményül kapott reguláris kifejezés.
  3. Ha k>2, választunk egy tetszőleges qr állapotot, amely különbözik a kezdő- és a végállapottól, azaz qr ≠ q0′ és qr ≠ qf′. Ezután létrehozunk egy új Z′ = ⟨Q′′, Σ, δ′′,q0′,qf′⟩ ÁNVA-t, amelyre igaz: Q′′=Q′∖{qr} és minden qi ∈ Q′′ ∖ {qf′} és minden qj ∈ Q′′ ∖ {q0′} esetén legyen δ′′(qi,qj)=(R4)|(R1(R2∗)R3), ahol R1 = δ′(qi,qr), R2 = δ′(qr,qr), R3 = δ′(qr, qj), R4 = δ′(qi, qj). Ezután folytasd a 2. lépéssel.

Példa

Legyen a bemeneten ez a véges automata:

Először átalakítjuk ÁNVA-vá (a felesleges ∅-átmeneteket nem ábrázoljuk):

Most alkalmazzuk az algoritmus második részét, és elhagyunk valamelyik csúcsot. Kezdjük a q2 csúccsal. Elhagyjuk a q2 csúcsot, és felveszünk egy átmenetet a q1 állapotból a qf állapotba. Ezt az átmenetet b(a|b)∗-gal címkézzük, mert a q1 csúcsból a q2 állapotba b alakú szavakkal jutunk, ott aztán az a|b szerint körözhetünk, így megkapjuk az (a|b)∗ kifejezést, végül az epszilon-átmenettel átlépünk a qf állapotba. Közben igaz, hogy b(a|b)∗ϵ = b(a|b)∗. Ezt az automatát kapjuk:

Már csak az utolsó állapotot kell elhagynunk, a q1-et. Felveszünk egy élt a qs állapotból a qf állapotba. Mivel címkézzük? A q1 állapotba epszilon-átmenettel jutunk, ezt rögtön elhagyhatjuk. Aztán körözhetünk az a szerint, így megkapjuk az a∗ reguláris kifejezést. Végül az élen át eljutunk a qf állapotba, vagyis a kifejezést még összefűzzük a b(a|b)∗ kifejezéssel. Az élt tehát az a∗ b(a|b)∗ reguláris kifejezéssel címkézzük.

Az automatának már csak két állapota van, tehát az algoritmus véget ér. Az élen van a végeredményül kapott reguláris kifejezés.

Források

Fejezetek: Reguláris kifejezések, Reguláris kifejezés átalakítása automatává, Általánosított nemdeterminisztikus véges automata, Automata átalakítása reguláris kifejezéssé