1. Minimalny DFA
Dla każdego języka regularnego istnieje dokładnie jeden (z dokładnością do izomorfizmów) DFA o minimalnej liczbie stanów.
(Własność ta wynika z twierdzenia Myhill-Nerode, które jednak zostanie pominięte na wykładzie.)
2. Idea algorytmu
Chcemy znaleźć takie stany, które można ze sobą połączyć (stan równoważne). Dwa stany równoważne to takie, że dla każdego x startujące z tych stanów albo znajdziemy się równocześnie w stanach akceptujących, albo nieakceptujących.
3. Algorytm minimalizacji
Oznaczamy pary stanów, które nie są równoważne.
for all
p∈F∧q∈Q∖F do
flag
(p,q)
for all
p,q∈(F×F)∪(Q∖F×Q∖F) takich że p=q do
:
if
∃a∈Σ taki że (δ(p,a),δ(q,a)) is flagged then
:
flag
(p,q)
flag
w sposób rekurencyjny wszystkie nieoznaczone pary na liście (p,q)
else
(żadna para (δ(p,a),δ(q,a)) nie jest oznaczona)
for all
a∈Σ do
:
- umieść parę (p,q) na liście (δ(p,a),δ(q,a)) pod warunkiem, że δ(p,a)=δ(q,a)
DFA uzyskany przez złączenie stanów równoważnych uzyskanych przez powyższy algorytm, z usuniętymi stanami nieosiągalnymi, jest minimalnym DFA dla danego języka.
4. Przykład
M=({a,b,c,d,e,f},{0,1},δ,a,{c,d,e})
a |
|
b |
c |
b |
|
a |
d |
c |
|
e |
f |
d |
|
e |
f |
e |
|
e |
f |
f |
|
f |
f |
Pomarańczowe X — pierwszy etap
Niebieskie X — drugi etap
- (a,b)
- 0: (a,b) — nie to nam nie mówi
- 1: (c,d) — na razie nieoznaczone
- (a,f)
- 0: (b,f) — na razie nieoznaczone
- 1: (c,f) — oznaczone
- (b,f)
- 1: (d,f) — oznaczone
- (c,d), (c,e), (d,e) — nic nie mogę
Czyli sklejamy:
- (a,b)
- (c,d), (c,e), (d,e)
Uproszczony DFA: M′=({ab,cde,f},{0,1},δ,ab,{cde})
ab |
|
ab |
cde |
cde |
|
cde |
f |
f |
|
f |
f |