形式语言与自动机总结笔记
形式语言与自动机
- MOOC:形式语言与自动机理论
- GitHub课件资源:gzn00417/2020Spring-Formal-Languages-and-Automata
教学大纲
- 正则语言
- 2 有穷自动机
2.1 确定的有穷自动机
2.2 非确定有穷自动机
2.3 带有空转移的非确定有穷自动机 - 3 正则表达式
3.1 正则表达式
3.2 自动机和正则表达式
3.3 正则表达式的代数定律 - 4 正则语言的性质
4.1 正则语言的泵引理
4.2 正则语言的封闭性
4.3 正则语言的判定性质
4.4 自动机最小化
- 2 有穷自动机
- 上下文无关语言
- 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 上下文无关语言的判定性质
- 5 上下文无关文法
- 计算导论
- 8.1 图灵机及其扩展
- 8.2 不可判定性
主要考点
- 构造自动机:DFA、NFA、ε-NFA、PDA、DPDA、TM
- 设计正则表达式/正则文法、上下文无关文法
- 泵引理+封闭性证明不是正则语言
- 等价性转换
- NFA和DFA
- FA和正则表达式
- PDA和CFG
- CNF和GNF
- 语言的接受和设计
文章目录
- 形式语言与自动机
- 教学大纲
- 主要考点
- 1. 确定的有穷自动机(DFA)
- 2. 非确定的有穷自动机(NFA)
- 3. 带有空转移的非确定有穷自动机(ε-NFA)
- 4. DFA和NFA的等价性与转换
- 5. DFA化简:状态等价性和填表算法
- 5.1 等价和可区分
- 5.2 填表算法 Table-Filling Algorithm
- 6. 正则表达式(Regular Express)
- 7. 正则表达式和有穷自动机的等价关系与转换
- 7.1 正则表达式-->自动机
- 7.1.1 并(加号)的转换
- 7.1.2 幂(星号)的转换
- 7.2 自动机-->正则表达式
- 7.2.1 删除状态法
- 7.2.2 归纳法
- 8. 正则语言的性质
- 8.1 泵引理
- 8.2 封闭性
- 9. 上下文无关文法(CFG)
- 9.1 规约
- 9.2 派生
- 9.3 解析树
- 9.4 歧义
- 10. 上下文无关文法的化简
- 10.1 消除无用符号
- 10.2 消除ε产生式
- 10.3 消除单元产生式
- 11. 上下文无关文法的范式
- 11.1 乔姆斯基范式(CNF)
- 11.2 格雷巴赫范式(GNF)
- 12. 下推自动机(PDA)
- 12.1 瞬时描述(ID)
- 12.1.1 转移
- 12.2 下推自动机接受的语言(终态/空栈)
- 13. CFG⟺\Longleftrightarrow⟺PDA(等价性)
- 13.1 CFG⟹\Longrightarrow⟹PDA
- 13.2 PDA⟹\Longrightarrow⟹CFG
- 14. GNF⟹\Longrightarrow⟹PDA
- 15. 确定性下推自动机(DPDA)
- 16 上下文无关语言的泵引理
- 17 上下文无关语言的封闭性
- 17.1 代换
- 17.2 封闭性应用
- 18 上下文无关语言的判定性质
- 18.1 可判定的 CFL 问题
- 18.2 CYK算法
- 18.3 不可判定的 CFL 问题
- 19. 图灵机
- 19.1 瞬时描述(ID)
- 19.2 递归可枚举语言
- 19.3 真减法
- 19.4 乘法
1. 确定的有穷自动机(DFA)
确定的有穷自动机(DFA, Deterministic Finite Automaton) A 为五元组
A=(Q,Σ,δ,q0,F)A = (Q, Σ, δ, q0, F)A=(Q,Σ,δ,q0,F)
- QQQ : 有穷状态集;
- ΣΣΣ : 有穷输入符号集或字母表;
- δδδ : Q×Σ→QQ × Σ → QQ×Σ→Q, 状态转移函数;
- q0q^0q0 ∈ Q : 初始状态;
- F⊆QF ⊆ QF⊆Q : 终结状态集或接受状态集.
例:请设计 DFA, 在任何由 0 和 1 构成的串中, 接受含有 01 子串的全部串.
- 未发现 01, 即使 0 都还没出现过;
- 未发现 01, 但刚刚读入字符是 0;
- 已经发现了 01
因此 DFA A 的可定义为:
A=({q1,q2,q3},{0,1},δ,q1,{q3})A\ = \ (\{ q1,\ q2,\ q3\},\ \{ 0,\ 1\},\ \delta,\ q1,\ \{ q3\}) A = ({q1, q2, q3}, {0, 1}, δ, q1, {q3})
其中 δ 为:
δ(q1,1)=q1δ(q1, 1) = q1δ(q1,1)=q1
δ(q2,1)=q3δ(q2, 1) = q3δ(q2,1)=q3
δ(q3,1)=q3δ(q3, 1) = q3δ(q3,1)=q3
δ(q1,0)=q2δ(q1, 0) = q2δ(q1,0)=q2
δ(q2,0)=q2δ(q2, 0) = q2δ(q2,0)=q2
δ(q3,0)=q3δ(q3, 0) = q3δ(q3,0)=q3状态转移图
- 每个状态 q 对应一个节点, 用圆圈表示;
- 状态转移 δ(q, a) = p 为一条从 q 到 p 且标记为字符 a 的有向边;
- 开始状态 q0 用一个标有 start 的箭头表示;
- 接受状态的节点, 用双圆圈表示.
状态转移表
2. 非确定的有穷自动机(NFA)
非确定有穷自动机(NFA, Nondeterministic Finite Automaton) A 为五元组
A=(Q,Σ,δ,q0,F)A = (Q, Σ, δ, q0, F)A=(Q,Σ,δ,q0,F)
- QQQ : 有穷状态集;
- ΣΣΣ : 有穷输入符号集或字母表;
- δδδ : Q×Σ=2QQ \times \Sigma = 2^{Q}Q×Σ=2Q, 状态转移函数;
- q0q^0q0 ∈ Q : 初始状态;
- F⊆QF ⊆ QF⊆Q : 终结状态集或接受状态集.
与DFA区别
- δδδ : Q×Σ=2QQ \times \Sigma = 2^{Q}Q×Σ=2Q
- 转移后为一个状态集合
- 同一个状态在相同的输入下,可以有多个转移状态
- 自动机可以处在多个当前状态
例:接受全部以 01 结尾的串的 NFA.
解:五元组为 A=({q0,q1,q2},{0,1},δ,q0,{q2})A\ = \ (\{ q0,\ q1,\ q2\},\ \{ 0,\ 1\},\ \delta,\ q0,\ \{ q2\})A = ({q0, q1, q2}, {0, 1}, δ, q0, {q2})
转移函数 δ:
- δ(q0,0)={q0,q1}\delta(q0,\ 0)\ = \ \{ q0,\ q1\}δ(q0, 0) = {q0, q1}
- δ(q1,0)=∅\delta(q1,\ 0)\ = \ \varnothingδ(q1, 0) = ∅
- δ(q2,0)=∅\delta(q2,\ 0)\ = \ \varnothingδ(q2, 0) = ∅
- δ(q0,1)={q0}\delta(q0,\ 1)\ = \ \{ q0\}δ(q0, 1) = {q0}
- δ(q1,1)={q2}\delta(q1,\ 1)\ = \ \{ q2\}δ(q1, 1) = {q2}
- δ(q2,1)=∅\delta(q2,\ 1)\ = \ \varnothingδ(q2, 1) = ∅
3. 带有空转移的非确定有穷自动机(ε-NFA)
DFA、NFA和ε-NFA性质:
- 自动机在某状态, 读入某个字符时, 可能有多个转移
- 自动机在某状态, 读入某个字符时, 可能没有转移
- 自动机在某状态, 可能不读入字符, 就进行转移
ε-NFA与NFA
- 不读入字符,就进行转移的NFA
- Q×(Σ∪{ε})=2QQ \times (\Sigma \cup \left\{ \varepsilon \right\}) = 2^{Q}Q×(Σ∪{ε})=2Q
例:语言 L=w∈0,1∗∣w倒数3个字符至少有一个是1L = {w ∈ {0, 1}∗ | w 倒数 3 个字符至少有一个是 1}L=w∈0,1∗∣w倒数3个字符至少有一个是1 的ε-NFA.
- 状态转移图
- 状态转移表
此后, 不再明确区分 ε-NFA 和 NFA, 而认为它们都是 NFA.
4. DFA和NFA的等价性与转换
ε−闭包:q0→所有q0能到达的状态的集合ε-闭包: {q_0} → {所有q_0能到达的状态的集合}ε−闭包:q0→所有q0能到达的状态的集合
记为Eclose(q)Eclose(q)Eclose(q)
例:求以下状态的 ε−closureε - closureε−closure
解:
- E(1)={1,2,4,3,6}E(1) = \{ 1, 2, 4, 3, 6 \}E(1)={1,2,4,3,6}
- E(2)={2,3,6}E(2) = \{ 2, 3, 6 \}E(2)={2,3,6}
- E(3)={3,6}E(3) = \{ 3, 6 \}E(3)={3,6}
- E(4)={4}E(4) = \{ 4 \}E(4)={4}
- E(5)={5,7}E(5) = \{ 5, 7 \}E(5)={5,7}
- E(6)={6}E(6) = \{ 6 \}E(6)={6}
- E(7)={7}E(7) = \{ 7 \}E(7)={7}
扩展转移函数
例:将以下NFA转换为DFA
解:
- 状态转移表和ε-闭包为
- 设置初状态{q0}\{q_0 \}{q0}
- 当输入0时,{q0}→{q0}\{q_0\} → \{q_0\}{q0}→{q0},不变,则{q0}\{q_0\}{q0}的ε-闭包还是为{q0}\{q_0\}{q0}
- 当输入1时,{q0}→{q0,q1}\{q_0\} → \{q_0, q_1\}{q0}→{q0,q1},则{q0,q1}\{q_0, q_1\}{q0,q1}的ε-闭包为{q0,q1,q2,q3}\{q_0, q_1,q_2, q_3\}{q0,q1,q2,q3}
- 因此状态转移函数如下
000 | 111 | |
---|---|---|
{q0}\{q_0\}{q0} | {q0}\{q_0\}{q0} | {q0,q1,q2,q3}\{q_0, q_1,q_2, q_3\}{q0,q1,q2,q3} |
- 出现新状态{q0,q1,q2,q3}\{q_0, q_1, q_2, q_3\}{q0,q1,q2,q3}
- 当输入0时,{q0,q1,q2,q3}→{q0,q2,q3}\{q_0, q_1,q_2, q_3\} → \{q_0, q_2, q_3\}{q0,q1,q2,q3}→{q0,q2,q3},则{q0,q2,q3}\{q_0, q_2, q_3\}{q0,q2,q3}的ε-闭包为{q0,q2,q3}\{q_0, q_2, q_3\}{q0,q2,q3}
- 当输入1时,{q0,q1,q2,q3}→{q0,q1,q2,q3}\{q_0, q_1,q_2, q_3\} → \{q_0, q_1,q_2, q_3\}{q0,q1,q2,q3}→{q0,q1,q2,q3},则{q0,q1,q2,q3}\{q_0, q_1,q_2, q_3\}{q0,q1,q2,q3}的ε-闭包为{q0,q1,q2,q3}\{q_0, q_1,q_2, q_3\}{q0,q1,q2,q3}
- 因此状态转移函数如下
000 | 111 | |
---|---|---|
{q0}\{q_0\}{q0} | {q0}\{q_0\}{q0} | {q0,q1,q2,q3}\{q_0, q_1, q_2, q_3\}{q0,q1,q2,q3} |
{q0,q1,q2,q3}\{q_0, q_1,q_2, q_3\}{q0,q1,q2,q3} | {q0,q2,q3}\{q_0, q_2, q_3\}{q0,q2,q3} | {q0,q1,q2,q3}\{q_0, q_1, q_2, q_3\}{q0,q1,q2,q3} |
- 出现新状态{q0,q2,q3}\{q_0, q_2, q_3\}{q0,q2,q3}
- 当输入0时,{q0,q2,q3}→{q0,q3}\{q_0, q_2, q_3\} → \{q_0, q_3\}{q0,q2,q3}→{q0,q3},则{q0,q3}\{q_0, q_3\}{q0,q3}的ε-闭包为{q0,q3}\{q_0, q_3\}{q0,q3}(红色为原转移,绿色为转移后的闭包)
- 当输入1时,{q0,q2,q3}→{q0,q1,q2,q3}\{q_0, q_2, q_3\} → \{q_0, q_1, q_2, q_3\}{q0,q2,q3}→{q0,q1,q2,q3},则{q0,q1,q2,q3}\{q_0, q_1, q_2, q_3\}{q0,q1,q2,q3}的ε-闭包为{q0,q1,q2,q3}\{q_0, q_1, q_2, q_3\}{q0,q1,q2,q3}
- 因此状态转移函数如下
000 | 111 | |
---|---|---|
{q0}\{q_0\}{q0} | {q0}\{q_0\}{q0} | {q0,q1,q2,q3}\{q_0, q_1, q_2, q_3\}{q0,q1,q2,q3} |
{q0,q1,q2,q3}\{q_0, q_1,q_2, q_3\}{q0,q1,q2,q3} | {q0,q2,q3}\{q_0, q_2, q_3\}{q0,q2,q3} | {q0,q1,q2,q3}\{q_0, q_1, q_2, q_3\}{q0,q1,q2,q3} |
{q0,q2,q3}\{q_0, q_2, q_3\}{q0,q2,q3} | {q0,q3}\{q_0, q_3\}{q0,q3} | {q0,q1,q2,q3}\{q_0, q_1, q_2, q_3\}{q0,q1,q2,q3} |
- 出现新状态{q0,q3}\{q_0, q_3\}{q0,q3}
- 同理,因此状态转移函数如下
000 | 111 | |
---|---|---|
{q0}\{q_0\}{q0} | {q0}\{q_0\}{q0} | {q0,q1,q2,q3}\{q_0, q_1, q_2, q_3\}{q0,q1,q2,q3} |
{q0,q1,q2,q3}\{q_0, q_1,q_2, q_3\}{q0,q1,q2,q3} | {q0,q2,q3}\{q_0, q_2, q_3\}{q0,q2,q3} | {q0,q1,q2,q3}\{q_0, q_1, q_2, q_3\}{q0,q1,q2,q3} |
{q0,q2,q3}\{q_0, q_2, q_3\}{q0,q2,q3} | {q0,q3}\{q_0, q_3\}{q0,q3} | {q0,q1,q2,q3}\{q_0, q_1, q_2, q_3\}{q0,q1,q2,q3} |
{q0,q3}\{q_0, q_3\}{q0,q3} | {q0}\{q_0\}{q0} | {q0,q1,q2,q3}\{q_0, q_1, q_2, q_3\}{q0,q1,q2,q3} |
- 最后,将q0q_0q0设为初始状态,且将含有原转移终止符(q3q_3q3)的状态设置为终止状态,即{q0,q1,q2,q3}\{q_0, q_1,q_2, q_3\}{q0,q1,q2,q3}、{q0,q2,q3}\{q_0, q_2, q_3\}{q0,q2,q3}、{q0,q3}\{q_0, q_3\}{q0,q3}均为终止状态
000 | 111 | |
---|---|---|
→{q0}→\{q_0\}→{q0} | {q0}\{q_0\}{q0} | {q0,q1,q2,q3}\{q_0, q_1, q_2, q_3\}{q0,q1,q2,q3} |
∗{q0,q1,q2,q3}* \{q_0, q_1,q_2, q_3\}∗{q0,q1,q2,q3} | {q0,q2,q3}\{q_0, q_2, q_3\}{q0,q2,q3} | {q0,q1,q2,q3}\{q_0, q_1, q_2, q_3\}{q0,q1,q2,q3} |
∗{q0,q2,q3}* \{q_0, q_2, q_3\}∗{q0,q2,q3} | {q0,q3}\{q_0, q_3\}{q0,q3} | {q0,q1,q2,q3}\{q_0, q_1, q_2, q_3\}{q0,q1,q2,q3} |
∗{q0,q3}* \{q_0, q_3\}∗{q0,q3} | {q0}\{q_0\}{q0} | {q0,q1,q2,q3}\{q_0, q_1, q_2, q_3\}{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∈Ea∈Ea∈E,a是一个正则表达式,表示语言{a};
- 如果正则表达式 r 和 s 分别表示语言RRR和SSS,那么r+s,rs,r∗和(r)r+s,rs, r^*和 ( r )r+s,rs,r∗和(r)都是正则表达式
- 分别表示语言R∪S,R⋅S,R∗和RR∪S,R·S,R*和RR∪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)(0+1)^*1(0+1)(0+1)∗1(0+1)转换为ε−NFAε-NFAε−NFA
7.1.1 并(加号)的转换
例:0+10+10+1
7.1.2 幂(星号)的转换
例:(0+1)∗(0+1)^*(0+1)∗
- 蓝色圈内为一个整体,表示幂运算的底
- 上方的红箭头是递归,即循环出现
- 下方的红箭头是蓝色圈内内容一个都不出现的情况,对应该题εεε,即空串情况
7.2 自动机–>正则表达式
若干例题
- 通过7.1的逆向推导得出
2.
3.
7.2.1 删除状态法
- 添加首尾两个状态;
- 从最小的单元开始化简为正则表达式,去掉这个单元,新增一条边,写上转换的表达式;
- 最后一条表达式即为结果;
7.2.2 归纳法
- Pick every label on the path from q0q_0q0 to q2q_2q2 ---- one by one
- Form every RegExpRegExpRegExp on the path from q0q_0q0 to q2q_2q2 ---- one by one
Rij(k):0<=k<=nR_{ij}^{(k)}: 0<=k<=nRij(k):0<=k<=n:iii到jjj路径上的正则表达式
- no inner node is greater than k
当k≥1时进行归纳法
公式:
例:
解:
8. 正则语言的性质
8.1 泵引理
- 确定一个语言是正则语言?
- 是
- DFA
- NFA
- ε-NFA
- 正则表达式
- 否
- 泵引理,反证法
- 是
即:前NNN的字符中存在一段可以在该位置循环出现
泵引理只是正则语言的必要条件,只能用来证明某个语言不是正则的
证明:
例:
8.2 封闭性
正则语言经某些运算后得到的新语言仍保持正则,称正则语言在这些运算下封闭
正则语言 L 和 M, 在这些运算下封闭
- 并:L∪ML \cup ML∪M
- 连接:LMLMLM
- 闭包:L∗L^*L∗
- 补:L‾\overline{L}L
- 差:L−ML-ML−M
- 交:L∩ML \cap ML∩M
- 反转:LR={wR∣wϵL}L^{R} = \left\{ w^{R}|w\epsilon L \right\}LR={wR∣wϵL}
- 同态
- 逆同态
考点:能够运用这些性质,结合泵引理证明一个语言是否是正则语言
自动机的转换
- 并:使用ε−NFAε-NFAε−NFA,新建初始状态节点,空转移到原来的初始状态;
- 连接:前者终止状态空转移到后者初始状态;
- 闭包:增加新终止状态,原终止状态空转移到新终止状态以及初始状态;
- 补:终止状态取补
- 差
- 交
- 反转:新增终止状态,原终止状态空转移到新终止状态,然后所有边逆向,是(非)终止状态改为非(是)终止状态;
证明思路
- 略
9. 上下文无关文法(CFG)
定义:上下文无关文法(CFG, 简称文法) G 是一个四元组 G=(V,T,P,S)G = (V, T, P, S)G=(V,T,P,S)
- VVV : 变元的有穷集, 变元也称为非终结符或语法范畴;
- TTT: 终结符的有穷集, 且 V ∩ T = ∅;
- PPP: 产生式的有穷集, 每个产生式包括:
- 一个变元, 称为“产生式的头或左部”;
- 一个产生式符号 →, 读作“定义为”;
- 一个(V∪T)∗(V ∪ T)^*(V∪T)∗中的符号串, 称为“体或右部”;
- S∈VS ∈VS∈V:初始符号, 文法开始的地方.
产生
- 产生式A→αA → αA→α,读作 A 定义为 α
- 如果有多个 A 的产生式 A→α1,A→α2,⋅⋅⋅,A→αnA → α_1, A → α_2, · · · , A → α_nA→α1,A→α2,⋅⋅⋅,A→αn
- 可简写为 A→α1∣α2∣⋅⋅⋅∣αnA → α_1 | α_2 | · · · | α_nA→α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)G = ({A}, {0, 1}, {A → ε | 0 | 1 | 0A0 | 1A1}, A)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)R = ({S }, {0,1}, P, S )R=(S,0,1,P,S)
P:S→ε∣0S1∣1S0∣SSP:S → ε | 0S1 | 1S0 | SSP:S→ε∣0S1∣1S0∣SS
- 从字符串到文法变元的分析过程, 称为递归推理或归约;
归约: 自底向上, 由产生式的体向头的分析 - 从文法变元到字符串的分析过程, 称为推导或派生.
派生: 自顶向下, 由产生式的头向体分析
9.1 规约
例:用算数表达式文法 GexpG_{exp}Gexp, 将 a∗(a+b00)a ∗ (a + b00)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)a ∗ (a + b00)a∗(a+b00)规约到EEE
解:
- a∗(a+b00)a ∗ (a + b00)a∗(a+b00)
- I∗(I+b00)I ∗ (I + b00)I∗(I+b00)
- I∗(I+I00)I ∗ (I + I00)I∗(I+I00)
- I∗(I+I0)I ∗ (I + I0)I∗(I+I0)
- I∗(I+I)I ∗ (I + I)I∗(I+I)
- E∗(E+E)E ∗ (E + E)E∗(E+E)
- E∗EE ∗ EE∗E
- EEE
即:
9.2 派生
- 最左派生
- 最右派生
为限制派生的随意性, 要求只替换符号串中最左边变元的派生过程, 称为最
左派生, 记为
⟹lm或⟹lm∗\underset{lm}{\Longrightarrow} 或 \overset{*}{\underset{\text{lm}}{\Longrightarrow}}lm⟹或lm⟹∗
只替换最右的, 称为最右派生, 记为
⟹rm或⟹rm∗\underset{rm}{\Longrightarrow} 或 \overset{*}{\underset{\text{rm}}{\Longrightarrow}}rm⟹或rm⟹∗
任何派生都有等价的最左派生和最右派生
- A⟹∗wA\overset{*}{\Longrightarrow}wA⟹∗w 当且仅当 A⟹lm∗wA\overset{*}{\underset{\text{lm}}{\Longrightarrow}}wAlm⟹∗w 当且仅当 A⟹rm∗wA\overset{*}{\underset{\text{rm}}{\Longrightarrow}}wArm⟹∗w
- 即:最左和最右派生同时存在或不存在
当www在L(G)L(G)L(G)中时满足:
- www仅由终结符组成
- 初始符号SSS能派生出www
即:
L(G)={w∣wϵT∗,S⟹G∗w}L\left( G \right) = \left\{ w\ |\ w\epsilon T^{*},\ S\overset{*}{\underset{G}{\Longrightarrow}}w \right\} L(G)={w ∣ wϵT∗, SG⟹∗w}
语言 L 是某个 CFG G 定义的语言, 即 L=L(G)L = L(G)L=L(G), 则称 L 为上下文无关语言(CFL, Context-Free Language).
- 上下文无关是指在文法派生的每一步αAβ⇒αγβαAβ ⇒ αγβαAβ⇒αγβ,符号串 γ 仅根据 A 的产生式派生, 而无需依赖 A 的上下文 α 和 β.
- 如果有两个文法 CFG G1 和 CFG G2,满足L(G1) = L(G2),则称 G1 和 G2 是等价的.
- 句型
- 若 CFGG=(V,T,P,S)CFG G = (V, T, P, S)CFGG=(V,T,P,S), 初始符号 S 派生出来的符号串, 称为 G 的句型, 即
- α∈(V∪T)∗\alpha \in \left( V \cup T \right)^{*}α∈(V∪T)∗且S⟹∗aS\overset{*}{\Longrightarrow}aS⟹∗a
- 如果S⟹lm∗αS\overset{*}{\underset{\text{lm}}{\Longrightarrow}}\alphaSlm⟹∗α,称α\alphaα为左句型
- 如果S⟹rm∗αS\overset{*}{\underset{\text{rm}}{\Longrightarrow}}\alphaSrm⟹∗α,称α\alphaα为右句型
- 只含有终结符的句型, 也称为 G 的句子
- 而 L(G) 就是文法 G 全部的句子
9.3 解析树
CFG G = (V, T, P, S) 的语法分析树(语法树或派生树) 为:
- 每个内节点标记为 V 中的变元符号;
- 每个叶节点标记为 V ∪ T ∪ {ε} 中的符号;
- 如果某内节点标记是 A, 其子节点从左至右分别为X1, X2, · · · , Xn
- 那么A→X1X2⋅⋅⋅Xn∈PA → X1X2 · · · Xn ∈ PA→X1X2⋅⋅⋅Xn∈P
- 若有 Xi = ε, 则 ε 是 A 唯一子节点, 且 A → ε ∈ P
- 语法树的全部叶节点从左到右连接起来, 称为该树的产物或结果. 如果树根节点是初始符号 S, 叶节点是终结符或 ε, 那么该树的产物属于 L(G).
- 语法树中标记为 A 的内节点及其全部子孙节点构成的子树, 称为 A 子树.
例:
CFG G = (V, T, P, S) 且 A ∈ V , 那么文法 G 中
- A⟹∗αA\overset{*}{\Longrightarrow}\alphaA⟹∗α 当且仅当 G 中存在以 A 为根节点产物为 α 的语法树
- 每棵语法分析树都有唯一的最左 (右) 派生
- 给定 CFG G = (V, T, P, S), A ∈ V , 以下命题等价:
- 通过递归推理, 确定串 w 在变元 A 的语言中
- 存在以 A 为根节点, 产物为 w 的语法分析树
- A⟹∗wA\overset{*}{\Longrightarrow}wA⟹∗w
- A⟹lm∗wA\overset{*}{\underset{\text{lm}}{\Longrightarrow}}wAlm⟹∗w
- A⟹rm∗wA\overset{*}{\underset{\text{rm}}{\Longrightarrow}}wArm⟹∗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⋅⋅⋅XnA → X_1X_2 · · · X_nA→X1X2⋅⋅⋅Xn用一组产生式A→Y1Y2⋅⋅⋅YnA → Y_1Y_2 · · · Y_nA→Y1Y2⋅⋅⋅Yn代替,其中
- 若 Xi 不是可空的, Yi 为 Xi
- 若 Xi 是可空的, Yi 为 Xi 或 ε
- 但 Yi 不能全为 ε (否则A为可空变元)
- 将含有可空变元的一条产生式A→X1X2⋅⋅⋅XnA → X_1X_2 · · · X_nA→X1X2⋅⋅⋅Xn用一组产生式A→Y1Y2⋅⋅⋅YnA → Y_1Y_2 · · · Y_nA→Y1Y2⋅⋅⋅Yn代替,其中
例:
- 消除 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⟹∗BA\overset{*}{\Longrightarrow}BA⟹∗B, 则称 [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→BCA → BCA→BC 或 A→aA → aA→a
- 这里的 A, B 和 C 是变元, a 是终结符.
- 利用 CNF 派生长度为 n 的串, 刚好需要 2n − 1 步
方法:
例:
- CFG G=(S,A,B,a,b,P,S)G = ({S, A, B}, {a, b}, P, S)G=(S,A,B,a,b,P,S), 产生式集合 P 为:
S→bA∣aBS → bA | aBS→bA∣aB
A→bAA∣aS∣aA → bAA | aS | aA→bAA∣aS∣a
B→aBB∣bS∣bB → aBB | bS | bB→aBB∣bS∣b- 请设计等价的 CNF 文法.
解:
- CNF 为:
S→CbA∣CaBS → CbA | CaBS→CbA∣CaB
A→CaS∣CbD1∣aA → C_aS | C_bD_1 | aA→CaS∣CbD1∣a
D1→AAD1 → AAD1→AA
Ca→aC_a → aCa→a
B→CbS∣CaD2∣bB → C_bS | C_aD_2 | bB→CbS∣CaD2∣b
D2→BBD2 → BBD2→BB
Cb→bC_b → bCb→b
11.2 格雷巴赫范式(GNF)
- 每个不带 ε 的 CFL 都可以由这样的 CFG G 定义, G 中每个产生式的形式都为A→aαA → aα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)P = (Q, Σ, Γ, δ, q_0, Z_0, F)P=(Q,Σ,Γ,δ,q0,Z0,F)
- QQQ, 有穷状态集;
- ΣΣΣ, 有穷输入符号集;
- ΓΓΓ, 有穷栈符号集;
- δ:Q×(Σ∪ε)×Γ→2Q×Γ∗δ : Q × (Σ ∪ {ε}) × Γ → 2^{Q×Γ^∗}δ:Q×(Σ∪ε)×Γ→2Q×Γ∗, 状态转移函数;
- q0∈Qq0 ∈ Qq0∈Q, 初始状态;
- Z0∈Γ−ΣZ_0 ∈ Γ − ΣZ0∈Γ−Σ, 栈底符号;
- F⊆QF ⊆ QF⊆Q, 接收状态集或终态集.
例:设计识别 L01={0n1n∣n≥1}L_{01} = \{0^n1^n | n ≥ 1\}L01={0n1n∣n≥1} 的 PDA
例:设计识别 Lwwr={wwR∣w∈(0+1)∗}L_{ww^r} = \{ww^R | w ∈ (0 + 1)^∗\}Lwwr={wwR∣w∈(0+1)∗} 的 PDA
12.1 瞬时描述(ID)
为描述 PDA 瞬间的格局, 定义 Q×Σ∗×Γ∗Q × Σ^∗ × Γ^∗Q×Σ∗×Γ∗ 中三元组
(q,w,γ)(q, w, γ)(q,w,γ)
为瞬时描述(ID, Instantaneous Description), 表示此时 PDA 处于状态 qqq, 剩
余输入串 www, 栈为 γγγ.
12.1.1 转移
在 PDA PPP 中如果 (p,β)∈δ(q,a,Z)(p, β) ∈ δ(q, a, Z)(p,β)∈δ(q,a,Z), 由 (q,aw,Zα)(q, aw, Zα)(q,aw,Zα) 到 (p,w,βα)(p, w, βα)(p,w,βα) 的变化, 称为瞬时描述(ID)的转移 ⊢P⊢_P⊢P, 记为
(q,aw,Zα)⊢P(p,w,βα)(q, aw, Zα) ⊢_P (p, w, βα)(q,aw,Zα)⊢P(p,w,βα)
其中 w∈Σ∗,α∈Γ∗w ∈ Σ^∗, α ∈ Γ^∗w∈Σ∗,α∈Γ∗.
若有瞬时描述(ID) III, JJJ 和 KKK, 递归定义 ⊢P∗⊢^*_P⊢P∗ 为:
- I⊢P∗II ⊢^*_P II⊢P∗I
- 若 I⊢P∗JI ⊢^*_P JI⊢P∗J, J⊢P∗KJ ⊢^*_P KJ⊢P∗K,则 I⊢P∗KI ⊢^*_P KI⊢P∗K
若 PPP 已知, 可省略, 记为 ⊢⊢⊢ 和 ⊢∗⊢^*⊢∗ .
例:语言 L01={0n1n∣n≥1}L_{01} = \{0^n1^n | n ≥ 1\}L01={0n1n∣n≥1} 的 PDA, 识别 0011 时的 ID 序列.
解:
(q0,0011,Z0)⊢(q0,011,0Z0)⊢(q0,11,00Z0)⊢(q1,1,0Z0)⊢(q1,ε,Z0)⊢(q2,ε,Z0)(q_0, 0011, Z_0) ⊢ (q_0, 011, 0Z_0) ⊢ (q_0, 11, 00Z_0) ⊢ (q_1, 1, 0Z_0) ⊢ (q_1, ε, Z_0) ⊢ (q_2, ε, Z_0)(q0,0011,Z0)⊢(q0,011,0Z0)⊢(q0,11,00Z0)⊢(q1,1,0Z0)⊢(q1,ε,Z0)⊢(q2,ε,Z0)
定理:
对 ∀w∈Σ∗,∀γ∈Γ∗∀w ∈ Σ^∗, ∀γ ∈ Γ^∗∀w∈Σ∗,∀γ∈Γ∗, 如果
(q,x,α)⊢P∗(p,y,β),(q, x, α) ⊢^*_P (p, y, β),(q,x,α)⊢P∗(p,y,β),
那么
(q,xw,αγ)⊢P∗(p,yw,βγ)(q, xw, αγ) ⊢^*_P (p, yw, βγ)(q,xw,αγ)⊢P∗(p,yw,βγ)
即:在可以转移的两个瞬时描述的剩余输入串后加入相同的剩余输入串、栈后加入相同的栈,仍然可以转移;对 ∀w∈Σ∗∀w ∈ Σ^∗∀w∈Σ∗, 如果
(q,xw,α)⊢P∗(p,yw,β),(q, xw, α) ⊢^*_P (p, yw, β),(q,xw,α)⊢P∗(p,yw,β),
那么
(q,x,α)⊢P∗(p,y,β)(q, x, α) ⊢^*_P (p, y, β)(q,x,α)⊢P∗(p,y,β)
即:在可以转移的两个瞬时描述的剩余输入串后删除相同的输入串,仍然可以转移;
12.2 下推自动机接受的语言(终态/空栈)
PDA P=(Q,Σ,Γ,δ,q0,Z0,F)P = (Q, Σ, Γ, δ, q_0, Z_0, F)P=(Q,Σ,Γ,δ,q0,Z0,F), 以两种方式接受语言:
- P 以终态方式接受的语言, 记为L(P)L(P)L(P), 定义为 L(P)=w∣(q0,w,Z0)⊢∗(p,ε,γ),p∈F.L(P) = {w | (q_0, w, Z_0) ⊢^*(p, ε, γ), p ∈ F}.L(P)=w∣(q0,w,Z0)⊢∗(p,ε,γ),p∈F.
- P 以空栈方式接受的语言, 记为N(P)N(P)N(P), 定义为 N(P)=w∣(q0,w,Z0)⊢∗(p,ε,ε).N(P) = {w | (q_0, w, Z_0) ⊢^*(p, ε, ε)}.N(P)=w∣(q0,w,Z0)⊢∗(p,ε,ε).
定理及证明(构造)方法:
- 如果 PDA PFP_FPF 以终态方式接受语言 L,那么一定存在 PDA PNP_NPN 以空栈方式接受 L: PF=(Q,Σ,Γ,δF,q0,Z0,F)P_F = (Q, Σ, Γ, δ_F, q_0, Z_0, F)PF=(Q,Σ,Γ,δF,q0,Z0,F) 构造PN=(Q∪{p0,p},Σ,Γ∪{X0},δN,p0,X0,∅)P_N = (Q ∪ \{p_0, p\}, Σ, Γ ∪ \{X0\}, δ_N, p_0, X_0, ∅)PN=(Q∪{p0,p},Σ,Γ∪{X0},δN,p0,X0,∅)
终止状态时,空转移到ppp、弹栈栈底符号 - 反之亦然: PN=(Q,Σ,Γ,δN,q0,Z0,∅)P_N = (Q, Σ, Γ, δ_N, q_0, Z_0, ∅)PN=(Q,Σ,Γ,δN,q0,Z0,∅) 构造 PF=(Q∪{p0,pf},Σ,Γ∪{X0},δF,p0,X0,{pf})P_F = (Q ∪ \{p_0, p_f\}, Σ, Γ ∪ \{X_0\}, δ_F, p_0, X_0, \{p_f\})PF=(Q∪{p0,pf},Σ,Γ∪{X0},δF,p0,X0,{pf})
空栈时,空转移到新建的终止状态pfp_fpf
例1:识别 LwwrL_{ww^r}Lwwr 的 PDA PPP , 从终态方式接受, 改为空栈方式接受.
- 解:
用 δ(q1,ε,Z0)={(q1,ε)}δ(q_1, ε, Z_0) = \{(q_1, ε)\}δ(q1,ε,Z0)={(q1,ε)} 代替 δ(q1,ε,Z0)={(q2,Z0)}δ(q_1, ε, Z_0) = \{(q_2, Z_0)\}δ(q1,ε,Z0)={(q2,Z0)} 即可
例2:接受 L={w∈{0,1}∗∣w中字符0和1的数量相同}L = \{w ∈ \{0, 1\}^∗ | w 中字符 0 和 1 的数量相同\}L={w∈{0,1}∗∣w中字符0和1的数量相同} 的 PDA
- 栈空时,压栈;
- 栈不空时:
- 若输入符与栈顶相同,压栈;
- 若输入符与栈顶不同,弹栈;
- 栈空为接受状态。
例3:接受 L={0n1m∣0≤n≤m≤2n}L = \{0^n1^m | 0 ≤ n ≤ m ≤ 2n\}L={0n1m∣0≤n≤m≤2n} 的 PDA
- 定义:左、中、右、下4个状态
- 左状态:读入0(自身递归转移)
- 转移到中状态:空转移(栈中有0或无0都可)
- 中状态:读入1
- 转移到下状态:(栈中有至少一个0,至少连续2个1)读入一个1,不弹栈
- 下状态转移回来:再读入一个1,弹栈
- 和下状态的一个来回读入2个1
- 自身转移:当1的个数是奇数
- 右状态:空栈,结束
13. CFG⟺\Longleftrightarrow⟺PDA(等价性)
13.1 CFG⟹\Longrightarrow⟹PDA
例:设计语言 L={0n1m∣1≤m≤n}L = \{0^n1^m | 1 ≤ m ≤ n\}L={0n1m∣1≤m≤n} 的 PDA,并转换为CFG
解:
- PDA:
CFG G:
S→ABS → ABS→AB
A→0A∣εA → 0A | εA→0A∣ε
B→0B1∣01B → 0B1 | 01B→0B1∣01字符串 00011 的最左派生:
S⟹lmAB⟹lm0AB⟹lm0B⟹lm00B1⟹lm00011S \underset{lm}{\Longrightarrow} AB \underset{lm}{\Longrightarrow} 0AB \underset{lm}{\Longrightarrow} 0B \underset{lm}{\Longrightarrow} 00B1 \underset{lm}{\Longrightarrow} 00011Slm⟹ABlm⟹0ABlm⟹0Blm⟹00B1lm⟹00011
用 PDA 栈顶符号的替换, 模拟文法的最左派生
- 栈顶为变元:输入εεε,变元派生(如:ε,S→0S1ε, S → 0S1ε,S→0S1)
- 栈顶为终结符:输入非空字符,输入串减少,栈顶弹出
- 例解:
13.2 PDA⟹\Longrightarrow⟹CFG
如果 PDA P=(Q,Σ,Γ,δ,q0,Z0,∅)P = (Q, Σ, Γ, δ, q_0, Z_0, ∅)P=(Q,Σ,Γ,δ,q0,Z0,∅), 那么构造 CFG G=(V,Σ,P′,S)G = (V, Σ, P^′, S)G=(V,Σ,P′,S), 其中
VVV 和 P′P^′P′ 为
- V={[qXp]∣p,q∈Q,X∈Γ}∪{S}V = \{[qXp] | p,q ∈Q, X ∈ Γ\} ∪ \{S\}V={[qXp]∣p,q∈Q,X∈Γ}∪{S};
- 对 ∀p∈Q∀p ∈ Q∀p∈Q, 构造产生式 S→[q0Z0p]S → [q_0Z_0p]S→[q0Z0p];
- 对 ∀(p,Y1Y2⋅⋅⋅Yn)∈δ(q,a,X)∀(p, Y_1Y_2 · · · Y_n) ∈ δ(q, a, X)∀(p,Y1Y2⋅⋅⋅Yn)∈δ(q,a,X), 构造 ∣Q∣n|Q|n∣Q∣n 个产生式
[qXrn]→a[pY1r1][r1Y2r2]⋅⋅⋅[rn−1Ynrn][qXr_n] → a[pY_1r_1][r_1Y_2r_2] · · · [r_{n−1}Y_nr_n][qXrn]→a[pY1r1][r1Y2r2]⋅⋅⋅[rn−1Ynrn]
其中 a∈Σ∪{ε}a ∈ Σ ∪ \{ε\}a∈Σ∪{ε}, X,Yi∈ΓX,Y_i ∈ ΓX,Yi∈Γ, 而 ri∈Qr_i ∈ Qri∈Q 是 nnn 次 ∣Q∣|Q|∣Q∣ 种状态的组合; 若i=0i = 0i=0, 为 [qXp]→a[qXp] → a[qXp]→a.
简单记忆
- δ(a,b,c)=(d,ef)\delta(a, b, c)=(d, e f)δ(a,b,c)=(d,ef) 转换为 [acr2]→b[der1][r1fr2][acr_2]\rightarrow b[der_1][r_1fr_2][acr2]→b[der1][r1fr2]
- δ(a,b,c)=(d,e)\delta(a, b, c)=(d, e)δ(a,b,c)=(d,e) 转换为 [acr1]→b[der1][acr_1]\rightarrow b[der_1][acr1]→b[der1]
- δ(a,b,c)=(d,ε)\delta(a, b, c)=(d, ε)δ(a,b,c)=(d,ε) 转换为 [acd]→b[acd]\rightarrow b[acd]→b
- 最后用有穷状态集带入r1r2r_1 r_2r1r2
例:将 PDA P = ({p, q}, (0, 1), {X, Z}, δ, q, Z) 转为 CFG, 其中 δ 如下:
解:
化简:
14. GNF⟹\Longrightarrow⟹PDA
如果 GNF 格式的 CFG G=(V,T,P′,S)G = (V, T, P^′, S)G=(V,T,P′,S), 那么构造 PDA
P=({q},T,V,δ,q,S,∅)P = (\{q\}, T, V, δ, q, S, ∅)P=({q},T,V,δ,q,S,∅)
为每个产生式, 定义 δ 为:
δ(q,a,A)={(q,β)∣A→aβ∈P′}δ(q, a, A) = \{(q, β) | A → aβ ∈ P^′\}δ(q,a,A)={(q,β)∣A→aβ∈P′}
即:每次读入终结符,将栈中变元进行派生(弹栈+压栈),直到栈中均为终结符。
例:文法 S→aAA,A→aS∣bS∣aS → aAA, A → aS | bS | aS→aAA,A→aS∣bS∣a 为 GNF 格式, 构造等价的 PDA
15. 确定性下推自动机(DPDA)
如果 PDA P=(Q,Σ,Γ,δ,q0,Z0,F)P = (Q, Σ, Γ, δ, q_0, Z_0, F)P=(Q,Σ,Γ,δ,q0,Z0,F) 满足
- ∀a∈Σ∪{ε}∀a ∈ Σ ∪ \{ε\}∀a∈Σ∪{ε}, δ(q,a,X)δ(q, a, X)δ(q,a,X) 至多有一个动作;
- ∀a∈Σ∀a ∈ Σ∀a∈Σ, 如果 δ(q,a,X)≠∅δ(q, a, X) \neq ∅δ(q,a,X)=∅, 那么 δ(q,ε,X)=∅.δ(q, ε, X) = ∅.δ(q,ε,X)=∅.
∀(q,a,Z)∈Q×Σ×Γ∀(q, a, Z) ∈ Q × Σ × Γ∀(q,a,Z)∈Q×Σ×Γ 满足 ∣δ(q,a,Z)∣+∣δ(q,ε,Z)∣≤1|δ(q, a, Z)| + |δ(q, ε, Z)| ≤ 1∣δ(q,a,Z)∣+∣δ(q,ε,Z)∣≤1
即:每一个瞬时描述下至多有一个转移状态(可以无动作)
则称 PPP 为确定型下推自动机(DPDA)
DPDA PPP 以终态方式接受的语言 L(P)L(P)L(P) 称为确定性上下文无关语言(DCFL)
注:DPDA 与 PDA 不等价
例:任何 DPDA 都无法接受LwwrL_{ww^r}Lwwr, 但是可以接受
Lwcwr={wcwR∣w∈(0+1)∗}L_{wcw^r} = \{wcw^R | w ∈ (0 + 1)^∗\}Lwcwr={wcwR∣w∈(0+1)∗}
设计DPDA
DCFL 的重要应用
- 非固有歧义语言的真子集
- 程序设计语言的语法分析器
- LR(k) 文法, Yacc 的基础, 解析时间复杂度为 O(n)
- 如果 LLL 是正则语言, 那么存在 DPDA PPP 以终态方式接受 LLL, 即 L=L(P)L = L(P)L=L(P)
- 证明: 显然,DPDA PPP 可以不用栈而模拟任何 DFA。
- 结论:正则语言⊆DCFL⊆CFL正则语言 ⊆ DCFL ⊆ CFL正则语言⊆DCFL⊆CFL
- 前缀性质:如果语言 L 中不存在字符串 x 和 y, 使 x 是 y 的前缀, 称语言 L 满足前缀性质.
- DPDA PPP 且 L=N(P)L = N(P)L=N(P), 当且仅当 LLL 有前缀性质, 且存在 DPDA P′P^′P′ 使L=L(P′)L = L(P ′)L=L(P′).
- DPDA PPP 的 N(P)N(P)N(P) 更有限, 即使正则语言 0∗0^∗0∗ 也无法接受
- 但却可以被某个 DPDA 以终态方式接受
DPDA 与歧义文法
DPDA PPP, 语言 L=L(P)L = L(P)L=L(P), 那么 LLL 有无歧义的 CFG
- 因此 DPDA 在语法分析中占重要地位
- 但是并非所有非固有歧义 CFL 都会被 DPDA 识别
如 LwwrL_{ww^r}Lwwr有无歧义文法 S→0S0∣1S1∣εS → 0S0 | 1S1 | εS→0S0∣1S1∣ε
16 上下文无关语言的泵引理
如果语言 LLL 是 CFL, 那么存在正整数 NNN, 对 ∀z∈L∀z ∈ L∀z∈L,
只要 ∣z∣≥N|z| ≥ N∣z∣≥N, 就可以将 zzz 分为五部分 z=uvwxyz = uvwxyz=uvwxy 满足:
- vx≠εvx \neq εvx=ε (或∣vx∣>0|vx| > 0∣vx∣>0);
- ∣vwx∣≤N|vwx| ≤ N∣vwx∣≤N;
- ∀i≥0,uviwxiy∈L∀i ≥ 0, uv^iwx^iy ∈ L∀i≥0,uviwxiy∈L.
例:证明 L={0n1n2n∣n≥1}L = \{0^{n}1^{n}2^{n} | n ≥ 1\}L={0n1n2n∣n≥1} 不是上下文无关语言
解:
- 假设 LLL 是 CFL, 那么存在整数 N, 对 ∀z∈L(∣z∣≥N)∀z ∈ L (|z| ≥ N)∀z∈L(∣z∣≥N) 满足泵引理.
- 从 LLL 中取 z=0N1N2Nz = 0^N1^N2^Nz=0N1N2N, 则显然 z∈Lz ∈ Lz∈L 且 ∣z∣=3N≥N|z| = 3N ≥ N∣z∣=3N≥N.
- 由泵引理, zzz 可被分为 z=uvwxyz = uvwxyz=uvwxy, 且有 ∣vwx∣≤N|vwx| ≤ N∣vwx∣≤N 和 vx≠εvx \neq εvx=ε.
- 那么 vwxvwxvwx 可能
- 只包含 0, 1 或 2, 那么 uwy∉Luwy \notin Luwy∈/L;
- 只包含 0 和 1, 或只包含 1 和 2, 那么也有 uwy∉Luwy \notin Luwy∈/L;
- 与泵引理 uwy=uv0wx0y∈Luwy = uv_0wx_0y ∈ Luwy=uv0wx0y∈L 矛盾, 假设不成立.
- LLL 不是上下文无关的
例:证明 L={ww∣w∈0,1∗}L = \{ww | w ∈ {0, 1}^∗\}L={ww∣w∈0,1∗} 不是上下文无关的
(错误的) 证明: 假设 LLL 是 CFL. 取 z=0N10N1z = 0^N10^N1z=0N10N1, 那么 z=uvwxyz = uvwxyz=uvwxy 为
则对任意 i≥0i ≥ 0i≥0, 有 uviwxiy∈Luv^iwx^iy ∈ Luviwxiy∈L, 满足泵引理.
(正确的) 证明: 假设 LLL 是 CFL. 取 z=0N1N0N1Nz = 0^N1^N0^N1^Nz=0N1N0N1N, 将 zzz 分为 z=uvwxyz = uvwxyz=uvwxy 时
- 若 vwxvwxvwx 在 zzz 中点的一侧, uv0wx0yuv_0wx_0yuv0wx0y 显然不可能属于 LLL;
- 若 vwxvwxvwx 包括 zzz 中点, 那么 uv0wx0yuv_0wx_0yuv0wx0y 为 0N1i0j1N0^N1^i0^j1^N0N1i0j1N, 也不可能属于 LLL.
所以假设不成立, LLL 不是 CFL
17 上下文无关语言的封闭性
封闭
- 并
- 连接
- 闭包
- 同态
- 逆同态
- 反转
不封闭
- 交
- 补运算
17.1 代换
两个字母表 Σ\SigmaΣ 到 Γ\GammaΓ 的函数 s:Σ→2Γ∗s\ :\ \Sigma\ \rightarrow 2^{\Gamma^{*}}s : Σ →2Γ∗ 称为代换. Σ\SigmaΣ 中的一个字符 aaa 在 sss 的作用下为
Γ\GammaΓ 上的一个语言 LaL_{a}La, 即
s(a)=Las(a)\ = \ La s(a) = La
扩展 sss 的定义到字符串,
s(ε)=εs(\varepsilon)\ = \ \varepsilon s(ε) = ε
s(xa)=s(x)s(a)s(xa)\ = \ s(x)s(a) s(xa) = s(x)s(a)
再扩展 hhh 到语言, 对 ∀L ⊆Σ∗\forall\text{L\ } \subseteq \ \Sigma^{*}∀L ⊆ Σ∗
s(L)=⋃x∈Ls(x)s(L)\ = \ \bigcup_{x \in L}^{}{s(x)} s(L) = x∈L⋃s(x)
定理:如果有 ΣΣΣ 上的 CFL LLL 和代换 sss, 且每个 a∈Σa ∈ Σa∈Σ 的 s(a)s(a)s(a) 都是 CFL, 那么 s(L)s(L)s(L) 也是 CFL
即:可以把CFL的每个终结符扩展为一个CFL,生成的语言还是CFL
具体构造方法:
设 CFL LLL 的文法 G=(V,T,P,S)G\ = \ (V,\ T,\ P,\ S)G = (V, T, P, S), 每个 s(a)s(a)s(a) 的文法 Ga=(Va,Ta,Pa,Sa)G_{a} = \ (V_{a},\ T_{a},\ P_{a},\ S_{a})Ga= (Va, Ta, Pa, Sa).
那么 s(L)s(L)s(L) 的文法可以构造为
G′=(V′,T′,P′,S)G'\ = \ (V\ ',\ T\ ',\ P\ ',\ S)\ G′ = (V ′, T ′, P ′, S)
V′=V∪(⋃a∈TVa)V^{'}=V \cup (\bigcup_{a \in T}^{}V_{a}\ )V′=V∪(⋃a∈TVa )
T′=⋃a∈TTaT^{'}=\bigcup_{a \in T}^{}T_{a}T′=⋃a∈TTa
P′P^{'}P′包括每个 PaP_{a}Pa 和 PPP 中产生式,但是要将PPP的产生式中每个终结符aaa均替换为文法 GaG_{a}Ga 的开始符号SaS_{a}Sa.
17.2 封闭性应用
例: 请证明语言 LLL 不是 CFL L={w∈{a,b,c}∗∣na(w)=nb(w)=nc(w)}L = \{w ∈ {\{a, b, c\}}^∗ | n_a(w) = n_b(w) = n_c(w)\}L={w∈{a,b,c}∗∣na(w)=nb(w)=nc(w)},其中 na(w)n_a(w)na(w) 表示 www 中 aaa 的个数.
证明:
- 因为 a∗b∗c∗a^∗b^∗c^∗a∗b∗c∗ 是正则语言,
- 而 L∩a∗b∗c∗={anbncn∣n≥0}L ∩ a^∗b^∗c^∗ = \{a^nb^nc^n | n ≥ 0\}L∩a∗b∗c∗={anbncn∣n≥0} 不是 CFL,
- 由 CFL 与正则语言的交还是 CFL, 所以 LLL 不可能是 CFL
18 上下文无关语言的判定性质
18.1 可判定的 CFL 问题
空性: 只需判断文法的开始符号 S 是否为非产生的
有穷性和无穷性:
- 用不带无用符号的 CNF 的产生式画有向图;
- 变元为顶点, 若有 A → BC, 则 A 到 B 和 C 各画一条有向边;
- 检查图中是否有循环.
成员性: 利用 CNF 范式, 有CYK算法检查串 w 是否属于 L
18.2 CYK算法
例:CNF GGG 如下, 用 CYK 算法判断 bbabaa∈L(G)bbabaa ∈ L(G)bbabaa∈L(G)?
解:
S→AB∣BCS → AB | BCS→AB∣BC
A→BA∣aA → BA | aA→BA∣a
B→CC∣bB → CC | bB→CC∣b
C→AB∣aC → AB | aC→AB∣a
填写最下层(单个终结符是否有可达)
计算上面若干行
结果
因为 S∈X16={S,A}S ∈ X_{16} = \{S, A\}S∈X16={S,A}, 所以 bbabaa∈L(G)bbabaa ∈ L(G)bbabaa∈L(G)
18.3 不可判定的 CFL 问题
- 判断 CFG GGG 是否歧义的?
- 判断 CFL 是否固有歧义的?
- 两个 CFL 的交是否为空?
- 两个 CFL 是否相同?
- 判断 CFL 的补是否为空? 尽管有算法判断 CFL 是否为空
- 判断 CFL 是否等于 Σ∗Σ^∗Σ∗?
19. 图灵机
FA | PDA | TM |
---|---|---|
(QQQ, Σ\SigmaΣ, δ\deltaδ, q0q_0q0, FFF) | (QQQ,Σ\SigmaΣ,Γ\GammaΓ,δ\deltaδ,q0q_0q0,z0z_0z0,FFF) | (QQQ,Σ\SigmaΣ,Γ\GammaΓ,δ\deltaδ,q0q_0q0,BBB,FFF) |
- 图灵机(TM, Turing Machine) MMM 为七元组
M=(Q,Σ,Γ,δ,q0,B,F)M = (Q,\Sigma,\Gamma,\delta,q_0,B,F)M=(Q,Σ,Γ,δ,q0,B,F)
- QQQ: 有穷状态集;
- ΣΣΣ: 有穷输入符号集;
- ΓΓΓ: 有穷带符号集, 且总有 Σ⊂ΓΣ ⊂ ΓΣ⊂Γ;
- δ:Q×Γ→Q×Γ×{L,R}δ: Q × Γ → Q × Γ × \{L, R\}δ:Q×Γ→Q×Γ×{L,R} 转移函数;
- q0∈Qq_0 ∈ Qq0∈Q: 初始状态;
- B∈Γ−ΣB ∈ Γ − ΣB∈Γ−Σ: 空格符号;
- F⊆QF ⊆ QF⊆Q: 终态集或接受状态集.
与有穷自动机区别:
- 可修改(必须修改,但可以相同)
- 可向左或向右移动输入带
- 有空格符号
例:设计识别 {0n1n∣n≥1}\{0^n1^n | n ≥ 1\}{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})M = (\{q0, q1, q2, q3, q4\}, \{0, 1\}, \{0, 1, X, Y, B\}, δ, q_0, B, \{q4\})M=({q0,q1,q2,q3,q4},{0,1},{0,1,X,Y,B},δ,q0,B,{q4})
19.1 瞬时描述(ID)
图灵机虽有无穷长的带, 但经过有限步, 带上非空内容总是有限的. 因此用全部非空符号、当前状态及带头位置, 定义图灵机的瞬时描述(ID)为
X1X2⋅⋅⋅Xi−1qXiXi+1⋅⋅⋅XnX_1X_2 · · · X_{i−1}qX_iX_{i+1} · · · X_nX1X2⋅⋅⋅Xi−1qXiXi+1⋅⋅⋅Xn
- 图灵机的当前状态 qqq
- 带头在左起第 iii 个非空格符 XiX_iXi 上
- X1X2⋅⋅⋅XnX_1X_2 · · · X_nX1X2⋅⋅⋅Xn是最左到最右非空格内容
如果 δ(q,Xi)=(p,Y,L)δ(q, Xi) = (p, Y, L)δ(q,Xi)=(p,Y,L), 定义 ID 转移为
X1⋅⋅⋅Xi−1qXi⋅⋅⋅Xn⊢X1⋅⋅⋅Xi−2pXi−1YXi+1⋅⋅⋅XnX_1 · · · X_{i−1}qX_i · · · X_n ⊢ X_1 · · · X_{i−2}pX_{i−1}YX_{i+1} · · · X_nX1⋅⋅⋅Xi−1qXi⋅⋅⋅Xn⊢X1⋅⋅⋅Xi−2pXi−1YXi+1⋅⋅⋅Xn
续例:设计识别 {0n1n∣n≥1}\{0^n1^n | n ≥ 1\}{0n1n∣n≥1} 的图灵机, 接受 0011 的 ID 序列
解:
q00011⊢Xq1011⊢X0q111⊢Xq20Y1⊢q2X0Y1⊢Xq00Y1⊢XXq1Y1⊢XXYq11⊢XXq2YY⊢Xq2XYY⊢XXq0YY⊢XXYq3Y⊢XXYYq3B⊢XXYYBq4Bq00011 ⊢ Xq1011 ⊢ X0q111 ⊢ Xq20Y1 ⊢ q2X0Y1 ⊢ Xq00Y1 ⊢ XXq1Y1 ⊢ XXYq11 ⊢ XXq2Y Y ⊢ Xq2XYY ⊢ XXq0YY ⊢ XXYq3Y ⊢ XXYYq3B ⊢ XXYYBq4Bq00011⊢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) = \{w | w ∈ Σ^∗, q_0w ⊢*αpβ, p ∈ F, α, β ∈ Γ^∗\}L(M)={w∣w∈Σ∗,q0w⊢∗αpβ,p∈F,α,β∈Γ∗}
如果 LLL 是图灵机 $M $的语言, 即 L=L(M)L = L(M)L=L(M), 则称 LLL 是递归可枚举语言.
一般假定, 当输入串被接受时, 图灵机总会停机
然而, 对于不接受的输入, 图灵机可能永远不停止
对接受和不接受的输入, 都保证停机的图灵机, 所接受的语言称为递归语言
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
形式语言与自动机总结笔记相关推荐
- 形式语言与自动机学习复述笔记
形式语言与自动机学习复述笔记 文章目录 形式语言与自动机学习复述笔记 本文说明 文法 文法的乔姆斯基分类 有穷自动机 正则语言 正则文法 关系 正则表达式 正则表达式RE->$\epsilon$ ...
- 【第二章 语言及文法】形式语言与自动机第二章个人总结复习笔记分享!(含文件、持续更新...)
目录 一.总览 二.2.1 [语言的定义与运算] 2.2 [文法] 2.3 [文法的分类] 说明 网盘链接 参考教材 有用的话请点个赞吧,后续有时间会持续更新. 提示:本文内容全是我一人学习总结而来, ...
- 【第三章 有限自动机与右线性文法】形式语言与自动机第三章个人总结复习笔记分享!(含文件、持续更新...)
目录 前言 一.总览 二.章节展示 3.1 [有限自动机] 3.2 [不确定的有限自动机] 3.3 [DFA和NFA的等效] 3.4 [有ε转换的不确定的有限自动机] 3.5 [正则集与正则式] 3. ...
- 形式语言与自动机 Part 3.有限自动机
课程名:形式语言与自动机 作者:Lupinus_Linn 许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享 署名(英语:Attribution,BY):您(用户)可以复制 ...
- 形式语言与自动机 Part.4 正则语言,2DFA,MealyMoore机
课程名:形式语言与自动机 作者:Lupinus_Linn 许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享 署名(英语:Attribution,BY):您(用户)可以复制 ...
- 形式语言与自动机 Part.5 上下文无关语言与下推自动机(PDA)
课程名:形式语言与自动机 作者:Lupinus_Linn 许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享 署名(英语:Attribution,BY):您(用户)可以复制 ...
- 形式语言与自动机 Part.6 图灵机
课程名:形式语言与自动机 作者:Lupinus_Linn 许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享 署名(英语:Attribution,BY):您(用户)可以复制 ...
- 形式语言与自动机 Part.1绪论, Part.2 语言与文法
课程名:形式语言与自动机 作者:Lupinus_Linn 许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享 署名(英语:Attribution,BY):您(用户)可以复制 ...
- 计算理论 形式语言与自动机_下推式自动机(PDA)| 计算理论
计算理论 形式语言与自动机 Pushdown Automaton (PDA) is a kind of Automaton which comes under the theory of Comput ...
- 【形式语言与自动机】图灵机
[形式语言与自动机]图灵机 一.图灵机 在经过有限状态机的介绍之后,再来看一种功能更强大的机器. 图灵机基本结构 〉 一条分格的无限长的纸带,每格可容纳一个字符 〉 一个读写头,可以在纸带上移动(可以 ...
最新文章
- android TranslateAnimation动画执行时的坐标获取。
- OpenStack Rally 质量评估与自动化测试利器
- Day34 数据库的增、删 、改、查
- 飞花的糖果_JAVA
- JavaScript高级程序设计58.pdf
- POJ 3254 状态压缩DP
- 树莓派的linux系统安装,树莓派安装Linux操作系统
- lock mysql unlock_MySQL中的lock tables和unlock tables
- python线程的互斥锁
- 时光就是一颗巨大的牛轧糖
- Markdown支持的语言
- [家里蹲大学数学杂志]第270期张恭庆编《泛函分析讲义》2.5节以前的习题参考解答...
- 使用curl清理Elasticsearch数据方法
- mysql事务prepare_mysql之 事务prepare 与 commit 阶段分析
- 古剑奇谭如何修改服务器,寻木枝改方向了!《古剑奇谭网络版》这波更新太值得去体验了...
- 【VUE项目】VUE+ElementUI电商后台管理系统
- Java 序列化详解
- 计算机ppt制作培训心得体会,制作ppt学习心得体会.doc
- Fatal error: Uncaught Error: Call to undefined function mysql_connect()问题解决
- PicGO+阿里云OSS或PicGO+Github+Jsdelivr搭建图床(图解)
热门文章
- java setmethod_java.util.zip.ZipEntry.setMethod(int method)方法示例
- 上海交大教授:何援军——包围盒(包容体/包围盒子)
- 互联网晚报 | 10月16日 星期六 | 搜狗正式并入腾讯;宏光MINIEV累计销量破40万台;神舟十三号载人飞船成功发射...
- Cesium-Fullscreen全屏显示
- 职高计算机专业c语言_重庆市职业高中计算机专业C语言试题
- 微信小程序-获取当前城市位置经纬度,并解析位置信息
- 天使之音——Declan Galbraith
- 用Visio画流程图
- 疯狂突破高中句型300句
- Speedtest在线测试html,Speedtest by Ookla:网络测速插件