冗長な状態
有限オートマトンには、そこから受理状態にたどり着けず、役に立たない状態が含まれていることがあります。このような状態を冗長な状態といいます。冗長な状態はオートマトン全体を無駄に複雑にするだけなので、ふつうは取り除きます。
冗長な状態の例
次の有限オートマトンを考えます。
状態 q4 または q5 に入ってしまうと、受理状態 q1、q2 のどちらにも二度とたどり着けないことがわかります。このような状態は冗長なので、そのまま取り除くことができます。取り除いて得られる新しいオートマトンは、もとのオートマトンと等価です。つまり、同じ言語を受理します。冗長な状態を削除すると、オートマトンは次のようになります。
このオートマトンも同じ言語を受理します。ただし、冗長な状態があったほうがよい場合もあります。例えば、完全なオートマトンをつくるときです。
冗長な状態の定義
有限オートマトン A = ⟨Q, Σ, δ, q0, F⟩ を考えます。状態 q ∈ Q が冗長であるとは、次を満たす語 w ∈ Σ∗ と受理状態 qf ∈ F が1つも存在しないことです。
冗長な状態の取り除き方
入力として、到達不能状態をもたないオートマトン A = ⟨Q, Σ, δ, q0, F⟩ が与えられているとします。まず受理状態に向かう状態を見つけ、次に「受理状態に向かう状態」に向かう状態を見つけ、というようにくり返していきます。こうして、冗長でないすべての状態の集合が得られます。最初に S0 = F とおきます。続いて、集合 Si を i ∈ ℕ について次の規則でつくります。
こうして得られる、冗長でない状態全体の集合は、次のように表せます。
また、冗長な状態の集合は次のとおりです。
言いかえると、Si = Si + 1 が成り立てば、集合 Q ∖ Si の要素が冗長な状態です。この手順を、次のオートマトンで説明します。
まず、S0 = {q1, q2} とおきます。次に、集合 S1 をつくります。集合 S0 に、S0 のどれかの状態に向かうすべての状態を加えます。加わるのは、状態 q0 と q3 です。q0 から q1 への遷移があり、q3 から q2 への遷移があるからです。S1 = {q0, q1, q2, q3} が得られます。S0 ≠ S1 なので、さらに続けます。
集合 S2 をつくります。S1 に行くことができて、まだ S1 に入っていない状態をすべて探します。そのような状態はただ1つ、q6 で、ここから状態 q3 に行けます。S2 = {q0, q1, q2, q3, q6} が得られます。S1 ≠ S2 なので、さらに続けます。
集合 S3 をつくります。S2 のどれかの状態に行ける新しい状態はあるでしょうか。ありません。状態 q4 と q5 からは S2 のどの状態にも行けず、ほかの状態はすでに S2 に入っています。よって、S3 = {q0, q1, q2, q3, q6} です。S2 = S3 なので、アルゴリズムは終了し、集合 S2 が冗長でない状態の集合になります。集合 {q4, q5} が冗長な状態の集合です。
形式的には、冗長な状態をもたない新しい等価なオートマトンを次のようにつくります。オートマトン A = ⟨Q, Σ, δ, q0, F⟩ が与えられたとき、これと等価で冗長な状態をもたないオートマトン A′ = ⟨Q′, Σ, δ′, q0, F⟩ を次のように定めます。
- ∀q ∈ Q′, a ∈ Σ: δ′(q, a) = δ(q, a)(ただし δ(q, a) ∈ Q′ の場合。そうでない場合、δ′(q, a) は定義されません)
参考文献
章: 到達不能状態, 冗長な状態, オートマトンの最小化