下推自動機
下推自動機有一個七元組定義:
下面給出一個例子:
PDA的狀態遷移圖
PDA的瞬時描述
一個PDA的瞬時描述對應於一個三元組。
PDA瞬時描述的遷移:
PDA瞬時描述遷移的定理:
下推自動機接受的語言
- 以終結狀態的方式接受
PDA通過消耗輸入並且j進入接受狀態來接受它的輸入串,這種方式稱為"以終結狀態接受",其形式化定義如下:
- 以空棧方式接受
如果一個PDA的語言由所有從初始ID開始能夠最終導致這個PDA的堆棧排空的串構成,那么稱其為“以空棧方式接受”,其形式化定義如下:
從空棧接受方式到終結狀態接收方式
我們可以使用一個不在其堆棧符號表中的新符號X0,它既是PF的初始符號,也是一個放在棧底能讓我們知道PN的堆棧已經為空了的標記。換句話說,如果PF在它的棧頂看到了X0,那么它就知道PN在同樣的輸入串上它的堆棧為空。其具體實現方式如下圖:
我們還需要一個新的初始狀態p0,它唯一的作用就是把Z0(也就是PN的初始符號)壓入堆棧中,然后進入狀態q0(PN的初始狀態)。在此之后,PF模擬PN,直到PN的堆棧符號為空——PF能夠檢測出這個事實,因為此時的棧頂符號為X0。最后,我們需要一個新的狀態pf,它是PF的接受狀態,當發現PN的堆棧符號會變為空時PF就轉移到接受狀態pf。
從終結狀態接受方式到空棧接受方式
現在可以考慮相反的方向:給定一個以終結狀態方式接受的語言L的PDA PF,構造一個以空棧方式接受L的PDA PN。
構造的過程比較簡單,從PF的每一個接受狀態,添加一個ε轉移到一個新的狀態p,當處在狀態p時,PN從堆棧中彈出符號,同時不消耗任何輸入。這樣,只要PF在消耗輸入w之后進入了接受狀態,相應的PN就會在消耗了w之后清空堆棧。實現過程如下圖:
為了避免PF清空了它的堆棧符號但是沒有進入接受狀態的情況,PN也一定要使用一個棧底標記X0,這個標記是PN的初始符號,PN必須從一個新的狀態p0開始,p0的唯一作用就是把PF的初始符號壓入堆棧並且進入PF的初始狀態。
PDA和CFG的等價性
定理:一個語言由一個上下文無關文法生成當且僅當它能夠被一個PDA接受。
從CFG到PDA
對於一個上下文無關的文法G=(V,T,Q,S),構造以空棧方式接受的PDA如下:
定理:如果一個PDA是通過上述方式轉換而來的,那么N(P)=L(G)
從PDA到CFG
給定一個以空棧接受的PDA
構造出一個與之等價的CFG
首先構造CFG的非終止符合集V:
然后需要構造的就是CFG的產生式R:
產生式分成兩個部分:
第一個部分由PDA的初始狀態和初始符號確定:
第二個部分由PDA的轉移函數來確定:
**其中的rk的含義是遍歷PDA的狀態集合的每個狀態。
下面給出一個例子:
構造終止字符集:
構造產生式:
剩下的產生式都根據PDA的轉移函數來確定:
定理:對於任意一個PDA P,存在一個上下文無關文法G滿足L(G)=N(P)。
確定型PDA
也就是說存在兩種類型的不確定性:一種是對於遷移的新狀態的不確定,第二種是對於進行遷移時的輸入符號的不確定性。
對於DPDA,兩種接受方式並不是相同的,更確切的說,以空棧方式接受的語言正是以終結狀態接受的語言且具有前綴性質的語言,前綴性質是指:語言中的任何串都不是其他串的前綴。
DPDA接受的語言:所有的正則語言都被DPDA(以終結狀態方式)接受,而且存在被DPDA接受的非正則語言。DPDA語言是上下文無關語言,而且事實上是擁有無歧義文法CFG的語言。因此,DPDA是嚴格位於正則語言和上下文無關語言之間。