课程名:形式语言与自动机
作者:Lupinus_Linn
许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享
-
署名(英语:Attribution,BY):您(用户)可以复制、发行、展览、表演、放映、广播或通过信息网络传播本作品;您必须按照作者或者许可人指定的方式对作品进行署名。
-
非商业性使用(英语:Noncommercial,NC):您可以自由复制、散布、展示及演出本作品;您不得为商业目的而使用本作品。
-
相同方式共享(英语:Sharealike,SA):您可以自由复制、散布、展示及演出本作品;若您改变、转变或更改本作品,仅在遵守与本作品相同的许可条款下,您才能散布由本作品产生的派生作品。(参见copyleft。)
引用:
- 本文中部分文字与图片引用自北京邮电大学计算机学院王柏教授的《形式语言与自动机》课程课件。
- 绪论中的证明方法部分引自清华大学王生原老师课件。
- 部分题目插图引用自北京邮电大学出版社《形式语言与自动机 第二版》教材。
在此一并表示感谢,并不做商业用途。
本笔记所有内容的传送门
Part.1绪论, Part.2 语言与文法
Part 3.有限自动机
Part.4 正则语言,2DFA,Mealy&Moore机
Part.5 上下文无关语言与下推自动机(PDA)
Part.6 图灵机
Part 3.有限自动机
- 具有离散输入输出系统的一种数学模型 (可以没有输出,比较特殊的也可以没有输入).
- 有限的状态
- 状态+输入→状态转移
- 每次转换的后继状态都唯一 → DFA,每次转换的后继状态不唯一→NFA
3.1 五要素
- 有限状态集Q
- 有限输入符号集T
- 转移函数δ:Q×T→Q:
- 一个开始状态q0,q0∈Q
- 一个终态集合F,F⊆Q
3.2 一个DFA的定义
- M=(Q,T,δ,q0,F)
- Q={q0,q1,q2,q3}
- T={0,1}
-
δ(q0,0)=q2,δ(q0,1)=q1
δ(q1,0)=q3,δ(q1,1)=q0
δ(q2,0)=q0,δ(q2,1)=q3
δ(q3,0)=q1,δ(q3,1)=q2
- q0
- F={q0,q3}
3.3 状态转移图

3.4 状态转移表

3.5 字符串转移函数δ′
δ′:Q×T∗→Q
对于任何q∈Q,定义
-
δ′(q,ϵ)=q。即空串转移到本状态。
- 如果ω∈T∗,a∈T,定义δ′(q,ωa)=δ(δ′(q,ω),a)。即非空字符串ωa∣可以看作是其前长度为∣ω∣的前缀$\omega $和长度为1的字符a组成。
对于DFA,单个字符使用δ或者δ′进行转移的结果相同。
3.6 DFA接受的语言
被DFA接收的字符串: 输入结束后使DFA的状态到达终 止状态。否则该字符串不能被DFA接收.
DFA接收的语言: 被DFA接收的字符串的集合.L(M)={ω∣δ′(q0,ω)∈F}
3.7 格局
- 有限自动机工作过程的瞬时描述,由当前状态q,待输入字符串ω构成的二元组(q,ω)表示,称为格局。
- 初始格局:(q0, ω)
- 终止格局: (q,ε), q∈F
- 用格局描述的推导序列:(q0,001010)┝ (q2,01010) ┝ (q0,1010) ┝ (q1,010) ┝ (q3,10) ┝ (q2,0) ┝ (q0,ε)
- 格局数量是无限的。
- 有限状态自动机是无记忆的,其跳转到的状态只与当前状态和输入的字符有关,和以前输入的字符无关。
3.8 有限自动机的设计
3.8.1 识别所有由奇数个a和奇数个b组成的字符串
- 不需要记住所看到的整个字符串,只需记住至此所看到 的a、b个数是偶数还是奇数。

3.8.2 识别包含000子串的语言
DFA

NFA

3.8.3 识别字符串代表的数字能被3整除的语言
- 一个十进制数除以3,余数只能为0、1、2。将其设计为状态。
- 状态q0表示已读入的数字和除3余0
- 状态q1表示已读入的数字和除3余1
- 状态q2表示已读入的数字和除3余2

3.8.4 长度为1-3 个字符且字母为首的语言
DFA

ϵ−NFA

3.9 NFA的五要素
- NFA是一个五元组,M=(Q,T,δ,q0,F). 其中δ:Q×T→2Q,其余与DFA相同.
- NFA的一个状态接受一个字符后转移到一个状态集合,DFA仅仅转移到单个状态。
- 如果接收一个字符串后NFA进入一个状态集, 而此集合中包含一个以上F中的状态, 则称NFA接收该字符串.
3.10 NFA的字符串转移函数δ′
δ′:Q×T→2Q
-
δ′(q,ϵ)={q},不允许空转移到别的状态。
-
δ′(q,ωa)=P,P={p∣∃r∈δ′(q,ω)∧δ(r,a)},即先接受ω进行转移,得到一个集合,然后将该集合内的状态再接受a进行转移,将所得状态集并起来。
3.11 NFA接受的语言
- L(A)={ω∣δ′(q0,ω)∩F=∅}
- 即NFA接受字符串后转移到的状态集合包含F中的状态。
3.12 NFA与DFA的等价性
等价性:接受的语言相相同
- DFA与NFA等价:显然,因为DFA⊂NFA
- NFA于NFA等价:使用子集构造法
3.13 子集构造法
精髓:将NFA的状态集合看做DFA的单个状态
方法:设 L 是某个 NFA N=(QN,T,δN,q0,FN) 的语言, 则 存在一个DFA M=(QD,T,δD,{q0},FD), 满足L(M)=L(N)=L.
其中
-
QD=2QN={R∣R⊆QN},即DFA的状态集合是NFA的状态的幂集(可以去掉无用状态)。
-
δD(R,a)=∪q∈R δN(q,a),即DFA的转移是NFA转移的并集。
-
FD={R∣R⊆QN∧R∩FN=∅},即新的DFA的可接受状态集是包含至少一个NFA可接受状态的集合的集合。
例子:

3.14 ϵ−NFA的五要素
ϵ−NFA是一个五元组A=(Q,T,δ,q0,F)
- 与NFA的区别:δ:Q×(T∪{ϵ})→2Q,即可以使用空串转移。
3.15 ϵ−CLOSURE
状态 q 的ε - 闭包,记为 ε - CLOSURE 或 ECLOSE ,定义为从q 经所有的ε路径可以到达 的状态(包括q自身)。
即从q开始,经过零次或多次空转移可以到达的状态集合。

3.16 ϵ−NFA的字符串转移函数δ′
δ′:Q×(T×{ϵ}→2Q)
-
δ′(q,ϵ)=ϵ−CLOSURE(q),允许空转移到一个状态集合
-
δ′(q,ωa)=ϵ−CLOSURE(δ(δ′(q0,ω),a),即先按接受ω进行δ′转移,得到一个集合,然后将该集合内的状态再接受字符a进行转移,将所得状态集并起来,再求其空闭包.
3.17 ϵ−NFA与NFA的等价性
- NFA与ε-NFA等价:显然,因为NFA⊂ε-NFA
-
ϵ−NFA于NFA等价:消空
3.18 ϵ−NFA的消空
精髓:把qx接受由字符a和若干个空串ε能转移到的所有状态找出来,视为qx接受a转移到这些状态的集合。此时空转移是冗余的,可以全部删掉。
方法:遍历原ϵ−NFA的非空转移(qx接收字符a转移到某个状态集合),做以下操作:(实际上在求δϵ−NFA′(qx,a))
- 求qx的空闭包ϵ−CLOSURE(qx)。
- 遍历ϵ−CLOSURE(qx)的每个状态qi,找出qi接收字符a(不含空转移)后所能到达的状态集合。遍历完成后,将得到的状态集合取并集。
- 寻找取并集后的集合的空闭包,认为qx接受a后直接到达该空闭包代表的集合,删去所有用到的空转移。
最后,还要对接受状态集合进行修改
FNFA={ Fϵ−NFA∪{q0},ϵ−CLOSURE(q0)∩F=∅Fϵ−NFA,otherwise
例子:

3.19 自动机的求补
精髓:自动机求补其实是语言求补,有的语言正面设计自动机比较麻烦,可以考虑其补语言后,再对该自动机求补。
方法:对于L1,构造Lˉ的自动机M=(Q,T,δ,q0,F)的步骤如下
-
Q=Q1∪{γ},γ用于使得原先自动机中会被卡住的转移在求补后被接受。
-
δ:
- 继承已有转移。
- 被卡死的转移,现在转到γ状态被接受。
-
γ状态接受任何字符都在原地转圈。
δ1(q,a)=δ(q,a)δ1(q,a)=∅→δ(q,a)=γδ(γ,T)=γ
-
F=(Q1−F1)∪{γ}。原自动机不被接受的状态被接收,增加γ被接受。
例子:T={a,b},L中的任意三个连续符号中最多包含2个a,设计接受它的自动机。
分析:
可以先构造L的补语言Lˉ的自动机。
Lˉ的描述是:存在连续的三个字符,其包含大于2个a。
这句话可以转述为:存在aaa子串。
Lˉ的自动机很容易画出。
(注:区分连续的字符和累积的字符:连续的字符失败后要回到开始,累积的字符失败后在原地转圈。如果是后缀匹配的话,要找到最长后缀匹配的上一个状态。)
Lˉ的自动机
再对其求补,得L的自动机为