Sto imparando come convertire NFA in DFA e voglio assicurarmi di farlo nel modo giusto. Ovviamente, tornare nella direzione opposta non è una cosa. Qualcuno conosce un algoritmo per verificare che un DFA sia equivalente a un NFA?
Sto imparando come convertire NFA in DFA e voglio assicurarmi di farlo nel modo giusto. Ovviamente, tornare nella direzione opposta non è una cosa. Qualcuno conosce un algoritmo per verificare che un DFA sia equivalente a un NFA?
Risposte:
Questa è una domanda problematica. C'è un modo per verificare l'equivalenza degli automi, che ora spiegherò, ma temo che non ti aiuterà, come vedrai alla fine.
Ricordiamo che due insiemi e sono uguali se e (questa è la definizione di uguaglianza dell'insieme). Pertanto, è sufficiente verificare che e , dove e sono rispettivamente DFA e NFA.
Ma come si controlla il contenimento delle lingue, si potrebbe chiedere. Bene, ora osserva che iff (dove è il complemento di ).
Consideriamo innanzitutto di verificare se . Per fare ciò, è necessario integrare (molto facile - scambiare gli stati di accettazione e rifiuto), quindi costruire l'automa di intersezione (ad es. Con la costruzione del prodotto) con e verificare la vacuità, trovando un percorso verso uno stato accettante.
La direzione opposta, tuttavia, mostrerà perché questo non ti aiuta. Al fine di verificare se , è necessario integrare . Ma per integrare un NFA, devi prima convertirlo in un DFA, rendendo inutile l'intera idea.
In sostanza, il problema con la tua domanda è molto più profondo: vuoi verificare che tu (un modello computazionale indefinito) hai eseguito correttamente un algoritmo ben definito. Quindi questo non è davvero un problema di informatica.
Dirò questo: seguendo le costruzioni che ho suggerito, non è difficile concludere che se c'è una parola di lunghezza al massimo ( è il numero di stati di ) che è accettato dall'uno e non dall'altro. Quindi puoi provare tutte le parole fino a questa lunghezza.
Un modo per procedere è convertire l'NFA in un DFA e quindi verificare l'equivalenza dei due DFA, per i quali esiste un algoritmo lineare [1].
Il seguente documento tratta il caso più generale dell'equivalenza di due NFA (che ovviamente si applica anche al tuo caso).
Filippo Bonchi, Damien Pous, Verifica dell'equivalenza NFA con bisimulazioni fino alla congruenza Principio dei linguaggi di programmazione (POPL), gennaio 2013, Roma, Italia. ACM, pagg. 457-468, 2013.
Astratto . Introduciamo la bisimulazione fino alla congruenza come tecnica per dimostrare l'equivalenza linguistica degli automi finiti non deterministici. Sfruttando questa tecnica, escogitiamo un'ottimizzazione dell'algoritmo classico di Hopcroft e Karp [1]. Confrontiamo il nostro approccio con gli algoritmi antichain recentemente introdotti, analizzando e mettendo in relazione i due metodi sottostanti di prova coinduttiva. Diamo esempi concreti in cui miglioriamo esponenzialmente rispetto agli antichain; i risultati sperimentali mostrano inoltre miglioramenti non trascurabili.
[1] JE Hopcroft e RM Karp. Un algoritmo lineare per testare l'equivalenza di automi finiti. TR 114, Cornell Univ., Dicembre 1971.
Vedi anche l' appendice web di questo documento , che contiene script di prova Coq dei risultati, un collegamento a un'implementazione e un'applet interattiva.
questa domanda riguarda più i test del software applicato e la verifica della correttezza nella pratica piuttosto che una domanda teorica.
puoi fare affidamento su software precedentemente testato che è stato testato per convalidare i risultati. ad es. libreria FSM AT&T
un'altra idea: test randomizzati. scegli stringhe casuali nella tua lingua. determinare se le stringhe sono accettate o non accettate dal DFA / NFA. se i due non sono uguali, con alta probabilità troverai stringhe che non corrispondono.
un'altra idea: è possibile scrivere codice per attraversare tutti i rami di DFA e NFA fino a una certa profondità e cercare discrepanze. questo equivale a enumerare tutte le potenziali stringhe accettate di determinate lunghezze.