2.3 正则表达式

用正则运算符构造描述语言的表达式,称为正则表达式。

  • 正则表达式的值是一个语言。
  • 连接符常常被省略。
  • 在正则表达式中,先做星号运算,然后做连接运算,最后做并运算。除非用括号来改变顺序。

注意:不要混淆了正则表达式ε\varepsilonϕ\phi。表达式ε\varepsilon表示只包含一个字符串ε\varepsilon的语言,而ϕ\phi表示不包含任何字符串的语言。

举几个典型的例子:
010=0^* 10^* = {www\mid w恰好有一个1}
Σ1Σ=\Sigma^* 1\Sigma^*= {www\mid w至少有一个1}
(ΣΣ)=(\Sigma\Sigma)^*= {www\mid w是偶数长度的字符串}
(0ε)1=(0\cup \varepsilon)1^* = {01,1001,10}
1ϕ=ϕ1^* \phi=\phi 空集与任何集合连接得空集
ϕ=\phi^*= {ε\varepsilon}

2.3.2 与有穷自动机的等价性
定理 2.28 一个语言是正则的,当且仅当可以用正则表达式描述它。
引理 2.28 如果一个语言可以用正则表达式描述,则它是正则的。

将正则表达式转换成一台NFA。(这里要自己会画图转换哦,只要清楚规则,很简单的。具体步骤可以看P41-P42)
注:这种过程的转换一般不能给出状态最少的NFA。

计算理论导论|正则语言(下)正则表达式、泵引理

引理 2.32 如果一个语言是正则的,则它可以用正则表达式描述。

由于AA是正则的,故它被一台DFADFA接受。证明过程需要分为2个部分。一是,把DFADFA转换成为GNFAGNFA;二是,如何把GNFAGNFA转换成正则表达式。
1)广义非确定型有穷自动机就是非确定型有穷自动机,只是转移箭头可以用任何正则表达式作标号,而不是只能用字母表的成员或ε\varepsilon作标号。
2)GNFAGNFA读输入符号段,而不是像NFANFA一次只能读一个符号。
3)GNFAGNFA是非确定性的,可能有几种不同的方式处理同一个输入串。如果它的处理能够使得GNFAGNFA在输入结束处进入一个接受状态,则接受它的输入。

GNFAGNFA
  • 起始状态有射到其他每一个状态的箭头,但是没有从任何其他状态射入的箭头。
  • 有唯一的一个接受状态,并且它有从其他每一个状态射入的箭头,但是没有射到任何其他状态的箭头。并且,这个接受状态与起始状态不同。
  • 除起始状态和接受状态之外,每一个状态到自身和其他每一个状态都有一个箭头。
DFADFA转化为GNFAGNFA
  • 首先,添加一个新的起始状态和一个接受状态,从新起始状态到老起始状态添加一个有ε\varepsilon的箭头,从每一个老接受状态到新接受状态添加一个有ε\varepsilon的箭头。
  • 其次,如果两个状态之间有多个方向相同的箭头,则把它替换成一个标记着原先标记的并集的箭头。
  • 最后,在没有箭头的状态之间添加标记ϕ\phi的箭头。
GNFAGNFA转化为正则表达式
  • 设这台GNFAGNFAkk个状态,由于GNFAGNFA必须有一个起始状态和接受状态,并且这两个状态不同,所以k2k\geq 2
  • 如果k>2k> 2,则构造一台有k1k-1个状态的等价的GNFAGNFA。重复这个步骤,直到只含有两个状态时为止。这个过程称为CONVERT(G)CONVERT(G)
  • k=2k=2时,箭头的标记就是等价的正则表达式。

注意⚠️:删去每一个中间状态时,要改动每一个留下来的箭头上标记的正则表达式。新标记要表示两状态间的正则表达式以及通过删去的中间状态到达目标状态的正则表达式。(防粗心的小技巧:通过中间状态的那条“路”内使用「连接」,与本来没有中间状态的那条“路”之间使用「并」。)

计算理论导论|正则语言(下)正则表达式、泵引理

2.33 广义非确定型有穷自动机

广义非确定型有穷自动机GG是一个5元组(Q,Σ,δ,qstart,qaccept)(Q,\Sigma,\delta,q_{start},q_{accept}),其中
1)QQ是一个有穷的状态集。
2)Σ\Sigma是字母集。
3)δ\delta(Qqaccept)×(Qqstart)R(Q-{q_{accept}})\times(Q-{q_{start}})\rightarrow R是转移函数(使用转移函数定义动作规则)。
4)qstartq_{start}是起始状态。
5)qacceptq_{accept}是接受状态。

断言 2.34 对于任意的GNFAGNFACONVERT(G)CONVERT(G)等价于GG

(用数学归纳法来证明,假设断言对k1k-1个状态为真,证明对于kk个状态断言为真。)

通过上述算法将DFADFA转化为正则表达式,可以参考书上P46的两个例子。理解了上面的算法再看具体实例,就一目了然啦~加油!

2.4 非正则语言

这一节主要证明某些语言不是正则的。

注意⚠️:看起来需要无穷的存储并不意味着一定需要无穷的存储。比如:在字母表Σ=0,1\Sigma={0,1}上的语言:D=D={www\mid w中01和10作为子串出现的次数相同},是正则的。

关于正则语言的泵引理
  • 性质:语言中的所有字符串只要它的长度不小于某个特定的值–泵长度,就可以被“抽取“。即将这段子串重复任意次的子串仍在这个语言中。
  • 如果能够证明一个语言没有这个性质,则保证它不是正则的。
定理2.37 泵引理

AA是一个正则语言,则存在一个数pp(泵长度)使得,如果ssAA中任一长度不小于pp的字符串,那么ss可以被分为3段,s=xyzs=xyz,满足下述条件:

1)对每一个i0i\geq 0xyizAxy^iz \in A
2)y>0|y|>0
3)xyp|xy|\leq p
其中,y|y|指的字符串长度,yiy^iiiyy相连接,y0y^0等于ε\varepsilon

关于泵引理,可以参考我之前的一篇文章:https://mp.weixin.qq.com/s/qt03G2s-l5nWB7mRcysqNw

为了用泵引理证明某个语言B不是正则的:
  • 首先假设BB是正则的,以便得出矛盾。
  • 其次在BB中寻找一个字符串ss,它的长度大于等于pp
  • 最后,证明ss不能被抽取。(需要考虑把ss划分成xxyyzz的所有方式,找到一个ii值使得xyizBxy^iz \notin B

具体实例可以参考书P49-P51

在这里,我举一个例子。
例 2.39C=C={www\mid w0011的个数相同},用泵引理证明CC不是正则的。
证明:采用反证法。假设CC是正则的。令pp是泵引理给出的泵长度。取ss是字符串0p1p0^p1^p。由于ssCC的一个成员且长度大于pp,泵引理保证ss可以被分为3段,s=xyzs=xyz,使得对任意i0i\geq 0,字符串xyizxy^izCC中。我们想证明这个结果是不可能的。
因为必须保证xyp|xy|\leq p,所以yy一定只由0组成,从而xyyzCxyyz \notin C。因此s不可能被抽取。

例 2.40F=F={www0,1ww\mid w \in{0,1}^*} 用泵引理说明FF是非正则的。

证明:假设FF是正则的。令pp是泵引理给出的泵长度。设ss是字符串0p10p10^p10^p1。因为ssFF的一个成员,并且ss的长度大于pp,故泵引理保证ss可以被分为3段,s=xyzs=xyz,满足引理中的三个条件。要证明这个结果是不可能的。
因为yy一定仅由00组成,故 xyyzFxyyz \notin F

注意⚠️:在选取ss的时候要非常小心,因为有些是能被抽取的,有些是不能抽取的。我们必须把不能抽取的找出来才能推翻它是正则的。只要存在不能被抽取的字符串,就说明它是非正则的。

相关文章:

  • 2022-02-18
  • 2022-12-23
  • 2022-12-23
  • 2021-12-29
  • 2022-12-23
  • 2021-12-22
  • 2021-08-15
猜你喜欢
  • 2022-12-23
  • 2021-07-29
  • 2021-11-29
  • 2022-12-23
  • 2021-10-09
  • 2021-10-12
  • 2021-12-31
相关资源
相似解决方案