2.3 正则表达式
用正则运算符构造描述语言的表达式,称为正则表达式。
- 正则表达式的值是一个语言。
- 连接符常常被省略。
- 在正则表达式中,先做星号运算,然后做连接运算,最后做并运算。除非用括号来改变顺序。
注意:不要混淆了正则表达式与。表达式表示只包含一个字符串的语言,而表示不包含任何字符串的语言。
举几个典型的例子:
{恰好有一个1}
{至少有一个1}
{是偶数长度的字符串}
{}
空集与任何集合连接得空集
{}
2.3.2 与有穷自动机的等价性
定理 2.28 一个语言是正则的,当且仅当可以用正则表达式描述它。
引理 2.28 如果一个语言可以用正则表达式描述,则它是正则的。
将正则表达式转换成一台NFA。(这里要自己会画图转换哦,只要清楚规则,很简单的。具体步骤可以看P41-P42)
注:这种过程的转换一般不能给出状态最少的NFA。
引理 2.32 如果一个语言是正则的,则它可以用正则表达式描述。
由于是正则的,故它被一台接受。证明过程需要分为2个部分。一是,把转换成为;二是,如何把转换成正则表达式。
1)广义非确定型有穷自动机就是非确定型有穷自动机,只是转移箭头可以用任何正则表达式作标号,而不是只能用字母表的成员或作标号。
2)读输入符号段,而不是像一次只能读一个符号。
3)是非确定性的,可能有几种不同的方式处理同一个输入串。如果它的处理能够使得在输入结束处进入一个接受状态,则接受它的输入。
- 起始状态有射到其他每一个状态的箭头,但是没有从任何其他状态射入的箭头。
- 有唯一的一个接受状态,并且它有从其他每一个状态射入的箭头,但是没有射到任何其他状态的箭头。并且,这个接受状态与起始状态不同。
- 除起始状态和接受状态之外,每一个状态到自身和其他每一个状态都有一个箭头。
将转化为
- 首先,添加一个新的起始状态和一个接受状态,从新起始状态到老起始状态添加一个有的箭头,从每一个老接受状态到新接受状态添加一个有的箭头。
- 其次,如果两个状态之间有多个方向相同的箭头,则把它替换成一个标记着原先标记的并集的箭头。
- 最后,在没有箭头的状态之间添加标记的箭头。
将转化为正则表达式
- 设这台有个状态,由于必须有一个起始状态和接受状态,并且这两个状态不同,所以。
- 如果,则构造一台有个状态的等价的。重复这个步骤,直到只含有两个状态时为止。这个过程称为
- 当时,箭头的标记就是等价的正则表达式。
注意⚠️:删去每一个中间状态时,要改动每一个留下来的箭头上标记的正则表达式。新标记要表示两状态间的正则表达式以及通过删去的中间状态到达目标状态的正则表达式。(防粗心的小技巧:通过中间状态的那条“路”内使用「连接」,与本来没有中间状态的那条“路”之间使用「并」。)
2.33 广义非确定型有穷自动机
广义非确定型有穷自动机是一个5元组,其中
1)是一个有穷的状态集。
2)是字母集。
3):是转移函数(使用转移函数定义动作规则)。
4)是起始状态。
5)是接受状态。
断言 2.34 对于任意的,等价于。
(用数学归纳法来证明,假设断言对个状态为真,证明对于个状态断言为真。)
通过上述算法将转化为正则表达式,可以参考书上P46的两个例子。理解了上面的算法再看具体实例,就一目了然啦~加油!
2.4 非正则语言
这一节主要证明某些语言不是正则的。
注意⚠️:看起来需要无穷的存储并不意味着一定需要无穷的存储。比如:在字母表上的语言:{中01和10作为子串出现的次数相同},是正则的。
关于正则语言的泵引理
- 性质:语言中的所有字符串只要它的长度不小于某个特定的值–泵长度,就可以被“抽取“。即将这段子串重复任意次的子串仍在这个语言中。
- 如果能够证明一个语言没有这个性质,则保证它不是正则的。
定理2.37 泵引理
设是一个正则语言,则存在一个数(泵长度)使得,如果是中任一长度不小于的字符串,那么可以被分为3段,,满足下述条件:
1)对每一个,
2)
3)
其中,指的字符串长度,是个相连接,等于。
关于泵引理,可以参考我之前的一篇文章:https://mp.weixin.qq.com/s/qt03G2s-l5nWB7mRcysqNw
为了用泵引理证明某个语言B不是正则的:
- 首先假设是正则的,以便得出矛盾。
- 其次在中寻找一个字符串,它的长度大于等于。
- 最后,证明不能被抽取。(需要考虑把划分成、和的所有方式,找到一个值使得)
具体实例可以参考书P49-P51
在这里,我举一个例子。
例 2.39 设{中和的个数相同},用泵引理证明不是正则的。
证明:采用反证法。假设是正则的。令是泵引理给出的泵长度。取是字符串。由于是的一个成员且长度大于,泵引理保证可以被分为3段,,使得对任意,字符串在中。我们想证明这个结果是不可能的。
因为必须保证,所以一定只由0组成,从而。因此s不可能被抽取。
例 2.40 令{} 用泵引理说明是非正则的。
证明:假设是正则的。令是泵引理给出的泵长度。设是字符串。因为是的一个成员,并且的长度大于,故泵引理保证可以被分为3段,,满足引理中的三个条件。要证明这个结果是不可能的。
因为一定仅由组成,故 。
注意⚠️:在选取的时候要非常小心,因为有些是能被抽取的,有些是不能抽取的。我们必须把不能抽取的找出来才能推翻它是正则的。只要存在不能被抽取的字符串,就说明它是非正则的。