课程名:形式语言与自动机
作者: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.4 正则语言
4.1 基本概念
- 正则语言:满足正则语言的判定定理的语言。
- 正则(表达)式:用类似代数表达式的方法表示正则语言。
- 正则式的相等:表示的语言相同。
- 正则集:满足正则式的字符串的集合。
- 正则式和语言的的联合运算+,连接运算•,正闭包L+,星闭包L∗及运算性质。
注1:正则集是T* 的子集。(即正则集是T*上的语言)
注2:L+包含ε当且仅当L包含ε。
注3:每个正则集至少对应一个正则式(可有无穷多 个正则式)
4.2 右线性文法↔正则表达式
两个等价
- 左线性文法和右线性文法等价。
- 右线性文法和正则式等价(右线性文法产生的语言都是正则语言,正则语言都可以用右线性文法产生)
从右线性文法导出正则式:设x→αx+β,α∈T∗,x∈N,then x=α∗β。不断代入消元,最后得出S=<RE>
4.3 正则语言可以表示为有限自动机、正则表达式和右线性文法
三者两两等价,都表示正则语言
例子:
G=({S,A},{0,1},P ,S)其中P:S—>1A,A—> 0A |1S|0
-
文法转正则式:解方程
A→0A∣1S∣0,即A→0A∣11A∣0,解得A=(0+11)∗0,得S=1(0+11)∗0
-
正则式转文法:按照运算顺序,按基本运算还原。
1,(0+11)∗,0是依次连接的,对应文法的连接,则S→1A0,A→(0+11)∗
闭包运算的文法是A→aA∣ϵ,所以A→0A∣11A∣ϵ
-
文法转自动机:生成一个吃一个,生成终结符串的,转移到一个新增的接受状态。
因为mermaid语法的限制,用方形框表示接受。
S→1A,则状态qS用字符1转移到状态qA,其他以此类推。
A可以推出终结符串0,则qA通过0转移到新的接受状态qH
-
自动机转文法:每一个转移,对应一个产生式。转移到接受状态的,额外增加推出终结符串。
qS接受1转移到qA,所以文法有产生式qS→1qA,其他以此类推。
最后可能要做三消(消单消空消递归)。
qS→1qAqA→1qSqA→0qAqA→0qH∣0
-
自动机转正则式:状态消去法
要消去状态qA,入射qA的有{qS},出射qA的有{qH,qS},所以对qS到qH,qS到$q_S $有影响。
此时已经是基本结构,一举写出
S=(10∗1)∗10∗0
-
正则式转自动机:按照运算顺序,按基本运算还原。
用S=1(0+11)∗0来还原,5.里那个比较复杂。
1,(0+11)∗,0是依次连接的,对应自动机某一些状态区域的空转移。
空闭包的结构是,要么空转移,要么在原地转圈后转移。
0+11的结构是,两条并行线。
11结构是,顺序执行。
4.4 有限自动机→正则表达式:状态消去法
精髓:将正则表达式作为转移弧的标记。不断删去状态,删去状态时将其前驱和后继的转移弧标记修改。删到基本结构时写出最终表达式。
删除方法:

基本结构:
对于q∈F
-
q=q0,则正则表达式为(R+SU∗T)∗SU∗,即观察从q0到q的可能路径。
为到达q0,可以在q0自环转任意次或者q0和q之间反复横跳任意次。
之后要到达q,一定会单独经过一次S,然后在q又可以自环转任意次。

-
q=q0,最后可以删到只剩下一个状态。正则表达式为R∗.

- 当有∣F∣>1,即有多个状态被接受时,将到达每个终态的正则表达式加起来。
技巧:删去的顺序不一定,可以先局部再整体。
例子:


- 另有状态消去法的形式化方法– CONVERT(G),但其不适合手工操作,略去不表。
4.5 正则表达式→有限自动机
精髓:将正则表达式的匹配过程写成一个二叉树,然后中序遍历,按照几种基本结构将其画成自动机。
其实大多数时候是随手画。
基础:

归纳:


4.6 右线性文法→有限自动机
精髓:因为右线性文法每次会产生一个非终结符合一个终结符,将生成终结符作为自动机的转移条件,产生的非终结符作为下一个状态。
因为只产生终结符时应该是接受状态,但是文法中没有这个符号,所以就新建一个符号H,让终结符指向H,H被接受。
为了不引入空转移,根据是否能由S推出空串决定S的可接受性。
方法:设右线性文法G=(N,T,P,S),构造一个与G等
价的有限自动机NFA M=(Q,T,δ,q0,F),其中: Q=N∪H,H为一个新增加的状态, H∈/N, q0=S.
F={{H,S},if S→ϵ∈P{H}
δ:
B∈δ(A,a) if A→aB∈PH∈δ(A,a) if A→a∈Pδ(H,a)=∅
例子:

4.7 有限自动机→右线性文法
精髓:把δ函数的转移看成是一个个生成式。
方法:设NFA M=(Q,T,δ,q0,F),构造一个右线性文法G=(N,T,P,S),其中N=Q, S=q0
P:
A→aB ∈P if δ(A,a)=B, then if B∈F, add A→a to P
例子:

4.8 DFA的最小化:填表算法
-
最小化:对DFA M的极小化是找出一个状态数比M少的
DFA M1,使满足 L(M) = L(M1)。若DFA M不存在互为等价状态及不可达状态,则称 DFA M是最小化的.
-
状态偶对:两个状态的有序二元组称为状态偶对。
-
状态的等价和可区分:两者是对立的。对于某一DFA M,如果两个状态q0,q1通过任意的串ω都可以转移接收状态(不一定是同一个接收状态),则两者等价。反之两者可区分。
即:设DFA M=(Q,T,δ,q0,F),若qx,qy∈Q,对于∀ω∈T∗,若(qx,ω)┣∗(qx,ϵ)↔(qy,ω)┣∗(qy,ϵ),则qx,qy等价,反之两者可区分。
-
不可达状态:即无法从q0输入任何字符串ω到达的状态。
4.8.1 删除不可达状态
可以减小填表算法的负担。
从q0开始,迭代寻找(bfs)可以到达的状态Q可达,则Q−Q可达即为不可达状态,删除不可达状态即含有其的转移条目。
4.8.2 填表算法
精髓:因为状态的等价关系是传递的,可以通过两两判断等价性来找出所有等价的状态。又因为是自反的、对称的,所以只需要一个n×n表格的下三角部分来记录,且不需要对角线。
如果没有理由认为两个状态是可区分的,那么就认为他们是等价的。
方法:
- 基础:所有的终态和非终态是可区分的。
- 归纳:如果某两个状态qx,qy可以通过符号a转移到两个可区分的状态,那么他们是可区分的。
例子:

4.8.3 等价状态的合并
将所有的状态根据等价性构成一个划分,将划分块用其等价类代替。
用等价类作为状态标记构造一个新的DFA,其转移关系为:如果原来不同划分之间至少有一种转移,那么这两个等价类增加一条转移。
即:设待最小化的DFA为DFA A=(Q,T,δ,q0,F) ,最小化的自动机为DFA B=(QB,T,δB,[q0],FB) , 其中 QB={[q]∣q∈Q}, δB([q],a)=[δ(q,a)]},FB={[q]∣q∈F}
4.8.4 例子

4.9 正则语言的泵引理
精髓:因为正则语言对应的是有限自动机,其状态数是有限的,那么由Pigeonhole Rule,对于无限的语言(有限语言可以通过“并”构成正则语言),如果其为正则语言,那么一定会在自动机的某一段绕圈来达到无限。
泵引理:正则语言中足够长的句子一定能拆成三段,并且中间一段重复0次或任意多次得到的句子仍然属于正则语言(可以Pumping in和Pumping out)。泵引理成立是正则语言的一个必要条件。
用泵引理来证明某语言不是正则语言
证明步骤
- 选任意的n.
- 找到一个满足以下条件的串w∈L (长度至少为n).
- 任选满足w=xyz∧y=ϵ∧∣xy∣≤n 的x,y,z
- 找到一个 k≥0, 使 xykz=L.
例子:利用泵引理证明下述语言不是正则语言:
L={1n2∣n≥0}
答:
- 假设L是正则语言。
- 那么,存在N∈Z+,对于∀ω∈L(∣ω∣≥N)满足泵引理。
- 取ω=1N2,显然ω∈L且∣ω∣=N2≥N。
- 那么,ω可以被分为ω=xyz,且∣xy∣≤N,∣y∣>0.
- 那么,y只能是1m(m>0),x为1l(l≥0),z为1N2−l−m,且满足m+l≤N。
- 那么xy2z=1l12m1N2−l−m=1N2+m。
- 因为m>0所以N2+m>N2;因为m+l≤N且l≥0,得m≤N,所以N2+m≤N2+N<N2+2N+1=(N+1)2,所以N2<N2+m<(N+1)2,即新串的长度严格位于两个完全平方数之间,所以其不是完全平方数。
- 则xy2z∈/L,而由泵引理xy2z∈L,所以假设不成立,L不是正则语言。
例子:由文法G产生的语言L(G),其中P:S→aSbS∣c.
语言的描述有很多种,用类似anbn的公式化描述的只有一部分。还有用叙述性描述(比如a和b的数量一样多)和文法描述的(本题)。这些描述有时候很难写出完全等价的公式化描述,其实只需要其中的一个句子即可。
- 假设L是正则语言,则存在正整数N,对于任意L内的字符串ω成立∣ω∣≥N时,可以应用泵引理。
- 对于L,不妨取ω=aNc(bc)N=ω1ω0ω2,则∣ω0∣>0,∣ω1ω0∣≤N,显然ω0=ai(i>0)。
- 则对于ω′=ω1ω02ω2=aN+ic(bc)N,其不属于L(注意是文法那个L,不是取的句子),而与泵引理矛盾,所以L不是正则语言。
4.10 双向有限自动机(2DFA)
双向有限自动机:读入一个字符之后,读头既可以左移一格, 也可以右移一格,或者不移动的有限自动机。
确定的双向有限自动机: 每读入一字符,必须向左或右移动,不考虑不移动的情况.
4.10.1 2DFA的五要素
2DFA M=(Q,T,δ,q0,F)
δ:Q×T→Q×{L,R}
δ(q,a)=(p,R) or δ(q,a)=(p,L)
其他与DFA相同。即每次除了状态转移之外还要移动读头(左移或右移一格)。
4.10.2 2DFA的格局
-
2DFA的格局和DFA的不同,要把字符串整个列出来。
-
δ(q,am+1)=(p,R)的格局表示:a1a2…amqam+1…an┣a1a2…am+1pa+m+2…an
-
δ(q,am+1)=(p,L)的格局表示: a1a2…amqam+1…an┣a1a2…am−1pamam+1…an
4.10.3 2DFA接受的语言
- 2DFA接受的语言是L(M)={ω∣qω┣ω∗q,q∈F}

4.11 有输出的有限自动机(Mealy&Moore)
有输出的有限自动机是有限自动机的一个类型.
这类自动机在有字符输入时,不仅存在状态转换, 同时引起字符输出.
根据输入字符,自动机状态,输出字符三者之 间关系,可有两类有输出的自动机:
米兰机(Mealy): 输出字符与输入字符及状态有关.
摩尔机(Moore): 输出字符仅与状态有关.
最大优点: 节省状态
4.11.1 Mealy机
-
M=(Q,T,R,δ,g,q0)
相比DFA,多了输出函数g:Q×T→R
δ和g函数共同描述Mealy机的工作情况。
-
绘图:
{δ(p,a)=qg(p,a)=b
绘制为
-
例子:


4.11.2 Moore机
-
M=(Q,T,R,δ,g,q0)
相比DFA,多了转移函数g
相比Mealy机,Moore机的转移函数g是个一元函数,只与当前状态有关。
-
绘图:
⎩⎪⎨⎪⎧δ(p,a)=qg(p)=b1g(q)=b2
绘制为
因为输出只与状态有关,所以把输出写在状态圈里。
-
例子:

4.11.3 Moore机→Mealy机
- Moore机比较简单,所以转换成Mealy机很方便。
- 将Moore机中某个状态q的输出b,作为新的Mealy机任何到达q状态的转移时的输出。
即:设摩尔机M=(Q,T,R,δ,g,q0) 米兰机M’=(Q,T,R,δ,g’,q0) 如果中有δ(q,a)=p,$ g§ = b$ 则M’中有g’(q,a)=b=g(δ(q,a))
例子:

4.11.4 不做要求:Mealy机→Moore机
略去不表。