形式语言与自动机
带有空转移能力的非有限状态自动机
状态的空转移
一个举例:
设计L=ω∈{0,1}∗∣ω倒数3个字符至少有一个是1的NFA
DFA:
NFA:
空转移的NFA:

由此得出定义:

注意状态转移的输入发生了变化,包含了空输入。其余与NFA定义一致。
正则表达式
递归定义
我们可以定义一个四则运算:
-
任何数都是四则表达式;
-
如果a和b是四则运算表达式,那么a,b满足:
都是四则运算.
由此我们可以得出正则表达式的递归定义:

语言的运算

运算优先级
这里着重说明“*”的用法:

*表示被“*”修饰的表达式任意组成
给出正则表达式(aa)*(bb)*b定义的语言.
L((aa)∗(bb)∗b)=L((aa)∗)L((bb)∗)L(b)=({a}{a})∗({b}{b})∗b={a2}∗{b2}∗{b}={a2nb2m+1∣n>=0,m>=0}
化简规则

自动机和正则表达式的等价性
若L=L(A)是某DFA A的表达式,那么存在正则表达式R满足L = L (R).
我们需要构造一个和正则表达式等价的自动机来完成这一点的证明。

递归表达式

我们可以得出普遍的状态转移图如上,比如得到接受状态需要通过输入x和y,那么R = x + y,由此我们知道R应当是所有初始状态到接收状态路径的集合,我们要用正则表达式构造这个表达。
更一般的,R应该是通过更多个输入到达接受状态,我们可以画出以下图像:

其中Rij表示从i节点到j节点的路径,Rij(k),表示不经过k的i到j的路径,我们推断任意两节点的路径可以用以下表达:
Rij=Rij(K)+Rik(k)(Rk(k))∗Rkj(k)
递归到直接相连的两个节点。
将DFA的状态从1开始编号,1为初始状态:

那么与A等价的正则表达式为:
j∈F⋃R1j(n)
递归表达为:
Rij(k)=Rij(k−1)+Rik(k−1)+(Rkkk−1)∗Rkj(k−1)
Rij0=⎩⎨⎧a∣δ(qi,a)=qj,i=ja∣δ(qi,a)=qj,∪{ϵ},i=j
证明递归表达式正确:






