Deterministic Finite Automata
Definition
(Deterministic Finite Automata, DFA) 用五元组 (K,Σ,δ,s,F) 表示:
- K 是由状态构成的有限集合。
- Σ 是字母表/字符集。
- s∈K 是起始状态。
- F⊆K 是接受状态的集合。
- δ:K×Σ→K 为状态转移函数。
Note
(State Diagram of FA)
【占位:FA 状态图示例】
Configuration
Tip
为了描述机器处理字符串的动态过程,我们需要引入格局 (Configuration) 的概念。
(DFA Configuration) 一个属于 K×Σ∗ 的元素 (q,w),这里 q 是 DFA 的当前状态 (current state),w 是剩余未读的字符串 (remaining unread string)。
Derivation
(DFA One-Step Derivation) 定义一种格局间的二元关系 ⊢M 来描述消耗一个字符进行转移的过程,用英文说是 (q,w) yields/derives (q′,w′) in one step。需要满足:
(q,w)⊢M(q′,w′)⟺∃a∈Σ, w=aw′,并且 δ(q,a)=q′
Note
这里 w 和 w′ 只能相差开头的一个字符,即我们进行这一步推导所消耗的字符。
在此基础之上定义 ⊢M∗ 描述消耗 0 个或任意 n 个字符进行转移的过程,⊢M∗ 是 ⊢M 的自反传递闭包 (reflexive, transitive closure)。若 (q,w)⊢M∗(q′,w′),则可以说 (q,w) yields/derives (q′,w′)。
(DFA Acceptance) 字符串 w∈Σ∗ 能被有限自动机 M 接受 (accepted),当且仅当存在状态 q∈F 满足 (s,w)⊢M∗(q,ε)。被 M 接受的语言(字符串构成的集合)称为 L(M)。
Warning
注意:空串 ε 能被接受,当且仅当起始状态 (start state) 是接受状态 (accepting state)。
Example
设计一个接受语言 L1={w∈{a,b}∗:w does not contain three consecutive b’s} 的 DFA。
【占位:不包含连续三个 b 的 DFA 示例】
Example
设计一个接受语言 L2={w∈{a,b}∗:w contains three consecutive b’s} 的 DFA。
【占位:包含连续三个 b 的 DFA 示例】
Warning
这里的两种语言 L1,L2 可以记为 L2=Σ∗−L1。
Nondeterministic Finite Automata
Definition
Tip
DFA 要求每一步都转移到确定的状态,这在设计复杂语言的自动机时很麻烦,因此我们引入转移有多种路径可选的 NFA,并会证明 DFA 和 NFA 是等价的。
(Nondeterministic Finite Automata, NFA) 用五元组 (K,Σ,Δ,s,F) 表示:
- K 是由状态构成的有限集合。
- Σ 是字母表/字符集。
- s∈K 是起始状态。
- F⊆K 是接受状态的集合。
- Δ⊆K×( Σ∪{ε} )×K 为状态转移关系。
Note
在 DFA 中,状态转移 δ 是一个函数 (function),但在 NFA 中,状态转移 Δ 是一个关系 (relation)。
特别地,在 NFA 的状态转移关系中,我们允许空移动 (e-move),即不消耗字符从一个状态转移到另一个状态 (q,ε,p)。
为以下语言设计 NFA
DFA/NFA Equivalence
(DFA/NFA Equivalence) 任给一个 DFA,都存在与其等价的 NFA,反之亦然。
Proof
⟹:DFA 显然是 NFA,只需要将 (k,a)↦s′∈δ 改写为 (k,a,s′)∈Δ 即可。
⟸:为了构造等价的 DFA,我们引入等价状态的概念:从某一状态 q 出发,只通过 e-move(不消耗字符的转移)能够到达的状态集合
E(q)={p∈K:(q,ε)⊢M∗(p,ε)}
是这一状态的等价状态。先不给出证明,构造等价 DFA M′ 的方法如下——通过将状态集拓展为原先的幂集,使转移变成从一组等价状态到另一组等价状态:
- K′=2K,即原来状态的幂集。
- Σ′=Σ,字母表不变。
- s′=E(s),即原始状态的等价集合。
- F′={Q∣Q⊆K,Q∩F=∅},即所有与原来的终止状态有交集的集合。
- 对于任意集合 Q⊆K 和 a∈Σ,令
δ(Q,a)=⋃{E(p)∣q∈Q,(q,a,p)∈Δ}
为了证明构造的 DFA 与给定的 NFA 等价,需要证明 w∈L(M)⟺w∈L(M′)。为此,先给出一个更强的断言:
(q,w)⊢M∗(p,ε)⟺(E(q),w)⊢M′∗(P,ε),p∈P
也就是说,如果在 NFA 中状态 q 可以通过消耗字符串 w 转移到状态 p,那么在等价 DFA 中,q 的等价状态 E(q) 可以通过字符串 w 转移到一个包含 p 的状态 P。这是因为在 NFA 中,别的转移可能到达更多的可能状态。
在这个断言的基础上,可以证明:
w∈L(M)⟺(s,w)⊢M∗(f,ε), f∈F⟺(E(s),w)⊢M′∗(Q,ε), f∈Q⟺(s′,w)⊢M′∗(Q,ε), Q∈F′⟺w∈L(M′).
只需证明上面的强断言。因为不知道字符串 w 的长度,可以使用数学归纳法:
Basis Step:若 w=ε 是空串(∣w∣=0),则 q 能转移到的 p 都包含在其等价状态 E(q) 中;对应到 DFA 中,就是 E(q) 经过 0 步推导到自身,即 p∈P=E(q)。
Induction Step:设 ∣w∣=k+1,w=va,其中 a∈Σ、v∈Σ∗。分别证明两个方向。
⟹:在 NFA 的转移过程中,存在两个中间状态 r1,r2,使得
(q,va)⊢M∗(r1,a)⊢M(r2,ε)⊢M∗(p,ε).
【占位:DFA/NFA 等价证明的归纳步骤(正向)】
⟸:
【占位:DFA/NFA 等价证明的归纳步骤(反向)】
给定 NFA,构造等价 DFA
先通过 e-move 把等价状态构建出来。
【占位:由 NFA 构造等价 DFA 的示例】
Regular Language
Tip
正则表达式是一种描述性的语言,可以方便我们定义什么串是合法的。稍后我们会证明正则表达式和 DFA/NFA 等价。
Regular Expression
(Regular Expression) 在字母表 Σ 下,可以通过以下方式构造正则表达式:
- ∅ 和 a∈Σ 是正则表达式。
- 若 α 和 β 是正则表达式,则 (αβ) 也是正则表达式。
- 若 α 和 β 是正则表达式,则 (α∪β) 也是正则表达式。
- 若 α 是正则表达式,则 α∗ 也是正则表达式。
Note
- 三种积木:空集 ∅、空串 ε 和单字符 a∈Σ;
- 三种胶水:并 ∪/+、连接、Kleene Star ∗。
正则表达式的性质
- S∪R=R∪S
- R(ST)=(RS)T
- R(S∪T)=RS∪RT,(R∪S)T=RT∪ST
- ∅∗={ε}
- (R∗S∗)∗=(R∪S)∗
Regular Language
(Regular Language) 能被正则表达式 r∈R 表示的语言 L 是正则语言。
FA/RL Equivalence
(FA/RL Equivalence) 正则语言和自动机能识别的语言是等价的。一个语言是正则语言,当且仅当它可以被一个有限自动机 M 识别,记为 L=L(M)。
Note
为了证明这一点,我们将给出:
- 给定任意正则表达式,将其递归地转化为 FA 的方法。
- 给出任意 FA,将其递归地转化为正则表达式的方法——先将其转化为 GFA,再缩到只有两个点,这时所剩唯一边上的正则表达式就是该 FA 所识别的正则表达式。
RL Closure Properties
Tip
在考试中,我们经常需要判断“一个语言是不是正则的”。通过正则语言的封闭性,我们可以构造一些显然是正则语言的语言,然后通过运算得到需要判断的语言。
(正则语言的封闭性) 自动机能接受的语言在并、连接、Kleene Star、补、交运算下封闭。
通过证明这一定理,我们实际上得到了把正则表达式转换为 DFA 的方法。
Proof
- 并 (union):构造一个新初始状态 s′,这个状态可以通过 e-move 到两个 NFA 的初始状态。
- 连接 (concatenation):只需要把前一个 NFA 的所有终止状态通过 e-move 连到后一个 NFA 的起始状态即可。
- Kleene Star:本质上只需要增加一条从终止状态到起始状态的回路,但由于还可能识别 0 次,所以还需要增加一个新的初始状态。
【占位:并运算的 NFA 构造】
- 补 (complementation):只需要反转 DFA 的终止状态集合,即令 F′=K′∖F。这一步需要在 DFA 而不能在 NFA 上操作,因为 NFA 的拒绝条件是所有路径都到不了终止状态。
- 交 (intersection):由 De Morgan’s Law 可以得出在补集和并集下封闭蕴含了在交集下封闭:
L(M1)∩L(M2)=Σ∗∖((Σ∗∖L(M1))∪(Σ∗∖L(M2))).
Example
判断给定语言是否为正则语言。
【占位:正则与非正则语言示例】
Example
证明 L={w∈{a,b}∗:w 中 a,b 的数量相等} 不是正则语言。
Proof
已知 Lknown 是正则语言。如果 Ltarget 也是正则语言,那么 Ltarget∩Lknown 也必须是正则语言。如果交集是一个已知的非正则语言,则假设不成立,Ltarget 一定是非正则语言。
直接用 Pumping Lemma 证明比较麻烦,因为 a,b 可以按任意顺序穿插。取正则语言 R=a∗b∗,则
L∩R={anbn∣n≥0}.
但 {anbn∣n≥0} 是已知的非正则语言,因此 L 一定不是正则语言。
Generalized Finite Automaton
(广义有限自动机, Generalized Finite Automaton, GFA) MG=(KG,ΣG,ΔG,sG,FG) 是从 NFA M=(K,Σ,Δ,s,F) 拓展得到的:
- GM 只有一个终止状态。
- ΣG=Σ∪R0,其中 R0 是一个有限的正则表达式集合。即边不仅可以是单个字符,也可以是一个正则表达式。
- ΔG⊆K×(Σ∪{ε}∪R)×K:GM 的转移可以通过空串、字母或者正则表达式来表示。
- 规范化约束:没有进入初始状态或者离开终止状态的转移。
(DFA/NFA to GFA) 为满足 GFA 中新增的规范化约束,需要添加新的起始状态与终止状态,并在它们和原来的起始状态、终止状态之间添加 e-move,中间的边不需要改动。
【占位:DFA/NFA 转换为 GFA】
因为 M 和 MG 的语言没有变化,L(M)=L(MG),因此称两者等价,记为 M≈MG。
(FA/GFA to Regular Expression) 若一个语言能被某个自动机接受,那么它能被一个正则表达式识别。
Proof
给定 DFA 或 NFA,都可以转化为等价的 GFA。逐步消除 GFA 的中间状态,直到只剩下两个节点和一条边;此时唯一边上的正则表达式 r 就是这个 GFA 所识别的正则语言,记为 L(M)=r。
简流版:依次删除 GFA 中的节点。入边和出边通过连接 (concatenation) 合并,然后把对应起点、终点之间已有的表达式通过并 (union) 与新构造的表达式合并。如果删除的节点有自环,则对应 Kleene Star 运算。
形式化版:给定 FA M,把 M 的所有状态排成序列 K:q1,q2,…,qn。
定义
R(i,j,k)={w∈Σ∗:(qi,w)⊢M,k∗(qj,ε)},
表示所有从 qi 到 qj 的路径所构成的字符串,其中路径经过编号小于等于 k 的点 q1,…,qk。注意 R(i,j,0) 表示不经过任意中间状态,只能直接相连。
因为
L(M)=⋃{R(1,j,n):qj∈F,q1=s},
所以只需证明所有 R(i,j,k) 都是正则语言,就能证明 L(M) 是正则语言。接下来使用归纳法构造正则表达式。
【占位:GFA 消除状态的归纳构造】
所有添加了第 k 个点后新增的路径,肯定都经过了 k 这个点至少一次;由于也可能经过多次,因此需要 Kleene Star。
Nonregular Languages
Tip
前面我们讨论了有限自动机能做什么(正则语言),但还有很多有限自动机不能做的语言,即不是正则语言的语言。这是学习计算理论课程中非常关键的一步——划定计算模型的边界。
正则语言的数量是可数无穷 (countably infinite) 的,而语言的数量是不可数的。
一些不是正则语言的例子(zq 说都需要记忆)
Pumping Lemma
(Pumping Theorem) 设 L 是正则语言,则存在整数 n≥1,使得对于任意字符串 w∈L,若 ∣w∣≥n,则可以将其写成 w=xyz,并满足:
- y=ε;
- ∣xy∣≤n;
- 对于所有 i≥0,均有 xyiz∈L。
可以利用 Pumping Lemma 和反证法来证明一个语言不是正则的。 具体来说,对于任意的 n,都需要给出串 w 的构造,使得无论怎样将 w 切分为 w=xyz,都能找到一个 w′=xyiz 不在 L 里。
Note
AI 把使用这个反证的过程比喻为一个游戏过程:
- 假设 (Assumption):假设 L 是正则语言(为了反证)。
- 对手出招 (n):因为假设正则,根据泵引理,对手给出一个泵长度 n。
- 注意:你不知道 n 是多少,只能把它当成一个符号处理。
- 你出招 (w):选择一个属于 L 且长度至少为 n 的字符串 w。
- 策略:选择一个“即使有环,一旦重复就会破坏结构”的特殊字符串。通常选包含 n 的串。
- 对手出招 (xyz):对手把 w 切成三段 xyz。
- 限制:对手必须遵守 ∣xy∣≤n 和 y=ε,但具体 x,y,z 是什么由对手决定。
- 策略:因为不知道对手怎么切,后续证明必须对所有可能的切分都成立。
- 你出绝招 (i):选择重复次数 i,构造新串 w′=xyiz。
- 判定 (Contradiction):如果能证明新串 w′∈/L,就产生了矛盾,说明原假设错误,L 不是正则语言。
Example
证明 L={aibi∣i≥0} 不是正则语言。
【占位:使用 Pumping Lemma 证明 aibi 非正则】
通过在前面放连续 n 个 a,使得 y=ai。
Comments