CH2 Finite Automata
关于有穷自动机, 包括DFA与NFA的形式化定义, DFA与Language一一对应的证明, 以及DFA与NFA的等价性的证明.
在这一章中, 我们将讨论两类自动机: 确定性有穷自动机(Deterministic Finite Automata)和非确定性有穷自动机(Nondeterministic Finite Automata), 以及与它们密切相关的一类语言: 正则语言(Regular Language).
此时, 正则语言以一种完全相关于自动机的方式被引入. 在下一章, 我们还会引入一类代数符号用于表示正则语言: RE(正则表达式). 同时, 我们会惊讶地发现, 自动机与正则语言的表达能力是完全等价的.
此外,
- 我们介绍了DFA, NFA, ϵ-NFA的定义,
- 以及它们延拓的转移函数的定义.
- 同时, 为了方便处理, 我们定义了 ϵ闭包的概念.
然后, 我们大量应用了自然归纳法, 用于相关的定义和证明. 这一章之后, 我们可以发现,
- DFA与NFA是可以互相转换的,
- ϵ-NFA也可以转换为DFA.
- 同时, 由于这些证明是构造性地, 我们也能够直接地得到具体的转换方式.
2.1节介绍了一个银行的例子, 用于作为一个引入, 对于DFA的思想有一个较为直观的表现. 在此略过
总之, 让我们从确定性自动机DFA开始.
Deterministic Finite Automata
Definition of a Deterministic Finite Automaton
形式化定义: 我们用一个五元组来定义DFA
A=<Q,Σ,δ,q0,F>
- Q: 状态集合, 包括有穷个状态
- Σ: 动作集合, 包括有穷个动作信号
- δ:Q×Σ→Q: 转移函数, 将状态与动作的二元组映射到下一个状态
- q0: 起始状态
- F: 终止状态集合
Simpler Notations for DFA’s
- A transition diagram: 转移图, 用点和边来表示状态与状态的转移.
- A transition table: 用一个状态转移表来表示状态与状态的转移.
Extending the Transition Function to Strings
扩展定义, 从单步的转移函数扩展为对字符串的转移函数. 将延拓出的函数表示为
δ^:Q×S→Q
定义是递归的:
- δ^(q,ϵ)=δ(q,ϵ)=q,
- 对于非空的字符串s:=xa, 定义δ^(q,s)=δ(δ^(q,x),s)
- 上面的定义很自然, 此处不作赘述.
- 定义延拓的转移函数是为了方便后续的证明. 转移函数是由已经定义好的五元组自然导出的结果.
- 实际推导中, 我们可以用转移矩阵反复相乘, 以求得各个长度字符串所对应的延拓转移函数
The Language of a DFA
直观上, 所有在DFA上运行后, 能够处于接收态的字符串, 都属于DFA所导出的L集合. 形式化地:
L(A)={w∣δ^(q,w)∈F}
- 此处, 我们对于一个已定义的DFA导出了一个语言集合L(A).
- 后面我们还会发现, 对于一个定义好的语言集合L(A), 同样能相应地导出一个DFA.
Nondeterministic Finite Automata
- 对于同一个输入, 能够同时转移到多个状态; 对于接收条件的判断, 只要终止时所处在的状态集合中, 包含有至少一个接收状态即可.
- 可以将其理解为"能够随意猜测方向, 且总是能猜对"的DFA.
形式化地, 我们同样定义一个五元组
A=<Q,Σ,δ,q0,F>
- Q: 状态集合, 包括有穷个状态
- Σ: 动作集合, 包括有穷个动作信号
- δ:Q×Σ→2Q: 转移函数, 将状态与动作的二元组映射到下一个状态. 此处, 对于单个状态和单个输入信号, 返回的是一个状态集合而非单个状态.
- q0: 起始状态
- F: 终止状态集合
The Extended Transition Function
对于延拓的转移函数, 由于原始转移函数在输出层面引入了状态的集合, 所以在对于延拓之后的转移函数, 其输入输出中的状态都是一个集合, 而非单个状态元素.
形式化地, 同样给出其归纳定义:
- δ^(q,ϵ)=δ(q,ϵ)={q},
- 对于非空的字符串s:=xa, 假定δ^(q,x)={q1,q2,...,qk}, 定义δ^(q,s)=∪ikδ(qi,s)
The Language of an NFA
由于此时对于某个字符串 w和状态机 NFA, 导出的结果是一个状态集合. 所以, 我们不能通过 qw∈F来判断是否终止.
此时的判断条件变更为 Qw∩F=∅是否成立.
形式化地
L(A)={w∣δ^(q0,w)∩F=∅}
Equivalence of Deterministic and Nondeterministic Finite Automata
等价性证明. 大致的思想是: 显式地考虑NFA在状态转移时产生的状态集合, 并将它们建模为一个DFA中的状态, 从而得到NFA到DFA的转换.
形式化地:
对于给定的NFA N=(QN,Σ,δN,q0,FN), 我们考虑一个DFA D=(QD,Σ,δD,{q0},FD). 然后, 我们归纳地定义DFA的状态集合, 转移函数, 以及接收状态集合.
其中:
- δD(S,a)=∪p∈SδN(p,a)
- QD 是 QN的一个子集, 由初始状态 {q0}不断进行转移, 最终闭包产生. 状态个数的上界是 2n, 但是在大多数场景下, 被访问到的集合数目往往不会达到指数级别.
- FD={Q∈QD∣Q∩QN=∅}
QD 更加形式化的定义为:
QD(0)={q0},QD(i+1)=∪a∈ΣδD(QD(i),a)
QD=∪i∞QD(i)
在完成上面的定义后, 我们形式化地证明其等价性. 这个定理的证明是构造性的, 所以只是对定义的不断应用.

- 要证定理成立, 即证 L(D)=L(N).
- 要证集合相等, 需要从两方面证明. 我们要证明对于任意的字符串 w∈Σ∗, w∈L(D)等价于 w∈L(N)
- 即 δN^(q0,w)∪FN=∅等价于 δD^(q0,w)∈FD
为此, 我们先证明: 对于两个状态机, 延拓后的转移函数接收到相同的字符串时, 会给出相同的集合作为结果.
我们归纳地开始证明. 对于字符串的长度作归纳:
- 对于空字符串的情况, 根据定义显然有 δN(q0,ϵ)={q0}, δD({q0},ϵ)={q0}. 合乎条件.
- 对于任意字符串 w:=xa, 假定δN^(q0,x)=δD^({q0},x)={q1,q2,...,qk}=Q, 根据定义可以得到 δN^(q0,w)=δD^({q0},w)=δD^(Q,a)=∪ikδN(qi,s).
因此, 对于任意的输入字符串 w, 我们有
δN^(q0,w)=δD^({q0},w)
于是根据定义, δN^(q0,w)∪FN=∅等价于 Q∩QN=∅ 等价于 Q∈FD等价于 δD^(q0,w)∈FD.
于是对任意 w∈Σ∗, w∈L(D)等价于 w∈L(N) Q.E.D.

此时需要证明双向箭头. 箭头的一个方向在上面的定理中已经完成了证明; 另一个方向的箭头是显然的: 只需要将DFA的转移函数的输出转变为集合的形式即可(这些集合都是单元素集).
Q.E.D.
A Bad Case for the Subset Construction

可以发现, 这个NFA接收这样的语言, 语言中所有字符串的倒数第n个字符为1, 其余字符不做要求.
显然, 这个NFA转换得到的DFA至少需要包含 2n个状态, 用于存储倒数n个字符的情况. 我们可以通过反证法, 利用鸽笼原理完成这个证明:
- 假设我们有一个DFA, 它接收上述的语言, 并且状态数目小于 2n.
- 此时, 我们发现, 对于字符串 a=anan−1...a2a1, b=bnbn−1...b2b1, δ^(q0,a)=δ^(q0,b) 当且仅当 a=b. 下面我们对这个论断进行证明:
- 对于论断"当 a=b时, δ^(q0,a)=δ^(q0,b) ", 这是显然的.
- 对于论断"当 a!=b时, δ^(q0,a)!=δ^(q0,b) , 我们采用反证法证明: 假设 a!=b , 此时必定有一个i使得 ai!=bi. 此时, 我们假设δ^(q0,a)=δ^(q0,b), 同时构造出新的两个字符串 a′=anan−1...aici−1...c2c1, b′=bnbn−1...bici−1...c2c1. 由于两个字符串添加的是同一个尾缀, 同时 δ^(q0,a)=δ^(q0,b), 那么必定有 δ^(q0,a′)=δ^(q0,b′). 但是这是不可能的, 因为 a′,b′的接收状态一定是相反的.
- 于是, 由于n位字符串 a可能有 2n种, 同时 当 a!=b时, δ^(q0,a)!=δ^(q0,b) , 于是根据鸽笼原理, 这个DFA的状态也至少有 2n个.
Q.E.D.
An Application Text Search
一些实际应用. 在实际的搜索引擎中, 大部分的场景下我们都不会使用状态机作为实际的搜索机制, 但是, 对于特定的场景下, DFA和NFA的应用是有可能的.
不过我们往往将Automata作为一个理论上的推导工具来使用, 所以在此跳过这个小结.
Finite Automata With Epsilon Transitions
- 此时, 我们对NFA进行延拓, 使得它能够接收空字符作为转移的信号
- 某种程度上, 可以将其理解为"在没有信号时, 也会自动地发生转移"的NFA
形式化地, 我们同样定义一个五元组
N=<Q,Σ,δ,q0,F>
此时几乎所有的定义都与NFA相同, 不同的是此处我们采用的转移函数的定义域为Σ∪ϵ, 即, 它可以接受空的字符作为转移信号.
Epsilon Closures
- 在完成了上面的定义之后, 我们同样地要对转移函数做延拓. 为了达到这个目的, 我们定义
Epsilon Closures
的概念.
- 某种程度上, 它将"那些会自动地发生转移的区域"视为一个整体, 然后进行处理.
对于某个状态 q, 它的 Epsilon Closures 是归纳定义的:
- q∈ECLOSE(q)
- ECLOSE(q)=ECLOSE(q)∪(∪p∈ECLOSE(q)δ(p,ϵ))
Extended Transitions and Languages for ϵ-NFA’s
根据上面的ϵ-闭包定义, 我们自然地可以得出对于ϵ-NFA的延拓转移函数. 它同样是归纳定义的:
- δ^(q,ϵ)=ECLOSE(q),
- 对于非空的字符串s:=xa, 假定δ^(q,x)={q1,q2,...,qk}, 定义δ^(q,s)=ECLOSE(∪ikδ(qi,s))
- 相当于, 每次转移完毕之后, 都要对转移的结果作一次闭包操作.
- 定义是非常自然的, 只是形式化表述花点功夫.
Eliminating ϵ-Transitions
对于这样添加了空字符的NFA, 同样的可以将其构造为一个等价的DFA.
具体而言, 大体上类似之前在NFA时所做的subset construction操作, 只是做了空字符串相关的闭包处理.
形式化地, 给出一个ϵ-NFA: E=(QE,Σ,δE,q0,FE), 我们构造一个对应的DFA:
D=(QD,Σ,δD,qD,FD)
其中,
- QD: 仍然是原始NFA的状态子集的集合. 不同的是, QD中的每个元素都是一个 ϵ闭包
- qD=ECLOSE(q0)
- FD={S∣S∈QD,S∩FE=∅}
- δD(S,a)=ECLOSE(∪qi∈SδE(qi,a))

采用同样的思路, 通过定义一步步推导即可得到.
- 要证定理成立, 即证 L(D)=L(E).
- 要证集合相等, 需要从两方面证明. 我们要证明对于任意的字符串 w∈(Σ∪ϵ)∗, w∈L(D)等价于 w∈L(E)
- 即 δE^(q0,w)∪FE=∅等价于 δD^(ECLOSE(q0),w)∈FD
为此, 我们先证明: 对于两个状态机, 延拓后的转移函数接收到相同的字符串时, 会给出相同的集合作为结果.
我们归纳地开始证明. 对于字符串的长度作归纳:
- 对于空字符串的情况, 根据定义显然有 δE(q0,ϵ)=ECLOSE(q0), δD(ECLOSE(q0),ϵ)=ECLOSE(q0). 合乎条件.
- 对于任意字符串 w:=xa, 假定δE^(q0,x)=δD^(ECLOSE(q0),x)={q1,q2,...,qk}=Q, 根据定义可以得到 δE^(q0,w)=ECLOSE(∪qi∈QδE(qi,a))=δD(Q,a)=δD^(ECLOSE(q0),w).
因此, 对于任意的输入字符串 w, 我们有
δN^(q0,w)=δD^(ECLOSE(q0),w)
于是对任意 w, δE^(q0,w)∪FE=∅等价于 δD^(ECLOSE(q0),w)∈FD
于是对任意 w∈Σ∗, w∈L(D)等价于 w∈L(E) Q.E.D.
总结
- Deterministic Finite Automata
- Transition Diagrams
- Language of an Automaton
- Nondeterministic Finite Automata
- The Subset Construction: 将NFA转换为DFA的方法.
- ϵ-Transitions: 延拓NFA后得到的状态机. 依然保持了等价性. 此时引入闭包操作用于消去ϵ
- Text Searching Applications: Nondeterministic nite automata are a useful way to represent a pattern matcher that scans a large body of text for one or more keywords. These automata are either simulated directly in software or are first converted to a DFA, which is then simulated
ps. 这一篇东西拖了老半天. 从9.25新建文件夹, 到10.22才写完. ww