Comment puis-je vérifier qu'un DFA est équivalent à un NFA?

10

J'apprends à convertir des NFA en DFA et je veux m'assurer de bien faire les choses. Évidemment, revenir dans l'autre sens n'est pas une chose. Quelqu'un connaît-il un algorithme pour vérifier qu'un DFA est équivalent à un NFA?

IAmOnStackExchange
la source
Une interprétation possible: existe-t-il un "vérificateur de résultats" (au sens de Wasserman et Blum ) pour le problème de la conversion d'un NFA en DFA? En d'autres termes, existe-t-il un algorithme qui est asymptotiquement plus rapide que la conversion elle-même, qui, étant donné une paire présumée (entrée, sortie) pour l'algorithme de conversion, vérifie si la sortie est correcte?
DW

Réponses:

7

C'est une question problématique. Il existe un moyen de vérifier l'équivalence des automates, que je vais maintenant expliquer, mais je crains que cela ne vous aidera pas, comme vous le verrez à la fin.

Rappelons que deux ensembles et sont égaux si et (c'est la définition de l'égalité d'ensemble). Ainsi, il vous suffit de vérifier que et , où et sont vos DFA et NFA, respectivement.ABABBAL(D)L(N)L(N)L(D)DN

Mais comment vérifier le confinement des langues, vous pourriez vous demander. Eh bien, observons maintenant que ssi (où est le complément de ).ABAB¯=B¯B

Examinons d'abord si . Pour ce faire, vous devez compléter (très facile - permutez les états acceptant et rejetant), puis construisez l'automate d'intersection (par exemple avec la construction du produit) avec , et vérifiez le vide, en trouvant un chemin vers un état acceptant.L(N)L(D)DN

La direction inverse, cependant, montrera pourquoi cela ne vous aide pas. Afin de vérifier si , vous devez compléter . Mais pour compléter un NFA, vous devez d'abord le convertir en DFA, rendant l'idée entière inutile.L(D)L(N)N

Essentiellement, le problème avec votre question est beaucoup plus profond: vous voulez vérifier que vous (un modèle de calcul non défini) avez correctement exécuté un algorithme bien défini. Ce n'est donc pas vraiment un problème informatique.

Je dirai ceci: suivant les constructions que j'ai suggérées, il n'est pas difficile de conclure que ssi il y a un mot de longueur au plus ( étant le nombre d'états de ) qui est accepté par l'un et non par l'autre. Vous pouvez donc essayer tous les mots jusqu'à cette longueur.2 2 n n NL(D)L(N)22nnN

Shaull
la source
Merci pour la réponse bien pensée. J'ai appris quelque chose de nouveau aujourd'hui. Il semble que mon meilleur pari est de comparer mon travail avec JFLAP.
IAmOnStackExchange
2
À moins que votre NFA soit grand (par exemple avec plus de 7 à 8 états), votre meilleure option est probablement de simplement vous vérifier soigneusement. En règle générale, après avoir supprimé les états non accessibles, vous obtenez un petit DFA, et la vérification manuelle n'est pas trop difficile.
Shaull
1
Vous ne pouvez pas déterminer et minimiser les deux machines et vérifier si les deux machines sont isomorphes?
saadtaame
5

Une façon de procéder consiste à convertir le NFA en DFA, puis à vérifier l'équivalence des deux DFA, pour lesquels il existe un algorithme linéaire [1].

L'article suivant traite du cas plus général de l'équivalence de deux NFA (qui s'applique bien sûr également à votre cas).

Filippo Bonchi, Damien Pous, Checking NFA equivalence with bisimulations up to congruence Principle of Programming Languages ​​(POPL), Jan 2013, Roma, Italy. ACM, pp.457-468, 2013.

Abstrait . Nous introduisons la bisimulation jusqu'à la congruence comme technique pour prouver l'équivalence de langage d'automates finis non déterministes. En exploitant cette technique, nous concevons une optimisation de l'algorithme classique par Hopcroft et Karp [1]. Nous comparons notre approche aux algorithmes antichaînes récemment introduits, en analysant et en reliant les deux méthodes sous-jacentes de preuve coinductive. Nous donnons des exemples concrets où nous nous améliorons de façon exponentielle par rapport aux antichaînes; les résultats expérimentaux montrent en outre des améliorations non négligeables.

[1] JE Hopcroft et RM Karp. Un algorithme linéaire pour tester l'équivalence d'automates finis. TR 114, Cornell Univ., Décembre 1971.

Voir également l' annexe Web de cet article , qui contient des scripts de preuve Coq des résultats, un lien vers une implémentation et une applet interactive.

J.-E. Épingle
la source
Une façon de procéder consiste à convertir le NFA en DFA , l'objectif de l'affiche est de vérifier le résultat de cet algorithme. Appliquer deux fois est en effet un moyen mais n'est pas à l'abri d'une mauvaise compréhension de l'algorithme. C'est probablement pourquoi une méthode de vérification a été demandée.
AProgrammer
2
@aprogrammer La partie principale de ma réponse est une référence à un algorithme pour lequel un script de preuve Coq est disponible, qui est certainement la méthode de vérification la plus sûre à laquelle je puisse penser.
J.-E.
1
Je ne sais pas ce que quelqu'un ne sait pas sur sa compréhension d'un algorithme simple comme celui de NFA à DFA fera avec un script de preuve Coq. Cela ressemble à l'utilisation de l'algèbre pour résoudre le problème mathématique d'une troisième niveleuse.
AProgrammer
0

cette question concerne davantage les tests de logiciels appliqués et la vérification de l'exactitude dans la pratique plutôt qu'une question théorique.

  • si vous avez un autre code pour calculer les intersections et les compléments (et les langues DFA vides), vous pouvez utiliser l'idée que et sont tous deux vides où est le complément. D 2¯ D 1 ˉ DD1D2¯D2D1¯D¯

  • vous pouvez compter sur un logiciel testé antérieurement qui a été testé pour valider vos résultats. par exemple bibliothèque AT&T FSM

  • une autre idée: les tests randomisés. choisissez des chaînes aléatoires dans votre langue. déterminer si les chaînes sont acceptées ou non par le DFA / NFA. si les deux ne sont pas égaux, avec une forte probabilité, vous trouverez des chaînes qui ne correspondent pas.

  • une autre idée: vous pouvez écrire du code pour parcourir toutes les branches du DFA et du NFA à une profondeur particulière et rechercher les décalages. cela équivaut à énumérer toutes les chaînes potentielles acceptées de longueurs données.

vzn
la source