Impossible de convertir NFA en DFA


11

J'ai un problème simple de créer un DFA qui accepte toutes les entrées commençant par des lettres doubles (aa, bb) ou se terminant par des lettres doubles (aa, bb), étant donné que est l'ensemble alphabétique du langue donnée.Σ={une,b}

J'ai essayé de le résoudre de manière détournée en:

  1. Génération d'une expression régulière
  2. Faire son NFA correspondant
  3. Utilisation de la construction du jeu de puissance pour déduire un DFA
  4. Minimiser le nombre d'états dans DFA

Étape 1: L'expression régulière d'un problème donné est (parmi d'innombrables autres):

((aa|bb)(a|b)*)|((a|b)(a|b)*(aa|bb))

Étape 2: NFA pour une expression donnée est:

NFA
(source: livefilestore.com )

Sous forme de tableau, NFA est:

State    Input:a     Input:b
->1        2,5         3,5
  2        4           -
  3        -           4
 (4)       4           4
  5        5,7         5,6
  6        -           8
  7        8           -
 (8)       -           -

Étape 3: conversion en DFA à l'aide de la construction du jeu de puissance:

Symbol, State       +   Symbol, State (Input:a) +   Symbol, State (Input:b)
   ->A, {1}         |        B, {2,5}           |        C, {3,5}
     B, {2,5}       |        D, {4,5,7}         |        E, {5,6}
     C, {3,5}       |        F, {5,7}           |        G, {4,5,6}
   (D), {4,5,7}     |        H, {4,5,7,8}       |        G, {4,5,6}
     E, {5,6}       |        F, {5,7}           |        I, {5,6,8}
     F, {5,7}       |        J, {5,7,8}         |        E, {5,6}
   (G), {4,5,6}     |        D, {4,5,7}         |        K, {4,5,6,8}
   (H), {4,5,7,8}   |        H, {4,5,7,8}       |        G, {4,5,6}
   (I), {5,6,8}     |        F, {5,7}           |        I, {5,6,8}
   (J), {5,7,8}     |        J, {5,7,8}         |        E, {5,6}
   (K), {4,5,6,8}   +        D, {4,5,7}         +        K, {4,5,6,8}

Étape 4: minimisez le DFA:

J'ai changé K-> G, J-> F, I-> E en premier. Dans l'itération suivante, H-> D et E-> F. Ainsi, le tableau final est:

  State    +   Input:a     +   Input:b
   ->A     |      B        |      C
     B     |      D        |      E
     C     |      E        |      D
    (D)    |      D        |      D
    (E)    |      E        |      E

Et schématiquement, cela ressemble à:

DFA final
(source: livefilestore.com )

... qui n'est pas le DFA requis! J'ai revérifié mon résultat. Alors, où je me suis trompé?

Remarque:

  • -> = état initial
  • () = état final

3
Ceci est un excellent exemple pour une question de base qui a été bien posée, car vous incluez toute votre réflexion.
Raphael

Ça fait du bien d'être apprécié, merci! ^^
Anurag Kalia

Réponses:


5

Vous êtes bien jusqu'à l'étape 3 (le DFA) mais votre minimisation est incorrecte.

Il est clair que le DFA minimisé n'est pas correct, car les entrées baet ab(qui ne sont pas dans la langue d'origine, ni acceptées par le DFA à l'étape 3) conduisent à l'état final E.

En regardant vos étapes de minimisation, il semble que vous ayez des états finaux et non finaux unifiés; par exemple J (final) -> F (pas final) et I (final) -> E (pas final). La fusion d'un état final avec un état non final modifie la langue acceptée par l'automate, conduisant à l'acceptation de chaînes incorrectes comme indiqué ci-dessus.


1
Oh. C'est donc ce qui crée un problème ici. Maintenant que je me souviens, la dernière fois que j'ai utilisé cette méthode, il n'y avait aucun état d'acceptation particulier dans le tableau!
Anurag Kalia
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.