§E15.3文脈自由言語

最終更新

文脈自由文法は、非終端記号を生成規則によって展開して語を作る。pushdown automaton は、有限制御に後入れ先出しのスタックを加えて語を読む。本記事では、導出と構文木を定義し、空スタック受理と終状態受理の関係を明示したうえで、文脈自由文法と非決定性 pushdown automaton の表現力が一致することを両方向の有限構成によって証明する。

1 文法、導出、構文木

終端記号と非終端記号は互いに重ならない有限集合として固定する。

定義 1.1. 文脈自由文法 (context-free grammar)(CFG)は、四項組

G=(V,Σ,P,S)G=(V,\Sigma,P,S)

である。VVは有限な非終端記号集合、Σ\Sigmaは有限な終端記号集合であり、V∩Σ=∅V\cap\Sigma=\varnothingとする。S∈VS\in Vは開始記号である。PPは有限な生成規則集合であり、各規則は

A⟶γ(A∈V, γ∈(V∪Σ)∗)A\longrightarrow\gamma \qquad (A\in V,\ \gamma\in(V\cup\Sigma)^*)

の形をもつ。右辺γ=ε\gamma=\varepsilonも許す。

規則A→γA\to\gammaを用いて

αAβ⇒Gαγβ\alpha A\beta\Rightarrow_G\alpha\gamma\beta

と書く。⇒G\Rightarrow_Gの反射推移閉包を⇒G∗\Rightarrow_G^*と書き、

L(G)={w∈Σ∗:S⇒G∗w}L(G)=\{w\in\Sigma^*:S\Rightarrow_G^*w\}

をGGの生成言語 (generated language) という。ある CFG の生成言語である言語を文脈自由言語 (context-free language) という。

一段導出で置き換える非終端記号より左側に非終端記号がない場合、その導出を左端導出という。左端導出の反射推移閉包を⇒lm∗\Rightarrow_{\mathrm{lm}}^*と書く。

導出の途中では、非終端記号がまだ展開されずに残る。この状態も含めて木として表すため、根を任意の非終端記号とし、未展開の葉を許す形で定義する。

定義 1.2. CFGG=(V,Σ,P,S)G=(V,\Sigma,P,S)とA∈VA\in Vに対して、AA-導出木 (A-derivation tree) は、根付き順序木であって、次を満たすものである。

  1. 根はAAで標識される。
  2. 各頂点はV∪Σ∪{ε}V\cup\Sigma\cup\{\varepsilon\}の元で標識される。Σ\Sigmaまたはε\varepsilonで標識された頂点は葉である。
  3. B∈VB\in Vで標識された頂点が子をもち、どの子もV∪ΣV\cup\Sigmaで標識されるならば、子の標識を左から並べた語X1⋯XkX_1\cdots X_kについて、B→X1⋯XkB\to X_1\cdots X_kはPPの規則である。
  4. B∈VB\in Vで標識された頂点の子が、ε\varepsilonで標識された一つの葉だけである場合、B→εB\to\varepsilonはPPの規則である。頂点が子をもつのは、条件 (c)または条件 (d)の場合に限る。

VVで標識された葉を未展開の葉 (unexpanded leaf) という。葉の標識を左から並べ、ε\varepsilonで標識された葉は記号を寄与しないものとして得られる(V∪Σ)∗(V\cup\Sigma)^*の元を、その木の成果 (yield)(yield)という。頂点vvに対して、vvを根とする部分木の成果をyield(v)\mathrm{yield}(v)と書く。

未展開の葉をもたないAA-導出木を完成した (completed)AA-導出木といい、その成果はΣ∗\Sigma^*に属する。完成したSS-導出木をGGの構文木 (parse tree) という。

任意の導出は、生成規則を左端から適用する導出へ並べ替えることができる。この事実を導出木を介して証明する。根を任意の非終端記号とするのは、証明の帰納段で部分木へ帰納法の仮定を適用するためである。

命題 1.3.G=(V,Σ,P,S)G=(V,\Sigma,P,S)、A∈VA\in Vおよびw∈Σ∗w\in\Sigma^*に対して、次の三条件は同値である。

  1. A⇒G∗wA\Rightarrow_G^*w。
  2. A⇒lm∗wA\Rightarrow_{\mathrm{lm}}^*w。
  3. 成果がwwである完成したAA-導出木が存在する。

とくにA=SA=Sの場合、三条件はw∈L(G)w\in L(G)と同値である。

証明.(2)⇒\Rightarrow(1)は直ちに従う。

(1)⇒\Rightarrow(3)を示す。導出

A=α0⇒Gα1⇒G⋯⇒Gαn=wA=\alpha_0\Rightarrow_G\alpha_1\Rightarrow_G\cdots\Rightarrow_G\alpha_n=w

を一つ取る。iiに関する帰納法で、成果がαi\alpha_iであるAA-導出木TiT_iを構成する。T0T_0はAAで標識された根だけからなる木とする。根は未展開の葉であり、子をもたないため、定義の四条件をすべて満たす。

TiT_iが得られたとする。一段導出αi=βBγ⇒Gβδγ=αi+1\alpha_i=\beta B\gamma\Rightarrow_G\beta\delta\gamma=\alpha_{i+1}が規則B→δB\to\deltaによるとする。TiT_iの成果はαi\alpha_iであるから、葉を左から読んだときβ\betaの直後に来る葉はBBで標識され、未展開である。この葉へ、δ\deltaの記号を左から順に子として付ける。δ=ε\delta=\varepsilonの場合にはε\varepsilonで標識された子を一つ付ける。得られる木Ti+1T_{i+1}は定義の四条件を満たすAA-導出木であり、その成果はβδγ=αi+1\beta\delta\gamma=\alpha_{i+1}である。

TnT_nの成果はw∈Σ∗w\in\Sigma^*であるから、TnT_nは未展開の葉をもたない。よってTnT_nは完成したAA-導出木である。

(3)⇒\Rightarrow(2)を示す。完成したAA-導出木の内部頂点数に関する帰納法を用いる。

内部頂点が根だけである場合、根の子はすべて葉であり、Σ\Sigmaまたはε\varepsilonで標識される。定義の定義 1.2 条件 (c)または定義 1.2 条件 (d)により、根に対応する規則を一度適用すれば成果wwを得る。

一般の場合、根の子を左からX1,…,XkX_1,\ldots,X_kとする。子がε\varepsilonで標識された一つの葉だけである場合は上の基底に含まれるため、どの子もV∪ΣV\cup\Sigmaで標識されるとしてよい。まず規則

A→X1⋯XkA\to X_1\cdots X_k

を適用する。Xj∈VX_j\in Vである子uju_jについて、uju_jを根とする部分木は完成したXjX_j-導出木であり、その内部頂点数は元の木より真に少ない。帰納法の仮定により、yield(uj)=wj\mathrm{yield}(u_j)=w_jに対してXj⇒lm∗wjX_j\Rightarrow_{\mathrm{lm}}^*w_jが成り立つ。この左端導出を、jjの小さい順に適用する。Xj∈ΣX_j\in\Sigmaである子は、その終端記号をそのまま寄与する。

左側の子をすべて処理し終えた時点では、その左側はすべて終端記号であるから、次の部分木に対する左端導出は木全体でも左端導出である。最後の子まで続けると、木の成果wwを得る。

最後に、A=SA=Sの場合を考える。定義 1.1によりw∈L(G)w\in L(G)はS⇒G∗wS\Rightarrow_G^*wと同値であるから、三条件はいずれもw∈L(G)w\in L(G)と同値である。▨

例 1.4 (a の並びの後に同数の b が続く言語). 開始記号をSSとし、生成規則を

S→aSb∣εS\to aSb\mid\varepsilon

とする。この文法の生成言語は

{anbn:n≥0}\{a^n b^n:n\ge 0\}

である。

実際、S→aSbS\to aSbをnn回適用してからS→εS\to\varepsilonを適用すればanbna^n b^nを得る。

逆向きには、文形式に関する次の不変量を導出の長さに関する帰納法で示す。SSから到達することができる文形式は、akSbka^kSb^kまたはakbka^kb^k(k≥0k\ge 0)の形に限る。実際、初期の文形式はa0Sb0a^0Sb^0である。akSbka^kSb^kにS→aSbS\to aSbを適用するとak+1Sbk+1a^{k+1}Sb^{k+1}を得て、S→εS\to\varepsilonを適用するとakbka^kb^kを得る。akbka^kb^kには非終端記号がないため、これ以上の一段導出は存在しない。個数の一致だけではababababのような語を排除することができないが、この不変量は語の形まで定めている。終端語である文形式はakbka^kb^kの形に限るため、生成言語は{anbn:n≥0}\{a^nb^n:n\ge 0\}である。

2 Pushdown automaton と受理方式

スタックの左端を上端とする。したがって、スタック語XβX\betaではXXが上端記号である。

定義 2.1. 非決定性 pushdown automaton (nondeterministic pushdown automaton)(PDA)は、七項組

M=(Q,Σ,Γ,δ,q0,Z0,F)M=(Q,\Sigma,\Gamma,\delta,q_0,Z_0,F)

である。QQは有限状態集合、Σ\Sigmaは有限入力アルファベット、Γ\Gammaは有限スタックアルファベット、q0∈Qq_0\in Qは初期状態、Z0∈ΓZ_0\in\Gammaは初期スタック記号、F⊆QF\subseteq Qは受理状態集合である。遷移関数は

δ:Q×(Σ∪{ε})×Γ⟶Pfin(Q×Γ∗)\delta:Q\times(\Sigma\cup\{\varepsilon\})\times\Gamma \longrightarrow\mathcal{P}_{\mathrm{fin}}(Q\times\Gamma^*)

である。

配置 (configuration) は(q,w,α)∈Q×Σ∗×Γ∗(q,w,\alpha)\in Q\times\Sigma^*\times\Gamma^*である。(p,γ)∈δ(q,a,X)(p,\gamma)\in\delta(q,a,X)ならば

(q,aw,Xβ)⊢M(p,w,γβ)(q,aw,X\beta)\vdash_M(p,w,\gamma\beta)

とし、(p,γ)∈δ(q,ε,X)(p,\gamma)\in\delta(q,\varepsilon,X)ならば

(q,w,Xβ)⊢M(p,w,γβ)(q,w,X\beta)\vdash_M(p,w,\gamma\beta)

とする。第一の遷移は入力aaを一文字消費し、第二の遷移は入力を消費しない。いずれも上端記号XXを語γ\gammaに置き換える。

PDA には二つの標準的な受理方式がある。

定義 2.2. PDAM=(Q,Σ,Γ,δ,q0,Z0,F)M=(Q,\Sigma,\Gamma,\delta,q_0,Z_0,F)が語wwを終状態で受理する (accept by final state) とは、あるf∈Ff\in Fとα∈Γ∗\alpha\in\Gamma^*が存在して

(q0,w,Z0)⊢M∗(f,ε,α)(q_0,w,Z_0)\vdash_M^*(f,\varepsilon,\alpha)

となることをいう。

受理状態集合を用いない PDA が語wwを空スタックで受理する (accept by empty stack) とは、あるq∈Qq\in Qが存在して

(q0,w,Z0)⊢M∗(q,ε,ε)(q_0,w,Z_0)\vdash_M^*(q,\varepsilon,\varepsilon)

となることをいう。

どちらの定義でも、入力全体を消費しなければ受理にならない。空語遷移だけで受理状態または空スタックへ到達した場合には、空語を受理する。

定理 2.3. 終状態で受理する PDA と空スタックで受理する PDA は、同じ言語のクラスを受理する。

証明. 最初に、終状態で受理する

M=(Q,Σ,Γ,δ,q0,Z0,F)M=(Q,\Sigma,\Gamma,\delta,q_0,Z_0,F)

を空スタック受理へ変換する。QQに属さない新しい状態s,ds,dと、Γ\Gammaに属さない新しい底記号⊥\botをとる。新しい PDA は底記号⊥\botだけを初期スタックとし、

(s,w,⊥)⊢(q0,w,Z0⊥)(s,w,\bot)\vdash(q_0,w,Z_0\bot)

という空語遷移をもつ。MMの遷移はすべてそのまま複製する。さらに、各f∈Ff\in FとX∈Γ∪{⊥}X\in\Gamma\cup\{\bot\}に対して

(f,w,Xβ)⊢(d,w,Xβ)(f,w,X\beta)\vdash(d,w,X\beta)

という空語遷移を加え、ddでは各X∈Γ∪{⊥}X\in\Gamma\cup\{\bot\}を空語遷移で取り除く。

MMがwwを終状態で受理するなら、新しい機械はその計算を模倣し、状態ddへ移ってスタック全体を空にする。逆に、新しい機械が入力をすべて消費してスタックを空にするには、状態ddへ入らなければならず、その直前にはMMの受理状態にいる。状態ddには入力を消費する遷移がないため、その時点で入力はすでに空である。したがって、変換前後の受理言語は等しい。

次に、空スタックで受理する PDAMMを終状態受理へ変換する。QQに属さない新しい状態s,fs,fと、Γ\Gammaに属さない新しい底記号⊥\botをとる。初期スタックを⊥\botとし、空語遷移でssからq0q_0へ移るときに⊥\botをZ0⊥Z_0\botへ置き換える。MMの遷移をすべて複製し、各q∈Qq\in Qについて、上端が⊥\botになったときに空語遷移でffへ移り、⊥\botは残す。ffを唯一の受理状態とし、ffからの遷移は置かない。

MMが入力全体を消費して元のスタックを空にしたとき、新しい機械の上端は⊥\botであるためffへ移ることができる。逆に、新しい機械がffで入力全体を消費しているなら、ffへ入る直前には上端が⊥\botであり、元のスタックは空である。よって、この変換も受理言語を保存する。▨

新しい状態と底記号は、元の状態集合およびスタックアルファベットに属さないものを選ばなければならない。既存の記号を再利用すると、元の計算と受理後のスタック消去を区別することができない場合がある。

3 文脈自由文法から PDA へ

CFG の左端導出を、スタックの上端にある左端記号の展開として実行する。

定理 3.1. 任意の CFGGGに対して、L(MG)=L(G)L(M_G)=L(G)を空スタックで受理する PDAMGM_Gを構成することができる。

証明.G=(V,Σ,P,S)G=(V,\Sigma,P,S)とする。一状態qqをもち、スタックアルファベットを

Γ=V∪Σ\Gamma=V\cup\Sigma

とし、初期スタック記号をSSとする PDAMGM_Gを構成する。各生成規則A→γA\to\gammaに対して

(q,γ)∈δ(q,ε,A)(q,\gamma)\in\delta(q,\varepsilon,A)

とし、各a∈Σa\in\Sigmaに対して

(q,ε)∈δ(q,a,a)(q,\varepsilon)\in\delta(q,a,a)

とする。前者は上端の非終端記号を規則の右辺へ置き換え、後者は入力の先頭文字と上端の終端記号が一致するときに両方を取り除く。

入力wwの接頭辞xxをすでに消費し、残りがyyで、スタックがα\alphaである配置

(q,y,α)(q,y,\alpha)

に対して、文形式xαx\alphaを対応させる。初期配置ではx=εx=\varepsilon、α=S\alpha=Sであるため、対応する文形式はSSである。

生成規則に対応する空語遷移が

(q,y,Aβ)⊢(q,y,γβ)(q,y,A\beta)\vdash(q,y,\gamma\beta)

を与えるとき、対応する文形式は

xAβ⇒GxγβxA\beta\Rightarrow_G x\gamma\beta

と変化する。xxは消費済みの終端語であるため、この導出は左端導出である。終端記号を照合する遷移

(q,ay,aβ)⊢(q,y,β)(q,ay,a\beta)\vdash(q,y,\beta)

では、消費済み接頭辞がxxからxaxaへ変わるが、対応する文形式は遷移の前後でともにxaβxa\betaであり、文法の導出は進まない。

したがって、MGM_Gに受理計算

(q,w,S)⊢∗(q,ε,ε)(q,w,S)\vdash^*(q,\varepsilon,\varepsilon)

が存在するなら、遷移列に沿って上の対応を適用することにより

S⇒lm∗wS\Rightarrow_{\mathrm{lm}}^*w

を得る。よってw∈L(G)w\in L(G)である。

逆にw∈L(G)w\in L(G)とする。命題 1.3により、左端導出

S⇒lm∗wS\Rightarrow_{\mathrm{lm}}^*w

が存在する。左端導出の各生成規則を、上端非終端記号を置き換える空語遷移で順に模倣する。文形式の先頭に終端記号が現れるたび、その文字を入力とスタックから同時に取り除く。左端導出であるため、次に展開する非終端記号より左側の終端記号はすべてこの方法で照合することができる。導出がwwに達した後、残る終端記号をすべて照合すると、入力とスタックが同時に空になる。したがってMGM_Gはwwを空スタックで受理する。ゆえにL(MG)=L(G)L(M_G)=L(G)である。▨

定理 2.3を適用すれば、同じ言語を終状態で受理する PDA も得られる。

4 PDA から文脈自由文法へ

逆向きの構成では、一つのスタック記号を取り除き、その下のスタック部分へ初めて戻るまでの計算区間を、一つの非終端記号で表す。

定義 4.1 (保護された計算区間). PDAMMの状態p,qp,q、スタック記号XX、語wwに対して

p⇒Xwqp\xRightarrow[X]{w}q

で表す関係を 保護された計算区間 (protected computation segment) といい、任意のスタック接尾辞β\betaに対して、入力wwをちょうど消費する計算

(p,w,Xβ)⊢M∗(q,ε,β)(p,w,X\beta)\vdash_M^*(q,\varepsilon,\beta)

が存在し、終点より前のすべての配置のスタックがρβ\rho\beta(ρ∈Γ+\rho\in\Gamma^+)の形をもつとき、かつそのときに限りp⇒Xwqp\xRightarrow[X]{w}qと定める。この計算は、最後の一手まで接尾辞β\betaの記号を読み書きしない。

遷移は上端だけを参照するため、あるβ\betaについて保護された計算が存在すれば、同じ遷移列を任意のβ\betaの上で実行することができる。したがって、定義中の「任意の接尾辞」は一つの接尾辞について確かめても同じ関係を与える。

定理 4.2. 任意の PDAMMに対して、L(GM)=L(M)L(G_M)=L(M)を満たす CFGGMG_Mを構成することができる。

証明.定理 2.3によって、MMは空スタックで受理すると仮定してよい。MMを

M=(Q,Σ,Γ,δ,q0,Z0)M=(Q,\Sigma,\Gamma,\delta,q_0,Z_0)

と書く。

各p,q∈Qp,q\in QとX∈ΓX\in\Gammaに対して、新しい非終端記号

[pXq][pXq]

を用意する。非終端記号[pXq][pXq]は入力記号およびスタック記号とは異なる形式的な記号である。さらに新しい開始記号S0S_0を用意し、各q∈Qq\in Qに対して

S0→[q0Z0q]S_0\to[q_0Z_0q]

を生成規則に加える。

PDA の遷移

(r,Y1⋯Yk)∈δ(p,a,X),a∈Σ∪{ε}(r,Y_1\cdots Y_k)\in\delta(p,a,X), \qquad a\in\Sigma\cup\{\varepsilon\}

を一つ固定する。k≥1k\ge 1の場合、任意の中間状態

s1,…,sk−1∈Qs_1,\ldots,s_{k-1}\in Q

と終状態q∈Qq\in Qに対して

[pXq]→a‾ [rY1s1][s1Y2s2]⋯[sk−1Ykq][pXq]\to \overline{a}\,[rY_1s_1][s_1Y_2s_2]\cdots [s_{k-1}Y_kq]

という展開規則を加える。ここで、a∈Σa\in\Sigmaならa‾=a\overline{a}=aとし、a=εa=\varepsilonならa‾\overline{a}は空語を表す。k=0k=0の場合には

[pXr]→a‾[pXr]\to\overline{a}

という消去規則を加える。Q,ΓQ,\Gammaおよび遷移集合が有限であり、各遷移が有限長のスタック語を押し込むため、この文法の非終端記号と生成規則は有限個である。

次の不変量を証明する。

[pXq]⇒GM∗w⟺p⇒Xwq.[pXq]\Rightarrow_{G_M}^*w \quad\Longleftrightarrow\quad p\xRightarrow[X]{w}q.

左から右を、完成した[pXq][pXq]-導出木の内部頂点数に関する帰納法で示す。命題 1.3は根を任意の非終端記号とする形で述べてあるため、GMG_Mの開始記号でない[pXq][pXq]を根とする導出木にも適用することができる。根で展開規則を用いたとする。PDA は最初に入力aaを消費するか、a=εa=\varepsilonの場合には入力を消費せず、

(p,a‾w1⋯wk,Xβ)⊢(r,w1⋯wk,Y1⋯Ykβ)(p,\overline{a}w_1\cdots w_k,X\beta) \vdash (r,w_1\cdots w_k,Y_1\cdots Y_k\beta)

と遷移する。各子の部分木は根の木より小さいため、帰納法の仮定により、wiw_iを消費してYiY_iを取り除き、状態を一つ前の中間状態から次の中間状態へ移す保護された計算が存在する。各子部分木に対応する保護された計算を左から順に連結すると、XXを取り除いて状態qqに至る保護された計算を得る。消去規則の場合には、最初の一遷移がXXを直ちに取り除くため主張が成り立つ。

右から左を、保護された計算の遷移回数に関する帰納法で示す。p⇒Xwqp\xRightarrow[X]{w}qを与える計算の最初の遷移を

(r,Y1⋯Yk)∈δ(p,a,X)(r,Y_1\cdots Y_k)\in\delta(p,a,X)

とする。k=0k=0ならば、この一遷移で接尾辞β\betaが露出する。保護された計算はその時点で終わらなければならないためq=rq=r、w=a‾w=\overline aであり、消去規則が[pXq]⇒∗w[pXq]\Rightarrow^*wを与える。

k≥1k\ge 1とする。計算は接尾辞β\betaに触れずにY1⋯YkY_1\cdots Y_kをすべて取り除く。各i=1,…,ki=1,\ldots,kについて、スタック全体が初めてYi+1⋯YkβY_{i+1}\cdots Y_k\betaに一致する時点をとる。ただしi=ki=kでは、スタックが初めてβ\betaになる終点をとる。スタック記号が重複する場合があるため、上端の記号ではなくスタック語全体で時点を定める。このような時点は、スタックが上端からしか変更されず、最終的にβ\betaへ戻るため必ず存在する。その時点の状態をsis_iとし、sk=qs_k=qとする。最初の遷移後からこれらの時点までに消費される入力を順にw1,…,wkw_1,\ldots,w_kと書くと、

w=a‾w1⋯wkw=\overline a w_1\cdots w_k

であり、

r⇒Y1w1s1,s1⇒Y2w2s2,…,sk−1⇒Ykwkqr\xRightarrow[Y_1]{w_1}s_1,\quad s_1\xRightarrow[Y_2]{w_2}s_2,\quad\ldots,\quad s_{k-1}\xRightarrow[Y_k]{w_k}q

が成り立つ。各区間は元の計算より遷移回数が少ないため、帰納法の仮定から

[rY1s1]⇒∗w1,…,[sk−1Ykq]⇒∗wk[rY_1s_1]\Rightarrow^*w_1,\quad\ldots,\quad [s_{k-1}Y_kq]\Rightarrow^*w_k

を得る。対応する展開規則を最初に適用し、各小区間に対応する導出を続ければ[pXq]⇒∗w[pXq]\Rightarrow^*wを得る。以上の二方向の帰納法によって、不変量の証明が完了する。

最後に、

w∈L(GM)⟺ある q∈Q について [q0Z0q]⇒∗w⟺ある q∈Q について q0⇒Z0wq⟺M が w を空スタックで受理する\begin{aligned} w\in L(G_M) &\Longleftrightarrow \text{ある }q\in Q\text{ について }[q_0Z_0q]\Rightarrow^*w\\ &\Longleftrightarrow \text{ある }q\in Q\text{ について }q_0\xRightarrow[Z_0]{w}q\\ &\Longleftrightarrow M\text{ が }w\text{ を空スタックで受理する} \end{aligned}

となる。よってL(GM)=L(M)L(G_M)=L(M)である。▨

二つの変換をまとめる。

定理 4.3. 有限アルファベットΣ\Sigma上の言語L⊆Σ∗L\subseteq\Sigma^*について、次の条件は同値である。

  1. LLはある文脈自由文法によって生成される。
  2. LLはある非決定性 PDA によって空スタックで受理される。
  3. LLはある非決定性 PDA によって終状態で受理される。

証明.(1)⇒\Rightarrow(2)は定理 3.1による。(2)⇔\Leftrightarrow(3)は定理 2.3による。(3)⇒\Rightarrow(1)は、終状態受理を空スタック受理へ変換した後、定理 4.2を適用すれば従う。▨

5 正規言語との関係

先行記事の有限オートマトンは、状態遷移を右端の非終端記号の展開として書き直すことができる。これにより、正規言語が文脈自由言語であることが従う。

命題 5.1.Σ\Sigma上の任意の正規言語LLに対して、L(G)=LL(G)=Lとなる CFGGGが存在する。

証明.§E15.2 定義 1により、L=L(A)L=L(A)となる DFAA=(Q,Σ,δ,qℓ,F)A=(Q,\Sigma,\delta,q_\ell,F)を取る。Q={q1,…,qn}Q=\{q_1,\ldots,q_n\}と番号づけ、QQ、Σ\Sigmaのいずれにも属さない新しい非終端記号B1,…,BnB_1,\ldots,B_nを用意する。V:={B1,…,Bn}V:=\{B_1,\ldots,B_n\}とし、生成規則を

Bi→aBj(a∈Σ, δ(qi,a)=qj),Bi→ε(qi∈F)B_i\to aB_j\quad(a\in\Sigma,\ \delta(q_i,a)=q_j), \qquad B_i\to\varepsilon\quad(q_i\in F)

とする。開始記号はBℓB_\ellとする。QQとΣ\Sigmaが有限であるから、規則は有限個である。

以下では、§E15.1 補題 1.3の後半の形δ^(q,au)=δ^(δ(q,a),u)\widehat{\delta}(q,au)=\widehat{\delta}(\delta(q,a),u)を用いる。

各iiと各w∈Σ∗w\in\Sigma^*について

Bi⇒G∗w⟺δ^(qi,w)∈FB_i\Rightarrow_G^*w \quad\Longleftrightarrow\quad \widehat{\delta}(q_i,w)\in F

を、wwの長さに関する帰納法で示す。

w=εw=\varepsilonとする。BiB_iを左辺とする規則のうち、Bi→aBjB_i\to aB_jを適用した文形式は先頭に終端記号aaをもち、以後の適用でそのaaが消えることはない。したがってBi⇒G∗εB_i\Rightarrow_G^*\varepsilonとなるのはBi→εB_i\to\varepsilonが規則である場合に限り、それはqi∈Fq_i\in Fと同値である。一方δ^(qi,ε)=qi\widehat{\delta}(q_i,\varepsilon)=q_iであるから、両辺は同値である。

w=au′w=au'とする。Bi⇒G∗au′B_i\Rightarrow_G^*au'が成り立つとする。最初に適用する規則がBi→εB_i\to\varepsilonであれば文形式はε\varepsilonとなり、au′≠εau'\ne\varepsilonに達することはない。よって最初の規則はBi→aBjB_i\to aB_jの形であり、先頭の終端記号が一致するためδ(qi,a)=qj\delta(q_i,a)=q_jである。残りの導出はBj⇒G∗u′B_j\Rightarrow_G^*u'を与える。逆に、δ(qi,a)=qj\delta(q_i,a)=q_jかつBj⇒G∗u′B_j\Rightarrow_G^*u'ならば、Bi→aBjB_i\to aB_jを最初に適用してBi⇒G∗au′B_i\Rightarrow_G^*au'を得る。帰納法の仮定によりBj⇒G∗u′B_j\Rightarrow_G^*u'はδ^(qj,u′)∈F\widehat{\delta}(q_j,u')\in Fと同値であり、上で示した等式により

δ^(qj,u′)=δ^(δ(qi,a),u′)=δ^(qi,au′)\widehat{\delta}(q_j,u')=\widehat{\delta}(\delta(q_i,a),u')=\widehat{\delta}(q_i,au')

である。よって両辺は同値である。

i=ℓi=\ellとすれば、w∈L(G)w\in L(G)とδ^(qℓ,w)∈F\widehat{\delta}(q_\ell,w)\in Fが同値である。§E15.1 定義 1.4により後者はw∈L(A)=Lw\in L(A)=Lと同値であるから、L(G)=LL(G)=Lである。▨

命題 5.1と定理 4.3により、正規言語の全体は文脈自由言語の全体に含まれる。この包含が真であることは、§E15.2 命題 5.5と例 1.4 (a の並びの後に同数の b が続く言語)から従う。

6 具体例

aaとbbの個数を照合する言語に対して、専用の PDA を直接構成する。定理 3.1の一般構成とは別の機械である。

命題 6.1. 言語

{anbn:n≥0}\{a^n b^n:n\ge 0\}

を終状態で受理する PDA が存在する。

証明. 新しい底記号を⊥\bot、個数を記録する記号をXXとする。初期状態qsq_sから、入力を消費しない二つの選択を置く。一つは空語を受理する状態qfq_fへ移る選択であり、もう一つはaaを読む状態qaq_aへ移る選択である。

qaq_aではaaを一文字読むたびにXXを一つ積む。最初のbbを読むときにqbq_bへ移り、XXを一つ取り除く。qbq_bではbbを一文字読むたびにXXを一つ取り除く。qbq_bで上端が⊥\botになったときに、空語遷移でqfq_fへ移る。qfq_fから遷移は置かない。

定義 2.1の遷移関数は入力の残りを参照しないため、「入力を読み終えた」という条件を遷移の側に書くことはできない。上の遷移は入力が残っていても起こり得るが、qfq_fから出る遷移が一つもないため、その場合は入力を消費し切ることができず受理に至らない。定義 2.2が入力全体の消費を要求することが、この点を担っている。

qaq_aでaaをkk個読んだ直後のスタックがXk⊥X^k\botであることはkkに関する帰納法で従う。qbq_bでbbをjj個読んだ後、j≤kj\le kならスタックはXk−j⊥X^{k-j}\botである。j>kj>kなら取り除くXXが存在しないため計算は停止する。また、qbq_bではaaを読む遷移がなく、qaq_aへ戻る遷移もない。したがって、空語以外で受理される語はakbka^k b^kに限る。

逆に、anbna^n b^nではn=0n=0のとき初期状態から直接qfq_fへ移る。n>0n>0のとき、aaを読むたびにXXを積み、続くbbを読むたびにXXを取り除けば、入力の終端で上端が⊥\botになりqfq_fへ移ることができる。よって、受理言語はちょうど{anbn:n≥0}\{a^n b^n:n\ge0\}である。▨

7 文脈自由言語の限界

定理 4.3は、二つの記述方法が同じ言語の範囲を定めることを述べる。その範囲がすべての言語を尽くすわけではないことを、構文木の形に対する制約から導く。

頂点vvの成果yield(v)\mathrm{yield}(v)は定義 1.2で定めた。あわせて、vvから葉へ至る道の辺数の最大値をvvの高さといい、根の高さを木の高さという。

補題 7.1. CFGG=(V,Σ,P,S)G=(V,\Sigma,P,S)に対して

b:=max⁡({2}∪{∣γ∣:A→γ∈P})b:=\max\bigl(\{2\}\cup\{|\gamma|:A\to\gamma\in P\}\bigr)

と置く。右辺の集合は22を要素にもつ有限集合であるから、P=∅P=\varnothingの場合を含めてbbは定まり、b≥2b\ge 2である。また、PPの各規則A→γA\to\gammaについて∣γ∣≤b|\gamma|\le bである。GGの構文木の任意の頂点vvについて、vvの高さがhhならば∣yield(v)∣≤bh|\mathrm{yield}(v)|\le b^{h}である。

証明.hhに関する帰納法を用いる。

h=0h=0のとき、vvは葉であり、定義 1.2によって終端記号またはε\varepsilonで標識される。したがって∣yield(v)∣≤1=b0|\mathrm{yield}(v)|\le 1=b^0である。

h≥1h\ge 1とする。vvの子を左からu1,…,uku_1,\ldots,u_kとする。vvが規則A→γA\to\gammaに対応するならばk=∣γ∣≤bk=|\gamma|\le bであり、vvが規則A→εA\to\varepsilonに対応するならばk=1≤bk=1\le bである。各uiu_iの高さは高々h−1h-1であるから、帰納法の仮定により∣yield(ui)∣≤bh−1|\mathrm{yield}(u_i)|\le b^{h-1}である。yield(v)\mathrm{yield}(v)はyield(u1)⋯yield(uk)\mathrm{yield}(u_1)\cdots\mathrm{yield}(u_k)に等しいから

∣yield(v)∣≤k bh−1≤b⋅bh−1=bh|\mathrm{yield}(v)|\le k\,b^{h-1}\le b\cdot b^{h-1}=b^{h}

である。▨

非終端記号は有限個であるから、成果が長い構文木には、根から葉への一本の道の上に同じ非終端記号が二度現れる。その二つの頂点にはさまれた部分を繰り返すことができる。

定理 7.2 (文脈自由言語のポンピング補題).LLを文脈自由言語とする。このとき、LLだけに依存する定数N≥1N\ge 1が存在して、∣w∣≥N|w|\ge Nを満たす任意のw∈Lw\in Lは

w=uvxyz(u,v,x,y,z∈Σ∗)w=uvxyz \qquad(u,v,x,y,z\in\Sigma^*)

の形に分解することができ、次の三条件を満たす。

  1. ∣vxy∣≤N|vxy|\le N。
  2. vy≠εvy\ne\varepsilon。
  3. すべてのi≥0i\ge 0についてuvixyiz∈Luv^ixy^iz\in L。

証明.L=L(G)L=L(G)となる CFGG=(V,Σ,P,S)G=(V,\Sigma,P,S)を取り、補題 7.1のbbを用いて

N:=b∣V∣+1N:=b^{|V|+1}

と置く。w∈Lw\in Lが∣w∣≥N|w|\ge Nを満たすとする。

命題 1.3により、成果がwwである構文木が存在する。そのような構文木の頂点数は正の整数であるから、頂点数が最小であるものを一つ取り、TTと書く。

TTの根から葉へ至る道のうち、辺数が最大であるものを一つ取り、π\piと書く。その辺数をhhとする。根から葉へ至る道の辺数の最大値は根の高さであるから、補題 7.1によりbh≥∣w∣≥N=b∣V∣+1b^{h}\ge|w|\ge N=b^{|V|+1}である。b≥2b\ge 2であるからh≥∣V∣+1h\ge|V|+1である。

π\pi上の頂点はh+1h+1個ある。末端の葉を除くhh個は子をもつため、定義 1.2 条件 (c)または定義 1.2 条件 (d)により非終端記号で標識される。h≥∣V∣+1h\ge|V|+1であるから、π\pi上で葉に近い側から非終端記号で標識された頂点を∣V∣+1|V|+1個取ることができる。非終端記号は∣V∣|V|種類であるから、鳩の巣原理により、この∣V∣+1|V|+1個のうち二つは同じ非終端記号AAで標識される。π\pi上で上にある方をr1r_1、下にある方をr2r_2とする。

π\piは根から葉へ至る道のうち辺数が最大であるから、π\pi上の頂点ppの高さは、π\piのうちppより下にある部分の辺数に等しい。実際、ppを根とする部分木に、ppから葉へ至るより長い道があれば、π\piのppより下を差し替えてπ\piより長い道を得るからである。r1r_1はπ\pi上で葉から数えて高々∣V∣+1|V|+1番目の非終端記号頂点であるから、π\piのうちr1r_1より下にある部分の辺数は高々∣V∣+1|V|+1であり、r1r_1の高さは高々∣V∣+1|V|+1である。したがって補題 7.1により

∣yield(r1)∣≤b∣V∣+1=N|\mathrm{yield}(r_1)|\le b^{|V|+1}=N

である。

r2r_2はr1r_1の真の子孫であるから、yield(r2)\mathrm{yield}(r_2)はyield(r1)\mathrm{yield}(r_1)の連続部分語であり、

yield(r1)=v yield(r2) y\mathrm{yield}(r_1)=v\,\mathrm{yield}(r_2)\,y

と一意に分かれる。x:=yield(r2)x:=\mathrm{yield}(r_2)と置く。同様にyield(r1)\mathrm{yield}(r_1)はwwの連続部分語であるからw=u yield(r1) zw=u\,\mathrm{yield}(r_1)\,zと分かれる。以上によりw=uvxyzw=uvxyzであり、∣vxy∣=∣yield(r1)∣≤N|vxy|=|\mathrm{yield}(r_1)|\le Nであるから条件 (a)が成り立つ。

ここで、二つの木を用意する。TTのr1r_1を根とする部分木を、r2r_2を根とする部分木で置き換えて得られる木をT−T^-とする。また、TTのr2r_2を根とする部分木を、r1r_1を根とする部分木の複製で置き換えて得られる木をT+T^+とする。r1r_1とr2r_2はともにAAで標識されるから、いずれの置き換えでも定義 1.2の四条件は保たれ、T−T^-とT+T^+はともに構文木である。成果はそれぞれuxzuxzとuv2xy2zuv^2xy^2zである。この二つの構成は、以下の仮定に依存しない。

条件 (b)を示す。v=y=εv=y=\varepsilonと仮定する。このときT−T^-の成果はuxz=uvxyz=wuxz=uvxyz=wでありTTと等しい。一方、r2r_2はr1r_1の真の子孫であるから、T−T^-の頂点数はTTの頂点数より真に少ない。これはTTの最小性に反する。よってvy≠εvy\ne\varepsilonである。

条件 (c)を示す。i=0i=0の場合、T−T^-が成果uxzuxzの構文木を与える。i≥1i\ge 1の場合、TTからT+T^+を作る操作を繰り返す。複製された部分木の中にはr2r_2に対応する頂点が再び現れるため、同じ操作をその頂点に対して適用することができる。操作の前後で成果はuvkxykzuv^kxy^kzからuvk+1xyk+1zuv^{k+1}xy^{k+1}zへ変わり、TTの成果がuvxyzuvxyzであることから、操作をi−1i-1回行えば成果uvixyizuv^ixy^izの構文木を得る。いずれの場合も命題 1.3によりuvixyiz∈L(G)=Luv^ixy^iz\in L(G)=Lである。▨

補題の条件 (a)は、繰り返す部分が語の中で近い位置に収まることを保証する。三つの区間の個数を同時に照合する言語では、この制約が矛盾を導く。

命題 7.3.Σ={a,b,c}\Sigma=\{a,b,c\}とする。言語

L={anbncn:n≥0}L=\{a^nb^nc^n:n\ge 0\}

は文脈自由言語ではない。

証明.LLが文脈自由であると仮定し、定理 7.2 (文脈自由言語のポンピング補題)の定数NNを取る。w:=aNbNcNw:=a^Nb^Nc^Nと置くとw∈Lw\in Lかつ∣w∣=3N≥N|w|=3N\ge Nであるから、三条件を満たす分解w=uvxyzw=uvxyzが存在する。

wwにおいて、aaが占める位置は11からNN、ccが占める位置は2N+12N+1から3N3Nである。aaの位置とccの位置をともに含む連続部分語の長さは(2N+1)−N+1=N+2(2N+1)-N+1=N+2以上であり、定理 7.2 条件 (a)の∣vxy∣≤N|vxy|\le Nに反する。したがって、連続部分語vxyvxyはaaとccの両方を含むことはない。

よってvyvyに現れる文字は{a,b}\{a,b\}または{b,c}\{b,c\}のいずれかに含まれ、a,b,ca,b,cのうち少なくとも一種の文字σ\sigmaはvyvyに現れない。

i=2i=2を取る。w=uvxyzw=uvxyzであるから、uv2xy2zuv^2xy^2zにおける各文字の個数は、wwにおける個数にvyvyにおける個数を加えたものである。したがってσ\sigmaの個数はNNのままである。一方、定理 7.2 条件 (b)によりvy≠εvy\ne\varepsilonであるから、vyvyに現れる文字τ\tauが存在し、uv2xy2zuv^2xy^2zにおけるτ\tauの個数はNNより真に大きい。σ≠τ\sigma\ne\tauであるから、uv2xy2zuv^2xy^2zでは三種の文字の個数が等しくない。ゆえにuv2xy2z∉Luv^2xy^2z\notin Lであり、これは定理 7.2 条件 (c)に反する。よってLLは文脈自由言語ではない。▨

命題 5.1は正規言語の全体が文脈自由言語の全体に含まれることを示し、§E15.2 命題 5.5と例 1.4 (a の並びの後に同数の b が続く言語)はこの包含が真であることを示す。命題 7.3は、PDA の表現力にも真の限界があることを示す。より強い計算モデルは次の記事で扱う。

9 演習

問題 9.1.

  1. S→aSb∣SS∣εS\to aSb\mid SS\mid\varepsilonの構文木を一つ描き、成果がaabbabaabbabとなる左端導出を構成せよ。
  2. 定理 3.1の PDA が、規則S→εS\to\varepsilonをもつ文法について空語を受理する計算を配置の列で示せ。
  3. 定理 4.2の生成規則で、中間状態をすべて列挙する必要がある理由を説明せよ。状態を固定すると失われる計算の例を構成せよ。
  4. 終状態受理から空スタック受理への変換で、排出状態ddが入力文字を消費する遷移をもつと受理言語が変わり得ることを示せ。
  5. 定理 7.2 条件 (a)∣vxy∣≤N|vxy|\le Nを落とすと、命題 7.3の証明のどこが成り立たなくなるかを述べよ。
  6. 定理 7.2 (文脈自由言語のポンピング補題)の証明では、構文木TTを頂点数が最小であるものに取った。この最小性を用いた箇所を指摘し、最小性を仮定しない場合に導くことができなくなる主張を述べよ。
解答 (演習の要点).
  1. 一例は、根SSの子をS,SS,Sとし、左の子からS→aSbS\to aSbを二回、S→εS\to\varepsilonを一回適用し、右の子からS→aSbS\to aSbとS→εS\to\varepsilonを適用した構文木である。対応する左端導出は S⇒SS⇒aSbS⇒aaSbbS⇒aabbS⇒aabbaSb⇒aabbabS\Rightarrow SS\Rightarrow aSbS\Rightarrow aaSbbS\Rightarrow aabbS\Rightarrow aabbaSb\Rightarrow aabbab であり、各段で最も左の非終端記号だけを展開している。
  2. 規則S→εS\to\varepsilonに対応する空語遷移(q,ε)∈δ(q,ε,S)(q,\varepsilon)\in\delta(q,\varepsilon,S)により、 (q,ε,S)⊢(q,ε,ε)(q,\varepsilon,S)\vdash(q,\varepsilon,\varepsilon) となる。入力は最初から空であり、スタックも空になるため、空語が空スタックで受理される。
  3. 遷移がY1⋯YkY_1\cdots Y_kを積んだ時点では、各YiY_iを取り除き終えたときの状態が、その後の計算によって初めて決まるからである。文法の規則は計算より前に固定されるため、中間状態のすべての組合せを規則として用意し、実際の計算に一致しない組合せは終端語を導かない形で残す。例として、二状態r,sr,sと遷移δ(r,a,Y)∋(r,ε)\delta(r,a,Y)\ni(r,\varepsilon)、δ(r,b,Y)∋(s,ε)\delta(r,b,Y)\ni(s,\varepsilon)、δ(s,b,Y)∋(s,ε)\delta(s,b,Y)\ni(s,\varepsilon)をもつ機械で、スタックYYYYを取り除く計算を考える。入力aaaaでは一つ目のYYの除去が状態rrで終わり、入力bbbbでは状態ssで終わる。中間状態をrrに固定した規則だけを許すと、bbbbを消費する計算に対応する導出が失われる。
  4. 排出状態ddに入力文字を消費する遷移があると、受理状態へ到達した後に残った入力を排出中に消費することができてしまう。たとえば、一文字aaを読んで受理状態へ移る機械MMの受理言語は{a}\{a\}である。変換後の機械のddにbbを読みながらスタック記号を取り除く遷移を加えると、入力ababでも、aaを読んで受理状態に至り、ddでbbを消費しながらスタックを空にすることができるため、ababが受理され、受理言語が変わる。
  5. vxyvxyの長さに制限がなければ、vxyvxyがaaの区間とccの区間の両方に交わることを排除することができない。その場合、vyvyが三種の文字すべてを含み得るため、uv2xy2zuv^2xy^2zで三つの個数が同時に等しく増える可能性が残り、矛盾を導くことができない。
  6. 最小性は定理 7.2 条件 (b)vy≠εvy\ne\varepsilonの証明だけに用いた。最小性を仮定しない場合、v=y=εv=y=\varepsilonとなる分解が生じ得る。このとき定理 7.2 条件 (c)はすべてのiiについてww自身を与えるだけであり、補題は非文脈自由性の証明に用いることができない主張になる。

▨

参考文献

  1. John E. Hopcroft, Rajeev Motwani, and Jeffrey D. Ullman, Introduction to Automata Theory, Languages, and Computation, 3rd ed., Pearson, 2007.文脈自由言語のポンピング補題と非文脈自由性の証明を参考にした。
  2. Michael Sipser, Introduction to the Theory of Computation, 3rd ed., Cengage, Boston, 2013.文脈自由言語のポンピング補題を参考にした。

前提記事