正規言語の和集合
2つの正規言語 L1, L2 を考えます。その和集合 L = L1 ∪ L2 も正規言語であることを証明します。
決定性オートマトンを使う方法
考え方
2つの正規言語 L1 と L2 があり、その和集合 L1 ∪ L2 もまた正規言語であることを証明したいとします。L1 と L2 は正規言語なので、有限オートマトン A1 と A2 が存在し、それぞれ言語 L1 と L2 を受理します。つまり、L(A1) = L1 と L(A2) = L2 が成り立ちます。ここで、有限オートマトン A をつくって言語 L1 ∪ L2 を受理させれば、言語 L1 ∪ L2 が正規言語であることを証明できます。
どうすればよいでしょうか。手元には、それぞれの言語を受理する有限オートマトン A1 と A2 があります。語 w が言語 L1 ∪ L2 に属するのは、オートマトン A1 と A2 の少なくとも一方がこの語を受理するとき、またそのときに限ります。
例えば、オートマトン A は入力 w に対して、オートマトン A1 に入力 w を与えたときの計算をシミュレートするように動くことが考えられます。A1 が語 w を受理すれば、語 w は A にも受理されます。A1 が語 w を受理しなければ、A はさらに、A2 に入力 w を与えたときの計算をシミュレートしてみます。A2 が語 w を受理すれば、A も語 w を受理します。そうでなければ、受理しません。
あとは、オートマトン A がほかのオートマトンの計算を「シミュレートする」とはどういうことかを形式化するだけです。
形式化
2つの正規言語 L1 と L2 があり、それぞれ次の有限オートマトンに受理されるとします。
有限オートマトン A = ⟨Q, Σ, δ, q, F⟩ をつくり、言語 L = L1 ∪ L2 を受理するようにします。2つのオートマトン A1, A2 をシミュレートするという考え方を使います。入力が語 w = w1w2… wn だとして、オートマトン A1 と A2 の語 w に対する動きを同時にシミュレートしてみましょう。オートマトン A1 の初期様相は ⟨q1, w1w2… wn⟩、A2 の初期様相は ⟨q2, w1w2… wn⟩ です。それぞれのオートマトンで計算を1ステップ行うと、様相 ⟨δ1(q1, w1), w2… wn⟩ と ⟨δ2(q2, w1), w2… wn⟩ に移ります。
これらの様相は1つ目の成分だけが異なり、2つ目の成分、つまり語のまだ読んでいない部分はいつも同じです。そのため、シミュレートするあいだ、2つのオートマトンの様相を2つとも保持する必要はなく、⟨⟨qi, qj⟩, wl… wn⟩ の形の様相を1つ保持するだけで済みます。ここで qi ∈ Q1、qj ∈ Q2 です。言いかえると、これからつくるオートマトン A の初期様相は ⟨⟨q1, q2⟩, w⟩ です。組 ⟨q1, q2⟩ の1つ目の成分はオートマトン A1 が今いる状態を、2つ目の成分はオートマトン A2 が今いる状態を表します。
そこで、つくるオートマトン A の状態の集合は Q = Q1 × Q2 と書けます。もとの2つのオートマトンの状態の集合の直積です。さらに、オートマトン A の初期状態を ⟨q1, q2⟩ とします。そして、オートマトン A1 が記号 w1 で状態 qi に移り、オートマトン A2 が記号 w1 で状態 qj に移るなら、オートマトン A は記号 w1 で状態 ⟨qi, qj⟩ に移るようにします。
遷移関数 δ は次のように書けます(ここでは、今いる状態が qi と qj であるとします)。
残りは細かい点だけです。アルファベットは Σ= Σ1 ∪ Σ2 とします。初期状態は q = ⟨q1, q2⟩ です。受理状態は、組 ⟨qi, qj⟩ のうち、qi ∈ F1 または qj ∈ F2 を満たすものすべてです。
手順の例
2つのオートマトンを考えます。1つ目はオートマトン A1 で、0と1が交互に現れるすべての語(空語も含む)、つまり01、0101、010101、…の形の語を受理します。
もう1つのオートマトン A2 は、0を少なくとも1つ含む語を受理します。
この2つの言語の和集合は、0を含むか、01、0101、…の形をした語の集合です。では、この和集合の言語を受理する有限オートマトン A = ⟨Q, Σ, δ, q, F⟩ をつくりましょう。まず、この新しいオートマトン A の状態がどうなるかを見てみます。1つ目と2つ目のオートマトンの状態の集合の直積です。
和集合の言語 L(A1) ∪ L(A2) を受理するオートマトン A の6つの状態は、このようになります。状態遷移図では次のようになります。
状態が状態の組でできていても、驚くことはありません。オートマトンの中で何が起きているのかをわかりやすくするためにすぎません。状態はふつうに q0, …, q5 という名前でもかまいません。受理状態は、状態 q0 または p1 を含む状態です。これらは、もとのオートマトンの受理状態です。初期状態は ⟨q0, p0⟩ です。
次に、すべての遷移を求めます。次のような表を書きます。
この表を順に埋めていきます。まず、状態 ⟨q0, p0⟩ から入力 0 でどこへ遷移するかを調べます。状態 q0 から入力0でどこへ遷移するかをオートマトン A1 で調べると、状態 q1 です。オートマトン A2 では、p0 から0の遷移は状態 p1 に向かいます。そこで、表に ⟨q1, p1⟩ と書きます。
入力1では、オートマトン A1 について δ1(q0, 1) = q2、オートマトン A2 について δ2(p0, 1) = p0 です。よって、状態 ⟨q2, p0⟩ が得られます。
表の残りを埋めます。
あとは、この表に従って状態遷移図の残りをかき加えるだけです。
オートマトンが正しく動くかを試してみましょう。語0100を受理するかを調べます。オートマトンは次の状態を順に通ります。
状態 ⟨q2, p1⟩ は受理状態なので、オートマトン A は語0100を受理します。では、語0100をオートマトン A1 と A2 に入力したら、どうなるでしょうか。オートマトン A1 は次の状態を順に通ります。
オートマトンは受理状態でない状態 q2 で終わるので、オートマトン A1 はこの語を受理しません。オートマトン A2 はどうでしょうか。
状態 p1 は受理状態なので、オートマトン A2 は語0100を受理します。オートマトン A1 と A2 が状態 q2 と p1 で終わったことは、オートマトン A が状態 ⟨q2, p1⟩ で終わったことと一致しています。
非決定性オートマトンを使う方法
例
正規言語の集合が和集合について閉じていることは、非決定性オートマトンをつくることでも証明できます。こちらのほうがずっと簡単です。
2つの正規言語 L1, L2 があり、その和集合 L = L1 ∪ L2 も正規言語であることを証明したいとします。L1, L2 は正規言語なので、これらの言語を受理するオートマトン A1, A2 が存在するはずです。つまり、L(A1) = L1 と L(A2) = L2 が成り立ちます。これらのオートマトンを使ってオートマトン A をつくり、言語 L を受理するように、つまり L(A) = L となるようにします。
有限オートマトン A1 と A2 が、それぞれ次のようになっているとします。
および
両方の言語の和集合を受理するオートマトンは、新しい初期状態をつくり、この状態からもとの2つの初期状態へ2本の ε 遷移を引けばつくれます。それだけです。オートマトンは次のようになります。
形式化
2つのオートマトン A1 = ⟨Q1, Σ, δ1, q1, F1⟩ と A2 = ⟨Q2, Σ, δ2, q2, F2⟩ があります。オートマトン A = ⟨Q, Σ, δ, q0, F⟩ をつくり、もとの2つのオートマトンが受理する言語の和集合を受理するように、つまり L(A) = L(A1) ∪ L(A2) となるようにします。このとき、次のように定めます。
- Q = Q1 ∪ Q2 ∪ {q0}
- F = F1 ∪ F2
遷移関数 δ は次のように定義します。
参考文献
章: 正規言語の閉包性, 正規言語の和集合, 正規言語の共通部分, 正規言語の差集合, 正規言語の補集合, 正規言語の連接, 正規言語のクリーネ閉包