✖

NFA から DFA への変換

非決定性オートマトンを決定性オートマトンに変換する方法を見ていきます。これによって、非決定性オートマトンと決定性オートマトンの計算能力が等しいことが示されます。

基本的な考え方

ε 遷移のない非決定性オートマトン ⟨QN, ΣN, δN, q0, FN⟩ を考えます。決定性オートマトン ⟨QD, ΣD, δD, p0, FD⟩ を、次のようにつくります。

  • QD ⊆ 2QN
  • ΣD = ΣN
  • p0 = {q0}
  • FD = {Q ∈ QD | Q ∩ FN ≠ ∅}

遷移関数 δD は、次のように定義します。

∀Q∈QD,a∈ΣD:δD(Q,a)=⋃q∈QδN(q,a)

これはどういう意味でしょうか。非決定性オートマトンは同時に複数の状態にいることができるので、例えば非決定性オートマトンが状態 {q0, q1} にいる場面が起こりえます。次の記号、例えば1を読むと、状態の集合 {q0, q2, q3} に進むことがあります。同じオートマトンの決定性版では、これを次のように表します。2つの状態をつくり、それらに {q0, q1} と {q0, q2, q3} という名前をつけ、その間に記号1の遷移を引きます。形式的には1つの状態から別の1つの状態に移るだけですが、名前のおかげで、非決定性オートマトンならそれぞれ2つ、3つの状態にいたはずだとわかります。

例

次の非決定性オートマトンを考えます。

決定性オートマトンをつくるには、何よりもまず新しい遷移関数をつくる必要があります。そのために、すべての遷移を書きこむ表を使います。はじめは、表は次のようになります。

状態/記号01{q0}

アルゴリズムが終わったとき、左の列には決定性オートマトンのすべての状態が並びます。そして、埋め終わった表が遷移関数を定めます。では、状態 {q0} にいて入力が記号0と1のとき、どの状態に進むかを表に書きこみます。

状態/記号01{q0}{q1}{q1,q2}

状態 q0 からは、記号0の遷移は状態 q1 だけに向かい、記号1の遷移は状態 q1 と q2 に向かいます。ここで、表に2つの新しい状態 {q1} と {q1, q2} を加えます。なぜでしょうか。表に書きこんだ状態の集合がまだ左の列にないときは、その状態の集合を左の列に加えるからです。

状態/記号01{q0}{q1}{q1,q2}{q1}{q1,q2}

そして、再び表を埋めます。状態 {q1, q2} については、両方の状態を調べるのを忘れないようにしましょう。つまり、状態 q1 から進める状態と、状態 q2 から進める状態の和集合をとります。

状態/記号01{q0}{q1}{q1,q2}{q1}{q0,q1,q3}{q0,q3}{q1,q2}{q0,q1,q3}{q0,q3}

新しい状態がいくつか得られたので、表に加える必要があります。

状態/記号01{q0}{q1}{q1,q2}{q1}{q0,q1,q3}{q0,q3}{q1,q2}{q0,q1,q3}{q0,q3}{q0,q1,q3}{q0,q3}

…そして、再び遷移を書きこみます。

状態/記号01{q0}{q1}{q1,q2}{q1}{q0,q1,q3}{q0,q3}{q1,q2}{q0,q1,q3}{q0,q3}{q0,q1,q3}{q0,q1,q3}{q0,q1,q2,q3}{q0,q3}{q1}{q1,q2}

状態 {q0, q1, q3}、{q1}、{q1,q2} はすでに表にあるので、状態 {q0,q1,q2,q3} だけを加えます。

状態/記号01{q0}{q1}{q1,q2}{q1}{q0,q1,q3}{q0,q3}{q1,q2}{q0,q1,q3}{q0,q3}{q0,q1,q3}{q0,q1,q3}{q0,q1,q2,q3}{q0,q3}{q1}{q1,q2}{q0,q1,q2,q3}{q0,q1,q3}{q0,q1,q2,q3}

新しい状態はもう加わらなかったので、表は完成です。あとは状態遷移図をかくだけです。決定性オートマトンの状態は1列目に、記号0と1の遷移はその右の列にあります。もとのオートマトンの受理状態を含む状態は、どれもこのオートマトンでも受理状態になります。つまり、q3 を含む状態はすべて受理状態です。オートマトンは次のようになります。

このオートマトンが本当に正しく動くことを確かめてみましょう。語11001を受理するか試します。決定性オートマトンでは、次の道をたどります。

q0→1q1,q2→1q0,q3→0q1→0q0,q1,q3→1q0,q1,q2,q3

最後の状態 {q0, q1, q2, q3} は受理状態なので、オートマトンはこの語を受理します。非決定性オートマトンでも、シミュレーションの途中で同じ状態にたどり着きます。つまり、状態 q0 から始め、記号1で状態 {q1, q2} に進みます。次の記号1で状態 {q0,q3} に進み、残りの記号についても同様です。最後には状態 {q0, q1, q2, q3} のすべてにいることになり、オートマトンはこの語を受理します。

参考文献

章: 有限オートマトン, 完全なオートマトン, 非決定性有限オートマトン, 非決定性オートマトンのシミュレーション, NFA から DFA への変換