✖

正規言語の連接

2つの正規言語 L1, L2 を考えます。その連接(連結ともいいます)L = L1 ∘ L2 も正規言語であることを証明します。

連接とは

2つの語「010」と「1111」を連接すると、語「0101111」ができます。言語の連接は、一方の言語のすべての語を、もう一方の言語のすべての語と連接してできる新しい言語です。語の連接も言語の連接も、丸の記号 ∘ で表します。すると、言語 L1 と L2 の連接は次のように定義できます。

L1∘L2={a∘b|a∈L1,b∈L2}

証明の考え方

2つの正規言語 L1, L2 と、これらの言語を受理する次の2つのオートマトンがあります。

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

非決定性オートマトン A = ⟨Q, Σ, δ, q, F⟩ をつくり、その中にオートマトン A1 と A2 の両方を「含める」ことにします。基本的な考え方は次のとおりです。まず語をオートマトン A1 で読み始め、オートマトン A1 が受理状態に達したら、語の残りの部分をさらにオートマトン A2 で受理できるかを試します。このオートマトンも語の残りの部分を受理すれば、オートマトン A はその語を受理します。

例

0だけからなる空でない語と、1のあとに0だけが続く語(1、10、100、…)を受理する、次のオートマトン A1 を考えます。

また、01で終わる語を受理する、次のオートマトン A2 も考えます。

2つのオートマトンは次のようにつなぎます。オートマトン A1 のすべての受理状態から、オートマトン A2 の初期状態へ ε 遷移を加え、そのあと A1 の受理状態を非受理状態にします。新しいオートマトン全体の初期状態は、オートマトン A1 の初期状態です。

このオートマトンはどのように動くでしょうか。まず、オートマトン A1 の動きをシミュレートします。もとの受理状態 q1 または q2 に移ったら、オートマトン A1 がこの語の前の部分を受理したことがわかります。語全体が言語 L1 ∘ L2 に属するには、語の残りの部分を2つ目のオートマトン A2 が受理しなければなりません。そのため、もとの受理状態のすべてから、オートマトン A2 のもとの初期状態へ ε 遷移が出ています。

例として、語0001を考えます。この語は2つの言語の連接に属します。語の連接 00 ∘ 01 としてできるからです。また、語の連接 0 ∘ 001 としてもできます。このオートマトンでは、どちらの手順もシミュレートできます。オートマトンは次の道筋をたどることができます。

q0→0q1→0q1→εp0→0p1→1p2

この道筋では、オートマトンはまず語の一部00を「受理」し、次に語の一部01を「受理」します。また、次の道筋をたどることもできます。

q0→0q1→εp0→0p0→0p1→1p2

この場合、オートマトンはまず語の一部0を「受理」し、次に語の一部001を「受理」します。どちらの場合も、もちろん受理状態 p2 にたどり着きます。

手順の形式化

もう一度まとめます。2つの正規言語 L1, L2 と、これらの言語を受理する次の2つのオートマトンがあります。

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

次の条件を満たす非決定性オートマトン A = ⟨Q, Σ, δ, q, F⟩ をつくります。

  • Q = Q1 ∪ Q2(ただし、Q1 ∩ Q2 = ∅ と仮定します)
  • Σ= Σ1 ∪ Σ2
  • q = q0
  • F = F2

遷移関数 δ は、場合に分けて次のように定めます。

δ(q,a)={δ1(q,a)q∈Q1∧q∉F1のときδ1(q,a)q∈F1∧a≠εのときδ1(q,a)∪{p0}q∈F1∧a=εのときδ2(q,a)q∈Q2のとき

参考文献

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