【計算理論】下推自動機 PDA ( 設計下推自動機 | 上下文無關語法 CFG 等價於 下推自動機 PDA )





I . 下推自動機 設計



設計下推自動機 , 可以識別 {wwR:w{0,1}}\{ ww^R : w \in \{ 0, 1\} ^* \} 語言 ;


RR 表示鏡面反射 , 如果 ww 是由 0,10 , 1 組成的字符串 011011 , 那麼 wRw^R 就是其鏡面反射 100100 字符串 , 然後將 wwwRw^R 串聯在一起 , wwR=011100ww^R = 011100 ;


1 . 首先生成開始狀態 ;

開始狀態是接受狀態 , 因爲如果字符串是空字符串 , 空字符串的鏡面反射還是空字符串 , 因此讀取空字符串後的狀態 , 是接受狀態 , 開始狀態其本身就是接受狀態 ;

在這裏插入圖片描述


2 . 向棧底放入 字符 SS , 用於作爲棧底的標識 , 生成 ε,εS\varepsilon , \varepsilon \to S 指令 ;


ε,εS\varepsilon , \varepsilon \to S 指令包含 22 部分 : 讀取字符 , 和 棧內操作 ;

  • 讀取字符 : 指的是讀取的帶子上的字符串 , ε,εS\varepsilon , \varepsilon \to S 中前面的 ε\varepsilon 指的是從帶子上讀取 ε\varepsilon ;

  • 棧內操作 : 使用某個字符 替換 棧頂字符 ; ε,εS\varepsilon , \varepsilon \to S 中後面的 εS\varepsilon \to S 指的是使用 SS 字符替換棧頂的空字符 ε\varepsilon ;

在這裏插入圖片描述


3 . 鏡面反射的前半個鏡面 :


00 入棧 : 每讀取一個 00 , 就將 00 放入棧中 , 生成指令 0,ε00, \varepsilon \to 0 ;

11 入棧 : 每讀取一個 11 , 就將 11 放入棧中 , 生成指令 1,ε11, \varepsilon \to 1 ;

在這裏插入圖片描述


4 . 跳轉到新的狀態 , 在新的狀態執行 後半個鏡面的操作 :


無條件跳轉就是讀取 ε\varepsilon , 並且棧中元素保持不變 , 即使用 ε\varepsilon 替換棧頂的 ε\varepsilon ;

生成的指令爲

ε,εε\varepsilon , \varepsilon \to \varepsilon


當前的下推自動機 :

在這裏插入圖片描述


5 . 鏡面反射的後半個鏡面 :


00 出棧 : 每讀取一個 00 , 從棧裏拿走一個 00 , 生成指令 0,0ε0, 0 \to \varepsilon ;

11 出棧 : 每讀取一個 11 , 從棧裏拿走一個 00 , 生成指令 1,1ε1, 1 \to \varepsilon ;

在這裏插入圖片描述


6 . 棧清空 , 跳轉到最後的 接受狀態 : 上述出棧操作執行若干次後, 總能將棧內的字符取出完畢 , 只剩下一個 SS 字符 , 該字符是棧底的標識 ; 此時將 SS 字符從棧內取出即可 ;


生成如下指令 :

ε,Sε\varepsilon , S \to \varepsilon

指令含義是 讀取 ε\varepsilon 字符 , 使用 ε\varepsilon 字符替換棧中的 SS 字符 ;


最後跳轉到的狀態是接受狀態 ;


當前下推自動機爲 :

在這裏插入圖片描述





II . 上下文無關語法 ( CFG ) 等價於 下推自動機 ( PDA )



假設某語言由 上下文無關語法 ( CFG ) 生成 , 找到一個 下推自動機 ( PDA ) 識別該語言 ;


構造下推自動機流程 ( PDA ) :


構造下推自動機 , 包含 33 個狀態 , 開始狀態 qstartq_{start} , Loop 循環狀態 qloopq_{loop} , 可接受狀態 qacceptq_{accept} ;


1 . qstartq_{start} 開始狀態 :

在這裏插入圖片描述

讀取 ε\varepsilon 字符 , 使用 TSTS 替換棧頂的 ε\varepsilon , 對應的指令爲


ε,εTS\varepsilon , \varepsilon \to TS

其中的 SS 是棧頂的標識 , TT 是棧內的實際字符 ;

在這裏插入圖片描述


2 . qloopq_{loop} 循環階段 , 根據 上下文無關語法 ( CFG ) 做替換 ;


① 當棧頂是變元時 , 作變換 , 讀取 ε\varepsilon , 即什麼都不讀取 , 將棧頂的變元 替換成 ww , 生成的 下推自動機 指令爲 " ε,Aw\varepsilon , A \to w " , 對應着的上下文無關語法規則爲 AwA \to w ;

② 當棧頂是終端字符 ( 常元 ) , 讓帶子上的 讀頭 讀取一個終端字符 , 對應的棧中 , 將棧頂的終端字符刪除 , 相當於使用 ε\varepsilon 替換終端字符 , 生成指令 " a,aεa , a \to \varepsilon " ;


一直讀取 終端字符 , 並將棧頂的終端字符刪除 , 一直循環該操作 , 直到 棧頂是一個變元 未爲止 ;

在這裏插入圖片描述


3 . 跳轉到 qacceptq_{accept} 狀態 : 當棧內的字符都出棧後 , 只剩下一個 SS 字符作爲棧底標識 , 此時 SS 出棧 , 生成對應的 下推自動機指令 " ε,Sε\varepsilon , S \to \varepsilon " , 即使用空字符 ε\varepsilon 替換棧內的 SS 字符 ;

之後跳轉到最後一個狀態 , qacceptq_{accept} 可接受狀態 ;

在這裏插入圖片描述

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