下推自動機(PDA)

PDA 轉移(transition)

/ delta = the symbol δ /

DFA 的轉移只讀一樣東西——當前的輸入符號——並改變狀態。PDA 的轉移同時讀「三樣」東西並做更多事:它查看當前狀態、下一個輸入符號、以及堆疊最上面的符號,根據這三者決定要去哪個狀態、以及對堆疊做什麼。這份更豐富的規則手冊就是轉移函數 δ(delta),堆疊也正是在這裡發揮作用。

標準形式是 δ(q, a, X) = 一個由(p, γ)對組成的集合。讀作:在狀態 q、讀輸入符號 a、堆疊頂端為 X 時,機器可以移動到狀態 p,並把彈出的 X 替換成堆疊符號串 γ(gamma)。有三點值得強調。第一,輸入符號 a 可以是 ε(epsilon),即空字串——意味機器可以「不消耗任何輸入」就移動,純粹憑藉它的狀態與堆疊頂端。第二,規則總是先彈出頂端 X、再推入 γ;推入 ε 是純彈出,推入更長的串是淨推入。第三,δ 回傳的是允許動作的「集合」,而非單一動作,因為 PDA 一般是非確定性的。

走一條 a^n b^n 的具體規則:δ(q0, a, Z0) = {(q0, X Z0)} 表示「在 q0、讀 a、頂端為 Z0:留在 q0 並在 Z0 上方推入 X」。δ(q1, b, X) = {(q1, ε)} 表示「在 q1、讀 b、頂端為 X:彈出該 X、不推入任何東西」。這兩條規則就是計數器「每個 a 推入、每個 b 彈出」的心跳。ε-移動與集合值的輸出,正是使 PDA 嚴格地比 DFA 那種確定性、無 ε 的轉移更具表達力之處。

δ(q1, ε, Z0) = {(qf, Z0)} 是一次 ε-移動:在 q1 且頂端為 Z0、不讀任何輸入的情況下,跳到接受狀態 qf 並把 Z0 留在原處。機器僅憑狀態與堆疊頂端就移動了。

δ(狀態, 輸入或 ε, 堆疊頂端) → 一組(下一狀態, 要推入的串)對。

每一次 PDA 轉移都會查看「並」消耗頂端堆疊符號——沒有任何動作能讓堆疊完全不變。要讓堆疊「不變」,你得彈出頂端再立刻把它推回去。

又称
deltaδPDA move ruletransition function of a PDAPDA 轉移函數