Mam prosty problem z utworzeniem DFA, który akceptuje wszystkie dane wejściowe zaczynające się od podwójnych liter (aa, bb) lub kończące się na podwójnych literach (aa, bb), biorąc pod uwagę, że jest zestawem alfabetu dany język.
Próbowałem rozwiązać to w sposób okrężny:
- Generowanie wyrażenia regularnego
- Tworzenie odpowiedniego NFA
- Wykorzystanie konstrukcji zestawu zasilającego do ustalenia DFA
- Minimalizowanie liczby stanów w DFA
Krok 1: Wyrażenie regularne dla danego problemu to (wśród niezliczonych innych):
((aa|bb)(a|b)*)|((a|b)(a|b)*(aa|bb))
Krok 2: NFA dla danego wyrażenia to:
(źródło: livefilestore.com )
W formie tabelarycznej NFA to:
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) - -
Krok 3: Przekształć w DFA za pomocą konstrukcji powerset:
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}
Krok 4: Zminimalizuj DFA:
Najpierw zmieniłem K-> G, J-> F, I-> E. W następnej iteracji H-> D i E-> F. Tak więc stół finałowy to:
State + Input:a + Input:b
->A | B | C
B | D | E
C | E | D
(D) | D | D
(E) | E | E
I schematycznie wygląda to tak:
(źródło: livefilestore.com )
... co nie jest wymaganym DFA! Potrójnie sprawdziłem swój wynik. Więc gdzie popełniłem błąd?
Uwaga:
- -> = stan początkowy
- () = stan końcowy