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.
J'ai essayé de le résoudre de manière détournée en:
- Génération d'une expression régulière
- Faire son NFA correspondant
- Utilisation de la construction du jeu de puissance pour déduire un DFA
- 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:
(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 à:
(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