正規言語の共通部分
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 が正規言語であることを証明できます。
語が言語の共通部分に属するのは、その語が言語 L1 と L2 の両方に属するときです。つまり、オートマトン A1 とオートマトン A2 の両方がその語を受理しなければなりません。正規言語の和集合で使ったのとまったく同じ考え方を使い、受理状態の集合だけを変えます。
手順の形式化
次の2つのオートマトンがあります。
オートマトン A = ⟨Q, Σ, δ, q, F⟩ をつくり、言語 L(A1) ∩ L(A2) を受理するようにします。このオートマトンは次のように定めます。
- Q = Q1 × Q2
- Σ= Σ1 ∩ Σ2
- q = ⟨q0, p0⟩
- F = F1 × F2
遷移関数 δ については、次の関係が成り立ちます。
例
1を偶数個含むすべての語を受理する、次のオートマトン A1 を考えます。
また、0を奇数個含む語を受理する、次のオートマトン A2 も考えます。
これらの言語の共通部分を受理するオートマトンをつくります。このオートマトンの状態の集合は Q = Q1 × Q2 の形で、初期状態は状態 ⟨q0, p0⟩、受理状態は F1 × F2 です。
次に、δ(⟨q,p⟩, a) = ⟨δ1(q, a), δ2(p, a)⟩ となるように遷移をつけ加えます。
例えば、このオートマトンには、状態 ⟨q0, p0⟩ から記号0で状態 ⟨q0,p1⟩ に向かう遷移があります。これは、オートマトン A1 には状態 q0 から記号0で再び状態 q0 にもどる遷移があり、オートマトン A2 には記号0で状態 p0 から状態 p1 に向かう遷移があることに対応しています。
オートマトンを試してみましょう。110や00000のような語は受理し(1を偶数個含み、しかも0を奇数個含みます)、11、111、1010のような語は受理しないはずです。
参考文献
章: 正規言語の閉包性, 正規言語の和集合, 正規言語の共通部分, 正規言語の差集合, 正規言語の補集合, 正規言語の連接, 正規言語のクリーネ閉包