NFA から DFA への変換
非決定性オートマトンを決定性オートマトンに変換する方法を見ていきます。これによって、非決定性オートマトンと決定性オートマトンの計算能力が等しいことが示されます。
基本的な考え方
ε 遷移のない非決定性オートマトン ⟨QN, ΣN, δN, q0, FN⟩ を考えます。決定性オートマトン ⟨QD, ΣD, δD, p0, FD⟩ を、次のようにつくります。
- QD ⊆ 2QN
- ΣD = ΣN
- p0 = {q0}
- FD = {Q ∈ QD | Q ∩ FN ≠ ∅}
遷移関数 δD は、次のように定義します。
これはどういう意味でしょうか。非決定性オートマトンは同時に複数の状態にいることができるので、例えば非決定性オートマトンが状態 {q0, q1} にいる場面が起こりえます。次の記号、例えば1を読むと、状態の集合 {q0, q2, q3} に進むことがあります。同じオートマトンの決定性版では、これを次のように表します。2つの状態をつくり、それらに {q0, q1} と {q0, q2, q3} という名前をつけ、その間に記号1の遷移を引きます。形式的には1つの状態から別の1つの状態に移るだけですが、名前のおかげで、非決定性オートマトンならそれぞれ2つ、3つの状態にいたはずだとわかります。
例
次の非決定性オートマトンを考えます。
決定性オートマトンをつくるには、何よりもまず新しい遷移関数をつくる必要があります。そのために、すべての遷移を書きこむ表を使います。はじめは、表は次のようになります。
アルゴリズムが終わったとき、左の列には決定性オートマトンのすべての状態が並びます。そして、埋め終わった表が遷移関数を定めます。では、状態 {q0} にいて入力が記号0と1のとき、どの状態に進むかを表に書きこみます。
状態 q0 からは、記号0の遷移は状態 q1 だけに向かい、記号1の遷移は状態 q1 と q2 に向かいます。ここで、表に2つの新しい状態 {q1} と {q1, q2} を加えます。なぜでしょうか。表に書きこんだ状態の集合がまだ左の列にないときは、その状態の集合を左の列に加えるからです。
そして、再び表を埋めます。状態 {q1, q2} については、両方の状態を調べるのを忘れないようにしましょう。つまり、状態 q1 から進める状態と、状態 q2 から進める状態の和集合をとります。
新しい状態がいくつか得られたので、表に加える必要があります。
…そして、再び遷移を書きこみます。
状態 {q0, q1, q3}、{q1}、{q1,q2} はすでに表にあるので、状態 {q0,q1,q2,q3} だけを加えます。
新しい状態はもう加わらなかったので、表は完成です。あとは状態遷移図をかくだけです。決定性オートマトンの状態は1列目に、記号0と1の遷移はその右の列にあります。もとのオートマトンの受理状態を含む状態は、どれもこのオートマトンでも受理状態になります。つまり、q3 を含む状態はすべて受理状態です。オートマトンは次のようになります。
このオートマトンが本当に正しく動くことを確かめてみましょう。語11001を受理するか試します。決定性オートマトンでは、次の道をたどります。
最後の状態 {q0, q1, q2, q3} は受理状態なので、オートマトンはこの語を受理します。非決定性オートマトンでも、シミュレーションの途中で同じ状態にたどり着きます。つまり、状態 q0 から始め、記号1で状態 {q1, q2} に進みます。次の記号1で状態 {q0,q3} に進み、残りの記号についても同様です。最後には状態 {q0, q1, q2, q3} のすべてにいることになり、オートマトンはこの語を受理します。
参考文献
章: 有限オートマトン, 完全なオートマトン, 非決定性有限オートマトン, 非決定性オートマトンのシミュレーション, NFA から DFA への変換