Conversione di un automa in espressione regolare
Vediamo come convertire un qualsiasi automa a stati finiti in un’espressione regolare.
Descrizione dell’algoritmo
In ingresso abbiamo un NFA A. Come prima cosa ne ricaviamo un GNFA. Nella seconda fase, a ogni passo eliminiamo uno stato, modifichiamo in modo opportuno la funzione di transizione e ripetiamo, finché non restano solo due stati: quello iniziale e quello finale. Tra loro ci sarà un arco etichettato con un’espressione regolare, che è il risultato dell’intero algoritmo. L’intera procedura consiste quindi soprattutto nell’eliminare uno stato e poi correggere l’automa in modo da ottenerne uno equivalente.
Eliminazione di un solo stato
Vediamo con un semplice esempio come si elimina uno stato. Supponiamo che una parte del nostro automa abbia questo aspetto:
dove Ri sono espressioni regolari. Come sarebbe l’automa se eliminassimo lo stato qr? Possiamo immaginare di trovarci nello stato qi e di chiederci quali parole possiamo generare in questo tratto. Se andiamo da qi direttamente a qj, saranno tutte le parole che corrispondono all’espressione regolare R4.
Se invece andiamo nello stato qr, possiamo generare le parole della forma R1. Nello stato qr però possiamo ciclare con l’espressione regolare R2, quindi possiamo generare le parole della forma
Ora sappiamo che da questa parte dell’automa possono nascere parole della forma R4 oppure della forma
Ora possiamo eliminare facilmente lo stato qr, lasciando solo i due stati qi e qj, e al posto di R4 scriviamo l’espressione appena calcolata:
Eseguiamo questa procedura per ogni arco da ogni stato qi a un qualche stato qj, compresi i cappi, cioè anche il caso in cui qi = qj.
Dopo aver eliminato uno stato otteniamo un automa equivalente, cioè un automa che riconosce lo stesso linguaggio.
L’algoritmo completo
In ingresso abbiamo un NFA A = ⟨Q, Σ, δ, q0, F⟩.
- Convertiamo l’NFA A in un GNFA Z = ⟨Q′, Σ, δ′, q0′, qf′⟩. D’ora in poi indichiamo con la lettera k il numero di stati di Z.
- Se k = 2, l’algoritmo termina e sull’arco tra lo stato iniziale e lo stato finale c’è l’espressione regolare cercata.
- Se k>2, scegliamo uno stato qualsiasi qr diverso dallo stato iniziale e da quello finale, cioè qr ≠ q0′ e qr ≠ qf′. Poi costruiamo un nuovo GNFA Z′ = ⟨Q′′, Σ, δ′′,q0′,qf′⟩ per il quale vale:
e per ogni qi ∈ Q′′ ∖ {qf′} e per ogni qj ∈ Q′′ ∖ {q0′} sia dove R1 = δ′(qi,qr), R2 = δ′(qr,qr), R3 = δ′(qr, qj), R4 = δ′(qi, qj). Poi continua con il passo 2.
Esempio
Prendiamo in ingresso questo automa a stati finiti:
Per prima cosa lo convertiamo in un GNFA (le transizioni inutili ∅ non le disegniamo):
Ora applichiamo la seconda parte dell’algoritmo ed eliminiamo un nodo. Cominciamo con il nodo q2. Eliminiamo il nodo q2 e aggiungiamo una transizione dallo stato q1 allo stato qf. La etichettiamo con b(a|b)∗, perché dal nodo q1 arriviamo allo stato q2 con le parole della forma b, poi possiamo ciclare con a|b, ottenendo (a|b)∗, e infine con la ε-transizione ci spostiamo in qf. Inoltre vale b(a|b)∗ϵ = b(a|b)∗. Otteniamo l’automa:
Resta da eliminare l’ultimo stato, q1. Aggiungiamo un arco dallo stato qs allo stato qf. Come lo etichettiamo? Nello stato q1 arriviamo con una ε-transizione, che possiamo tralasciare subito. Poi possiamo ciclare con a, quindi otteniamo l’espressione regolare a∗. Infine, attraverso l’arco arriviamo a qf, quindi concateniamo l’espressione con b(a|b)∗. L’arco è quindi etichettato con l’espressione regolare a∗ b(a|b)∗.
L’automa ha ormai solo due stati, quindi l’algoritmo termina. Sull’arco c’è l’espressione regolare cercata.
Fonti
- L’esempio e la descrizione dell’algoritmo provengono da M. Sipser: Introduction to the Theory of Computation
Capitoli: Espressioni regolari, Conversione di un’espressione regolare in automa, Automa a stati finiti non deterministico generalizzato, Conversione di un automa in espressione regolare