✖

正規言語の共通部分

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つのオートマトンがあります。

A1=⟨Q1,Σ1,δ1,q0,F1⟩A2=⟨Q2,Σ2,δ2,p0,F2⟩

オートマトン A = ⟨Q, Σ, δ, q, F⟩ をつくり、言語 L(A1) ∩ L(A2) を受理するようにします。このオートマトンは次のように定めます。

  • Q = Q1 × Q2
  • Σ= Σ1 ∩ Σ2
  • q = ⟨q0, p0⟩
  • F = F1 × F2

遷移関数 δ については、次の関係が成り立ちます。

∀q∈Q1,p∈Q2:δ(⟨q,p⟩,a)=⟨δ1(q,a),δ2(p,a)⟩

例

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のような語は受理しないはずです。

参考文献

章: 正規言語の閉包性, 正規言語の和集合, 正規言語の共通部分, 正規言語の差集合, 正規言語の補集合, 正規言語の連接, 正規言語のクリーネ閉包