本文原载于我的博客,地址:https://blog.guoziyang.top/archives/21/
1 课程简介与基础知识
1.1 课程简介
自动机理论:图灵机、有限状态机、文法,下推自动机
形式语言:经数学定义的语言
课程内容:
- 正则语言:有穷自动机、正则表达式、正则语言的性质
- 上下文无关语言:上下文无关文法、下推自动机、上下文无关语言的性质
- 计算导论:图灵机及其拓展、不可判定性
1.2 基础知识
字母表:符号(或字符)的非空有穷集。
字符串:由某字母表中符号组成的有穷序列。
空串:记为ϵ,有0个字符的串。
字母表可以是任意的,但是都有ϵ∈Σ。
字符串的长度:字符串中符号所占位置的个数,递归定义为
KaTeX parse error: No such environment: equation at position 8:
\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲|\omega|=\begin…
字符串的连接:将首尾相接得到新字符串的运算,记为x⋅y或者xy。
字符串的幂:字符串x的n次幂(n$\ge$0),递归定义为
KaTeX parse error: No such environment: equation at position 8:
\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲x^n=\begin{case…
字符串集合的连接:得到字符串集合,将两个集合中的串两两连接。
集合的幂:An=An−1A
克林闭包:
Σ∗=∪i=0∞Σi
正闭包:
Σ+=∪i=1∞Σi
与克林闭包相差一个ϵ
语言:若Σ为字母表且∀L⊂Σ∗,则L称为字母表Σ上的语言。
∅,{ϵ},Σ∗分别都是任意字母表Σ上的语言。
2 有穷自动机
2.2 确定的有穷自动机
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CCx5SaZ9-1591105349225)(https://i.loli.net/2019/06/13/5d01bbc9d91a237478.png)]
确定的有穷自动机(DFA):描述为A,A为一个五元组
A=(Q,Σ,δ,q0,F)
- Q:有穷状态集
-
Σ:有穷输入符号集或字母表
-
δ:Q×Σ→Q,状态转移函数
-
q0∈Q:初始状态
-
F⊂Q:终结状态集或接收状态集
一种描述:状态转移表:

扩展转移函数δ^:Q×Σ∗→Q:
KaTeX parse error: No such environment: equation at position 8:
\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲\hat{\delta}(q,…
举例:(有误)

DFA的语言与正则语言:
若 D = (Q, Σ, δ, q0, F) 是一个DFA, 则 D 接受的语言为
L(D)={ω∈Σ∗∣δ^(q0,ω)∈F}
如果语言 L 是某个 DFA D 的语言, 即 L = L(D), 则称 L 是正则语言。
2.3 非确定有穷自动机
形式定义 :
非确定有穷自动机(NFA):
A=(Q,Σ,δ,q0,F)
- Q:有穷状态集
-
Σ:有穷输入符号集或字母表
-
δ:Q×Σ→2Q,状态转移函数,即可以转移到多种状态
-
q0∈Q:初始状态
-
F⊂Q:终结状态集或接收状态集
扩展转移函数δ^:Q×Σ∗→2Q:
KaTeX parse error: No such environment: equation at position 8:
\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲\hat{\delta(q, …
举例:

DFA与NFA的等价性:
如果语言L被NFA接受,当且仅当L被DFA接受。
子集构造法(构造与NFA等价的DFA):如果 NFA N=(QN,Σ,δN,q0,FN)构造 DFA D=(QD,Σ,δD,{q0},FD)
- QD=2QN
- FD={S∣S⊂QN,S∩FN=∅}
- ∀S⊂QN,∀a∈Σ,δD(S,a)=∪p∈SδN(p,a)
则有L(D)=L(N)
举例:

2.4 带空转移的非确定有穷自动机
允许状态因空串ϵ而转移, 即不消耗输入字符就发生状态的改变。
带空转移非确定有穷自动机(ϵ-NFA):
A=(Q,Σ,δ,q0,F)
- Q:有穷状态集
-
Σ:有穷输入符号集或字母表
-
δ:Q×(Σ∪{ϵ})→2Q,状态转移函数
-
q0∈Q:初始状态
-
F⊂Q:终结状态集或接收状态集
状态的ϵ-闭包:记为ECLOSE(q),表示从q经过ϵ序列
可达的全部状态集合。
状态集S的ϵ−闭包:ECLOSE(S)=∪q∈SECLOSE(q)。
扩展转移函数δ^:Q×Σ∗→2Q:
KaTeX parse error: No such environment: equation at position 8:
\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲\hat{\delta}(q,…
举例:

ϵ-NFA的语言:若E=(Q,Σ,δ,q0,F)是一个ϵ−NFA,则E接受的语言为
L(F)={ω∈Σ∗∣δ^(q0,ω)∩F=∅}
消除空转移的子集构造法:
如果ϵ−NFAE=(QE,Σ,δE,qE,FE),构造DFA:
D=(QD,Σ,δD,qD,FD)
-
QD=2QE,或QD={S⊂QE∣S=ECLOSE(S)}。
-
qD=ECLOSE(qE)。
-
FD={S∣S∈QD,S∩FE=∅}。
-
∀S∈QD,∀a∈Σ,δD(S,a)=ECLOSE(∪p∈SδE(p,a))。
那么有L(D)=L(E)。
举例:


定理:如果语言L被ϵ−NFA接受,当且仅当L被DFA接受。
3 正则表达式
3.1 正则表达式
有穷自动机通过机器装置描述正则语言
通过表达式描述正则语言
语言的运算:

注意:语言的幂将字符添加在已有字符串的后面。
四则运算表达式的递归定义:
- 任何数都是四则运算表达式
- 如果a和b是四则运算表达式,那么a+b,a−b,a×b,a÷b和(a)都是四则运算表达式
正则表达式的递归定义:
如果Σ为字母表,则Σ上的正则表达式递归定义为:
-
∅是一个正则表达式,表示空语言,ϵ是一个正则表达式,表示语言{ϵ},∀a∈Σ,a是一个正则表达式,表示语言{a}。
- 如果正则表达式r和s分别表示语言R和S,那么
r+s,rs,r∗,(r)
都是正则表达式,分别表示语言R∪S,R⋅S,R∗,R。
运算符优先级:
括号,星,连接(rs,r⋅s),加(r+s,r∪s)
3.2 有穷自动机和正则表达式

**定理:**若L=L(A)是某DFA A的语言,那么存在正则表达式R满足L=L®。
将DFA转化为正则表达式(递归表达式法):
正则表达式Rij(k)表示从i到j但中间节点不超过k全部路径的字符串集
举例:


注意:自己到自己包括ϵ
化简规则:

继续上面的例子:



DFA 到正则表达式(状态消除法):
从DFA中逐个删除状态,保证"自动机"的等价。


注意:在使用状态消除法时,需要利用空转移添加开始状态s和结束状态f。
从正则表达式到有穷自动机:
正则表达式定义的语言,都可以被有穷自动机识别。
构造规则:

3.3 正则表达式的代数定律



4 正则语言的性质
4.1 证明语言的非正则性
正则语言的泵引理:
如果语言 L 是正则的,那么存在正整数N,它只依赖于L,对∀ω∈L,只要∣ω∣≥N,就可以将ω分为三部分ω=xyz满足:
- y=ϵ(∣y∣>0)
- ∣xy∣≤N
- ∀k≥0,xykz∈L
举例:

若一个语言的一部分已经被证明不是正则的,则这个语言不是正则的。
注意:泵引理只是必要条件,只能用于证伪。
4.2 正则语言的封闭性
正则语言在经过以下运算后得到的仍然为正则语言,称为在这些运算下封闭

求补运算:将所有的接受和非接受状态反转(注意这种方法需要完整的DFA)
可通过证明一个语言的补非正则,而证明该语言非正则
4.3 正则语言的判定性质
定理:具有n个状态的有穷自动机M接受的集合S:
- S是非空的,当且仅当M接受某个小于n的串。
- S是无穷的,当且仅当M接受某个长度为m的串,n≤m≤2n。
所以,对于正则语言:
- 存在算法, 判断其是否为空, 只需检查全部长度小于 n 的串。
- 存在算法, 判断其是否无穷, 只需检查全部长度由 n 到 2n − 1 的串。
定理:存在算法判定两个有穷自动机是否等价(接受语言相同)
4.4 自动机的最小化
**定义:**DFA A=(Q,Σ,δ,q0,F)中的两个状态p和q,对∀ω∈Σ∗:
δ^(p,ω)∈F⟷δ^(q,ω)∈F
则称这两个状态是等价的,否则称为可区分的。
填表算法:如果填表算法不能区分两个状态,则这两个状态等价。
- 直接标记终态和非终态之间的状态对
- 标记所有经过字符0到达终态和非终态的状态对
- 标记所有经过字符1到达终态和非终态的状态对
- 剩余的未标记状态对逐个检查,如果该状态对中的每个状态都可经过相同的串到达某可区分的状态对,则该状态对可区分
- 而剩余的状态对经过很短的字符串后,都会到达相同状态,所以是等价的
举例:






最小化:根据等价状态,将状态集划分为块,合并等价状态即可
5 上下文无关文法
5.1 上下文无关文法
如果字符串ω∈Σ∗满足ω=ωR,则称字符串ω为回文。如果语言L中的字符串都是回文,则称L为回文语言。
回文的递归表示:以Lpal={ω∈{0,1}∗∣ω=ωR}为例
- 首先ϵ,0,1都是回文
- 如果ω是回文,那么0ω0和1ω1也是回文
嵌套定义:
A→ϵA→0A→1A→0A0A→1A1
上下文无关文法(CFG):G=(V,T,P,S)
V:变元的有穷集,变元也称为非终结符或语法范畴
T:终结符的有穷集, 且 V∩T = ∅
P:产生式的有穷集, 每个产生式包括:
- 一个变元, 称为产生式的头或左部。
- 一个产生式符号→, 读作定义为。
- 一个(V∪T)∗中的符号串, 称为体或右部。
S∈V:初始符号,文法开始的地方
字符使用的一般规定:

从字符串到文法变元的过程,称为归约,逆过程称为派生。
举例:

派生和归约的形式定义:若CFG G=(V, T, P, S),设α,β,γ∈(V∪T)∗,A∈V,A→γ∈P,那么称G中由αAβ可派生出αγβ,记为

相应的,称αγβ可归约为αAβ。
举例:

最左派生:为限制派生的随意性, 要求只替换符号串中最左边变元的派生过程,称为最左派生。只替换最右的, 称为最右派生。


任何派生都有等价的最左派生和最右派生。
文法的语言:CFG G=(V, T, P, S)的语言定义为

那么符号串ω在L(G)中,要满足:
-
ω仅由终结符组成
- 初始符号S能派生出ω。
上下文无关语言定义:语言L是由某个CFG G 定义的语言,即 L = L(G),则称 L 为上下文无关语言。

如果有两个文法 CFG G1和CFG G2,满足L(G1)=L(G2),则称G1和G2是等价的。
**句型:**若 CFG G = (V, T, P, S),初始符号 S 派生出来的符号串,称为 G 的句型, 即


- 只含有终结符的句型, 也称为 G 的句子
- 而 L(G) 就是文法 G 全部的句子
所有的正则语言都是上下文无关语言。
5.2 语法分析树
派生或者归约的过程可以表示成树形结构
定义:CFG G = (V, T, P, S) 的语法分析树(语法树或派生树) 为
- 每个内节点标记为 V 中的变元符号
- 每个叶节点标记为V∪T∪{ϵ}中的符号
- 如果某内节点标记是 A, 其子节点从左至右分别为X1,X2,…,Xn,那么A→X1,X2,…,Xn∈P,若有Xi=ϵ,则ϵ是A唯一子节点,且A→ϵ∈P。
**定义:**语法树的全部叶结点从左到右连接起来,称为该树的产物或者结果
如果树根节点是初始符号 S,叶节点是终结符或 ε,那么该树的产物属于 L(G)。
语法树中标记为 A 的内节点及其全部子孙节点构成的子树,称为 A 子树。
语法分析树和派生的等价性:

语法树唯一确定最左 (右) 派生:
每棵语法分析树都有唯一的最左 (右) 派生,给定 CFG G = (V, T, P, S), A∈V , 以下命题等价

5.3 文法和语言的歧义性
如果 CFG G 使某些符号串有两棵不同的语法分析树, 称文法 G 是歧义的。
例如:

可重新设计文法来消除歧义性
语言的固有歧义性:定义同样的语言可以有多个文法,如果 CFL L 的所有文法都是歧义的,那么称语言 L 是固有歧义的。
判断给定的语言是否歧义是一个不可判定的问题
5.4 文法的化简与范式
前提:不改变语言
步骤:
- 消除无用符号
- 消除ϵ产生式:A→ϵ
- 消除单元产生式:A→B
无用符号:CFG G = (V, T, P, S), 符号X∈(V∪T)

消除无用符号:首先消除全部非产生的符号,再消除全部非可达的符号
产生的符号集:每个T中的符号(终结符)都是产生的,A→α∈P且α中符号都是产生的, 则A是产生的。(从终结符向前寻找)
可达的符号集:符号 S 是可达的,A→α∈P且A是可达的,则α中符号都是可达的。(从起始符向后寻找)
举例:消除如下文法的无用符号:S→AB∣α,A→b:
先消除非产生的:S→αA→b再消除非可达的:S→a
消除ϵ−产生式:
文法中形如$A\rightarrow\epsilon 的产生式称为\epsilon$-产生式
确定空可变元:
- 如果A→ϵ, 则 A 是可空的
- 如果$ B\rightarrow\alpha 且\alpha$中的每个符号都是可空的, 则 B 是可空的
替换产生式:

消除单元产生式:

消除单元产生式:
- 删除全部形为A→B的单元产生式
- 对每个单元对[A, B],将B的产生式复制给A
定理:每个不带ϵ的 CFL 都可由一个不带无用符号, ϵ-产生式和单元产生式的文法定义。
5.4.1 文法化简的可靠顺序
- 消除ϵ-产生式
- 消除单元产生式
- 消除非产生的无用符号
- 消除非可达的无用符号
5.4.2 限制文法格式
乔姆斯基范式CNF:每个不带ϵ的CFL都可由这样的CFG G定义,G中每个产生式都形为
A→BC或A→a
其中A、B和C都是变元,a是终结符
CFG转为CNF的方法:
- 将产生式A→X1X2…Xm(m≥2)中每个终结符a替换为Ca,并增加新产生式Ca→a
- 引入新变元D1,D2,…,Dm−2,将产生式A→B1B2…Bm替换为一组级联的产生式
A→B1D1D1→B2D2...Dm−2→Bm−1Bm
格雷巴赫范式:
每个不带ϵ的CFL都可由这样的CFG G定义,G中每个产生式都形为A→aα
其中A是变元,a是终结符,α是零或多个变元的串
直接左递归:文法中形式为$ A\rightarrow Aα $的产生式, 称为直接左递归
消除直接左递归:
-
若 A 产生式A→Aα1∣Aα2∣…∣Aαn∣β1∣β2∣…∣βm
-
引入新变元B,并用如下产生式替换
A→β1∣β2∣...∣βm∣β1B∣β2B∣...∣βmBB→α1∣α2∣...∣αn∣α1B∣α2B∣...∣αnB
间接左递归:文法中如果有形式为
A→Bα∣...B→Aβ∣...
的产生式, 称为间接左递归。
消除间接左递归:
-
将文法中变元重命名为A1,A2,⋅⋅⋅,An
-
通过代入, 使产生式都形如
Ai→AjαAi→aα
但要求i≤j
-
消除直接左递归Ai→Aiβ, 再代入其他产生式
举例:将以下文法转化为GNF:
S→ABA→BS∣bB→SA∣a

6 下推自动机
6.1 下推自动机
形式定义:PDA,P为七元组
P=(Q,Σ,Γ,δ,q0,Z0,F)
- Q,有穷状态集
-
Σ,有穷输入符号集
-
Γ,有穷栈符号集
-
δ:Q×(Σ∪{ϵ})×Γ→2Q×Γ∗,状态转移函数
-
q0∈Q,初始状态
-
Z0∈Γ−Σ,栈底符号
-
F⊂Q,接收状态集或终态集
本质上是带有栈的ϵ−NFA
举例:


瞬时描述:为描述 PDA 瞬间的格局, 定义Q×Σ∗×Γ∗中三元组
(q,ω,γ)
为瞬时描述(ID),表示此时PDA处于状态q,剩余输入串ω,栈为γ
转移符号:

对 PDA P 的一个合法 ID 序列 (计算):
- 把相同的字符串加到所有ID的输入串末尾, 所得到的计算合法
- 把相同的栈符号串加到所有ID的栈底之下, 所得到的计算合法
- 把所有ID中都未消耗的部分输入串去掉, 所得到的计算合法


6.2 下推自动机接受的语言
PDA P=(Q,Σ,Γ,δ,q0,Z0,F)以两种方式接受语言

如:

此种方式无栈底符号
从终态方式到空栈方式:如果PDA $P_F $以终态方式接受语言L,则存在PDA $P_N $以空栈方式接受L
从空栈方式到终态方式:如果PDA $P_N $以空栈方式接受语言L,则存在PDA $P_F $以终态方式接受L

6.3 下推自动机与文法的等价性
PDA到CFG:

构造与文法等价的 PDA:
如果CFG G = (V, T, P′, S),构造PDA
P=({q},T,V∪T,δ,q,S,∅)
其中,δ为
-
∀A∈V:
δ(q,ϵ,A)={(q,β)∣A→β∈P′}
-
∀a∈T:
δ(q,a,a)={(q,ϵ)}
那么L(G)=N(G)
举例:

构造与 GNF 格式文法等价的 PDA:
如果 GNF 格式的 CFG G = (V, T, P′, S), 那么构造 PDA
P=({q},T,V,δ,q,S,∅)
为每个产生式, 定义δ为:
δ(q,a,A)={(q,β)∣A→aβ∈P′}
举例:

由 PDA 到 CFG:
如果 PDA P , 有 L = N§, 那么 L 是上下文无关语言。
构造与 PDA 等价的 CFG:

6.4 确定性下推自动机
如果 PDA P=(Q,Σ,Γ,δ,q0,Z0,F) 满足
-
∀a∈Σ∪{ϵ},δ(q,a,X)至多有一个动作
-
∃a∈Σ,如果δ(q,a,X)=∅,那么δ(q,ϵ,X)=∅
则称P为确定性下推自动机(DPDA)
DPDA P以终态方式接受的语言L§称为DCFL
DPDA与PDA不等价
正则语言与 DPDA:
定理:如果 L 是正则语言, 那么存在 DPDA P 以终态方式接受 L, 即 L = L§
定义:如果语言 L 中不存在两个不同的字符串 x 和 y,使 x 是 y 的前缀,称语言 L 满足前缀性质
定理:如果有DPDA P且L=N§,当且仅当L有前缀性质且存在DPDA P′使
L=L(P′)
DPDA 与无歧义文法
定理:DPDA P,语言 L = N§,那么 L 有无歧义的 CFG
定理:DPDA P,语言 L = L§,那么 L 有无歧义的 CFG
7 上下文无关语言的性质
7.1 上下文无关语言的泵引理
任何Σ上的所有语言是不可数的
任何Σ上的所有CFL是可数的
语法分析树的大小:
对于乔姆斯基范式文法 G = (V, T, P, S) 的语法树,如果产物为终结符串ω,且树中最长路径的长度是n,那么∣ω∣≤2n−1
上下文无关语言的泵引理:
如果语言L时CFL,那么存在正整数N,它只依赖于L,对∀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}∗}不是上下文无关的

7.2 上下文无关语言的封闭性
代换:两个字母表 Σ 到 Γ 的函数$ s : \Sigma\rightarrow 2^{\Gamma∗} 称为代换,\Sigma中的一个字符a在s的作用下为\Gamma上的一个语言La,即s(a)=L_a,扩展s的定义到字符串,s(\epsilon)={\epsilon},s(xa)=s(x)s(a),再扩展s到语言,对\forall L\subset\Sigma^*,s(L)=\cup_{x\in L}s(x)$
上下文无关语言在并、连接、闭包、正闭包、同态、反转、代换、逆同态下封闭。
CFL 对交/补运算不封闭
若 L 是 CFL 且 R 是正则语言, 则 L∩R 是 CFL
应用举例:

7.3 上下文无关语言的判定性质
可判定的 CFL 问题:
- 空性: 只需判断文法的开始符号S是否为非产生的
- 有穷性和无穷性
- 用不带无用符号的CNF的产生式画有向图
- 变元为顶点, 若有A$\rightarrow $BC,则A到B和C各画一条有向边
- 检查图中是否有循环
- 成员性:利用CNF范式,有CYK算法检查串w是否属于L
CYK算法:
CNF G=(V, T, P, S),以O(n3)时间检查"w=a1a2…an∈L(G)?"
以动态规划的方式,在表中由下至上逐行计算Xij,再检查"S∈X1n?"
计算首行Xii={A∣A→ai∈P}
计算其他Xij={A∣i≤k<j,BC∈XikXk+1,j,A→BC∈P}

举例:CNF G 如下, 用 CYK 算法判断 bbabaa∈L(G)?
S→AB∣BCA→BA∣aB→CC∣bC→AB∣a

7.4 乔姆斯基文法体系
如果文法 G = (V, T, P, S),符号串α∈(V∪T)∗V(V∪T)∗,β∈(V∈T)∗,产生式都形如α→β,即每个产生式的左部α中至少要有一个变元,那么
- 称G为0型文法或短语结构文法
- 若∣β∣≥∣α∣,称G为1型文法或上下文有关文法
- 若α∈V,称G为2型文法或上下文无关文法
- 若α→β都形如A→aB或A→a,称G为3型文法或正则文法
8 图灵机
8.1 图灵机

图灵机M为七元组M=(Q,Σ,Γ,δ,q0,B,F)
- Q:有穷状态集
-
Σ:有穷输入符号集
-
Γ:有穷带符号集,且总有Σ⊂Γ
-
δ:Q×Γ→Q×Γ×{L,R}
-
q0∈Q:初始状态
-
B∈Γ−Σ:空格符号
-
F⊂Q:终态集或接受状态集
图灵机的动作及状态转移图:
有穷控制器处于状态 q,带头所在单元格为符号 X,如果动作的定义为δ(q,X)=(p,Y,L),表示状态转移到了p,单元格改为Y,然后将带头向左移动一个单元格

举例:


瞬时描述:
图灵机虽有无穷长的带, 但非空内容总是有限的. 因此用带上全部的非空符号、当前状态和带头位置, 同时定义瞬时描述(ID)为:
X1X2...Xi−1qXiXi+1...Xn
- 图灵机当前状态q
- 带头在左起第i个非空格符上
-
X1X2…Xn是最左到最右非空格内容
- 为避免混淆, 一般假定Q和Γ不相交
转移符号:
如:

图灵机的语言:
如果M=(Q,Σ,Γ,δ,q0,B,F)是一个图灵机, 则 M 接受的语言为
L(M)={ω∣ω∈Σ∗,q0ω⊢∗αpβ,p∈F,α,β∈Γ∗}
如果 L 是图灵机 M 的语言, 即 L = L(M), 则称 L 是递归可枚举语言
对接受和不接受的输入, 都保证停机的图灵机, 所接受的语言称为递归语言
如果$ f(i_1, i_2, . . . , i_k) 对所有i_1, i_2, . . . , i_k 都有定义,称 f 为全递归函数,被图灵机计算的函数 f(i_1, i_2, . . . , i_k) $称作部分递归函数