Conversia unui automat într-o expresie regulată
Vom arăta cum putem converti orice automat finit într-o expresie regulată.
Descrierea algoritmului
La intrare avem un AFN A. Mai întâi îl transformăm într-un AFNG. În a doua fază eliminăm de fiecare dată câte o stare, modificăm corespunzător funcția de tranziție și repetăm până când rămân doar două stări – cea inițială și cea finală. Între ele va exista o tranziție etichetată cu o expresie regulată, iar aceasta este rezultatul întregului algoritm. Tot procedeul constă, așadar, în eliminarea unei stări și în corectarea ulterioară a automatului, astfel încât să obținem un automat echivalent.
Eliminarea unei stări
Cum se elimină o stare, putem vedea pe un exemplu simplu. Presupunem că o parte din automatul nostru arată astfel:
unde Ri sunt niște expresii regulate. Cum ar arăta automatul dacă am elimina starea qr? Ne putem imagina că ne aflăm în starea qi și ne întrebăm ce cuvinte putem genera pe această porțiune. Dacă mergem direct din starea qi în starea qj, vom obține toate cuvintele care corespund expresiei regulate R4.
Dacă însă mergem în starea qr, putem genera cuvinte de forma R1. În starea qr putem rămâne în buclă, după expresia regulată R2, deci putem genera de fapt cuvinte de forma
Acum știm că din această parte a automatului pot rezulta cuvinte de forma R4 sau de forma
Acum putem elimina simplu starea qr și păstra doar cele două stări qi și qj, iar în locul lui R4 scriem expresia tocmai obținută:
Acest procedeu îl aplicăm fiecărei tranziții din fiecare stare qi într-o stare qj, inclusiv buclelor, adică și cazului în care qi = qj.
După eliminarea unei stări obținem un automat echivalent – un automat care recunoaște același limbaj.
Algoritmul complet
La intrare avem un AFN A = ⟨Q, Σ, δ, q0, F⟩.
- Convertim AFN-ul A într-un AFNG Z = ⟨Q′, Σ, δ′, q0′, qf′⟩. În continuare notăm cu k numărul de stări din Z.
- Dacă k = 2, algoritmul se oprește, iar pe tranziția dintre starea inițială și cea finală se află expresia regulată căutată.
- Dacă k>2, alegem o stare oarecare qr, diferită de starea inițială și de cea finală, adică qr ≠ q0′ și qr ≠ qf′. Apoi construim un nou AFNG Z′ = ⟨Q′′, Σ, δ′′,q0′,qf′⟩, pentru care are loc:
și pentru toate qi ∈ Q′′ ∖ {qf′} și pentru toate qj ∈ Q′′ ∖ {q0′} fie unde R1 = δ′(qi,qr), R2 = δ′(qr,qr), R3 = δ′(qr, qj), R4 = δ′(qi, qj). Apoi continuă cu pasul 2.
Exemplu
Fie la intrare acest automat finit:
Mai întâi îl convertim în AFNG (tranzițiile inutile etichetate cu ∅ nu le vom desena):
Acum aplicăm a doua parte a algoritmului și eliminăm o stare. Începem cu starea q2. Eliminăm starea q2 și adăugăm o tranziție din starea q1 în starea qf. Această tranziție o etichetăm cu b(a|b)∗, deoarece din starea q1 ajungem în starea q2 prin cuvinte de forma b, apoi putem rămâne în buclă pentru a|b, ceea ce ne dă (a|b)∗, iar la final trecem în qf printr-o ε-tranziție. Aici are loc b(a|b)∗ϵ = b(a|b)∗. Obținem automatul:
Ne rămâne de eliminat ultima stare, q1. Adăugăm o tranziție din starea qs în starea qf. Cu ce o etichetăm? În starea q1 ajungem printr-o ε-tranziție, pe care o putem omite direct. Apoi putem rămâne în buclă pentru a, deci obținem expresia regulată a∗. Și, în sfârșit, prin tranziția următoare ajungem în qf, așa că expresia o concatenăm cu b(a|b)∗. Tranziția va fi deci etichetată cu expresia regulată a∗ b(a|b)∗.
Automatul are acum doar două stări, deci algoritmul se oprește. Pe tranziție se află expresia regulată căutată.
Surse
- Exemplul și descrierea algoritmului provin din M. Sipser: Introduction to the Theory of Computation
Capitole: Expresii regulate, Din expresie în automat, AFN generalizat, Din automat în expresie