L'objectif est de créer DFA à partir d'une expression régulière et l'utilisation de "Exp régulière> NFA> Conversion DFA" n'est pas une option. Comment faut-il s'y prendre?
J'ai posé cette question à notre professeur mais il m'a dit que nous pouvions utiliser l'intuition et a gentiment refusé de fournir des explications. Je voulais donc vous demander.
"Regular exp> NFA> DFA conversion" n'est pas une option car une telle conversion prend beaucoup de temps pour convertir une expression régulière plutôt complexe. Par exemple, pour un certain regex "regex> NFA> DFA" prend 1 heure pour un être humain. J'ai besoin de convertir regex en DFA en moins de 30 minutes.
a(a|ab|ac)*a+
. Vous pouvez soit traduire cela directement en NDFA que vous réduisez en DFA, soit le normaliser en quelque chose qui correspond immédiatement à un DFA.Réponses:
Puisque vous voulez "convertir des regex en DFA en moins de 30 minutes", je suppose que vous travaillez à la main sur des exemples relativement petits.
Dans ce cas, vous pouvez utiliser l'algorithme de Brzozowski , qui calcule directement l'automate Nérode d'un langage (connu pour être égal à son automate déterministe minimal). Il est basé sur un calcul direct des dérivées et fonctionne également pour les expressions régulières étendues permettant l'intersection et la complémentation. L'inconvénient de cet algorithme est qu'il nécessite de vérifier l'équivalence des expressions calculées en cours de route, un processus coûteux. Mais en pratique, et pour les petits exemples, c'est très efficace.[ 1 ]
Quotients de gauche . Soit un langage de A ∗ et soit u un mot. Alors u - 1 L = { v ∈ A * | u v ∈ L } La langue u - 1 L est appelé quotient gauche (ou à gauche dérivé ) de L .L UNE∗ u
Automate Nérode . L' automate nérode de est l'automate déterministe A ( L ) = ( Q , A , ⋅ , L , F ) où Q = { u - 1 L ∣ u ∈ A ∗ } , F = { u - 1 L ∣ u ∈ L } et la fonction de transition est définie, pour chacun a ∈L UNE( L ) = ( Q , A , ⋅ , L , F) Q = { u- 1L ∣ u ∈ A∗} F= { u- 1L ∣ u ∈ L } , par la formule
( u - 1 L ) ⋅ a = a - 1 ( u - 1 L ) = ( u a ) - 1 L
Attention à cette définition plutôt abstraite. Chaque état de A est un quotient gauche de L par un mot, et est donc un langage de A ∗ . L'état initial est la langue L , et l'ensemble des états finaux est l'ensemble de tousquotients gauche de L par un mot de L .a ∈ A
Modifier . (5 avril 2015) Je viens de découvrir qu'une question similaire: Quels algorithmes existent pour construire un DFA qui reconnaît le langage décrit par une expression régulière donnée? a été demandé sur cstheory. La réponse traite en partie des problèmes de complexité.
la source
J.-E. Pin fournit la meilleure réponse en termes de formalité et d'exhaustivité, mais je pense qu'il y a quelque chose à dire pour "l'intuition" à laquelle votre professeur fait allusion.
Dans la plupart de ces cas, la chose la plus simple à faire est de regarder une expression régulière, de comprendre quelle langue elle accepte, puis d'utiliser votre créativité / intelligence pour construire un DFA acceptant cette langue.
Il n'y a pas de moyen simple de le faire, à part les algorithmes que d'autres ont donnés, mais voici quelques lignes directrices qui pourraient s'avérer utiles.
Demandez-vous, pourrais-je écrire un programme qui accepte cette RE en utilisant uniquement des variables booléennes ou de très petits nombres entiers? Ensuite, écrivez ce programme et convertissez-le en DFA où il existe un état pour chaque combinaison de valeurs.
Recherchez les parties de l'expression régulière que vous savez que vous pouvez accepter de façon déterministe, où vous savez "Si je vois cela, alors je dois correspondre à cette partie de l'ER". Il n'y en aura pas toujours des tonnes, mais l'identification de ces pièces peut montrer les pièces qui seront faciles à créer un DFA, vous pouvez donc passer plus de temps sur les pièces qui nécessitent vraiment du non-déterminisme.
La construction du sous-ensemble pour NFA-> DFA n'est pas vraiment compliquée d'un algorithme. Donc, s'il s'agit d'un devoir, et non d'une question d'examen, il peut être plus rapide de coder une implémentation et de laisser votre programme convertir NFA en DFA. Si vous avez utilisé votre propre code, il ne devrait pas y avoir de problème de plagarisme.
Essayez de «regarder vers l'avenir», coupez les coins lorsque vous pouvez utiliser votre intuition dans des endroits où l'algorithme nécessiterait de nombreuses étapes mais son résultat est clair.
la source
Bien que ce ne soit pas la bonne façon, mais cela fonctionne la plupart du temps.
Première étape : recherchez la plus petite chaîne pouvant être acceptée par l'expression régulière. Deuxième étape : dessinez les états nécessaires avec la transaction de la machine acceptant la chaîne minimale. Troisième étape : pour tous les États, dessinez les transactions alphabétiques restantes.
Par exemple: Expression régulière (0 + 1) * Chaîne de 1 "se terminant par 1" Étape 1: Chaîne la plus petite: 1 Étape 2: deux états Q0 et Q1. ayant la transaction de 1 de Q0 à Q1. et Q1 est l'état acceptant. Étape 3: pour l'état Q0, la transaction Q0 1 est vers Q1. Faites maintenant 0 transaction dans Q0 lui-même. Pour Q1 State Q1 1, la transaction restera au T1. Et 0 transaction ira au Q0.
la source