プッシュダウンオートマトン

同義語:pushdown automatonプッシュダウン・オートマトンPDA

概要

プッシュダウンオートマトン(pushdown automaton)とは、有限オートマトンに後入れ先出しの記憶装置であるスタックを一本加えた計算モデルのことで、入力を左から読みながら、状態とスタックの一番上の記号に応じて状態を移り、一番上の記号を文字列に取り替える。受理は受理状態への到達か空スタックによって定め、非決定性の機械ではどちらの方式でも同じ言語のクラスが得られる。非決定性プッシュダウンオートマトンで受理できる言語はちょうど文脈自由言語であり、機械は状態が一つのものに直せる。中央を推測する非決定性が本質的な言語もあり、Chomsky 階層ではタイプ 2 に対応する計算モデルである。

$$\newcommand{C}[0]{\mathbb{C}} \newcommand{div}[0]{\mathbin{÷}} \newcommand{N}[0]{\mathbb{N}} \newcommand{Q}[0]{\mathbb{Q}} \newcommand{R}[0]{\mathbb{R}} \newcommand{Z}[0]{\mathbb{Z}} $$

前提知識: 有限オートマトン, 文脈自由言語, 数学的帰納法

有限オートマトンは有限個の状態しか記憶を持たないので、$\{0^{n}1^{n}\mid n\in\mathbb{N}\}$ のように「読んだ $0$ の個数を覚えておく」必要のある言語は受理できない。プッシュダウンオートマトン(pushdown automaton; PDA)は、有限オートマトンに後入れ先出しの記憶装置(スタック)を一本だけ加えた計算モデルである。スタックには記号をいくらでも積めるが、読めるのは一番上の記号だけであり、書き換えも一番上でしか行えない。
この記事の中心の結果は、非決定性プッシュダウンオートマトンで受理できる言語がちょうど文脈自由言語であるという定理(thm-pda-cfg)である。文法から機械を作る向きと、機械から文法を作る向きの両方をこの記事の中で証明する。証明の要は、スタックの一つの記号が「消えるまで」の計算を一つの変数記号に対応させることである。あわせて、受理の二つの方式(受理状態による受理と空スタックによる受理)が同じ言語のクラスを定めること、文脈自由言語と正規言語の共通部分が文脈自由言語であることを示す。

定義

以下、$\Sigma$ はアルファベット(空でない有限集合)、$\Sigma^{*}$ はその上の文字列全体、$\varepsilon$ は空語を表し、$\varepsilon$ は $\Sigma$ の元ではないとする。スタックの内容は文字列で表し、左端を一番上とする。

プッシュダウンオートマトン

プッシュダウンオートマトンとは、$7$ つ組 $P=(Q,\Sigma,\Gamma,\delta,q_0,Z_0,F)$ であって次を満たすものをいう。

  • $Q$ は空でない有限集合(状態の集合)
  • $\Sigma$ はアルファベット(入力アルファベット)
  • $\Gamma$ は空でない有限集合(スタック記号の集合)
  • $\delta$ は $Q\times(\Sigma\cup\{\varepsilon\})\times\Gamma\times Q\times\Gamma^{*}$ の有限部分集合(遷移の集合)
  • $q_0\in Q$(初期状態)、$Z_0\in\Gamma$(初期スタック記号)、$F\subset Q$(受理状態の集合)
    遷移 $(q,a,X,p,\gamma)\in\delta$ は「状態 $q$ で、入力の次の記号 $a$ を読み($a=\varepsilon$ なら何も読まず)、スタックの一番上の記号 $X$ を取り除いてその位置に文字列 $\gamma$ を積み、状態 $p$ に移る」ことを表す。$\gamma=\varepsilon$ なら $X$ を取り除くだけ(ポップ)、$\gamma=YX$ なら $X$ の上に $Y$ を積むこと(プッシュ)になる。$a=\varepsilon$ の遷移を $\varepsilon$ 遷移という。
様相と計算

$P=(Q,\Sigma,\Gamma,\delta,q_0,Z_0,F)$ をプッシュダウンオートマトンとする。$Q\times\Sigma^{*}\times\Gamma^{*}$ の元 $(q,w,\alpha)$ を様相(configuration)という。$q$ は現在の状態、$w$ は未読の入力、$\alpha$ はスタックの内容である。様相の間の関係 $\vdash$(一歩)を、
$$(q,\,aw,\,X\beta)\vdash(p,\,w,\,\gamma\beta)\qquad\bigl((q,a,X,p,\gamma)\in\delta,\ a\in\Sigma\cup\{\varepsilon\},\ w\in\Sigma^{*},\ \beta\in\Gamma^{*}\bigr)$$
で定める($a=\varepsilon$ のときは $aw=w$ と読む)。$\vdash$ を $n$ 回続けた関係を $\vdash^{n}$、有限回($0$ 回を含む)続けた関係を $\vdash^{*}$ と書き、$C\vdash^{*}C'$ を与える様相の列を計算という。スタックが空の様相 $(q,w,\varepsilon)$ からは一歩も進めない。

受理

プッシュダウンオートマトン $P$ に対し、
$$L(P):=\{\,w\in\Sigma^{*}\mid \text{ある }f\in F,\ \alpha\in\Gamma^{*}\text{ について }(q_0,w,Z_0)\vdash^{*}(f,\varepsilon,\alpha)\,\}$$
を $P$ が受理状態によって受理する言語、
$$N(P):=\{\,w\in\Sigma^{*}\mid \text{ある }q\in Q\text{ について }(q_0,w,Z_0)\vdash^{*}(q,\varepsilon,\varepsilon)\,\}$$
を $P$ が空スタックによって受理する言語という。どちらも「受理に至る計算が少なくとも一つ存在する」という意味の受理であり、同じ様相から複数の遷移が適用できてもよい。この意味で、ここで定義したものを非決定性プッシュダウンオートマトンともいう。

決定性プッシュダウンオートマトン

プッシュダウンオートマトン $P$ が決定性であるとは、各 $q\in Q$、$X\in\Gamma$ について次の二条件が成り立つことをいう。

  1. 各 $a\in\Sigma\cup\{\varepsilon\}$ について、$(q,a,X,p,\gamma)\in\delta$ となる $(p,\gamma)$ は高々一つである。
  2. $(q,\varepsilon,X,p,\gamma)\in\delta$ となる $(p,\gamma)$ があれば、どの $a\in\Sigma$ についても $(q,a,X,p',\gamma')\in\delta$ となる $(p',\gamma')$ はない。
    このとき、どの様相から適用できる遷移も高々一つである。決定性プッシュダウンオートマトン $P$ の $L(P)$ として表せる言語を決定性文脈自由言語という。
定義の流儀

細部の流儀は文献によって違う。入力の右に空白記号を置いたテープを読み、ヘッドを進めない一歩を許し、スタックの底に専用の記号を置く流儀もある(MSm24 Definition 3.5.1、pp. 113–114)。受理の方式も、受理状態による受理と空スタックによる受理の二通りがあるが、非決定性の機械では受理できる言語のクラスは変わらない(prop-pda-final-empty)。決定性の機械では事情が違い、空スタックによる受理では、受理する文字列の真の接頭辞を受理することはない。実際、決定性の機械が $w$ を受理して $(q,\varepsilon,\varepsilon)$ に至るなら、入力 $wx$ に対するただ一つの計算は同じ遷移をたどって $(q,x,\varepsilon)$ に至り(lem-pda-extend)、そこで止まるので、$x\ne\varepsilon$ なら $wx$ は受理されない。したがって $\{\varepsilon,a\}$ のような言語は空スタックによる受理では決定性の機械で受理できず、決定性の機械では受理状態による受理を標準とする。

直感

有限オートマトンの記憶は状態だけであり、その個数は入力の長さによらず一定である。プッシュダウンオートマトンはこれにスタックを加える。スタックは無限に深くなりうるので記憶量に上限はないが、使い方が「最後に積んだものから先に取り出す」に限られる。この制限がちょうど「入れ子」の構造に合っている。括弧の列を読むとき、開き括弧を積み、閉じ括弧で一つ降ろせば、対応が取れているかどうかが判定できる。$0^{n}1^{n}$ では $0$ を積み、$1$ で一つずつ降ろす。
文法の側から見ると、文脈自由文法の導出は「変数記号を一つ選んで右辺に置き換える」操作の繰り返しであり、まだ展開していない変数記号を左から順に並べたものがスタックに当たる。一番上の変数記号を規則の右辺に置き換え、一番上に終端記号が来たら入力と照合して降ろす、という機械で最左導出がなぞれる(prop-pda-from-grammar)。逆向きに、機械の計算を文法に翻訳するときは、「状態 $p$ で一番上に $X$ があるところから、$X$ がスタックから消えて状態 $q$ になるまでに読む文字列」の全体を一つの変数記号 $[pXq]$ が生成するようにする(prop-pda-to-grammar)。スタックの記号は積まれた順の逆にしか消えないので、この単位で計算を切り分けることができる(lem-pda-split)。

例

前半と後半の長さが等しい文字列

$\Sigma=\{0,1\}$、$Q=\{s,p,q,r\}$、$\Gamma=\{0,Z\}$、初期状態 $s$、初期スタック記号 $Z$、$F=\{s,r\}$ とし、遷移を
$$(s,0,Z,p,0Z),\quad(p,0,0,p,00),\quad(p,1,0,q,\varepsilon),\quad(q,1,0,q,\varepsilon),\quad(q,\varepsilon,Z,r,Z)$$
とする。状態 $p$ では読んだ $0$ を積み、最初の $1$ で状態 $q$ に移り、以後 $1$ を読むたびに $0$ を一つ降ろす。底の $Z$ が見えたら受理状態 $r$ に移る。たとえば
$$(s,0011,Z)\vdash(p,011,0Z)\vdash(p,11,00Z)\vdash(q,1,0Z)\vdash(q,\varepsilon,Z)\vdash(r,\varepsilon,Z)$$
である。この機械について $L(P)=\{0^{n}1^{n}\mid n\in\mathbb{N}\}$ が成り立つ。実際、$(s,w,Z)$ から到達できる様相は、一歩ごとに確かめると次のものに限られる。$(s,w,Z)$ 自身、$w=0^{k}w'$($k\ge1$)のときの $(p,w',0^{k}Z)$、$w=0^{k}1^{j}w'$($1\le j\le k$)のときの $(q,w',0^{k-j}Z)$、$w=0^{k}1^{k}w'$($k\ge1$)のときの $(r,w',Z)$。受理状態は $s$ と $r$ であり、受理には未読の入力が空であることが要るので、受理されるのは $w=\varepsilon$ または $w=0^{k}1^{k}$($k\ge1$)のときに限る。どの状態と一番上の記号の組についても適用できる遷移は高々一つなので、この機械は決定性である。

偶数長の回文

$\Sigma=\{0,1\}$ 上の言語 $\{ww^{\mathrm{R}}\mid w\in\Sigma^{*}\}$($w^{\mathrm{R}}$ は $w$ の鏡像)は、次の機械が受理状態によって受理する。$Q=\{p,q,r\}$、$\Gamma=\{0,1,Z\}$、初期状態 $p$、初期スタック記号 $Z$、$F=\{r\}$ とする。状態 $p$ では読んだ記号をそのまま積む(各 $a\in\Sigma$、$X\in\{0,1,Z\}$ について遷移 $(p,a,X,p,aX)$)。どの時点でも $\varepsilon$ 遷移 $(p,\varepsilon,X,q,X)$ で「ここが中央である」と推測して状態 $q$ に移ってよい。状態 $q$ では、読んだ記号が一番上の記号と一致するときだけ降ろす(遷移 $(q,a,a,q,\varepsilon)$)。底の $Z$ が見えたら受理状態 $r$ に移る(遷移 $(q,\varepsilon,Z,r,Z)$)。$w$ を積んだ後のスタックは $w^{\mathrm{R}}Z$ であり、後半が $w^{\mathrm{R}}$ のときに限り照合が最後まで通る。中央の位置は入力を読み終えるまで分からないので、この機械は推測(非決定性)を本質的に使う。実際、この言語を受理する決定性プッシュダウンオートマトンは存在しない(文脈自由言語 の記事の注意「プッシュダウンオートマトンとの同値性の証明の所在」)。

括弧の対応

対応の取れた括弧列全体(Dyck 言語。文脈自由言語 の記事の例「Dyck 言語」)は、状態が一つ $q$ だけの機械で空スタックによって受理できる。$\Gamma=\{Z,(\}$、初期スタック記号 $Z$ とし、遷移を
$$(q,(,X,q,(X)\ (X\in\Gamma),\qquad(q,),(,q,\varepsilon),\qquad(q,\varepsilon,Z,q,\varepsilon)$$
とする。開き括弧を積み、閉じ括弧で一つ降ろし、底の $Z$ は任意の時点で降ろせる。$Z$ を降ろすとそれ以降は一歩も進めないので、入力を読み終えた時点でスタックが空になるのは、それまでどの接頭辞でも閉じ括弧が開き括弧より多くならず、全体で両者が同数のときに限る。

文法から作る機械

文脈自由文法 $S\to0S1\mid\varepsilon$ に prop-pda-from-grammar の構成を当てはめると、状態が一つ $q$ の機械で、遷移が $(q,\varepsilon,S,q,0S1)$、$(q,\varepsilon,S,q,\varepsilon)$、$(q,0,0,q,\varepsilon)$、$(q,1,1,q,\varepsilon)$ のものが得られる。入力 $0011$ の受理は
$$(q,0011,S)\vdash(q,0011,0S1)\vdash(q,011,S1)\vdash(q,011,0S11)\vdash(q,11,S11)\vdash(q,11,11)\vdash(q,1,1)\vdash(q,\varepsilon,\varepsilon)$$
であり、変数記号を置き換える一歩が導出 $S\Rightarrow0S1\Rightarrow00S11\Rightarrow0011$ の各一歩に対応している。

反例:三つの部分の個数が等しい文字列

$\{a^{n}b^{n}c^{n}\mid n\in\mathbb{N}\}$ を受理するプッシュダウンオートマトンは(受理の方式によらず)存在しない。存在すれば thm-pda-cfg によりこの言語は文脈自由言語になるが、それは 文脈自由言語 の記事の命題「三つの部分の個数が等しい文字列は文脈自由でない」に反する。直感的には、$a$ を積んで $b$ で降ろすと $c$ と照合するための情報が失われている。この言語は「スタック一本で照合できる」という性質を満たさない。スタックを二本にすると受理できる(ex-pda-counterexamples)。

性質

計算の切り分け

文脈の付け足し

$(q,w,\alpha)\vdash^{n}(p,w',\alpha')$ ならば、任意の $x\in\Sigma^{*}$、$\beta\in\Gamma^{*}$ について $(q,wx,\alpha\beta)\vdash^{n}(p,w'x,\alpha'\beta)$ である。

$n$ に関する帰納法により、一歩の場合を示せばよい。$(q,aw_1,X\alpha_1)\vdash(p,w_1,\gamma\alpha_1)$ が遷移 $(q,a,X,p,\gamma)$ による一歩なら、同じ遷移を様相 $(q,aw_1x,X\alpha_1\beta)$ に適用して $(p,w_1x,\gamma\alpha_1\beta)$ を得る。一歩の定義は一番上の記号と入力の先頭の記号しか見ないので、後ろに $x$、底に $\beta$ を付け足しても適用できる。

計算の切り分け

$k\ge1$、$X_1,\ldots,X_k\in\Gamma$ とし、$(p,w,X_1X_2\cdots X_k)\vdash^{n}(r,\varepsilon,\varepsilon)$ とする。このとき状態 $p=p_0,p_1,\ldots,p_k=r$、文字列 $w_1,\ldots,w_k$、自然数 $n_1,\ldots,n_k$ が存在して、$w=w_1w_2\cdots w_k$、$n=n_1+\cdots+n_k$、各 $i$ について
$$(p_{i-1},w_i,X_i)\vdash^{n_i}(p_i,\varepsilon,\varepsilon)$$
が成り立つ。

$k$ に関する帰納法。$k=1$ なら $p_1=r$、$w_1=w$、$n_1=n$ でよい。$k\ge2$ とし、計算を $C_0\vdash C_1\vdash\cdots\vdash C_n$、$C_i=(q_i,u_i,\gamma_i)$ と書く。$\gamma_0=X_1\cdots X_k$、$\gamma_n=\varepsilon$ である。一歩でスタックの長さは高々 $1$ しか減らない(一番上の記号を一つ取り除き、文字列を積む)ので、$|\gamma_t|\le k-1$ となる最小の $t$ が存在し、$1\le t\le n$、$|\gamma_t|=k-1$ である。
$i\le t$ について $\gamma_i=\delta_iX_2\cdots X_k$ と書け、$i< t$ なら $\delta_i\ne\varepsilon$、$i=t$ なら $\delta_t=\varepsilon$ であることを $i$ に関する帰納法で示す。$i=0$ では $\delta_0=X_1$。$i< t$ で $\gamma_i=\delta_iX_2\cdots X_k$、$\delta_i\ne\varepsilon$ なら、一歩 $C_i\vdash C_{i+1}$ は $\delta_i$ の先頭の記号を取り除いて文字列 $\gamma$ を積むので、$\gamma_{i+1}=\delta_{i+1}X_2\cdots X_k$($\delta_{i+1}$ は $\delta_i$ の先頭を $\gamma$ に置き換えたもの)である。$i+1< t$ なら $t$ の最小性により $|\gamma_{i+1}|\ge k$ なので $\delta_{i+1}\ne\varepsilon$、$i+1=t$ なら $|\gamma_t|=k-1$ なので $\delta_t=\varepsilon$ である。
各一歩は未読の入力から先頭の高々一記号を取り除くだけなので、$u_0=w_1u_t$ となる $w_1$ があり、各 $i\le t$ について $u_i=v_iu_t$($v_i$ は時刻 $i$ から $t$ までに読む部分)と書ける。時刻 $i< t$ の一歩は、一番上の記号($\delta_i$ の先頭)と、読むなら $v_i$ の先頭の記号しか使わないので、底の $X_2\cdots X_k$ と入力の残り $u_t$ を取り去った $(q_i,v_i,\delta_i)\vdash(q_{i+1},v_{i+1},\delta_{i+1})$ も同じ遷移による一歩である。よって $(p,w_1,X_1)\vdash^{t}(q_t,\varepsilon,\varepsilon)$ が成り立つ。$p_1:=q_t$、$n_1:=t$ とおくと、残りの計算は $(p_1,u_t,X_2\cdots X_k)\vdash^{n-t}(r,\varepsilon,\varepsilon)$ であり、長さ $k-1$ の場合の帰納法の仮定から $p_2,\ldots,p_k$、$w_2,\ldots,w_k$、$n_2,\ldots,n_k$ が得られる。

二つの受理の方式

受理状態による受理と空スタックによる受理

任意のプッシュダウンオートマトン $P$ に対し、$N(P')=L(P)$ となるプッシュダウンオートマトン $P'$ が存在する。逆に、任意の $P$ に対し、$L(P'')=N(P)$ となる $P''$ が存在する。

$P=(Q,\Sigma,\Gamma,\delta,q_0,Z_0,F)$ とし、新しい状態 $s,e,g\notin Q$ と新しいスタック記号 $X_0\notin\Gamma$ をとる。
($L(P)$ を空スタックで受理する機械)$P':=(Q\cup\{s,e\},\Sigma,\Gamma\cup\{X_0\},\delta',s,X_0,\emptyset)$ とし、$\delta'$ は $\delta$ に、$(s,\varepsilon,X_0,q_0,Z_0X_0)$ と、各 $f\in F\cup\{e\}$、$Y\in\Gamma\cup\{X_0\}$ についての $(f,\varepsilon,Y,e,\varepsilon)$ を加えたものとする。$w\in L(P)$ で $(q_0,w,Z_0)\vdash^{*}(f,\varepsilon,\alpha)$ なら、lem-pda-extend により $P'$ で
$$(s,w,X_0)\vdash(q_0,w,Z_0X_0)\vdash^{*}(f,\varepsilon,\alpha X_0)\vdash^{*}(e,\varepsilon,\varepsilon)$$
(最後は状態 $f$、$e$ からの $\varepsilon$ 遷移で一記号ずつ降ろす)となり $w\in N(P')$。逆に $w\in N(P')$ とし、空スタックに至る $P'$ の計算をとる。最初の一歩は $(q_0,w,Z_0X_0)$ に移るもので、記号 $X_0$ を取り除けるのは状態 $F\cup\{e\}$ からの新しい遷移だけであり、状態 $e$ に入るのもそれらの遷移だけである。そこで状態 $e$ に初めて入る時刻を考えると、それまでの各様相は $(q,u,\alpha X_0)$($q\in Q$)の形で、$\delta$ の遷移による一歩は $\alpha\ne\varepsilon$ の一番上の記号だけを使うので、$P$ の計算 $(q_0,w,Z_0)\vdash^{*}(q,u,\alpha)$ を与える。$e$ に入る一歩はある $f\in F$ の様相 $(f,u,\alpha X_0)$ からの $\varepsilon$ 遷移であり、その後は状態 $e$ の $\varepsilon$ 遷移しか使えないので入力は読まれず、$u=\varepsilon$ である。よって $(q_0,w,Z_0)\vdash^{*}(f,\varepsilon,\alpha)$、$w\in L(P)$。
($N(P)$ を受理状態で受理する機械)$P'':=(Q\cup\{s,g\},\Sigma,\Gamma\cup\{X_0\},\delta'',s,X_0,\{g\})$ とし、$\delta''$ は $\delta$ に、$(s,\varepsilon,X_0,q_0,Z_0X_0)$ と、各 $q\in Q$ についての $(q,\varepsilon,X_0,g,\varepsilon)$ を加えたものとする。$(q_0,w,Z_0)\vdash^{*}(q,\varepsilon,\varepsilon)$ なら $(s,w,X_0)\vdash(q_0,w,Z_0X_0)\vdash^{*}(q,\varepsilon,X_0)\vdash(g,\varepsilon,\varepsilon)$ である。逆に $(s,w,X_0)\vdash^{*}(g,\varepsilon,\beta)$ とすると、$g$ に入る一歩は様相 $(q,u,X_0)$($q\in Q$)からのものであり、それまでの様相は $(q',u',\alpha X_0)$ の形で、$\delta$ の遷移は $\alpha\ne\varepsilon$ のときしか適用できない。前段と同じく $P$ の計算 $(q_0,w,Z_0)\vdash^{*}(q,u,\varepsilon)$ が得られ、$g$ からの遷移はないので $u=\varepsilon$ である。よって $w\in N(P)$。

文脈自由文法との同値

文法から機械へ

文脈自由文法 $G=(V,\Sigma,R,S)$ に対し、状態が一つ $q$ だけのプッシュダウンオートマトン
$$P_G:=(\{q\},\Sigma,V\cup\Sigma,\delta,q,S,\emptyset),\qquad\delta:=\{(q,\varepsilon,A,q,\alpha)\mid A\to\alpha\in R\}\cup\{(q,a,a,q,\varepsilon)\mid a\in\Sigma\}$$
を考える。このとき任意の $X\in V\cup\Sigma$、$w\in\Sigma^{*}$ について
$$X\Rightarrow_G^{*}w\iff(q,w,X)\vdash^{*}(q,\varepsilon,\varepsilon)$$
が成り立つ。特に $N(P_G)=L(G)$ である。

$X=a\in\Sigma$ のときは、終端記号に適用できる規則はないので $a\Rightarrow^{*}w$ は $w=a$ と同値である。一方 $(q,w,a)$ から適用できる遷移は $(q,a,a,q,\varepsilon)$ だけ(変数記号を置き換える遷移は一番上が変数記号のときに限る)なので、空スタックに至るのは $w=a$ のとき、一歩で $(q,\varepsilon,\varepsilon)$ に至る場合に限る。よって主張は成り立つ。以下 $X=A\in V$ とする。
($\Rightarrow$)$A\Rightarrow^{*}w$ とすると、文脈自由言語 の記事の補題「構文木と導出の対応」により、$A$ を根とし生成文字列が $w$ の完全な構文木がある。その頂点数に関する帰納法で $(q,w,A)\vdash^{*}(q,\varepsilon,\varepsilon)$ を示す。根で使われる規則を $A\to X_1\cdots X_k$ とする。$k=0$(規則 $A\to\varepsilon$)なら $w=\varepsilon$ で、遷移 $(q,\varepsilon,A,q,\varepsilon)$ の一歩で空スタックに至る。$k\ge1$ なら、根の子 $X_i$ を根とする部分木の生成文字列を $w_i$ として $w=w_1\cdots w_k$ であり、$X_i$ が変数記号ならその部分木はより頂点数の少ない完全な構文木なので帰納法の仮定により、$X_i$ が終端記号なら前段により、$(q,w_i,X_i)\vdash^{*}(q,\varepsilon,\varepsilon)$ である。lem-pda-extend を使ってこれらをつなぐと
$$(q,w,A)\vdash(q,w_1\cdots w_k,X_1\cdots X_k)\vdash^{*}(q,w_2\cdots w_k,X_2\cdots X_k)\vdash^{*}\cdots\vdash^{*}(q,\varepsilon,\varepsilon)$$
となる。
($\Leftarrow$)$(q,w,A)\vdash^{n}(q,\varepsilon,\varepsilon)$ の長さ $n$ に関する帰納法。スタックは空でないので $n\ge1$ であり、一番上が変数記号 $A$ なので最初の一歩はある規則 $A\to\alpha$ に対応する遷移 $(q,\varepsilon,A,q,\alpha)$ による。よって $(q,w,\alpha)\vdash^{n-1}(q,\varepsilon,\varepsilon)$。$\alpha=\varepsilon$ なら、空スタックからは進めないので $n-1=0$、$w=\varepsilon$ であり、$A\Rightarrow\varepsilon$ である。$\alpha=X_1\cdots X_k$($k\ge1$)なら、lem-pda-split(状態は $q$ だけ)により $w=w_1\cdots w_k$、$(q,w_i,X_i)\vdash^{n_i}(q,\varepsilon,\varepsilon)$、$n_1+\cdots+n_k=n-1$ と書ける。各 $X_i$ について、終端記号なら前段により、変数記号なら $n_i< n$ なので帰納法の仮定により、$X_i\Rightarrow^{*}w_i$ である。句構造言語 の記事の命題「導出の文脈への代入合致性」によりこれらを並べて、$A\Rightarrow X_1\cdots X_k\Rightarrow^{*}w_1\cdots w_k=w$ を得る。
最後に $X=S$ とおけば、$w\in L(G)\iff S\Rightarrow^{*}w\iff(q,w,S)\vdash^{*}(q,\varepsilon,\varepsilon)\iff w\in N(P_G)$ である。

機械から文法へ

プッシュダウンオートマトン $P=(Q,\Sigma,\Gamma,\delta,q_0,Z_0,F)$ に対し、変数記号の集合を
$$V:=\{S\}\cup\{\,[pXq]\mid p,q\in Q,\ X\in\Gamma\,\}$$
($[pXq]$ は三つ組を名前とする一つの変数記号)とし、規則の集合 $R$ を次で定める。

  • 各 $q\in Q$ について $S\to[q_0Z_0q]$。
  • 各遷移 $(p,a,X,r,Y_1\cdots Y_k)\in\delta$($a\in\Sigma\cup\{\varepsilon\}$、$k\ge0$)と、状態の各列 $r_1,\ldots,r_k\in Q$ について、$r_0:=r$ として
    $$[pXr_k]\to a\,[r_0Y_1r_1][r_1Y_2r_2]\cdots[r_{k-1}Y_kr_k]$$
    ただし $k=0$ のときは $[pXr]\to a$ とし、$a=\varepsilon$ のときは右辺の $a$ を省く。
    $G_P:=(V,\Sigma,R,S)$ は文脈自由文法であり、任意の $p,q\in Q$、$X\in\Gamma$、$w\in\Sigma^{*}$ について
    $$[pXq]\Rightarrow_{G_P}^{*}w\iff(p,w,X)\vdash^{*}(q,\varepsilon,\varepsilon)$$
    が成り立つ。特に $L(G_P)=N(P)$ である。

$Q,\Gamma,\delta$ が有限なので $V$ と $R$ は有限であり、各規則の左辺は一つの変数記号だから $G_P$ は文脈自由文法である。
($\Leftarrow$)$(p,w,X)\vdash^{n}(q,\varepsilon,\varepsilon)$ の長さ $n\ge1$ に関する帰納法。最初の一歩の遷移を $(p,a,X,r,Y_1\cdots Y_k)$ とすると、$w=aw'$ で $(r,w',Y_1\cdots Y_k)\vdash^{n-1}(q,\varepsilon,\varepsilon)$ である。$k=0$ なら、空スタックからは進めないので $n-1=0$、$w'=\varepsilon$、$r=q$ であり、規則 $[pXq]\to a$ により $[pXq]\Rightarrow a=w$。$k\ge1$ なら、lem-pda-split により状態 $r=r_0,r_1,\ldots,r_k=q$ と $w'=w_1\cdots w_k$ があって $(r_{i-1},w_i,Y_i)\vdash^{n_i}(r_i,\varepsilon,\varepsilon)$、$n_i\le n-1$ となる。帰納法の仮定により $[r_{i-1}Y_ir_i]\Rightarrow^{*}w_i$ であり、この状態の列に対応する規則 $[pXq]\to a[r_0Y_1r_1]\cdots[r_{k-1}Y_kr_k]$ があるので、句構造言語 の記事の命題「導出の文脈への代入合致性」により $[pXq]\Rightarrow a[r_0Y_1r_1]\cdots[r_{k-1}Y_kr_k]\Rightarrow^{*}aw_1\cdots w_k=w$ である。
($\Rightarrow$)$[pXq]\Rightarrow^{*}w$ とし、文脈自由言語 の記事の補題「構文木と導出の対応」により $[pXq]$ を根とし生成文字列 $w$ の完全な構文木をとって、その頂点数に関する帰納法で示す。根で使われる規則は、ある遷移 $(p,a,X,r,Y_1\cdots Y_k)$ と状態の列 $r_1,\ldots,r_k$($r_k=q$、$k=0$ なら $r=q$)から作られたものである。$k=0$ なら $w=a$ であり、その遷移の一歩で $(p,a,X)\vdash(q,\varepsilon,\varepsilon)$ となる。$k\ge1$ なら、子 $[r_{i-1}Y_ir_i]$ を根とする部分木の生成文字列を $w_i$ として $w=aw_1\cdots w_k$ であり、帰納法の仮定により $(r_{i-1},w_i,Y_i)\vdash^{*}(r_i,\varepsilon,\varepsilon)$ である。lem-pda-extend でつないで
$$(p,aw_1\cdots w_k,X)\vdash(r_0,w_1\cdots w_k,Y_1\cdots Y_k)\vdash^{*}(r_1,w_2\cdots w_k,Y_2\cdots Y_k)\vdash^{*}\cdots\vdash^{*}(r_k,\varepsilon,\varepsilon)$$
を得る。$r_k=q$ なので主張が成り立つ。
最後に、$S$ の規則は $S\to[q_0Z_0q]$ だけなので、$w\in L(G_P)$ は「ある $q$ について $[q_0Z_0q]\Rightarrow^{*}w$」と同値であり、これは「ある $q$ について $(q_0,w,Z_0)\vdash^{*}(q,\varepsilon,\varepsilon)$」、すなわち $w\in N(P)$ と同値である。

文脈自由言語との同値性

$\Sigma$ 上の言語 $L$ について、次は同値である。

  1. $L$ は文脈自由言語である。
  2. あるプッシュダウンオートマトン $P$ について $L=N(P)$ である。
  3. あるプッシュダウンオートマトン $P$ について $L=L(P)$ である。
    さらに 2 の $P$ は状態が一つだけのものにとれる。

1 から 2 は prop-pda-from-grammar による(そこで作る $P_G$ は状態が一つである)。2 から 1 は prop-pda-to-grammar による。2 と 3 の同値は prop-pda-final-empty による。

この定理は 文脈自由言語 の記事の定理「プッシュダウンオートマトンとの同値性」と同じ主張である。同値な主張と、文法から機械への向きの別の構成(Chomsky 標準形を経由する)は MSm24 Theorem 3.7.1(p. 120)、Theorem 3.7.3(p. 124)にもある。prop-pda-from-grammar と prop-pda-to-grammar を続けて使うと、任意のプッシュダウンオートマトンは、状態が一つで空スタックによって受理するものに置き換えられる。状態が担う情報は、文法の変数記号 $[pXq]$ を経由してスタック記号に移せる。

正規言語との共通部分

正規言語との共通部分

$L$ が文脈自由言語、$M$ が正規言語ならば、$L\cap M$ は文脈自由言語である。

thm-pda-cfg により $L=L(P)$ となる $P=(Q,\Sigma,\Gamma,\delta,q_0,Z_0,F)$ がある。正規言語 の記事の命題「右線形文法と有限オートマトンの同値性」と 有限オートマトン の記事の命題「部分集合構成」により、$M$ を受理する決定性有限オートマトン $D=(Q_D,\Sigma,\eta,s_0,F_D)$($\eta\colon Q_D\times\Sigma\to Q_D$ は写像)がある。$\eta(s,\varepsilon):=s$ と約束し、$\eta$ を文字列に拡張したものも $\eta$ と書く。
$$P':=(Q\times Q_D,\Sigma,\Gamma,\delta',(q_0,s_0),Z_0,F\times F_D),\qquad\delta':=\{\,((q,s),a,X,(p,\eta(s,a)),\gamma)\mid(q,a,X,p,\gamma)\in\delta,\ s\in Q_D\,\}$$
とおく。$n$ に関する帰納法により、
$$((q_0,s_0),w,Z_0)\vdash_{P'}^{n}((q,s),u,\alpha)\iff(q_0,w,Z_0)\vdash_{P}^{n}(q,u,\alpha)\text{ かつ }w=vu,\ s=\eta(s_0,v)\text{ となる }v\text{ がある}$$
が成り立つ。実際 $n=0$ では両辺とも $(q,s,u,\alpha)=(q_0,s_0,w,Z_0)$ を意味し、一歩進めるときは $P'$ の遷移が $P$ の遷移と一対一に対応し、読んだ記号 $a$($\varepsilon$ でもよい)に応じて第二成分が $\eta(s,a)$ に変わる。読み終えた部分 $v$ に $a$ を付け足すと $\eta(s_0,va)=\eta(\eta(s_0,v),a)$ となるので、対応が保たれる。よって $w\in L(P')$ は、ある計算 $(q_0,w,Z_0)\vdash^{*}(f,\varepsilon,\alpha)$($f\in F$)があって $\eta(s_0,w)\in F_D$ となること、すなわち $w\in L(P)\cap L(D)=L\cap M$ と同値である。

この命題は 文脈自由言語 の記事の注意「正規言語との共通部分」で述べられた事実である。同じ記事の命題「共通部分と補集合に関しては閉じていない」と並べると、文脈自由言語どうしの共通部分は文脈自由とは限らないが、一方が正規言語なら文脈自由である。二つのスタックを一つの機械に同居させることはできないが、有限オートマトンの状態は機械の状態に組み込める、というのがその理由である。

仮定を外したときの反例

外す条件反例成り立たなくなること
スタックは一本スタックを二本持つ機械で $\{a^{n}b^{n}c^{n}\mid n\in\mathbb{N}\}$ を受理するもの受理する言語が文脈自由言語であること(thm-pda-cfg)
状態の集合と遷移の集合が有限状態を読んだ文字列全体 $\Sigma^{*}$ で添字づけた「機械」受理する言語が文脈自由言語であること:任意の言語が受理できる
スタック記号の集合と遷移の集合が有限スタック記号を $\langle v\rangle$($v\in\Sigma^{*}$)とした「機械」受理する言語が文脈自由言語であること:任意の言語が受理できる
反例の確かめ

1 行目:二本のスタックを持ち、遷移で両方の一番上を読んで両方を書き換えられる機械を考える。$a$ を読むたびに両方のスタックに記号を積み、$b$ を読むたびに一本目から一つ降ろし、$c$ を読むたびに二本目から一つ降ろし、$a,b,c$ の順が崩れたら止まり、入力を読み終えた時点で両方の底の記号が一番上にあれば受理する。受理されるのはちょうど $a^{n}b^{n}c^{n}$ の形の文字列であり、これは文脈自由言語ではない(rem-pda-nonexample)。
2 行目:任意の言語 $L\subset\Sigma^{*}$ に対し、状態の集合を $\Sigma^{*}$、初期状態を $\varepsilon$、遷移を「状態 $v$ で $a$ を読んで状態 $va$ に移る(スタックはそのまま)」、受理状態の集合を $L$ とすると、受理状態によって受理する言語はちょうど $L$ になる。言語は非可算個あり(形式言語 の記事の命題「言語の個数」)、文脈自由言語は可算個しかない(句構造言語 の記事の命題「句構造言語の個数」)ので、文脈自由でない言語も受理される。
3 行目:状態を一つ $q$ とし、スタック記号の集合を $\{\langle v\rangle\mid v\in\Sigma^{*}\}$($\langle v\rangle$ は文字列 $v$ を表す一つの記号)、初期スタック記号を $\langle\varepsilon\rangle$ とする。遷移「一番上が $\langle v\rangle$ のとき $a$ を読んで $\langle v\rangle$ を $\langle va\rangle$ に取り替える」と、「一番上が $\langle v\rangle$($v\in L$)のとき何も読まずに $\langle v\rangle$ を降ろす」をとると、空スタックによって受理する言語はちょうど $L$ になる(降ろした後は進めないので、降ろすのは入力を読み終えたときに限られる)。

2 行目と 3 行目の「機械」は遷移が無限個あり、有限個のデータでは書けない。遷移の集合を有限に保ったまま状態やスタック記号の集合だけを無限にしても、遷移に現れる状態と記号は有限個なので、受理する言語は変わらない。プッシュダウンオートマトンの限界は、有限の制御と、後入れ先出しという記憶の使い方の制限の両方から来ている。

補足

決定性と非決定性

有限オートマトンでは非決定性は表現力を増やさない(有限オートマトン の記事の命題「部分集合構成」)が、プッシュダウンオートマトンでは事情が違う。ex-pda-palindrome の言語のように、非決定性の機械で受理できるが決定性の機械では受理できない言語がある。長さが奇数で中央の文字が $b$ である文字列全体 $\{vbw\mid v,w\in\{a,b\}^{*},\ |v|=|w|\}$ についても同じことが述べられている(MSm24 Remark 3.6.1、p. 119。この記事では証明しない)。決定性の機械は入力の各位置で取るべき動作が一通りに決まるので、プログラミング言語の構文解析(構文解析)で使われる効率的な手続きの理論的な基礎になる。

階層における位置

プッシュダウンオートマトンは Chomsky階層 のタイプ 2、すなわち文脈自由言語に対応する計算モデルである。スタックを使わない(一番上の記号を変えない)機械は有限オートマトンと同じ働きをし、入力の長さに比例する作業領域を自由に読み書きできる機械が線形有界オートマトン(文脈依存言語)、作業領域に制限のない機械がTuring機械(句構造言語)である。

関連項目

参考文献

Mathpediaは寄付と、参考文献の書籍リンク(Amazonアソシエイト)の紹介料で運営されています。 支援について / 寄付する