generated at
NFAからDFAへの変換
NFAの各集合がDFAの状態に対応するように作る
NFAがn個の有限な状態を持つとすると、DFAの状態は2^n個に収まる
実際には、初期状態から到達可能なのはおよそn個ぐらいになる
コツ
遷移先と、遷移先から\epsilonで辿れる状態を一つの状態にまとめる
複雑になると漏れがありうるので、同時に表を作ると良い

参考


[** 例として(a|b)^\ast ab(a|b)^\ast cのNFAをDFAに変換する]

これが元のNFA
ここから各状態と遷移先の表を作っていく

まず状態 0 から出ている矢印に注目する
a 1 へ、 b 2 へ、 ε 3 へ行っているのがわかる
ここで注意することは、「 ε が出ているものは考えない」という点だ
行を状態、列を遷移先にした対応表を作る
対応表
abc
012x

さらに遷移先から ε で移動できるところも含める
例えば a 1 へ行けたが、 1 から ε が伸び、 0 , 3 へ行けることがわかる
対応表
abc
01,0,32x
これを b についてもやる
対応表
abc
01,0,32,0,3x

この①と②の操作を繰り返し表を埋める
対応表
a b c
00,1,30,2,3x
1xxx
2xxx
34xx
4x5,8x
55,6,85,7,8x
6xxx
7xxx
8xx9
9xxx

ここからDFAの作図に入る
NFAの図とさきほど作った対応表を見ながら作っていく
スタート地点は 0 と、 0 から ε で遷移できる状態
なので、今回は 0,3 がスタートのノードになる

0,3 から a , b , c で移動できるノードを考える
まず a のとき、表の 0/a , 3/a を確認してその和集合を1ノードにする
ここでは、 0,1,3 4 なので 0,1,3,4 というノードになる
b に対しても同じ様に考える


⑥この操作を繰り返して、完成
受理状態を含む状態については二重丸などにする
今回は受理状態は 9 のみなので、 9 が含まれているところを二重丸にする


これでNFAからDFAの作図ができた
通常はさらにここからDFAの状態数の最小化を行う