プッシュダウン・オートマトン
プッシュダウン・オートマトン(Pushdown Automaton)は、オートマトンの一種であり、文脈自由言語を認識する抽象機械である。
ある意味では、プッシュダウン・オートマトンは有限オートマトンと無限の容量のスタックを組み合せたシステムである。
プッシュダウンオートマトンは通常の有限オートマトンとは以下の二点で異なる。
スタックのトップを使って成すべき状態遷移を判断する。
遷移実行の一部としてスタック操作を行うことが出来る。
プッシュダウン・オートマトンは入力信号、現在状態、スタックのトップを使って状態遷移表内の位置を指定することで遷移先を選択する。通常の有限オートマトンは現在状態と入力信号しかなく、スタックは持たない。プッシュダウン・オートマトンはスタックを遷移先選択のパラメータに加える。つまり、入力信号と現在状態とスタックのトップにある文字から遷移先を選択する。
プッシュダウン・オートマトンは、遷移を実行する動作の一部としてスタックを操作することもできる。通常の有限オートマトンは遷移の結果として新しい状態を選択する。スタック操作とはある特定の文字をスタックにプッシュすることやスタックのトップをポップすることを意味する。また、プッシュダウン・オートマトンはスタックを操作せずにそのままにしておくこともできる。どう操作するかは状態遷移表によって決定される。
まとめると、入力信号と現在状態とスタック上の文字によって状態遷移すると共に、必要に応じてスタック操作を行う。
有限オートマトンでも特に非決定性有限オートマトンに基づいている場合、「非決定性プッシュダウン・オートマトン」(NPDA、nondeterministic pushdown automaton)と呼ばれる。決定性有限オートマトンに基づいている場合、「決定性プッシュダウン・オートマトン」(DPDA、deterministic pushdown automaton)と呼ばれる。非決定性とは、入力信号と状態とスタック上の文字を与えられても次の遷移先が一意に決定されない場合があることを意味する。
有限オートマトンにふたつのスタックを接続することもでき、これは事実上チューリングマシンと等価な非常に強力なデバイスとなる。線形拘束オートマトンはプッシュダウン・オートマトンよりも強力だが、チューリングマシンよりは非力である。
形式的には、PDA は以下の6-タプルで定義される。
M=(Q,\  \Sigma,\  \Gamma,\  \delta, \ q_{0}, \ F)
ここで、
\, Q  は状態の有限集合
\,\Sigma は入力アルファベットの有限集合
\,\Gamma はスタック上のアルファベットの有限集合
\,\delta: Q \times  \Sigma_{\epsilon}  \times \Gamma_{\epsilon} \longrightarrow P( Q \times \Gamma_{\epsilon} ) は遷移関数
q_{0} は開始状態
F\subset Q は受容(受理)状態の集合
\Gamma_{\epsilon} = \Gamma\cup\{\epsilon\}
\Sigma_{\epsilon} = \Sigma\cup\{\epsilon\}
任意のPDA、M=(Q,\  \Sigma,\  \Gamma,\  \delta, \ q_{0}, \ F) について、計算経路の順序は (n+1)-タプル  (q_{0},\, q_{1}, ...., \,q_{n})  で表され(ここで q_{i}\in Q, n\geq 0 )、以下の条件が成り立つ。
i = 0, 1, 2,\dots, n-1 について、\ \  (q_{i+1}, b_{i+1}) \in \delta (q_{i}, w_{i+1}, a_{i+1})ここで w_{i+1}\in \Sigma_{\epsilon}, \ a_{i+1}, \ b_{i+1}\in \Gamma_{\epsilon}
\exists\, s_{0},\, s_{1},\,s_{2},\,s_{3},\,\dots,\,s_{n}\,\in\Gamma^{*} についてs_{i} = a_{i+1}t_{i},\,s_{i+1} = b_{i+1}t_{i},\, t_{i}\in\Gamma^{*}
直観的に、PDA での計算の任意の時点で、スタックのトップから記号を読み取ってそれを他の記号に置換するか、置換せずに単にスタックのトップを削除するか、あるいは読み取らずにスタックに新たに記号を追加するか、なにもしないかという選択肢がある。これらは連立方程式 s_{i} = a_{i+1}t_{i}\,and\,s_{i+1} = b_{i+1}t_{i}で制御される。\,s_{i} は、(i+1)番目の状態遷移の直前のスタックの内容であり、a_{i+1} はスタックのトップから除去される記号である。s_{i+1} は (i+1)番目の状態遷移の直後のスタックの内容であり、b_{i+1}は (i+1)番目の状態遷移に伴ってスタックに追加される記号である。
a_{i+1} も b_{i+1} も \epsilon の可能性もある。
a_{i+1}\neq\epsilon かつ b_{i+1}\neq\epsilon なら、PDA はスタックから記号を読み取り、それを別の記号に置換する。
a_{i+1}\neq\epsilon かつ b_{i+1} = \epsilon なら、PDA はスタックから記号を読み取り、単にそれを削除する。
a_{i+1} = \epsilon かつ b_{i+1}\neq\epsilon なら、PDA は単に記号をスタックに追加する。
a_{i+1} = \epsilon かつ b_{i+1} = \epsilon なら、PDA はスタックを更新しない。
n=0 の場合、計算経路はシングルトンとなる(q_{0})。
任意の入力 w = w_{1}w_{2}\dots w_{m} について、w_{i} \in \Sigma , m \geq 0 であり、M が w を受容するのは、計算経路 (q_{0},\, q_{1}, ...., \,q_{n})  と有限の状態列 r_{0}, r_{1}, r_{2},\dots ,r_{m} \in Q, m \leq nが存在し、以下が成り立つ場合である。
i = 0, 1, 2, \dots ,m  の各々について、r_{i} が計算経路上にある。すなわち、あるf(i) が存在し、i \leq f(i) \leq nで、r_{i} = q_{f(i)} が成り立つ。
i = 0, 1, 2,\dots ,m-1 の各々について、(q_{f(i)+1}, b_{f(i)+1}) \in \delta (r_{i}, w_{i+1}, a_{f(i)+1})  ここで  a_{f(i)+1} と b_{f(i)+1} は計算定義 1 で定義されたもの。
q_{j} \notin \{r_{0}, r_{1},\dots r_{m}\} であるとき、(q_{j+1}, b_{j+1}) \in \delta (q_{j}, \epsilon, a_{j+1}) ここで  a_{j+1} と b_{j+1} は計算定義 1 で定義されたもの。
r_{m} = q_{n} かつ  r_{m} \in F
これら定義はスタックが空かどうかの判定機構を提供していない点に注意。スタックが空かどうかを判定するには、計算前にスタックに特殊記号を書いておき、PDA がスタックを読んでその記号が読み取れた場合は空であると判断する。形式的には、\delta(q_{0}, \epsilon,\,\epsilon) = \{(q_{1}, \$)\} という遷移を導入する。ここで、$ はその特殊記号である。
言語 \{0^n1^n | n \ge 0 \} を認識するPDAの形式定義は以下の通りである。
M=(Q,\  \Sigma,\  \Gamma,\  \delta, \ q_{1}, \ F)
Q = \{q_{1}, q_{2}, q_{3}, q_{4} \}
\Sigma = \{0, 1\}
\Gamma = \{0, \$\}
F = \{q_{1}, q_{4}\}
\delta(q_{1}, \epsilon, \epsilon ) = \{(q_{2}, \$), (q_{1}, \epsilon )\}
\delta(q_{2}, 0, \epsilon) = \{(q_{2}, 0)\}
\delta(q_{2}, 1, 0) = \{(q_{3}, \epsilon )\}
\delta(q_{3}, 1, 0) = \{(q_{3}, \epsilon )\}
\delta(q_{3},  \epsilon , \$) = \{(q_{4},  \epsilon )\}
上記以外の状態、入力、スタック記号については常に \delta(q, w, a) = \Phi である。