正则表达式
定义
(正则表达式)
设 Σ 是一个字母表,定义其上的正则表达式(Regular Expression, RE)如下构建:
- ∅ 是 Σ 上的正则表达式,表示语言 ∅
- ε 是 Σ 上的正则表达式,表示语言 {ε}
- ∀a∈Σ 是 Σ 上的正则表达式,表示语言 {a}
- 如果 r,s 是 Σ 上表达 R 和 S 的正则表达式,则
- r+s 是 Σ 上的正则表达式,表示语言 R∪S
- rs 是 Σ 上的正则表达式,表示语言 RS
- r∗ 是 Σ 上的正则表达式,表示语言 R∗
(正则表达式的等价)
如果对于 Σ 上的正则表达式 r,s,有 L(r)=L(s),则 r=s。
关于正则表达式一条很有趣的性质是 L((r∗s∗)∗)=L((r+s)∗)
RE 与 FA 等价
为了证明这个问题,只需要证明对于任意正则表达式,存在一个 ε-NFA 与之等价;且对于任意 DFA,存在一个正则表达式与之等价。
对于任意正则表达式,存在一个 ε-NFA 与之等价
只要根据正则表达式的构建树,按照下面的规则进行转换即可。
![Figure 1: convert symbol from RE to FA]()
Figure 1: convert symbol from RE to FA
![Figure 2: convert empty string from RE to FA]()
Figure 2: convert empty string from RE to FA
![Figure 3: convert empty set from RE to FA]()
Figure 3: convert empty set from RE to FA
![Figure 4: convert union from RE to FA]()
Figure 4: convert union from RE to FA
![Figure 5: convert concatenation from RE to FA]()
Figure 5: convert concatenation from RE to FA
![Figure 6: convert kleene star from RE to FA]()
Figure 6: convert kleene star from RE to FA
对于任意 DFA 存在一个正则表达式与之等价
首先对 DFA M=(Q,Σ,δ,q0,F) 上的结点进行标号:1,2,…,n。
定义一条 k-路径为 DFA 上的一条路径,其中路径上的点(不包括起点和终点)的标号不超过 k。因此所有路径都是 n-路径。路径上的边构成了一个句子。
记 Rijk 为点 i 到点 j 的所有 k-路径组成的语言,下面开始构造 Rijk。
当 k=0 时
- 如果 i=j,则 Rii0=ε+a1+a2+⋯+an(δ(i,al)=i)
- 如果 i=j,且不存在从 i 到 j 的路径,则 Rij0=∅
- 如果 i=j,且存在从 i 到 j 的路径,则 Rij0=a1+a2+⋯+an(δ(i,al)=j)
当 k>0 时,假设所有 k−1-路径都可以转换成正则表达式
- 则从 i 到 j 的路径有两种选择:不经过 k 或至少经过 k 一次
- 因此 Rijk=Rijk−1+Rikk−1(Rkkk)∗Rkjk−1
根据这个方法可以构造出 Rq0qfn(qf∈F),此时 Rq0qf1n+Rq0qf2n+⋯+Rq0qfmn(fi∈F) 即是答案。
正则语言的性质
泵引理
(Pumping Lemma)
设 RL L 对应的 FA 为 M,则存在一个仅依赖于 L 的正整数 N。如果存在 z∈L 使得 ∣z∣≥n,那么 ∀z∈L,存在 u,v,w 使得:
- z=uvw
- ∣uv∣≤N
- ∣v∣≥1
- ∀i≥0.uviw∈L
- N<∣M∣
设 RL L,DFA M=(Q,Σ,δ,q0,F) 满足 L(M)=L,∣Q∣=N。为方便起见,不妨设 M 中不含不可达状态。
取 z=a1a2…am∈L(m≥N),记 z 在 M 上经过的状态为 qh=δ(q0,a1a2…ah)(1≤h≤m)。
由于 m≥N,因此存在 qi,qj∈Q(1<i<j<m=N) 使得 qi=qj。即
δ(q0,a1a2…ai)=qi
δ(q0,a1a2…aj)=qj=qi
因此 ∀k≥0,δ(qi,(ai+1ai+2…aj)k=qj=qi)
因此,
∀k≥0,δ(q0,a1a2…ai(ai+1ai+2…aj)kaj+1…am)=am
取 u=a1a2…ai,v=ai+1ai+2…aj,w=aj+1aj+2…am
则 ∀i≥0 有
- ∣uv∣≤N
- ∣v∣≥1
![Figure 7: Pumping lemma]()
Figure 7: Pumping lemma
泵引理是 RL 的必要条件,因此只能用来证明某些语言*不是*RL。为了简化证明,一般会构造一个 uv 为同一字符串重复的情况。
证明 L={0n∣n is a prime number} 不是 RL。
设 L 是 RL,则 L 满足 pumping lemma。
设 n 是仅依赖于 L 的正整数,取 z=0n+p∈L,其中 n+p 是素数。由 pumping lemma 知存在 z=uvw 满足条件。由于 ∣v∣≥1,不妨设 v=0k,u=0n−k。且 ∀i≥0,uviw=0n−k+ik+p=0n+p+(i−1)k。
当 i=n+p+1 时,uviw=0(n+p)(k+1) 非素数,矛盾,因此原命题不成立。
Myhill-Nerode 定理
Myhill-Nerode 定理及其证明
设 DFA M=(Q,Σ,δ,q0,F),M 在 Σ∗ 上的关系 RM 定义为
∀x,y∈Σ∗,xRMy⇔δ(q0,x)=δ(q0,y)
并定义
set(q)={x∣x∈Σ∗∧δ(q0,x)=q}
即 ∀x,y∈Σ∗,xRMy⇔∃q∈Q,x∈set(q)∧y∈set(q)
设 L⊆Σ∗,L 在 Σ∗ 上的关系 RL 定义为
xRLy⇔(∀z∈Σ∗,xz∈L⇔yz∈L)
这两个关系分别是在自动机和语言上的等价关系。
设 R 是 Σ∗ 上的等价关系,如果 ∀x,y∈Σ∗.xRy→(∀z.xzRyz),则称 R 是右不变关系(right invariant)等价关系。
根据上面的定义,不难得出 RM 和 RL 是右不变的等价关系。
设 R 是 Σ∗ 上的等价关系,Σ∗/R 的一个元素是 Σ∗ 关于 R 的一个等价类,称 ∣Σ∗/R∣ 称为 R 关于 Σ∗ 的指数(index)。
从定义中不难看出 xRMy⇒xRL(M)y,反之则未必成立。对于 DFA M=(Q,Σ,δ,q0,F),有
∣Σ∗/RL(M)∣≤∣Σ∗/RM∣≤∣Q∣
也就是说按照在自动机分出的等价类(自动机的状态数量),数量大于等于在语言分出的等价类(真实的等价类)。RM 的分类比 RL(M) 的更细,称 RM 是 RL(M) 的加细(refinement)。
(Myhill-Nerode)
下面的三个命题等价:
- L⊆Σ∗ 是 RL
- L 是 Σ∗ 上的一个有穷指数、右不变、等价关系 R 的某些等价类的并
- RL 具有有穷指数
下面通过证明 (1)→(2)→(3)→(1) 来证明。
(1)→(2)
设 L⊆Σ∗ 是 RL,则存在 DFA M(Q,Σ,δ,q0,F) 使得 L(M)=L。令关系 R=RM。
- 由前面的定义知 RM 是 Σ∗ 上的右不变等价关系
- 由 ∣Σ∗/RM∣≤∣Q∣,所以 RM 具有有穷指数
- 如果 x∈L,那么 δ(q0,x)=t∈F。因此 ∀x∈L,x∈set(t)(t∈F),所以 L=∪t∈F(set(t)) 即 L 是 R 的某些等价类的并
(2)→(3),因此需要证明 R 是 RL 的加细,即需要证明 ∀x,y∈Σ∗.xRy→xRLy
由于 R 是右不变的,所以 ∀z∈Σ∗.xzRyz。
又由于 L 是 R 的部分等价类的并,因此 xz∈L⇔yz∈L。
所以 xRLy。
(3)→(1)
设 RL 具有有穷指数,下证存在 DFA M 使得 L(M)=L。
令 M=(Σ∗/RL,Σ,δ,[ε],{[x]∣x∈L}),其中 [x] 表示 x 所在的等价类。
其中对于任意的 ([x],a)∈(Σ∗/RL)×Σ,有
δ([x],a)=[xa]
下面证明 δ 的相容性(是一个函数),即 ∀[x],[y]∈(Σ∗/RL).[x]=[y]→(∀a∈Σ.δ([x],a)=δ([y],a))。
由于 [x]=[y],则 xRLy,又由于 RL 具有右不变形,所以 ∀a∈Σ.[xa]=[ya],成立。因此 M 是一个合法的 DFA。
根据 RL 的定义,∀x∈L.δ(q0,x)∈{[x]∣x∈L}。
Myhill-Nerode 定理的推论
对任意 RL L,在同构意义下,接受 L 的最小 DFA 是唯一的。
设 L 是 RL,其最小 DFA M=(Q,Σ,δ,q0,F) 满足 L(M)=L,显然 M 中不含不可达状态。根据前面的证明,有
∣Σ∗/RM∣≥∣Σ∗/RL∣
下证 M 与 Myhill-Nerode 定理证明中的 M’=(Σ∗/RL,Σ,δ’,[ε],{[x]∣x∈L}) 同构,其中
δ’([x],a)=[xa]
定义映射 f:Q→Σ∗/RL,那么 ∀q∈Q.∃x∈Σ∗.δ(q0,x)=qx。令
f(qx)=f(δ(q0,x))=f(δ’([ϵ],x))=[x]
这样就建立起来从 M 到 M’ 的映射。现在证明 f 是同构映射。
- 首先证明这是合法的函数,即 qx=qy⇒δ’([ε],x)=δ’([ε],y)
- qx=qy⇔δ(q0,x)=δ(q0,y)⇔xRMy⇒xRLy⇔[x]=[y]⇔δ’([ε],x)=δ’([ε],y)
- 证明单射,即 qx=qy⇒δ’([ε],x)=δ’([ε],y)
- qx=qy⇔δ(q0,x)=δ(q0,y),即 x 和 y 在 Σ∗/RM 的不同等价类中
- 如果此时 [x]=[y],那么 ∣Σ∗/RM∣>∣Σ∗/RL∣,这与 M 是最小 DFA 矛盾
- 因此 [x]=[y],即 δ’([ε],x)=δ’([ε],y)
- 证明满射,即 ∀[x].∃qx∈Q.f(qx)=[x]
- ∀x∈L.[x]=δ’([ε],x)⇔∃x∈L.δ(q0,x)=qx
- 证明同态映射。在自动机中,两个状态 q→p 表示为 δ(q,a)=p,因此即需要证明 δ(f(q),a)=f(p)
- 设 δ(q0,x)=q
- f(p)=f(δ(q,a))=f(δ(δ(q0,x),a))=f(δ(q0,xa))=[xa],成立
综上,最小 DFA 都与唯一的 DFA 同构。
DFA 最小化
根据 Myhill-Nerod 定理的推论,可以知道最小 DFA 是唯一的,并且其每个状态都对应了原来的语言中的一个等价类。因此只要合并原来的 DFA 中所有的等价类即可。
在具体计算时,状态 δ’([a1a2…an],x)=δ(a1,x)∨δ(a2,x)∨⋯∨δ(an,x)。
判定性质
(Decision Property)
一类语言的判定性质(decision property)对应于一个算法,这个算法以某个语言的形式化描述为输入,然后判断这个语言是否满足某些性质。
下面将介绍一系列判定性问题,并给出对应的算法。
Membership Problem
给定字符串 w,判定其是否属于某个正则语言 L?
模拟语言在 L 对应的的 DFA 上是否接受即可。
Emptiness Problem
设 DFA M=(Q,Σ,δ,q0,F),L=L(M) 是否为空的充要条件为
∃x∈Σ∗.∣x∣<∣Q∣∧δ(q0,x)∈F
Infiniteness Problem
给定一个正则语言 L,问该语言是否无穷(该语言是否可以描述无穷的字符串)?
构建该语言的 DFA
- 删除所有起点不可达状态
- 删除所有不可达终点的状态
- 判断图上是否有环
设 DFA M=(Q,Σ,δ,q0,F),L=L(M) 是否无穷的充要条件为
∃x∈Σ∗.∣Q∣≤∣x∣<2∣Q∣∧δ(q0,x)∈F
Equivalence Problem
(Product DFA)
对于两个 DFA M1=(Q1,Σ,δ1,q01,F1) 和 M2=(Q2,Σ,δ2,q02,F2),定义其乘积 DFA(product DFA) M1M2=(Q1×Q2,Σ×Σ,δ3,[q01,q02],F3)
其中
- δ3([x,y],a)=[δ1(x,a),δ2(y,a)]
- F3={[x,y]∣(x∈F1)⊕(y∈F2)}
给定两个正则语言 L1,L2,问两个语言是否等价?
构建两个语言对应的 DFA 的 product DFA,如果 product DFA 的语言为空(不存在一个句子其中一个自动机接受而另一个不接受),则说明两个语言等价。
Containment Problem
给定两个正则语言 L1,L2,问是否存在 L1∈L2?
同样使用乘积自动机,将终止条件改为:
F3={[x,y]∣(x∈F1)∧(y∈/F2)}
假设这个乘积自动机存在终止状态,那么说明存在一个 z∈L1∧z∈/L2。此时原命题不成立;反之乘积自动机为空原命题成立。
封闭性
(Closure Property)
一类语言的闭包性质(closure property)指给定这个语言类的一些语言,对于这些语言进行某个操作得到的另一个语言依旧在同一个语言类中。
保持封闭性的运算
可以转换成正则表达式,然后直接用正则表达式表达出来。
利用乘积自动机
- 交集:构建乘积自动机,其中终止状态 F3={[x,y]∣x∈F1∧y∈F2}
- 差集:构建乘积自动机,其中终止状态 F3={[x,y]∣x∈F1∧y∈/F2}
- 补集:正则语言 L 的补集为 Σ∗−L,由于 Σ∗ 是正则语言,因此 L 的补集也是正则语言
利用正则表达式证明。设 RL L 的正则表达式为 E,下面构建它的逆 ER:
- 如果 E 是字符 a∈Σ 或 ε 或 ∅,那么 ER=E
- 如果 E=F+G,那么 ER=FR+GR
- 如果 E=FG,那么 ER=(FG)R=GRFR
- 如果 E=F∗,那么 ER=(FR)∗
根据上面的规则构建的 ER 依然是正则表达式,因此 ER 仍然是 RL。
封闭性可以用来做反证,证明某个语言不是 RL。
令 L1={x∣x contains equal numbers of 0 and 1},证明 L1 不是正则语言。
令 L2={0n1n∣n≥0},由泵引理知 L2 不是正则语言。
令 L3={0∗1∗},显然 L3 也是正则语言
假如 L1 是正则语言,那么 L2=L1∩L3 也是正则语言,矛盾。因此原命题成立。
正则代换
(正则代换)
设 Σ,Δ 是两个字母表,映射
f:Σ→2Δ∗
称为是从 Σ 到 Δ 的代换(substitution),其中 2Δ∗ 表示 Δ 上的语言组成的集合,f 能将一个字母映射到一个语言。
f 的定义域可以扩展到字符串集合 Σ∗ 上,对于 f:Σ∗→2Δ∗,满足
f(s)={{ε},f(x)f(a),s=εs=xa
最后,f 的定义域可以扩展到语言集合 2Σ∗ 上,对于 f:2Σ∗→2Δ∗,满足
f(L)=x∈L⋃f(x)
定义域相当于一个大自动机(对于字符串来说是相当于是自动机上的一条路径),然后使用正则代换将这个大自动机中的每个小节点都替换成一个自动机。
例如设 Σ={0,1},Δ={a,b},f(0)=a,f(1)=b∗,则
- f(010)=f(0)f(1)f(0)=ab∗a
- f(L(0∗(0+1)1∗)=L(a∗(a+b∗(b∗)∗)))=L(a∗b∗)
设 Σ,Δ 是两个字母表,映射 f:Σ→2Δ∗。如果对于 ∀a∈Σ,f(a) 都是 Δ 上的 RL,则称 f 是正则代换(regular substitution)。
可将 f 进行扩展 f:2Σ∗→2Δ∗:
- f(∅)=∅,f(ε)=ε
- ∀a∈Σ,f(a) 是正则表达式
- 如果 r,s 是 Σ 上的正则表达式,则 f(r+s)=f(r)+f(s),f(rs)=f(r)f(s),f(r∗)=f(r)∗
设 Σ,Δ 是两个字母表,映射 f:Σ→2Δ∗ 是正则代换,则 f(L) 也是 RL。
使用归纳法,对 L 对应的正则表达式 r 进行归纳易证。
同态映射
设 Σ,Δ 是两个字母表,映射 f:Σ→Δ∗,如果扩展到 f:Σ∗→Δ∗ 上后有
∀x,y∈Σ∗.f(xy)=f(x)f(y)
则称 f 是从 Σ∗ 到 Δ∗ 的同态映射(homomorphism)。
- 对于 L⊆Σ∗,其同态像为 f(L)=⋃x∈Lf(x)
- 对于 w⊆Δ∗,其同态原像(逆同态)为一个集合 f−1(w)={x∣f(x)=w∧x∈Σ∗}
此处,注意 f(f−1(L))=L,因为有可能 ∃x∈L,∀y∈Σ∗,f(y)=x,但是一定有 f(f−1(L))⊆L。
同态映射是正则代换的特例(同态映射可以看成令正则代换的值域为只包含一个句子的语言,那么这个语言一定是正则语言)。
设同态映射 f:Σ∗→Δ∗。DFA M(Q,Δ,δ,q0,F),L(M)=L。
则 DFA M’(Q,Σ,δ’,q0,F),其中
δ’(q,a)=δ(q,f(a))
要证明 L(M)=L(M’),即证明 δ’(q0,x)∈F⇔δ(q0,f(x))∈F。
下面先证明 δ(q0,f(x))=δ’(q0,x),对 ∣x∣ 进行归纳:
∣x∣=0,显然成立
设 ∣x∣=∣y∣=k 的时候成立,那么当 ∣x∣=∣ya∣=k+1 时,
δ(q0,x)=δ’(q0,ya)=δ’(δ’(q0,y),a)=δ(δ(q0,f(y)),f(a))=δ(q0,f(y)f(a))=δ(q0,f(x))
由归纳知原命题成立,因此 δ’(q0,x)∈F⇔δ(q0,f(x))∈F,即原命题成立。
商
(商)
设 L1,L2⊆Σ∗,则商(quotient)定义为
L1/L2={x∣∃y∈L2,xy∈L1}
从定义可以看出,计算商主要考虑一个语言是否为另一个语言的后缀。
设 L1,L2⊆Σ∗,如果 L1 是 RL,那么 L1/L2 也是 RL。
注意此处并不要求 L2 是 RL。
设 L1 对应的 DFA 为 M(Q,Σ,δ,q0,F)。定义 \(M_2(Q, Σ, δ, q_0, F’),其中
F’={q∣∃y∈L2,δ(q,y)∈F}
显然 L(M’)=L1/L2