✖

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 R1∘(R2∗). Și, pentru că din starea qr mai putem trece în starea qj, adăugăm la final expresia regulată R3. În total, pe acest drum obținem cuvinte de forma R1∘(R2∗)∘R3.

Acum știm că din această parte a automatului pot rezulta cuvinte de forma R4 sau de forma R1∘(R2∗)∘R3. Putem scrie aceasta, desigur, sub forma unei expresii regulate: (R4)|(R1∘(R2∗)∘R3).

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⟩.

  1. Convertim AFN-ul A într-un AFNG Z = ⟨Q′, Σ, δ′, q0′, qf′⟩. În continuare notăm cu k numărul de stări din Z.
  2. Dacă k = 2, algoritmul se oprește, iar pe tranziția dintre starea inițială și cea finală se află expresia regulată căutată.
  3. 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: Q′′=Q′∖{qr} și pentru toate qi ∈ Q′′ ∖ {qf′} și pentru toate qj ∈ Q′′ ∖ {q0′} fie δ′′(qi,qj)=(R4)|(R1(R2∗)R3), 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

Capitole: Expresii regulate, Din expresie în automat, AFN generalizat, Din automat în expresie