✖

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 R1∘(R2∗). E poiché dallo stato qr possiamo ancora arrivare allo stato qj, aggiungiamo anche l’espressione regolare R3. In totale, per questa via possiamo ottenere le parole della forma R1∘(R2∗)∘R3.

Ora sappiamo che da questa parte dell’automa possono nascere parole della forma R4 oppure della forma R1∘(R2∗)∘R3. Naturalmente possiamo scriverlo sotto forma di espressione regolare come (R4)|(R1∘(R2∗)∘R3).

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

  1. 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.
  2. Se k = 2, l’algoritmo termina e sull’arco tra lo stato iniziale e lo stato finale c’è l’espressione regolare cercata.
  3. 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: Q′′=Q′∖{qr} e per ogni qi ∈ Q′′ ∖ {qf′} e per ogni qj ∈ Q′′ ∖ {q0′} sia δ′′(qi,qj)=(R4)|(R1(R2∗)R3), 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

Capitoli: Espressioni regolari, Conversione di un’espressione regolare in automa, Automa a stati finiti non deterministico generalizzato, Conversione di un automa in espressione regolare