本質的に曖昧な文脈自由言語
本質的に曖昧な文脈自由言語が存在するという事実は色んなところで何度も目にしてきたのですが、証明を見たことが無かったのでここで紹介します。
流れは大体 [1] と同じですが、補題の証明はオリジナルも混ざってます(本質的には同じだとは思います)(間違ってたら教えてください)
今回本質的に曖昧だと示すのは です。(これが文脈自由であることは簡単なので省略します)
ちなみに、これは計算理論の基礎 [2] (めっちゃいい本)の第2版の演習問題 2.29 です。(本に答えは載っていません)
めちゃくちゃ難しいと思うのですが自信のある人は考えてみてください(僕は分かりませんでした)
少しずつ補題を証明していく形式なので、少しずつ読んで考えてみるのも面白いかもしれません。(最後のステップだけでも普通に難しいと思います)
基本的な記法と定義
文脈自由文法を非終端記号 、終端記号
、生成規則
、開始記号
の組
で定義します。
生成規則を のように表します。
生成規則を 0 回以上適用して新しい列を生成することを のように表します。
生成規則を 1 回以上適用して新しい列を生成することを のように表します。
文法 が生成する言語を
と表します。
は終端記号の列を表すメタ変数とします。
文法 が既約であるとは、任意の非終端記号
について 導出の過程で
を使って言語の要素を導出できることとします。(つまり、開始記号からある非終端記号に到達できなかったり、ある非終端記号から無限ループやデッドエンドに陥って語を生成できないといったことがないということです。)
証明
補題0
任意の曖昧でない文脈自由文法 について、
となる既約な曖昧でない文脈自由文法
が存在する。
補題0の証明
到達できない記号や無限ループやデッドエンドに陥る非終端記号を取り除くだけでよいです。
具体的には
とすると、
とすればよいです。
補題1
任意の既約な曖昧でない文脈自由文法 について、
となることはない。
補題1の証明
となる非終端記号があると、
と
と木の形が違う二通りの導出ができてしまうので、曖昧な文法になります。
定義 (
)
文法 について
ここで、補題1 より が既約で曖昧でないとき、
となることはないので、
のとき
から
を含む列を生成することはありません。
定義 (almost looping)
文法 が almost looping であるとは、
は既約
- 任意の
の導出において
は一度しか出現しない
3 の条件が元の論文と少し違うので注意してください。
補題2
任意の既約な曖昧でない文脈自由文法 について、
となる almost looping な曖昧でない文脈自由文法
が存在する。
補題2の証明
まず、 3 が成り立っていないときは新しい開始記号 と規則
を用意すれば、既約性と非曖昧性は変わらず 3 が成り立つので、最初から 3 は成り立っているものとします。
から非終端記号
を 1 つずつ帰納的に処理して
と変形していきます。
処理の仕方は、ループしない非終端記号については単純に木を 1 段増やすだけなので、そのような非終端記号を文法から取り除いて、子を親に直接つなぐように生成規則を変化させるというやり方です。
具体的には以下のようになります。
(1) のとき
このときは何も変化させません。
とします。
(2) のとき
とします。
のうち、左辺が
であるものの集合を
とします。
の定義と
の非曖昧性(と補題1)より
の右辺に
はないはずです。
が右辺にある
の生成規則について、
の出現をそれぞれ
の右辺で置き換えたものを
とします。
が右辺に
回出現する規則の場合は、
個の規則に置き換わります。
そして、 とします。
既約性と非曖昧性は (1) の場合は文法が変化していないので成立し、 (2) の場合も、木の が出てくるノードについて子を親に直接つなぐようにしただけなので成立します。
また、 なる非終端記号
について
です。
これは、(i) は場合分けの定義からそのままで、(ii) も が無くなったので帰納法の仮定からそのまま成り立ちます。
また、生成する言語も変化しません。
以上より とすれば目標達成です。
補題3
となる almost looping な文脈自由文法
の開始記号でない非終端記号
は以下の 3 タイプのうちちょうど 1 つにあてはまる
が存在して
または
が存在して
が存在して
補題3の証明
まず各非終端記号がどのタイプかに属することを示します。
almost looping の定義から、 となります。
ここで、 または
に二種類以上の非終端記号を含むとすると、
となり、
が
の順に並ばなければいけないことに反します。
よって、 と
に含まれる非終端記号は高々 1 種類となり、ありえる組み合わせは次の 16 通りです
x | y | タイプ |
---|---|---|
空 | 空 | ありえない(i) |
a | 空 | 1 |
b | 空 | ありえない(iii) |
c | 空 | 1 |
空 | a | 1 |
a | a | 1 |
b | a | ありえない(ii) |
c | a | ありえない(ii) |
空 | b | ありえない(iii) |
a | b | 2(v) |
b | b | ありえない(iii) |
c | b | ありえない(ii) |
空 | c | 1 |
a | c | ありえない(iv) |
b | c | 3(v) |
c | c | 1 |
(i) について: です。
(ii) について: が
の順に並ばなければいけないことに反します。
(iii) について:
とします。
とします。
この真ん中の段階において、 を
回繰り返すと、
となり矛盾します。
(iv) について:
とします。
とします。
この真ん中の段階において、 を
回繰り返すと、
となり矛盾します。
(v) について:
とします。
とします。この真ん中の段階において、
を
回繰り返すと、
となり矛盾します。
よって です。
のときも同様です。
次に、どれか一つのタイプにしか属せないことを示します。
仮に、タイプ 1 とタイプ 2 に属していたとすると、
となります。
は一種類の終端記号しか生成してはいけないので、
または
です。
のとき
に反します。
のとき (v) の議論から
となり
に反します。
これは矛盾です。
タイプ 1 とタイプ 3 についても同様です。
仮に、タイプ 2 とタイプ 3 に属していたとすると、
となります。
が
の順に並ばなければいけないことに反します。
以上より示せました。
補題4
となる almost looping な文脈自由文法
について、
が
と補題3のタイプ1の非終端記号からのみ生成できるとき、
に含まれる
の個数は
個以下となる(
は文法
により定まる定数)
補題4の証明
の導出木を考えます。
almost looping なので、 は一度しか現れません。
タイプ1の非終端記号 を表す頂点
の子孫に
を表す頂点
が現れるとき、
の部分木を
の部分木で置き換えても
の個数は変わりません。
これを繰り返して、子孫に同じ非終端器号が現れない木 を作り、これが表す終端記号列を
とします。
根からのパスに同じ非終端記号が現れないので の深さは
以下です。
の生成規則の右辺に現れる記号の最大数を
とします。
すると、 なので、
に含まれる
の個数も
個以下です。
よって、 とすれば良いことが分かります。
が本質的に曖昧であることの証明
背理法により証明します。
を生成する曖昧でない文法
が存在したと仮定します。
補題0 より、 を生成する既約で曖昧でない文法
が存在します。
補題2 より、 を生成する almost looping な曖昧でない文法
が存在します。
補題3 のタイプ 2 とタイプ 3 について を全て掛けあわせたものを
とします。
補題4 の について、
となる
の倍数
をとります。
を考えます。
なので、補題 4 より、タイプ 2 かタイプ 3 の非終端記号が
の導出の過程で現れます。
仮にタイプ 3 の非終端記号 が
の導出で出現したとすると、
となり矛盾するので、 の導出にはタイプ 3 の非終端記号は含まれていません。
よって、タイプ 2 の終端記号 が
の導出の過程で出現します。
この導出の過程でタイプ 2 の非終端記号が出現し、タイプ 3 の非終端記号は出現しません。
同様に を考えると、タイプ 3 の非終端記号が出現し、タイプ 2 の非終端記号は出現しないような
の導出があります。
これは の異なる導出木があることを意味し、
が曖昧な文法となり、矛盾が生じます。
よって、 は本質的に曖昧です。
最後に
もしもっと簡単に証明できるのならぜひ教えてください。
何か間違いや質問などがあればお願いします。
最後まで読んでいただきありがとうございました。
参考文献
[1] Herman A. Maurer. (1969). A Direct Proof of the Inherent Ambiguity of a Simple Context-Free Language.
[2] Michael Sipser. (2008). 計算理論の基礎 [原著第2版] 1.オートマトンと言語. (訳書)