Come convertire un NFA con cicli sovrapposti in un'espressione regolare?


11

Se ho capito bene, NFA ha lo stesso potere espressivo delle espressioni regolari. Spesso leggere espressioni regolari equivalenti da NFA è facile: traduci cicli in stelle, incroci come alternative e così via. Ma cosa fare in questo caso:

inserisci qui la descrizione dell'immagine
[ fonte ]

I cicli sovrapposti rendono difficile vedere cosa accetta questo automa (in termini di espressioni regolari). C'è un trucco?


2
Sarebbe bene se nel diagramma si potesse indicare quali sono gli stati iniziale e finale: una piccola freccia per lo stato iniziale e un doppio cerchio come stato finale. Inoltre, è difficile sapere dove stai sbagliando se non dai alcuna indicazione di ciò che hai provato.
Dave Clarke,

Forse questo documento può aiutarti: spiega chiaramente come convertire un NFA in un RE.
Vor

1
Perché è difficile? Hai provato uno degli algoritmi canonici? Qual è la migliore risposta che puoi fare?
Raffaello

3
Ho modificato per rendere la domanda (imho) interessante e buona per questo sito. Consulta la cronologia delle revisioni per formare un'opinione.
Raffaello

1
Ho una risposta pronta che trasforma il tuo NFA in un'espressione regolare, ma l'ho eliminato: la risposta di Raffaello ti dà il metodo di cui hai bisogno per farlo da solo (fornisce anche un collegamento a un esempio), quindi puoi fare un po 'di pratica se volere. Se vuoi ancora la mia soluzione, annullerò la risposta.
Alex ten Brink,

Risposte:


5

Piuttosto che "leggere", dovresti utilizzare uno dei diversi metodi canoncial per farlo. Di gran lunga il più bello che abbia mai visto è quello che esprime l'automa come sistema di equazioni di linguaggi (regolari) che possono essere risolti. È particolarmente bello in quanto sembra produrre espressioni più concise rispetto ad altri metodi.

Ho scritto questo documento spiegando il metodo per gli studenti l'estate scorsa. Si riferisce direttamente a una lezione specifica; il riferimento menzionato è la tipica definizione di espressioni regolari. Una prova di Lemma di Arden (un risultato necessario) è contenuta; manca uno per la correttezza del metodo. Come ho imparato a lezione, non ho un riferimento, purtroppo.

In breve: per ogni stato , creare l'equazioneqio

Qio=qioun'qjun'Qj{{ε}, qioF, altro

dove è l'insieme degli stati finali e q i a q j significa che c'è una transizione da q i a q j etichettata con a . Se leggi come o (a seconda della tua definizione di espressione regolare), vedi che questa è un'equazione di espressioni regolari.Fqioun'qjqioqjun'+|

Risolvendolo (usando il Lemma di Arden ) si ottiene un'espressione regolare per ogni stato che descrive esattamente quelle parole che possono essere accettate a partire da ; pertanto (se è lo stato iniziale) è l'espressione desiderata.QioqioQ0q0

L'applicazione all'automa dato viene lasciata come esercizio; un esempio completo è incluso nel documento collegato sopra .

Vedi anche qui dove ho pubblicato una risposta simile.


1
Vedi questa domanda di riferimento per altri metodi generali.
Raffaello

3

Se ci fosse solo una catena di stati senza loop, sapresti cosa fare?

Se ci fosse un semplice ciclo senza questa ramificazione sovrapposta, sapresti cosa fare?

(Se la risposta è "no", pensa prima a questi casi.)

Ora, l'idea è quella di trasformare progressivamente l'automa per metterlo in una forma in cui è possibile individuare quei modelli: catene, anelli e percorsi divergenti che si riconciliano alla fine (portando all'alternanza). Ad ogni passo della trasformazione, assicurati che l'automa trasformato riconosca ancora la stessa lingua.

Tieni presente che si tratta di un automa non deterministico. Quello che hai pubblicato sembra essere deterministico, ma non deve rimanere così quando lo trasformi.

q2q1fq2gq3q4q2q5q4jq5gq3

q3,q4,q5q3q3(hjg)*

Fai attenzione a verificare quali stati sono definitivi. All'inizio può essere utile non preoccuparsi di questo e creare un ciclo grande, quindi duplicare le parti che terminano a metà del ciclo.

Questa non è necessariamente la tecnica più efficiente o quella che genera l'espressione regolare più semplice, ma è semplice.


3

Dividi q_1


E questo risponde alla domanda come?
Raffaello

1
Se riscrivi la macchina a stati in questo modo, ora è banale leggere l'espressione regolare equivalente.
Jukka Suomela,

1
Forse dovresti includerlo nel testo della risposta. Funziona sempre?
Raffaello

@Raphael: funziona in questo caso. :) L'idea generale alla base di questo trucco è la seguente: abbiamo reso i cicli "nidificati correttamente". Cioè, non abbiamo la struttura del ciclo [(])ma [()].
Jukka Suomela,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.