自動機類型:有限自動機(finite automata,FA),下推自動機(push-down automata, PDA),線性界限自動機(linear-bounded automata)和圖靈機(Turing machine)函數
DFA(deterministic automata) M 是一個五元組blog
$M=(\Sigma, Q, \delta, q_0, F)$input
其中,$\Sigma$是輸入符號的有窮集合,Q 是狀態的有限集合,$q_0 \in Q$是初始狀態,F 是終止狀態集合,$F \subseteq Q$,$\delta$ 是 $Q \times \Sigma$ 到 Q(下一個狀態)的映射,也稱狀態轉移函數。it
注:$Q \times \Sigma$表示兩個集合的直積,這裏表示分別從兩個集合中取任意元素的組成的有序對,生成有序對的集合。擴展
DFA M 接受的語言,記做T(M):gc
$T(M)=\lbrace x | \delta(q_0,x) \in F \rbrace$im
其中,x 表示一個句子,且 $x \in \Sigma^*$,咱們擴輾轉移函數爲,d3
$\hat {\delta}: Q \times \Sigma^* \rightarrow Q $統計
$\hat {\delta} (q, \epsilon) = q$top
$\hat {\delta}(q, xa) = \hat {\delta}(\delta(q, a),x)$
其中$x' \rightarrow xa$爲右線性正則文法產生式(應用到句子上的狀況)
NFA(non-definite automata) M 是一個五元組
$M=(\Sigma, Q, \delta, q_0, F)$
其中,$\Sigma$是輸入符號的有窮集合,Q 是狀態的有限集合,$q_0 \in Q$是初始狀態,F 是終止狀態集合,$\delta$是直積$Q \times \Sigma$ 到 Q的冪集的映射。集合的冪集是集合全部的子集(包括空集和自身)組成的集合,這個集合的元素個數爲$2^{|Q|} = \sum_{i=0}^{|Q|} \binom {|Q|} {i}$
NFA與DFA不一樣的是,DFA 的$\delta(q,a)$是一個肯定的狀態做爲下一個狀態,而NFA的$\delta(q,a)$是一個集合,其中任一狀態都有可能做爲下一狀態,
$\delta: Q \times \Sigma \rightarrow P(Q)$
咱們擴輾轉移函數以下,
$\hat {\delta}: Q \times \Sigma^* \rightarrow P(Q)$
$\hat {\delta}(q, \epsilon) = s$
$\hat{\delta}(q, xa) = \bigcup_{r \in \delta(q, a)} \hat{\delta}(r,x)$
NFA M 接受的語言爲,
$T(M)=\lbrace x|p \in \delta(q_0, x), p \in F$
其中,x 表示一個句子
定理:若$G=(V_N, V_T, P, S)$表示一個正則文法,則存在一個$FA M = (\Sigma, Q, \delta, q_0, F)$,使得$T(M)=L(G)$
其中,$V_N$表示非終結符,$V_T$表示終結符
因而能夠由給定正則文法構造FA M,步驟以下:
上面這個步驟給出的太忽然,初看可能會不太容易理解。
咱們從給出的正則文法出發,根據上篇文章的介紹,正則文法的規則是(爲了與上面步驟相一致,以右線性正則文法爲例)$A \rightarrow x|xB$,可見非終結符老是由一種或多種終結符的方冪鏈接而成,也就是說,非終結符是有終結符組成,因此正則文法所識別的句子最終都是由終結符組成,因此步驟(1)中,FA M的輸入符號集就是$\Sigma = V_T$,FA M的上個狀態在某一輸入符的條件下轉換到下一狀態,而這個輸入符正是文法中的終結符x,正好對應文法規則的產生式$A \rightarrow xB$,不難想到,這對應着FA M中狀態轉變,即狀態 A 轉換到 狀態 B,而A 和 B 是文法中的非終結符,因此FA M的狀態集合$Q = V_N$。不過,這樣就OK了嗎?顯然沒有,此時Q中的狀態所有是$V_N$中的非終結符,根據文法產生式,非終結符老是要繼續推導下去的,這說明,Q中少了能表示終止的狀態,不然就是要構造無限長度的句子了。咱們新增一個非終結符T,這個非終結符T很特殊,它沒有產生式,它的具體意義稍後就會解釋。不過咱們的Q 就完整了,因而$Q=V_N \cup {T} $。另外,FA M的起始狀態則不難理解爲是文法的起始符$q_0=S$。
接着看步驟三、4和5
右線性正則文法的產生式有:$B \rightarrow a, B \in V_N, a \in V_T$,表示一個非空終止符B 產生出一個終止符a,這個產生式的右端沒有非終結符,根據這種產生式,對應於FA M則是由狀態B 接收一個輸入符a 後進入下一個狀態,這個狀態就是前面新引入的那個T,即,但凡應用了$B \rightarrow a$這種右端沒有非終結符的產生式,FA M就進入下一個狀態T,由狀態B並接收一個輸入符a進入下一個狀態T,若是是NFA,則是下一個狀態集合,這裏爲了避免失通常性,咱們考慮NFA(畢竟DFA是NFA的特例),即$\delta(B, a)$是下一個狀態集合,那麼若是通過產生式$B \rightarrow a$變換後,,FA M進入狀態T,則 $T \in \delta(B, a)$。
根據右線性正則文法,若是有產生式:$B \rightarrow aC, B, C \in V_N, a \in V_T$,那麼根據上面的闡述,應該知道應用了此產生式後,FA M進入下一個狀態C,且$C \in \delta(B, a)$。固然若是還有產生式$B \rightarrow aD$,那麼$D \in \delta(B, a)$;若是B 只有一個產生式$B \rightarrow a$,那麼$\delta(B, a)$只有一個元素,$\delta (B, a) = \lbrace T \rbrace$
前面提到過,新引入的非終結符T沒有產生式,沒有$T \rightarrow a|aA$這樣的產生式,因此$\delta(T, a) = \varnothing$
而後來看步驟2,
FA M的終止狀態集合$F \subseteq Q$,顯然集合Q裏面只有狀態T 能夠做爲終止狀態,即應用了文法產生式$B \rightarrow a$以後進入狀態T,因此$F = \lbrace T \rbrace$。前面咱們介紹文法時,沒有引入$\epsilon$,如今將其引入,這樣就能夠產生「空句子」,若是$S \rightarrow \epsilon$,即產生一個 空句子 ,那麼顯然,使用起始狀態 S 做爲此時的終止狀態,因此,若是有產生式$S \rightarrow \epsilon$,此時$F=\lbrace S, T \rbrace$,而 $S \in V_N$,此時依然能保證$F \subseteq Q$,固然若是沒有產生式$S \rightarrow \epsilon$,那麼$F = \lbrace T \rbrace$,即只有非空句子的終止狀態T
定理:若$M=(\Sigma, Q, \delta, q_0, F)$是一個有限自動機,則存在一個正則文法$G=(V_N, V_T,P,S)$,使得$L(G)=T(M)$
由FA M構造G的步驟:
下推自動機(Pushdown Automata, PDA)用於實現上下文無關文法(CFG)。PDA 能夠表達成一個七元組:
$M=(\Sigma, Q, \Gamma, \delta, q_0, Z_0, F)$
$Q$: 狀態的有限集合
$\Sigma$: 輸入符號集
$\Gamma$: 棧符號表
$\delta$: 轉移函數
$q_0$: 初始狀態
$Z_0$: 初始棧頂符號(也有叫棧底符號的,由於初始時棧裏僅有這一個符號)
$F$: 終止狀態集或可接受狀態集,$F \subseteq Q$
$$ \begin{aligned} \delta : & \quad \quad Q & \quad \times \quad \quad \Sigma \quad \times & \quad \Gamma \quad \Rightarrow \quad & Q \quad \times \quad & \Gamma^* \\ & \text{old state} & \text{input symb.} & \text{stack top} & \text{new state(s)} & \text{new stack top(s)} \end{aligned}$$
$\delta (q,a,X) = \lbrace (p, Y), ...$
從狀態q 轉移到狀態 p,a是下一個輸入符號,X是當前棧頂符號,Y是下一個用於替換X的棧頂符號,以下圖所示,$Y \in \Gamma^*$,
(圖來源網上)
PDA相似NFA,比NFA多了一個stack,正是這個stack使得PDA能夠識別一些非正則的語言。輸入符號集與棧符號集可能會不一樣,因此分別用$\Sigma$和$\Gamma$表示。
略(之後再專門講述,主要是內容跟書上太太重複了,可是本身又不會組織語言,因此只能先等等)。
ref
統計天然語言處理,宗成輕