正则语言与有穷自动机
正则表达式的运算符
1、两个语言L和M的并,记作L∪M,是只属于L或属于只属于M,或者同时属于二者的串的集合。这个运算符有时也记作L+M。
2、语言L和M的连接是以下形成的串的集合:取L中任意一个串,与M中任意一个串连接起来。一般用圆点或者根本不用任何运算符来表示两个语言的连接。
3、语言L的闭包(或星,或克林闭包),记作L*,表示用以下方式形成的串的集合:从L中取任意多个串,可能有重复(即可以多次选同一个串),把所有这些串连接起来。更形式化的说,L*是无穷的并Ui≥0Li,其中L0={ε},L1=L,对于i>1,Li是i个L的连接。
正则语言
从RE到ε-NFA
对于正则语言:ε、Ø、a,对应的自动机依次如下
对于正则语言:R|S,对应的自动机如下
对于正则语言:R.S,对应的自动机如下
对于正则语言:R*,对应的自动机如下
下面给出一个例子:
将RE转换成ε-NFA后,可以按照下面的路径将ε-NFA转换成为DFA
RE→ε-NFA→NFA→DFA
从DFA到RE
可以通过状态消除的方法将一个FA转换成为RE,状态消除的方法如下:
合并:
消除顺序状态:
消除循环状态:
下面给出一个例子:
从NFA到正则文法
正则文法:
在前面的博客也有给出文法的定义,在这里,N是指非终止符号集,Σ是指终止符号集。
一个语言L能够被NFA接受,当且仅当这个语言有一个正则文法。
从一个NFA构造出一个等价的正则文法:
下面给出一个例子:
证明一个语言是正则语言
如果能构造出一个接受该语言的有限状态自动机,则是正则语言。
证明一个语言不是正则语言
如果语言L不满足泵引理,则不是正则语言。
泵引理的定义,其中n是一个与语言L相关的常数。
也就是说,我们总能在离w的开始处不太远的地方找到一个非空的串y,然后可以把它作为“泵”,也就是说,重复y任意多次,或者去掉它(k=0的情况),而所得到的结果串依然属于L。
下面给出一个例子:
DFA的最小化 - 填表算法
算法步骤:
下面给出一个例子,将下面的DFA最小化:
第一步,画一个表,然沿对角线画一条线,将对角线以上的部分丢掉(这是因为一个完整的表是沿对角线对称的),同时也要丢掉对角线上的部分,因为对任意的(q, q),不可能有q属于F并且q不属于F。
第二步,将包含终止状态的状态对打上标记,如下
第三步,在状态转换图中找出所有与终止状态相邻的状态。依次检查这些状态,使用上述填表算法进行检查,标记上符合要求的状态对。检查完毕后,再向外扩张,直到每个状态对都被检查过为止。
将所有等价的状态进行合并,即可得到最小化的DFA:
正则语言的封闭性
判定性问题
- 给定一个字符串w和正则语言L,判断w是否属于L
- 给定一个正则语言L,判断L是否为空
- 给定两个正则语言L1和L2,判断L1是否等于L2