Come posso verificare che un DFA sia equivalente a un NFA?


10

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?


Un'interpretazione del candidato: esiste un "controllo dei risultati" (nel senso di Wasserman e Blum ) per il problema di convertire un NFA in un DFA? In altre parole, esiste un algoritmo asintoticamente più veloce rispetto alla conversione stessa, che data una presunta coppia (input, output) per l'algoritmo di conversione, controlla se l'output è corretto?
DW

Risposte:


7

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.UNBUNBBUNL(D)L(N)L(N)L(D)DN

Ma come si controlla il contenimento delle lingue, si potrebbe chiedere. Bene, ora osserva che iff (dove è il complemento di ).UNBUNB¯=B¯B

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.L(N)L(D)DN

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.L(D)L(N)N

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.L(D)L(N)22nnN


Grazie per la ben ponderata risposta. Ho imparato qualcosa di nuovo oggi. Sembra che la mia scommessa migliore sia quella di confrontare il mio lavoro con JFLAP.
IAmOnStackExchange il

2
A meno che il tuo NFA non sia grande (ad esempio con più di 7-8 stati), la tua migliore opzione è probabilmente quella di controllarti attentamente. In genere, dopo aver rimosso gli stati non raggiungibili, si ottiene un piccolo DFA e il controllo manuale non è troppo difficile.
Shaull

1
Non riesci a determinare e minimizzare entrambe le macchine e verificare se le due macchine sono isomorfe?
Saadtaame,

5

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.


Un modo per procedere è convertire l'NFA in un DFA , l'obiettivo del poster è verificare il risultato di tale algoritmo. Applicare due volte è davvero un modo, ma non è immune dall'incomprensione dell'algoritmo. Questo è probabilmente il motivo per cui è stato chiesto un metodo di controllo.
Approgrammatore

2
@aprogrammer La parte principale della mia risposta è un riferimento a un algoritmo per il quale è disponibile uno script di prova Coq, che è sicuramente il metodo di controllo più sicuro che mi venga in mente.
J.-E.

1
Non sono sicuro di cosa farà qualcuno incerto sulla sua comprensione di un semplice algoritmo come quello da NFA a DFA con uno script di prova Coq. Questo sembra usare l'algebra per risolvere il problema di matematica di un terzo anno.
Approgrammatore

0

questa domanda riguarda più i test del software applicato e la verifica della correttezza nella pratica piuttosto che una domanda teorica.

  • D1D2¯D2D1¯D¯

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

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.