形式語言與自動機
教學大綱
- 正則語言
- 2 有窮自動機
2.1 確定的有窮自動機
2.2 非確定有窮自動機
2.3 帶有空轉移的非確定有窮自動機
- 3 正則表達式
3.1 正則表達式
3.2 自動機和正則表達式
3.3 正則表達式的代數定律
- 4 正則語言的性質
4.1 正則語言的泵引理
4.2 正則語言的封閉性
4.3 正則語言的判定性質
4.4 自動機最小化
- 上下文無關語言
- 5 上下文無關文法
5.1 上下文無關文法
5.2 語法分析樹
5.3 文法和語言的歧義性
5.4 文法的化簡和範式
- 6 下推自動機
6.1 下推自動機
6.2 下推自動機的語言
6.3 下推自動機與文法的等價性
6.4 確定性下推自動機
- 7 上下文無關語言的性質
7.1 上下文無關語言的泵引理
7.2 上下文無關語言的封閉性
7.3 上下文無關語言的判定性質
- 計算導論
主要考點
- 構造自動機:DFA、NFA、ε-NFA、PDA、DPDA、TM
- 設計正則表達式/正則文法、上下文無關文法
- 泵引理+封閉性證明不是正則語言
- 等價性轉換
- CNF和GNF
- 語言的接受和設計
1. 確定的有窮自動機(DFA)
確定的有窮自動機(DFA, Deterministic Finite Automaton) A 爲五元組
A=(Q,Σ,δ,q0,F)
- Q : 有窮狀態集;
- Σ : 有窮輸入符號集或字母表;
- δ : Q×Σ→Q, 狀態轉移函數;
- q0 ∈ Q : 初始狀態;
- F⊆Q : 終結狀態集或接受狀態集.
例:請設計 DFA, 在任何由 0 和 1 構成的串中, 接受含有 01 子串的全部串.
- 未發現 01, 即使 0 都還沒出現過;
- 未發現 01, 但剛剛讀入字符是 0;
- 已經發現了 01
因此 DFA A 的可定義爲:
A = ({q1, q2, q3}, {0, 1}, δ, q1, {q3})
-
其中 δ 爲:
δ(q1,1)=q1
δ(q2,1)=q3
δ(q3,1)=q3
δ(q1,0)=q2
δ(q2,0)=q2
δ(q3,0)=q3
-
狀態轉移圖
- 每個狀態 q 對應一個節點, 用圓圈表示;
- 狀態轉移 δ(q, a) = p 爲一條從 q 到 p 且標記爲字符 a 的有向邊;
- 開始狀態 q0 用一個標有 start 的箭頭表示;
- 接受狀態的節點, 用雙圓圈表示.
-
狀態轉移表
2. 非確定的有窮自動機(NFA)
非確定有窮自動機(NFA, Nondeterministic Finite Automaton) A 爲五元組
A=(Q,Σ,δ,q0,F)
- Q : 有窮狀態集;
- Σ : 有窮輸入符號集或字母表;
- δ : Q×Σ=2Q, 狀態轉移函數;
- q0 ∈ Q : 初始狀態;
- F⊆Q : 終結狀態集或接受狀態集.
與DFA區別
- δ : Q×Σ=2Q
- 轉移後爲一個狀態集合
- 同一個狀態在相同的輸入下,可以有多個轉移狀態
- 自動機可以處在多個當前狀態
例:接受全部以 01 結尾的串的 NFA.
解:五元組爲 A = ({q0, q1, q2}, {0, 1}, δ, q0, {q2})
轉移函數 δ:
- δ(q0, 0) = {q0, q1}
- δ(q1, 0) = ∅
- δ(q2, 0) = ∅
- δ(q0, 1) = {q0}
- δ(q1, 1) = {q2}
- δ(q2, 1) = ∅
3. 帶有空轉移的非確定有窮自動機(ε-NFA)
DFA、NFA和ε-NFA性質:
- 自動機在某狀態, 讀入某個字符時, 可能有多個轉移
- 自動機在某狀態, 讀入某個字符時, 可能沒有轉移
- 自動機在某狀態, 可能不讀入字符, 就進行轉移
ε-NFA與NFA
- 不讀入字符,就進行轉移的NFA
- Q×(Σ∪{ε})=2Q
例:語言 L=w∈0,1∗∣w倒數3個字符至少有一個是1 的ε-NFA.
- 狀態轉移圖
- 狀態轉移表
此後, 不再明確區分 ε-NFA 和 NFA, 而認爲它們都是 NFA.
4. DFA和NFA的等價性與轉換
ε−閉包:q0→所有q0能到達的狀態的集合
記爲Eclose(q)
例:求以下狀態的 ε−closure
解:
- E(1)={1,2,4,3,6}
- E(2)={2,3,6}
- E(3)={3,6}
- E(4)={4}
- E(5)={5,7}
- E(6)={6}
- E(7)={7}
擴展轉移函數
例:將以下NFA轉換爲DFA
解:
- 狀態轉移表和ε-閉包爲
- 設置初狀態{q0}
- 當輸入0時,{q0}→{q0},不變,則{q0}的ε-閉包還是爲{q0}
- 當輸入1時,{q0}→{q0,q1},則{q0,q1}的ε-閉包爲{q0,q1,q2,q3}
- 因此狀態轉移函數如下
|
0 |
1 |
{q0} |
{q0} |
{q0,q1,q2,q3} |
- 出現新狀態{q0,q1,q2,q3}
- 當輸入0時,{q0,q1,q2,q3}→{q0,q2,q3},則{q0,q2,q3}的ε-閉包爲{q0,q2,q3}
- 當輸入1時,{q0,q1,q2,q3}→{q0,q1,q2,q3},則{q0,q1,q2,q3}的ε-閉包爲{q0,q1,q2,q3}
- 因此狀態轉移函數如下
|
0 |
1 |
{q0} |
{q0} |
{q0,q1,q2,q3} |
{q0,q1,q2,q3} |
{q0,q2,q3} |
{q0,q1,q2,q3} |
- 出現新狀態{q0,q2,q3}
- 當輸入0時,{q0,q2,q3}→{q0,q3},則{q0,q3}的ε-閉包爲{q0,q3}(紅色爲原轉移,綠色爲轉移後的閉包)
- 當輸入1時,{q0,q2,q3}→{q0,q1,q2,q3},則{q0,q1,q2,q3}的ε-閉包爲{q0,q1,q2,q3}
- 因此狀態轉移函數如下
|
0 |
1 |
{q0} |
{q0} |
{q0,q1,q2,q3} |
{q0,q1,q2,q3} |
{q0,q2,q3} |
{q0,q1,q2,q3} |
{q0,q2,q3} |
{q0,q3} |
{q0,q1,q2,q3} |
- 出現新狀態{q0,q3}
- 同理,因此狀態轉移函數如下
|
0 |
1 |
{q0} |
{q0} |
{q0,q1,q2,q3} |
{q0,q1,q2,q3} |
{q0,q2,q3} |
{q0,q1,q2,q3} |
{q0,q2,q3} |
{q0,q3} |
{q0,q1,q2,q3} |
{q0,q3} |
{q0} |
{q0,q1,q2,q3} |
- 最後,將q0設爲初始狀態,且將含有原轉移終止符(q3)的狀態設置爲終止狀態,即{q0,q1,q2,q3}、{q0,q2,q3}、{q0,q3}均爲終止狀態
|
0 |
1 |
→{q0} |
{q0} |
{q0,q1,q2,q3} |
∗{q0,q1,q2,q3} |
{q0,q2,q3} |
{q0,q1,q2,q3} |
∗{q0,q2,q3} |
{q0,q3} |
{q0,q1,q2,q3} |
∗{q0,q3} |
{q0} |
{q0,q1,q2,q3} |
5. DFA化簡:狀態等價性和填表算法
5.1 等價和可區分
對於任意兩個狀態,一定是
二者之一
-
等價
- 即:當兩個狀態爲等價時,對於任意一個輸入符,轉移狀態同時爲終止狀態或同時不是;
- 注:不一定相同
- 因此:不提及兩個狀態的轉移狀態是否相同
-
可區分
- 即:當兩個狀態爲可區分時(不等價),存在至少一個輸入符,轉移狀態不同時爲終止(不同時爲非終止)
例:化簡以下DFA
5.2 填表算法 Table-Filling Algorithm
- 直接標記終態和非終態之間的狀態對
- 標記所有經過字符 0 到達終態和非終態的狀態對
- {D, F }×{A, B, C, E, G, H}
- 標記所有經過字符 1 到達終態和非終態的狀態對
- {B, H }×{A, C, D, E, F, G}
- 此時還有 [A,E], [A,G], [B,H], [D,F], [E,G] 未標記, 只需逐個檢查.
- [A,G] 是可區分的, 因爲經串 01 到可區分的 [C,E];
- [E,G] 是可區分的, 因爲經串 10 到可區分的 [C,H].
- [A,E], [B,H] 和 [D,F] 在經過很短的字符串後, 都會到達相同狀態,因此都是等價的.
6. 正則表達式(Regular Express)
語言是字符串集合。
語言的運算:並、連接、冪、克林閉包
遞歸定義:
如果E爲字母表,則2上的正則表達式遞歸定義爲:
- 0是一個正則表達式,表示空語言;
- ε是一個正則表達式,表示語言{e};
- 任意a∈E,a是一個正則表達式,表示語言{a};
- 如果正則表達式 r 和 s 分別表示語言R和S,那麼r+s,rs,r∗和(r)都是正則表達式
- 分別表示語言R∪S,R⋅S,R∗和R
優先級:括號>星(*)>連接(×)>加(+)
例:L = {w | w ∈ {0, 1}∗ and w has no pair of consecutive 0’s.}
- 解:1∗(011∗)∗(0 + ε) 或 (1 + 01)∗(0 + ε)
7. 正則表達式和有窮自動機的等價關係與轉換
- 正則表達式與有窮自動機等價
- 有窮自動機可以識別正則語言
- 正則表達式生成正則語言
7.1 正則表達式–>自動機
正則表達式到自動機的轉換分爲以下4種
例:正則表達式(0+1)∗1(0+1)轉換爲ε−NFA
7.1.1 並(加號)的轉換
例:0+1
7.1.2 冪(星號)的轉換
例:(0+1)∗
- 藍色圈內爲一個整體,表示冪運算的底
- 上方的紅箭頭是遞歸,即循環出現
- 下方的紅箭頭是藍色圈內內容一個都不出現的情況,對應該題ε,即空串情況
7.2 自動機–>正則表達式
若干例題
-
2.
3.
7.2.1 刪除狀態法
- 添加首尾兩個狀態;
- 從最小的單元開始化簡爲正則表達式,去掉這個單元,新增一條邊,寫上轉換的表達式;
- 最後一條表達式即爲結果;
7.2.2 歸納法
- Pick every label on the path from q0 to q2 ---- one by one
- Form every RegExp on the path from q0 to q2 ---- one by one
Rij(k):0<=k<=n:i到j路徑上的正則表達式
- no inner node is greater than k
當k≥1時進行歸納法
公式:
例:
解:
8. 正則語言的性質
8.1 泵引理
即:前N的字符中存在一段可以在該位置循環出現
泵引理只是正則語言的必要條件,只能用來證明某個語言不是正則的
證明:
例:
8.2 封閉性
正則語言經某些運算後得到的新語言仍保持正則,稱正則語言在這些運算下封閉
正則語言 L 和 M, 在這些運算下封閉
- 並:L∪M
- 連接:LM
- 閉包:L∗
- 補:L
- 差:L−M
- 交:L∩M
- 反轉:LR={wR∣wϵL}
- 同態
- 逆同態
考點:能夠運用這些性質,結合泵引理證明一個語言是否是正則語言
自動機的轉換
- 並:使用ε−NFA,新建初始狀態節點,空轉移到原來的初始狀態;
- 連接:前者終止狀態空轉移到後者初始狀態;
- 閉包:增加新終止狀態,原終止狀態空轉移到新終止狀態以及初始狀態;
- 補:終止狀態取補
- 差
- 交
- 反轉:新增終止狀態,原終止狀態空轉移到新終止狀態,然後所有邊逆向,是(非)終止狀態改爲非(是)終止狀態;
證明思路
9. 上下文無關文法(CFG)
定義:上下文無關文法(CFG, 簡稱文法) G 是一個四元組 G=(V,T,P,S)
- V : 變元的有窮集, 變元也稱爲非終結符或語法範疇;
- T: 終結符的有窮集, 且 V ∩ T = ∅;
- P: 產生式的有窮集, 每個產生式包括:
- 一個變元, 稱爲“產生式的頭或左部”;
- 一個產生式符號 →, 讀作“定義爲”;
- 一個(V∪T)∗中的符號串, 稱爲“體或右部”;
- S∈V:初始符號, 文法開始的地方.
產生
- 產生式A→α,讀作 A 定義爲 α
- 如果有多個 A 的產生式 A→α1,A→α2,⋅⋅⋅,A→αn
- 可簡寫爲 A→α1∣α2∣⋅⋅⋅∣αn
- 文法中變元 A 的全體產生式, 稱爲 A 產生式
符號
- 終結符: 0, 1, . . . , a, b, . . .
- 終結符串: . . . , w, x, y, z
- 非終結符: S, A, B, . . .
- 終結符或非終結符: . . . , X, Y, Z
- 終結符或非終結符組成的串: α, β, γ, . . .
例:
- 迴文
G=(A,0,1,A→ε∣0∣1∣0A0∣1A1,A)
- L={ w∈{0,1}* | w contains same number of 0’s and 1’s }
R=(S,0,1,P,S)
P:S→ε∣0S1∣1S0∣SS
- 從字符串到文法變元的分析過程, 稱爲遞歸推理或歸約;
歸約: 自底向上, 由產生式的體向頭的分析
- 從文法變元到字符串的分析過程, 稱爲推導或派生.
派生: 自頂向下, 由產生式的頭向體分析
9.1 規約
例:用算數表達式文法 Gexp, 將 a∗(a+b00) 歸約的過程
- E → I
- E → E + E
- E → E ∗ E
- E → (E)
- I → a
- I → b
- I → Ia
- I → Ib
- I → I0
- I → I1
目標:從a∗(a+b00)規約到E
解:
- a∗(a+b00)
- I∗(I+b00)
- I∗(I+I00)
- I∗(I+I0)
- I∗(I+I)
- E∗(E+E)
- E∗E
- E
即:
9.2 派生
爲限制派生的隨意性, 要求只替換符號串中最左邊變元的派生過程, 稱爲最
左派生, 記爲
lm⟹或lm⟹∗
只替換最右的, 稱爲最右派生, 記爲
rm⟹或rm⟹∗
任何派生都有等價的最左派生和最右派生
- A⟹∗w 當且僅當 Alm⟹∗w 當且僅當 Arm⟹∗w
- 即:最左和最右派生同時存在或不存在
當w在L(G)中時滿足:
- w僅由終結符組成
- 初始符號S能派生出w
即:
L(G)={w ∣ wϵT∗, SG⟹∗w}
語言 L 是某個 CFG G 定義的語言, 即 L=L(G), 則稱 L 爲上下文無關語言(CFL, Context-Free Language).
- 上下文無關是指在文法派生的每一步αAβ⇒αγβ,符號串 γ 僅根據 A 的產生式派生, 而無需依賴 A 的上下文 α 和 β.
- 如果有兩個文法 CFG G1 和 CFG G2,滿足L(G1) = L(G2),則稱 G1 和 G2 是等價的.
- 句型
- 若 CFGG=(V,T,P,S), 初始符號 S 派生出來的符號串, 稱爲 G 的句型, 即
- α∈(V∪T)∗且S⟹∗a
- 如果Slm⟹∗α,稱α爲左句型
- 如果Srm⟹∗α,稱α爲右句型
- 只含有終結符的句型, 也稱爲 G 的句子
- 而 L(G) 就是文法 G 全部的句子
9.3 解析樹
CFG G = (V, T, P, S) 的語法分析樹(語法樹或派生樹) 爲:
- 每個內節點標記爲 V 中的變元符號;
- 每個葉節點標記爲 V ∪ T ∪ {ε} 中的符號;
- 如果某內節點標記是 A, 其子節點從左至右分別爲X1, X2, · · · , Xn
- 那麼A→X1X2⋅⋅⋅Xn∈P
- 若有 Xi = ε, 則 ε 是 A 唯一子節點, 且 A → ε ∈ P
- 語法樹的全部葉節點從左到右連接起來, 稱爲該樹的產物或結果. 如果樹根節點是初始符號 S, 葉節點是終結符或 ε, 那麼該樹的產物屬於 L(G).
- 語法樹中標記爲 A 的內節點及其全部子孫節點構成的子樹, 稱爲 A 子樹.
例:
CFG G = (V, T, P, S) 且 A ∈ V , 那麼文法 G 中
- A⟹∗α 當且僅當 G 中存在以 A 爲根節點產物爲 α 的語法樹
- 每棵語法分析樹都有唯一的最左 (右) 派生
- 給定 CFG G = (V, T, P, S), A ∈ V , 以下命題等價:
- 通過遞歸推理, 確定串 w 在變元 A 的語言中
- 存在以 A 爲根節點, 產物爲 w 的語法分析樹
- A⟹∗w
- Alm⟹∗w
- Arm⟹∗w
9.4 歧義
有些文法的歧義性, 可以通過重新設計文法來消除
- 定義同樣的語言可以有多個文法, 如果 CFL L 的所有文法都是歧義的,那麼稱語言 L 是固有歧義的
- 定義同樣的語言可以有多個文法, 如果 CFL L 的所有文法都是歧義的, 那麼稱語言 L 是固有歧義的.
- “判定任何給定 CFG G 是否歧義”是一個不可判定問題
10. 上下文無關文法的化簡
文法化簡的可靠順序
- 消除ε-產生式;
- 消除單元產生式;
- 消除非產生的無用符號;
- 消除非可達的無用符號.
10.1 消除無用符號
- 初始符號在派生過程中能派生的語言,前後爲若干終止符、中間的單一符號爲可達的;
- 某一符號和前後的若干終止符能夠最終派生爲均爲終止符的語言,則其是產生的;
- 可達 + 產生 = 有用
- 非(有用)= 無用 = 非(可達) 或 非(產生)
步驟:
- 計算“產生的”符號集
- 每個 T 中的符號都是產生的
- A → α ∈ P 且 α 中符號都是產生的, 則 A 是產生的
- 計算“可達的”符號集
- 符號 S 是可達的
- A → α ∈ P 且 A 是可達的, 則 α 中符號都是可達的
- 刪除全部含有 “非產生的” 和 “非可達的” 符號的產生式
注:先尋找並消除全部非“產生的”符號,再尋找並消除全部非“可達的”符號,否則可能消除不完整。
- 例:消除如下文法無用符號
S → AB | a
A → b
- 解:S → bB | a
10.2 消除ε產生式
步驟:
- 確定“可空變元”
- 如果 A → ε, 則 A 是可空的
- 如果 B → α 且 α 中的每個符號都是可空的,則 B 是可空的
- 確定“可空變元”
- 將含有可空變元的一條產生式A→X1X2⋅⋅⋅Xn用一組產生式A→Y1Y2⋅⋅⋅Yn代替,其中
- 若 Xi 不是可空的, Yi 爲 Xi
- 若 Xi 是可空的, Yi 爲 Xi 或 ε
- 但 Yi 不能全爲 ε (否則A爲可空變元)
例:
- 消除 CFG G = ({S, A, B}, {a, b}, P, S) 的 ε-產生式.
S → AB
A → AaA | ε
B → BbB | ε
解:
- CFG G′ 爲
S → AB | A | B
A → AaA | Aa | aA | a
B → BbB | Bb | bB | b
10.3 消除單元產生式
單元產生式:例如 A → B
步驟:
- 確定“單元對”
- 如果有 A⟹∗B, 則稱 [A,B] 爲單元對
- A → B ∈ P, 則 [A, B] 是單元對
- 若 [A, B] 和 [B, C] 都是單元對, 則 [A, C] 是單元對
- 消除單元產生式
- 刪除全部形爲 A → B 的單元產生式
- 對每個單元對 [A, B], 將 B 的產生式複製給 A
例:
- 消除文法的單元產生式
S → A | B | 0S1
A → 0A | 0
B → 1B | 1
解:
- 單位對爲 [S, A] 和 [S, B], 帶入得:
S → 0S1
S → 0A | 0
S → 1B | 1
A → 0A | 0
B → 1B | 1
11. 上下文無關文法的範式
11.1 喬姆斯基範式(CNF)
- 每個不帶 ε 的 CFL 都可以由這樣的 CFG G 定義, G 中每個產生式的形式都爲 A→BC 或 A→a
- 這裏的 A, B 和 C 是變元, a 是終結符.
- 利用 CNF 派生長度爲 n 的串, 剛好需要 2n − 1 步
方法:
例:
- CFG G=(S,A,B,a,b,P,S), 產生式集合 P 爲:
S→bA∣aB
A→bAA∣aS∣a
B→aBB∣bS∣b
- 請設計等價的 CNF 文法.
解:
- CNF 爲:
S→CbA∣CaB
A→CaS∣CbD1∣a
D1→AA
Ca→a
B→CbS∣CaD2∣b
D2→BB
Cb→b
11.2 格雷巴赫範式(GNF)
- 每個不帶 ε 的 CFL 都可以由這樣的 CFG G 定義, G 中每個產生式的形式都爲A→aα
其中 A 是變元, a 是終結符, α 是零或多個變元的串.
- GNF 每個產生式都會引入一個終結符
- 長度爲 n 的串的派生恰好是 n 步
例:
- 將以下文法轉換爲 GNF.
S → AB
A → aA | bB | b
B → b
解:
- GNF 爲
S → aAB | bBB | bB
A → aA | bB | b
B → b
特殊情況:
12. 下推自動機(PDA)
下推自動機(PDA, Pushdown Automata) P 爲七元組
P=(Q,Σ,Γ,δ,q0,Z0,F)
- Q, 有窮狀態集;
- Σ, 有窮輸入符號集;
- Γ, 有窮棧符號集;
- δ:Q×(Σ∪ε)×Γ→2Q×Γ∗, 狀態轉移函數;
- q0∈Q, 初始狀態;
- Z0∈Γ−Σ, 棧底符號;
- F⊆Q, 接收狀態集或終態集.
例:設計識別 L01={0n1n∣n≥1} 的 PDA
例:設計識別 Lwwr={wwR∣w∈(0+1)∗} 的 PDA
12.1 瞬時描述(ID)
爲描述 PDA 瞬間的格局, 定義 Q×Σ∗×Γ∗ 中三元組
(q,w,γ)
爲瞬時描述(ID, Instantaneous Description), 表示此時 PDA 處於狀態 q, 剩
餘輸入串 w, 棧爲 γ.
12.1.1 轉移
在 PDA P 中如果 (p,β)∈δ(q,a,Z), 由 (q,aw,Zα) 到 (p,w,βα) 的變化, 稱爲瞬時描述(ID)的轉移 ⊢P, 記爲
(q,aw,Zα)⊢P(p,w,βα)
其中 w∈Σ∗,α∈Γ∗.
若有瞬時描述(ID) I, J 和 K, 遞歸定義 ⊢P∗ 爲:
- I⊢P∗I
- 若 I⊢P∗J, J⊢P∗K,則 I⊢P∗K
若 P 已知, 可省略, 記爲 ⊢ 和 ⊢∗ .
例:語言 L01={0n1n∣n≥1} 的 PDA, 識別 0011 時的 ID 序列.
解:
(q0,0011,Z0)⊢(q0,011,0Z0)⊢(q0,11,00Z0)⊢(q1,1,0Z0)⊢(q1,ε,Z0)⊢(q2,ε,Z0)
定理:
-
對 ∀w∈Σ∗,∀γ∈Γ∗, 如果
(q,x,α)⊢P∗(p,y,β),
那麼
(q,xw,αγ)⊢P∗(p,yw,βγ)
即:在可以轉移的兩個瞬時描述的剩餘輸入串後加入相同的剩餘輸入串、棧後加入相同的棧,仍然可以轉移;
-
對 ∀w∈Σ∗, 如果
(q,xw,α)⊢P∗(p,yw,β),
那麼
(q,x,α)⊢P∗(p,y,β)
即:在可以轉移的兩個瞬時描述的剩餘輸入串後刪除相同的輸入串,仍然可以轉移;
12.2 下推自動機接受的語言(終態/空棧)
PDA P=(Q,Σ,Γ,δ,q0,Z0,F), 以兩種方式接受語言:
- P 以終態方式接受的語言, 記爲L(P), 定義爲 L(P)=w∣(q0,w,Z0)⊢∗(p,ε,γ),p∈F.
- P 以空棧方式接受的語言, 記爲N(P), 定義爲 N(P)=w∣(q0,w,Z0)⊢∗(p,ε,ε).
定理及證明(構造)方法:
- 如果 PDA PF 以終態方式接受語言 L,那麼一定存在 PDA PN 以空棧方式接受 L: PF=(Q,Σ,Γ,δF,q0,Z0,F) 構造PN=(Q∪{p0,p},Σ,Γ∪{X0},δN,p0,X0,∅)
終止狀態時,空轉移到p、彈棧棧底符號
- 反之亦然: PN=(Q,Σ,Γ,δN,q0,Z0,∅) 構造 PF=(Q∪{p0,pf},Σ,Γ∪{X0},δF,p0,X0,{pf})
空棧時,空轉移到新建的終止狀態pf
例1:識別 Lwwr 的 PDA P , 從終態方式接受, 改爲空棧方式接受.
- 解:
用 δ(q1,ε,Z0)={(q1,ε)} 代替 δ(q1,ε,Z0)={(q2,Z0)} 即可
例2:接受 L={w∈{0,1}∗∣w中字符0和1的數量相同} 的 PDA
- 棧空時,壓棧;
- 棧不空時:
- 若輸入符與棧頂相同,壓棧;
- 若輸入符與棧頂不同,彈棧;
- 棧空爲接受狀態。
例3:接受 L={0n1m∣0≤n≤m≤2n} 的 PDA
- 定義:左、中、右、下4個狀態
- 左狀態:讀入0(自身遞歸轉移)
- 中狀態:讀入1
- 轉移到下狀態:(棧中有至少一個0,至少連續2個1)讀入一個1,不彈棧
- 下狀態轉移回來:再讀入一個1,彈棧
- 和下狀態的一個來回讀入2個1
- 自身轉移:當1的個數是奇數
- 右狀態:空棧,結束
13. CFG⟺PDA(等價性)
13.1 CFG⟹PDA
例:設計語言 L={0n1m∣1≤m≤n} 的 PDA,並轉換爲CFG
解:
- PDA:
-
CFG G:
S→AB
A→0A∣ε
B→0B1∣01
-
字符串 00011 的最左派生:
Slm⟹ABlm⟹0ABlm⟹0Blm⟹00B1lm⟹00011
用 PDA 棧頂符號的替換, 模擬文法的最左派生
- 棧頂爲變元:輸入ε,變元派生(如:ε,S→0S1)
- 棧頂爲終結符:輸入非空字符,輸入串減少,棧頂彈出
- 例解:
13.2 PDA⟹CFG
如果 PDA P=(Q,Σ,Γ,δ,q0,Z0,∅), 那麼構造 CFG G=(V,Σ,P′,S), 其中
V 和 P′ 爲
- V={[qXp]∣p,q∈Q,X∈Γ}∪{S};
- 對 ∀p∈Q, 構造產生式 S→[q0Z0p];
- 對 ∀(p,Y1Y2⋅⋅⋅Yn)∈δ(q,a,X), 構造 ∣Q∣n 個產生式
[qXrn]→a[pY1r1][r1Y2r2]⋅⋅⋅[rn−1Ynrn]
其中 a∈Σ∪{ε}, X,Yi∈Γ, 而 ri∈Q 是 n 次 ∣Q∣ 種狀態的組合; 若i=0, 爲 [qXp]→a.
例:將 PDA P = ({p, q}, (0, 1), {X, Z}, δ, q, Z) 轉爲 CFG, 其中 δ 如下:
解:
化簡:
14. GNF⟹PDA
如果 GNF 格式的 CFG G=(V,T,P′,S), 那麼構造 PDA
P=({q},T,V,δ,q,S,∅)
爲每個產生式, 定義 δ 爲:
δ(q,a,A)={(q,β)∣A→aβ∈P′}
即:每次讀入終結符,將棧中變元進行派生(彈棧+壓棧),直到棧中均爲終結符。
例:文法 S→aAA,A→aS∣bS∣a 爲 GNF 格式, 構造等價的 PDA
15. 確定性下推自動機(DPDA)
如果 PDA P=(Q,Σ,Γ,δ,q0,Z0,F) 滿足
- ∀a∈Σ∪{ε}, δ(q,a,X) 至多有一個動作;
- ∀a∈Σ, 如果 δ(q,a,X)=∅, 那麼 δ(q,ε,X)=∅.
∀(q,a,Z)∈Q×Σ×Γ 滿足 ∣δ(q,a,Z)∣+∣δ(q,ε,Z)∣≤1
即:每一個瞬時描述下至多有一個轉移狀態(可以無動作)
則稱 P 爲確定型下推自動機(DPDA)
例:任何 DPDA 都無法接受Lwwr, 但是可以接受
Lwcwr={wcwR∣w∈(0+1)∗}
設計DPDA
DCFL 的重要應用
- 非固有歧義語言的真子集
- 程序設計語言的語法分析器
- LR(k) 文法, Yacc 的基礎, 解析時間複雜度爲 O(n)
- 如果 L 是正則語言, 那麼存在 DPDA P 以終態方式接受 L, 即 L=L(P)
- 證明: 顯然,DPDA P 可以不用棧而模擬任何 DFA。
- 結論:正則語言⊆DCFL⊆CFL
- 前綴性質:如果語言 L 中不存在字符串 x 和 y, 使 x 是 y 的前綴, 稱語言 L 滿足前綴性質.
- DPDA P 且 L=N(P), 當且僅當 L 有前綴性質, 且存在 DPDA P′ 使L=L(P′).
- DPDA P 的 N(P) 更有限, 即使正則語言 0∗ 也無法接受
- 但卻可以被某個 DPDA 以終態方式接受
DPDA 與歧義文法
DPDA P, 語言 L=L(P), 那麼 L 有無歧義的 CFG
- 因此 DPDA 在語法分析中佔重要地位
- 但是並非所有非固有歧義 CFL 都會被 DPDA 識別
如 Lwwr有無歧義文法 S→0S0∣1S1∣ε
16 上下文無關語言的泵引理
如果語言 L 是 CFL, 那麼存在正整數 N, 對 ∀z∈L,
只要 ∣z∣≥N, 就可以將 z 分爲五部分 z=uvwxy 滿足:
- vx=ε (或∣vx∣>0);
- ∣vwx∣≤N;
- ∀i≥0,uviwxiy∈L.
例:證明 L={0n1n2n∣n≥1} 不是上下文無關語言
解:
- 假設 L 是 CFL, 那麼存在整數 N, 對 ∀z∈L(∣z∣≥N) 滿足泵引理.
- 從 L 中取 z=0N1N2N, 則顯然 z∈L 且 ∣z∣=3N≥N.
- 由泵引理, z 可被分爲 z=uvwxy, 且有 ∣vwx∣≤N 和 vx=ε.
- 那麼 vwx 可能
- 只包含 0, 1 或 2, 那麼 uwy∈/L;
- 只包含 0 和 1, 或只包含 1 和 2, 那麼也有 uwy∈/L;
- 與泵引理 uwy=uv0wx0y∈L 矛盾, 假設不成立.
- L 不是上下文無關的
例:證明 L={ww∣w∈0,1∗} 不是上下文無關的
(錯誤的) 證明: 假設 L 是 CFL. 取 z=0N10N1, 那麼 z=uvwxy 爲
則對任意 i≥0, 有 uviwxiy∈L, 滿足泵引理.
(正確的) 證明: 假設 L 是 CFL. 取 z=0N1N0N1N, 將 z 分爲 z=uvwxy 時
- 若 vwx 在 z 中點的一側, uv0wx0y 顯然不可能屬於 L;
- 若 vwx 包括 z 中點, 那麼 uv0wx0y 爲 0N1i0j1N, 也不可能屬於 L.
所以假設不成立, L 不是 CFL
17 上下文無關語言的封閉性
封閉
不封閉
17.1 代換
兩個字母表 Σ 到 Γ 的函數 s : Σ →2Γ∗ 稱爲代換. Σ 中的一個字符 a 在 s 的作用下爲
Γ 上的一個語言 La, 即
s(a) = La
擴展 s 的定義到字符串,
s(ε) = ε
s(xa) = s(x)s(a)
再擴展 h 到語言, 對 ∀L ⊆ Σ∗
s(L) = x∈L⋃s(x)
-
定理:如果有 Σ 上的 CFL L 和代換 s, 且每個 a∈Σ 的 s(a) 都是 CFL, 那麼 s(L) 也是 CFL
-
即:可以把CFL的每個終結符擴展爲一個CFL,生成的語言還是CFL
具體構造方法:
設 CFL L 的文法 G = (V, T, P, S), 每個 s(a) 的文法 KaTeX parse error: Undefined control sequence: \
at position 6: G_{a}\̲
̲= \ (V_{a},\ T_….
那麼 s(L) 的文法可以構造爲
G′ = (V ′, T ′, P ′, S)
-
V′=V∪(⋃a∈TVa )
-
T′=⋃a∈TTa
-
P′包括每個 Pa 和 P 中產生式,但是要將P的產生式中每個終結符a均替換爲文法 Ga 的開始符號Sa.
17.2 封閉性應用
例: 請證明語言 L 不是 CFL L={w∈{a,b,c}∗∣na(w)=nb(w)=nc(w)},其中 na(w) 表示 w 中 a 的個數.
證明:
- 因爲 a∗b∗c∗ 是正則語言,
- 而 L∩a∗b∗c∗={anbncn∣n≥0} 不是 CFL,
- 由 CFL 與正則語言的交還是 CFL, 所以 L 不可能是 CFL
18 上下文無關語言的判定性質
18.1 可判定的 CFL 問題
空性: 只需判斷文法的開始符號 S 是否爲非產生的
有窮性和無窮性:
- 用不帶無用符號的 CNF 的產生式畫有向圖;
- 變元爲頂點, 若有 A → BC, 則 A 到 B 和 C 各畫一條有向邊;
- 檢查圖中是否有循環.
成員性: 利用 CNF 範式, 有CYK算法檢查串 w 是否屬於 L
18.2 CYK算法
例:CNF G 如下, 用 CYK 算法判斷 bbabaa∈L(G)?
解:
S→AB∣BC
A→BA∣a
B→CC∣b
C→AB∣a
-
填寫最下層(單個終結符是否有可達)
-
計算上面若干行
-
結果
-
因爲 S∈X16={S,A}, 所以 bbabaa∈L(G)
18.3 不可判定的 CFL 問題
- 判斷 CFG G 是否歧義的?
- 判斷 CFL 是否固有歧義的?
- 兩個 CFL 的交是否爲空?
- 兩個 CFL 是否相同?
- 判斷 CFL 的補是否爲空? 儘管有算法判斷 CFL 是否爲空
- 判斷 CFL 是否等於 Σ∗?
19. 圖靈機
FA |
PDA |
TM |
|
|
|
(Q, Σ, δ, q0, F) |
(Q,Σ,Γ,δ,q0,z0,F) |
(Q,Σ,Γ,δ,q0,B,F) |
- 圖靈機(TM, Turing Machine) M 爲七元組
M=(Q,Σ,Γ,δ,q0,B,F)
- Q: 有窮狀態集;
- Σ: 有窮輸入符號集;
- Γ: 有窮帶符號集, 且總有 Σ⊂Γ;
- δ:Q×Γ→Q×Γ×{L,R} 轉移函數;
- q0∈Q: 初始狀態;
- B∈Γ−Σ: 空格符號;
- F⊆Q: 終態集或接受狀態集.
與有窮自動機區別:
- 可修改(必須修改,但可以相同)
- 可向左或向右移動輸入帶
- 有空格符號
例:設計識別 {0n1n∣n≥1} 的圖靈機
解:
- 每次標記一個0和一個1
- 標記0爲X(X=“0已標記”)之後,越過所有未標記的0和已標記的1,將1標記爲Y(Y=“1已標記”)
- 無未標記1後向右找到空格B,結束
M=({q0,q1,q2,q3,q4},{0,1},{0,1,X,Y,B},δ,q0,B,{q4})
19.1 瞬時描述(ID)
圖靈機雖有無窮長的帶, 但經過有限步, 帶上非空內容總是有限的. 因此用全部非空符號、當前狀態及帶頭位置, 定義圖靈機的瞬時描述(ID)爲
X1X2⋅⋅⋅Xi−1qXiXi+1⋅⋅⋅Xn
- 圖靈機的當前狀態 q
- 帶頭在左起第 i 個非空格符 Xi 上
- X1X2⋅⋅⋅Xn是最左到最右非空格內容
如果 δ(q,Xi)=(p,Y,L), 定義 ID 轉移爲
X1⋅⋅⋅Xi−1qXi⋅⋅⋅Xn⊢X1⋅⋅⋅Xi−2pXi−1YXi+1⋅⋅⋅Xn
續例:設計識別 {0n1n∣n≥1} 的圖靈機, 接受 0011 的 ID 序列
解:
q00011⊢Xq1011⊢X0q111⊢Xq20Y1⊢q2X0Y1⊢Xq00Y1⊢XXq1Y1⊢XXYq11⊢XXq2YY⊢Xq2XYY⊢XXq0YY⊢XXYq3Y⊢XXYYq3B⊢XXYYBq4B
19.2 遞歸可枚舉語言
如果 M 是一個圖靈機,則 M 接受的語言爲
L(M)={w∣w∈Σ∗,q0w⊢∗αpβ,p∈F,α,β∈Γ∗}
如果 L 是圖靈機 $M $的語言, 即 L=L(M), 則稱 L 是遞歸可枚舉語言.
一般假定, 當輸入串被接受時, 圖靈機總會停機
然而, 對於不接受的輸入, 圖靈機可能永遠不停止
對接受和不接受的輸入, 都保證停機的圖靈機, 所接受的語言稱爲遞歸語言
19.3 真減法
例:Compute the function nomus (m, n)=max(m-n,0)
解:
- put 1m01n into tape as input
- delete a 1 from 1m and a 1 from 1n
19.4 乘法
例:Construct a TM to compute m×n
3 × 2 = 2 + 2 + 2