ポンピング補題: 形式言語理論入門 10

今までは、どのような言語が決定性有限オートマトンにより表現できるかを見てきましたが、この章では、決定性有限オートマトンで表現できない言語がどのようなものかを学びます。ある言語が正規言語でないことを示すポンピング補題を学びます。

ポンピング補題

以下の一見奇妙な定理をポンピング補題といいます。

補題: ポンピング補題

\(A\) が正規言語であるならば、ある正整数 \(p\) が存在し、任意の長さ \(p\) 以上の単語 \(w \in A\) は以下の条件が成り立つ成り立つように \(w = x y z\) と分割できる

1. 任意の \(i \ge 0\) について \(x y^i z \in A\)
2. \(|y| > 0\)
3. \(|xy| \le p\)

ここで、\(y^i\) は \(y\) を \(i\) 個連結したものを表す(\(i = 0\) のときは空文字。)\(|x|\) は文字列 \|x\| の長さを表す。\(p\) をポンピング長とよぶ。

ここで \(x\) および \(z\) は空文字でもよいが \(y\) は二番目の条件より空文字ではいけないことに注意してください。また、一番目の条件では \(i = 0\) のときには \(x y^i z\) は \(w\) よりも短くなることに注意してください。

この定理だけ見ても、一体何に使えるのかよく分からないですね。実は、ポンピング補題は対偶、つまり、後段の条件が成り立たないときその言語が正規言語でない、というような論法でよく使われます。

ポンピング補題の証明は後回しにして例を見てみましょう。

命題: 非正規言語の例

\(A = \{0^n 1^n \mid n \ge 1\} = \{01, 0011, 000111, 00001111, \cdots\}\) は正規言語でない

命題の証明

背理法により示す。\(A\) が正規言語と仮定する。ポンピング補題より、ポンピング長 \(p\) が存在する。\(w = 0^p 1^p\) と取ると、\(w \in A\) および \(|w| \ge p\) より、ポンピング補題の条件を満たすように \(w = xyz\) と分解できる。

1. \(y\) が \(0\) のみを含むとすると、\(xy^2z\) は 1 の個数より 0 の個数が多くなるので \(xy^2z \not \in A\) となりポンピング補題の条件を満たさない。
2. \(y\) が \(1\) のみを含むとすると、\(xy^2z\) は 0 の個数より 1 の個数が多くなるので \(xy^2z \not \in A\) となりポンピング補題の条件を満たさない。
3. \(y\) が \(0\) と \(1\) を含むとすると、\(xy^2z\) は 0 の前に 1 が来ることになるので \(xy^2z \not \in A\) となりポンピング補題の条件を満たさない。

よって矛盾。\(A\) は正規言語でない。

ポンピング補題の三つ目の条件を使えば、\(y\) には \(0\) しか含まれないことになるので 2 番目と 3 番目の場合分けは実は必要ないです。

命題: 非正規言語の例

回文全体からなる言語 \(A\) は正規言語でない

命題の証明

背理法により示す。\(A\) が正規言語と仮定する。ポンピング補題より、ポンピング長 \(p\) が存在する。\(w = 0^p 1 0^p\) と取ると、\(w \in A\) および \(|w| \ge p\) より、ポンピング補題の条件を満たすように \(w = xyz\) と分解できる。

ポンピング補題の三つ目の条件より、\(y\) は \(0\) のみを含む。

\(xy^2z\) は \(s > t\) により \(0^s10^t\) と表されるので回文ではない。\(xy^2z \not \in A\) となりポンピング補題の条件を満たさない。

よって矛盾。\(A\) は正規言語でない。

ポンピング補題の証明

\(A\) を正規言語とすると、\(A\) を認識する決定性有限オートマトン \(M = (Q, \Sigma, \delta, q_0, F)\) が存在する。

\(p = |Q|\) とおく。

任意に長さが \(p\) 以上の文字列 \(w = c_1 c_2 \cdots c_n \in A\) をとる。\(w\) を \(M\) に入力したときの状態列を \(q_0 q_1 \cdots q_n\) とすると、\(n \ge p\) と鳩の巣原理より、\(q_i = q_j, (0 \le i < j \le p)\) となる \(i, j\) が存在する。\(x = c_1 c_2 \cdots c_{i}, y = c_{i+1} c_{i+2} \cdots, c_{j}, z = c_{j+1} c_{j+2} \cdots c_n\) とおく。\(i = 0\) のとき \(x\) が空文字であることに注意。こうすると \(w = x y z\) となり、

1. \(|y| \ge 1\)
2. \(|xy| \le p\)

となる。また、任意の \(k \ge 0\) について \(w’ = x y^k z\) とおくと、\(w’\) を \(M\) に入力したとき、状態列は \(q_0, q_1, \cdots, q_i, q_{i+1}, \cdots, q_{j}, q_{i+1}, q_{i+2}, \cdots, q_{j}, q_{i+1} q_{i+2}, \cdots, \cdots, q_{j}, q_{j+1}, \cdots, q_n\) というように、\(q_i, q_{i+1}, \cdots, q_j\) の間でループすることを除けば \(w\) と同じように遷移し最終的に受理状態 \(q_n\) にたどり着く。よって

3. \(w’ = x y^k z \in A\)。

以上より、ポンピング補題が成立する。

まとめ

  • ポンピング補題は正規言語であるための条件を述べている
  • ポンピング補題は逆に、その条件を満たさない言語が正規言語でないことを示すことによく使われる
  • 例えば回文全体の言語が正規言語でないことを見た

前章へもどる 第一章へもどる まとめへすすむ