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?
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?
Réponses:
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.
Mais comment vérifier le confinement des langues, vous pourriez vous demander. Eh bien, observons maintenant que ssi (où est le complément de ).
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.
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.
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 N
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.
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 ˉ 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.