【計算理論】下推自動機 PDA 及 計算示例





I . 下推自動機



1 . 下推自動機 由來 : 下推自動機 ( PDA ) 是在 確定性有限自動機 ( DFA ) 基礎上 擴展而來的 ;


2 . 下面是 下推自動機 ( PDA ) 的示意圖 :

在這裏插入圖片描述

① 輸入字符串 : 將輸入的字符寫在右側的帶子上 ;

② 開始狀態 : 讀取指針 ( 讀頭 ) 開始指向最左端字符 , 此時處於開始狀態 ;

③ 啓動自動機 , 自動機根據讀取的指令進行計算 ;

④ 讀取指令 : 每讀取一個字符 , 自動機跳轉到一個新的狀態 , 指針向後移動一個格子 ;

⑤ 自動機停止 : 當讀取指針指向輸入的最右端 , 此時自動機就停止了 , 此時查看當前狀態 , 如果當前是接受狀態 , 稱自動機接受該字符串 ( 帶子上寫的字符組成的字符串 ) , 反之 , 自動機不接受該字符串 ;





II . 下推自動機 計算過程



1 . 下推自動機 ( PDA ) 提升了自動機計算能力 : 在上述自動機的基礎上 , 提升該自動機的計算能力 , 引入一個新的棧結構 ;

棧特點 : ① 後進先出 , ② 存儲能力無限 ;


2 . 下推自動機計算有兩個部分 , 一個是字符的讀取 , 一個是棧內字符的存取 , 棧內只有最上面的字符會被替換 ;


3 . 下推自動機 ( PDA ) 的指令格式 : 該指令包含了 上述講的兩個操作 ;


1,0ε1 , 0 \to \varepsilon


① 自動機字符讀取 : 左側的 11 是從帶子上讀取的字符 ;

② 棧內字符存取操作 : 0ε0 \to \varepsilon 是需要在棧上進行的操作 , 將棧頂的 00 取出 , 然後將 ε\varepsilon 放入到棧中 , 相當於在棧中 , 使用 ε\varepsilon 將棧頂的 00 替換掉 ;





III . 下推自動機 計算結果



1 . 下推自動機 ( PDA ) 是否接受字符串 : 將帶子上的字符全部讀取完畢後 , 此時的狀態如果是 接受狀態 , 那麼帶子上的字符組成的字符串就可以被 下推自動機接受 ;


2 . 計算能力 : 下推自動機 ( PDA ) 比 確定性有限自動機 ( DFA ) 多了棧上的操作 , 下推自動機 ( PDA ) 的計算能力比有限自動機 ( DFA ) 計算能力高 ;


3 . 語言識別能力 : 確定性有限自動機 ( DFA ) 是不能識別 {0n1n:n0}\{ 0^n 1^n : n \geq 0\} 語言的 , 但是 下推自動機 ( PDA ) 是可以認識該語言的 ;





IV . 下推自動機 計算示例



在這裏插入圖片描述

上圖的下推自動機有 44 個狀態 q1,q2,q3,q4q_1 , q_2 , q_3 , q_4 ;

讀取 00110011 字符串 , 並給出 下推自動機 計算過程 ;


ε,εS\varepsilon , \varepsilon \to S 指令含義 : 當讀取 ε\varepsilon 字符後 , εS\varepsilon \to S 指的是在棧上的操作 , 從棧內取出 ε\varepsilon 字符 , 向棧內放入一個 SS 字符 , 本質是在棧中使用 SS 替換 ε\varepsilon 字符 ;





1 . 開始狀態 是 q1q_1 , 此時讀頭指向 00 位置 , 棧內是空的 ;

在這裏插入圖片描述


2 . 開始狀態 q1q_1 : 讀取 ε,εS\varepsilon , \varepsilon \to S 指令 , 讀取 ε\varepsilon 字符後 , εS\varepsilon \to S 指的是在棧上的操作 , 從棧內拿走 ε\varepsilon , ε\varepsilon 是空字符 , 相當於不用拿 , 並將 SS 字符放入棧 , 相當於使用 SS 替換 棧內 空字符 ε\varepsilon ,

SS 字符的作用 : 下推自動機是無法識別棧底的 , SS 作用是輔助下推自動機識別棧底元素 , 當下推自動機讀取到 SS 時 , 就知道已經讀取到棧底了 ;

開始狀態 讀取字符 操作 ε,εS\varepsilon , \varepsilon \to S , 最終向棧中放入了字符 SS ;

狀態跳轉 : 此時 自動機狀態 跳轉到了 q2q_2 狀態 ;

在這裏插入圖片描述


3 . q2q_2 狀態 : 讀取 0,ε00 , \varepsilon \to 0 指令 , 讀取到一個 00 , 從棧內拿走 ε\varepsilon , 使用 00 替換 ε\varepsilon , 並將該替換後的 00 放入棧中 ; 相當於在棧中 , 使用 00 替換 ε\varepsilon ; 之後依然保持 q2q_2 狀態不變 ;

狀態跳轉 : 下推自動機狀態 仍保持 q2q_2 狀態 ;

在這裏插入圖片描述


4 . q2q_2 狀態 : 再次讀取 0,ε00 , \varepsilon \to 0 指令 , 讀取到一個 00 , 從棧內拿走 00 字符 , 使用 00 替換 ε\varepsilon , 並將該替換後的 00 放入棧中 ; 之後依然保持 q2q_2 狀態不變 ;

狀態跳轉 : 下推自動機狀態 仍保持 q2q_2 狀態 ;
在這裏插入圖片描述


5 . q2q_2 狀態 , 讀取 1,0ε1 , 0 \to \varepsilon 指令 , 讀取到一個 11 , 從棧中拿走一個 00 , 並將 ε\varepsilon 放入棧中 , ε\varepsilon 是空字符串 , 從棧內拿取放入 ε\varepsilon 棧不變 , 相當於將一個 00 從棧內拿出 ;

狀態跳轉 : 下推自動機狀態 從 q2q_2 狀態跳轉到 q3q_3 狀態 ;

在這裏插入圖片描述


6 . q3q_3 狀態 : 讀取 1,0ε1 , 0 \to \varepsilon 指令 , 從棧中 , 拿走一個 00 , 將 ε\varepsilon 放入棧內 , 相當於在棧內使用 ε\varepsilon 空字符 替換 00 , 操作完成後 , 棧內少一個 00 ;

狀態跳轉 : 下推自動機狀態 仍保持 q3q_3 狀態 ;

在這裏插入圖片描述


7 . q3q_3 狀態 , 讀頭讀取到了最右端 , 所有字符都讀取完畢 , 此時不需要讀取任何字符 , 讀取 ε,Sε\varepsilon , S \to \varepsilon 指令 , 從棧內拿走 SS , 將 ε\varepsilon 放入棧中 , 跳轉到 q4q_4 狀態 ;

在這裏插入圖片描述

此時 , 棧清空 , 下推自動機停止計算 ;

q4q_4 是個雙圈 , 接受狀態 , 說明該下推自動機接受該 00110011 字符串 ;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章