文档详情

正则表达式和有限自动机

小**
实名认证
店铺
DOC
336KB
约14页
文档ID:159799665
正则表达式和有限自动机_第1页
1/14

第二部分正规语言和有限自动机语言往往是无限集,但描述的方法往往是有限的,一种方法是描述如何通过字符串操作由简单的字符串产生整个语言,或者描述如何通过集合操作由简单语言产生复杂语言另一种方法是描述识别字符串是否属于某个语言的机制,也就是描述一个算法过程本书考察的最简单的语言类是正规语言,正规语言能够通过应用有限次的某个标准操作从一元语言产生正规语言能够被有限自动机识别,有限自动机是空间严格受限的简单机器在第二部分,我们还考察正规语言的另外一些特点:1)导出将一种语言的描述翻译成另一种语言的描述的算法;2)使用形式化方法描述语言;3)正规语言在实际中的应用3正则表达式和有限自动机3.1正则语言和正则表达式注意:regularlanguage和regularexpression有时也翻译成正规语言和正规表达式正则语言可以从非常简单的表达式得到,初始语言的字符串为空或单字母,仅使用合并、连接和Kleene连接运算,因此正则语言可用一个清楚的表达式描述,通常用小括号()代替大括号{},+代替u,称为正则表达式下面是一些定义在字母表{0,1}上的正则表达式,通过这些例子,能够感受到书写正则表达式的一些规律。

语言相应的正则表达式{,},{0}0{001}或{0}{0}{1}001{0,1}或{02{1}0+1{0,10}或{02{10}0+10{1,,}{001}(1+,)001{110}*{0,1}(110)*(0+1){1}*{10}1*10{10,111,11010}*(10+111+11010)*{0,10}*({11}*u{001,,})(0+10)*((11)*+001+,)我们认为正则表达式表示的是相应语言的“最典型的字符串”,比如,1*10表示一个字符串,它以10结束,前面可以有任意多个数目的1我们在前面将正则语言描述成:在最简单的语言上仅仅使用三种运算合并、连接、Kleene连接所得到的语言这种描述预示了正则语言的递归定义(参见2.4节)下面递归定义不仅定义了语言,而且定义了正则表达式定义3.1字母表工上正则语言类R,及其相应的正则表达式定义如下:1. 空集,(即空语言)是正则语言,表达式是,2. {A}仅有空串的语言是正则语言,表达式是A3. 每个aeZ,{a}是正则语言,表达式是a4. 如果L1和L2是正则语言,表达式是r1和r2,则(a) L1UL2是正则语言,表达式是rl+r2。

b) L1L2是正则语言,表达式是r1r2c) L1*是正则语言,表达式是rl*只有应用上面4条规则产生的语言才是字母表工上的正则语言对上面的解释做些解释为了保持一致性和连贯性,空语言被认为是正则语言后面许多地方将提到这样的说法:对于每个…,都对应一个正则语言如果空语言不属于正则语言,那么每个这样的说法还需要排除空语言这种特殊情况,带来不简洁的说法为了书写简洁,省去大量的括号,我们规定正则表达式中运算符的优先级次序是Kleene*、连接、合并同时我们借用一些代数表达式的符号,如指数幂等原表达式简洁表达式(rr)r2(a+((b*)c))a+b*c((r*)r)r+同样借助代数学的记号,两个表示不同语言的正则表达式可以使用符号工,比如:(a+b)*丰a+b*我们还可以借用符号=来化简正则表达式,如正则表达式的化简1*(1+A)=1*1*1*=1*0*+1*=1*+0*(0*1*)*=(0+1)*(0+1)*01(0+1)*+1*0*=(0+1)*其中一些化简用到的规则可以从集合运算规则得到,但另有一些是字符串运算特有的,目前我们还没有发现这种化简的系统的方法(或形式化方法),但上面的例子预示了化简的巨大作用。

比如最后一行的例子,两个看似很复杂的语言,它们的并集却很简单问题:存不存在化简正则表达式的形式化方法(既是否存在化简正则表达式的通用算法)?是否存在最简洁的正则表达式?朱洪来信:我的印象中,它是NP-完全的问题PleaselookatGareyandJohnson'sbook:computerandintractibility.例子3.1语言Lu{0,1}*,由所有长度为偶数的字符串组成,(由于0是偶数,因此空串,属于L),问:L是否是正则语言?如果是,L对应的正则表达式是什么?解答:任何一个偶数长度的字符串都由多个(或0个)长度为2的字符串连接而成,而字母表{0,1}上的长度为2的字符串只可能是4个:00、01、10、11,因此L可定义如下:L={00,01,10,11}*它的正则表达式是:(00+01+10+11)*或((0+1)(0+1))*例子3.2L是定义在字母表{0,1}上的包含奇数个1的字符串组成的语言,问L的正则表达式是什么?解答:显然L中的字符串至少有一个1,因此一定有这样的前缀0i10j,其后则有偶数个(或0个)1,因此可分解成多组10m10n的形式由此得到L的正则表达式:包含奇数个1的字符串组成的语言0*10*(10*10*)*以最左的1为基准(10*10*)*0*10*以最右的1为基准(10*10*)*0*10*(10*10*)*以中间的某个1为基准0*1(0*10*1)*0*考虑最左1之后的后缀(0*10*1)*0*10*0*(10*10*)*1(0*10*1)*0*错误的表达式有:(10*10*)*10*例子3.3L是字母表{0,1}上所有长度小于等于6的字符串组成的语言,问L的正则表达式?解答:由于L中的元素是有限的,最简单的方法是枚举法:A+0+1+00+01+...+111110+111111而表示长度为n的字符串组成的语言的表达式是:(0+1)(0+1).(0+1)=(0+1)n因此一些简洁的表达式如下:所有长度小于等于6的字符串组成的语言,+(0+1)+(0+1)(0+1)+...+(0+1)(0+1)(0+1)(0+1)(0+1)(0+1),+(0+1)+(0+1)2+...+(0+1)6(,+0+1)6例子3.4L={x以1结束且不包含子串00Ixe{0,1}*},问L的正则表达式?解答:字符串不包含00,则说明其中的每个0不能后接0,而且0不能是串尾字母,因此每个0后面必定是1,既符合条件的字符串包含大量的01片断,其间是许多1,因此初步得到的表达式是:(1+01)*但空串不符合条件,修正得到:(1+01)*(1+01)=(1+01)+注意:(1+01)*1不对,漏掉了01情况。

€例子3.5C语言的标志符的组成的语言的正则表达式解答:C语言的标志符由3种符号组成:英文字母、数字和下划线而且第一个字符只能是字母或下划线因此:(a+b+...+z+A+B+...+Z+_)(a+b+...+z+A+B+...+Z+0+1+...+9+_)*我们令l是表示字母的集合,d是表示数字的集合,即:l=a+b+.+z+A+B+.+Zd=0+1+.+9则上式的简洁表达式是:(l+_)(l+d+_)*例子3.6(暂空)3.2识别语言所需要的空间语言的识别(或字符串的识别,recognize)问题是一个成员资格判定问题,即判定一个任意给定的字符串是否属于某个语言为了以后讨论问题的方便,给出一些约定首先限制成从左至右的一次扫描(这简化了整个识别过程中应该记住的信息总量的讨论,也利于根据每步记住的信息量多少对语言分类),其次判别对象是一个特定的字符串除了扫描完成后,给出最后的判别(是或否),在每一步也给出假设判别,当前的假设判别反映了已扫描的前缀的情况最后的判别可以看成最后的、最新的假设判别先看看人是怎么完成识别任务,然后设计自动机完成这项任务问题是,为了给出假设判别,我们应该记住多少前缀信息。

这里有两种极端的情况:1)记住所有的前缀2)什么也不记忆在某些情况下,我们确实可以什么也不记,如判别语言©和,*,前者我们忽略每步输入,一律回答“否”;后者则一律回答“是”但多数情况下,我们必须记住一些信息,应该记住的不是字符串本身,而是字符串表达的判别信息称为有限自动机的原因是所需的空间是有限的比如分别输入两个字符串x和y,得到不同的答案这说明我们一定记住了一些不同的信息当分别输入x和y时,否则我们无法区别这两个字符串,因此通常情况下,为了识别某个语言,我们必须记住一些信息,而记住这些信息则需要一定的空间例子3.7语言L定义在字母表{0,1}上,由以10结尾的字符串组成分析:显然判定(decision)一个字符串是否属于语言L,只需要考察该字符串的最后两个字符,因此在字符串输入识别过程中,只需要记住当前最后的两个字符,而之前的所有字符可以忽略字母表{0,1}上的两个字符组成的字符串只有4种,因此本例所需空间为4个单位,当然后面会看到还可进一步减少记住的信息,从而节省空间例子3.8语言L定义在字母表{0,1}上,由包含偶数个0和奇数个1的字符串组成分析:显然,整个输入过程中,不需要记住输入的字符串的具体内容,一种方法是记住当前输入的0和1的个数,更简单的方法是记住当前输入的0和1的个数的奇偶性,而这只有4种可能,因此本例的判定过程所需空间是4个单位。

参见图3-1,77页)例子3.9语言L={x以1结束且不包含子串00Ix€{0,1}*}(参见例子3.4)分析:假设在当前输入的字符串中发现了00子串,则我们只需要记住这个事实,不管前面已经读过和后面将输入的字符串是什么,能够肯定该字符串不属于L,不妨将这种情况记为N再考虑另两种情况,情况0是最后一个字符是0,情况1是最后一个字符是1出现情况0时,如果又看到一个0,则转到情况N,而情况0和情况1时看到1都转到情况1,情况1时看到0转到情况0这三种情况能够判定所有非空的字符串了,为了判定空字符串,还需要增加一个特殊的情况显然所有的情况都专注于记住最后一个字符,和是否出现或有可能出现00子串本例需要的空间是4个单位,参见图3-1将例子3.8和3.9的讨论用一个图(图3-1)来总结,它像一个流程图,或展示了我们上面判定过程的算法图中每个圆表示一种情况,是我们需要记住的关键信息,因此圆的多少表示了记住信息的多少,也表示了判定过程中需要的总的空间的多少每个图中有一个起始的圆(由一个没有源的箭头指示),输入的字符串从起始圆开始,沿着箭头流动(转移)到下一个圆,每一次流动消耗一个字符,当字符消耗完(即读完所有字符),所停在的圆揭示了输入字符串与图表示的语言的关系,如果圆是双圈,则说明该字符串被接受,或属于这个语言,否则不属于这个语言。

有了这样的图后,任何人或机器不用理解图中每个节点的具体含义,只要按照上面描述的机械的步骤动作,就能完成字符串的判定工作,因此刻画了一种“抽象机”,我们不关心这种机器的实现细节,比如它的驱动动力来自什么,它表示接受的具体信号是什么?我们关心的是它所揭示的一种形式化的过程(或算法),我们称它为自动机将要证明能够被这种自动机识别的语言是正则语言,下面的例子显示存在语言无法被这种自动机识别,因此存在非正则语言,而且我们将来的结论是非正则语言大量存在,尽管3.1节显示的正则表达式具有灵活且强大的描述能力例子3.10语言L是例子2.16中描述的回文语言pal分析:L的每个字符串相同于它的反写字符串,因此从描述上看,这似乎是一种很简单的语言,但是从判定过程所需要的空间而言,它完全不同于例子3.7到3.9中的语言对于任意两个不同的字符串x和y,都存在一个字符串z,使得xz属于L,而yz不属于L(证明见后),因此需要区别的字符串是无穷多,自动机需要的空间是无穷多,因此L不是有限自动机能够识别的语言分三种情况讨论:1. x和y长度相同,则令z=xr;2. x比y短,设y=y]y2,其中y1与x同长,令z=wwrxr,且wzy2,则xz是回文,而yz不是回文。

3. 类似情况2形式化的方法(即从计算机的角度)定义语言的复杂程度,而不是人脑的感觉来判定语言的复杂程度,一些人脑感觉简单的语言,如回文,可能是计算机认为的复杂语言;反过来,一些计算机容易处理的语言却可能是人脑难以把握的另外,计算机定义语言是从判定的角度而不是从语言的产生或大小等等角度进行的3.3有限自动机(finiteautomata)从3.2节的例子很容易导出有限自动机的正式定义定义3.2:有限自动机(finiteautomata,FA)是一个5元组(Q,€,q0,8,A),其中1)Q是一个有限集,其元素称为状态€是有限字母表,其元素是输入符号„)q0…Q,是初始状态4)AcQ,是接受状态集5)8是转移函数,从Qx€到Q这种定义在其他数学概念定义中很少见,数学家R.P.Boas曾在发表在theAmericanMathematicalMonthly的题为CanWeMakeMathematicsIntelligible?的文中写到:Thereisatestforidentifyingsomeofthefutureprofessionalmathematiciansatanearlyage.Therearestudentswhoinstantlycomprehendasentencebeginning“LetXbeanorderedquintuple(a,T,冗,a,B),where..."Theyareevenmorepromisingiftheyadd,“Ineverreallyunderstooditbefore.”但这是计算机科学,尤其是形式语言和自动机理论中很喜爱采用的定义形式,很象是描述了一个机器的5个部件,或程序设计语言中对象的定义。

且不管它的数学含义,或是否一个5元组如何成为一个机器,它确实提供了一个有效的标记方法例子3.11(例子3.7的进一步讨论)画出识别语言L={0,1}*{10}的有限自动机见图3-2我们可以简化图3-2所示的FA考虑状态0和状态00,它们都不是接受状态,而且无论下一个字符是0还是1,都进入同一个状态(0进入状态00,1进入状态01),因此状态0和状态00可以合并(不妨称为A),不会改变自动机识别的语言同理,状态1、状态01和状态11能够合并成一个状态(不妨称为B),更进一步,新状态A可以和状态A合并最后简化后的自动机只有3个状态,见图3-3简化后的自动机显然更简洁和深刻地体现了语言的本质特征,图3-3中的状态B含义是发现当前字符为1,满足了10结尾的一半要求,状态10则表示满足了全部要求正如正则表达式可以简化,有限自动机也可以简化寻找简化的形式化方法删除有限自动机的死状态是简化的一个有效方法例子3.11的简化方法存在形式化的方法,5.2节会具体介绍前面提到了自动机的状态转换,定义了输入一个字符的转移函数,下面形式化定义输入字符串的转移函数,很容易想到递归定义,首先需要知道字符串的递归定义。

显然字符串递归定义的起点是空串A,长度为n的字符串由长度为n-1的前缀和最后一个字符构成,即x=ya陶晓鹏Copyright20037语言与计算理论导引正则表达式和有限自动机定义3.3M=(Q,€,qO,8,A),函数5*的递归定义:1) q,Q,8*(q,A)=q2) 8*(q,ya)=8(8*(q,y),a)讨论,也可以认为长度为n的字符串由第一个字符和长度为n-1的后缀构成,即x=ay则定义3.3的递归部分也可以写成:2)8*(q,ay)=8*(5(q,a),y)但通常认为定义3.3使用更方便根据图3-4的自动机,计算5*(q,abc)解答1:8*(q,abc)=8(8*(q,ab),c)=8(8(8*(q,a),b),c)=8(8(8*(q,Aa),b),c)=8(8(8(8*(q,A),a),b),c)=8(5(5(q,a),b),c)=8(8(q1,b),c)=8(q2,c)=q3解答2:8*(q,abc)=8*(q,abc)=8*(8(q,a),bc)=8*(q1,bc)=8*(5(q1,b),c)=8*(q2,c)=8*(5(q2,c),A)=8*(q3,c)=q3根据定义3.3,有如下的结论:1. 8*(q,a)=8(q,a),a是单个字符2. 8*(q,xy)=8*(8*(q,x),y),x、y是字符串,可以用数学归纳法证明,参见练习3.25有了字符串转移函数的定义,我们能够形式化定义什么是自动机接受的字符串和自动机接受的语言。

定义3.4存在自动机M=(Q,€,q0,8,A),字符串x被M接受当且仅当5*(q0,x),A,否则称为x被M拒绝,被M接受或识别的语言是,L(M)={xlx被M接受}字母表€上的语言L,被自动机M接受(accepted)或识别(recognized)的充分必要条件是L=L(M)注意:此处没有区分接受(accepted)和识别(recognized)这两种提法有限自动机接受的语言是由所有被M接受的字符串组成,而不是部分有限自动机的能力不体现在它的状态数,不体现在它能接受的字符串的个数,体现在它的鉴别能力,它接受什么样的字符串,拒绝什么样的字符串如果给定一个语言L,构造接受L的自动机M,它接受所有属于L的字符串,拒绝所有不属于L的字符串,而不仅仅是接受属于L的字符串,否则图3-5所示的自动机接受所有的语言,失去了自动机研究的意义定理3.1一个语言是正则语言当且仅当被一个有限自动机接受Kleene定理,后面证明)定理3.1揭示了,一方面,给定一个有限自动机M,存在一个正则表达式E表示M所接受的语言,即L(M)=L(E);另一方面,给定一个正则表达式E,存在一个有限自动机接受E所表示的语言第4章Kleene定理的证明将给出构造正则表达式和有限自动机的形式化方法。

这里先给出一些仅凭直觉就能解决的简单例子,有助于导出最后的形式化方法例子3.12参见图3-6,构造它接受语言的正则表达式分析:逐个分析自动机的每个接受状态,然后分析接受状态的所有到达路线本例有两个接受状态A和B,状态A接受的语言是(00)*,状态B接受的语言是(00)*11(11)*,则整个自动机接受的语言是:(00)*+(00)*11(11)*=(00)*(11)*例子3.13考虑图3.7所示的自动机分析:先找到自动机接受的最短的字符串,baaa,进一步发现所有的状态读入b都会转入状态B,从起始状态A到达接受状态E的路径只有一条,即ABCDE,因此此自动机接受的字符串的特征是以baaa结尾,得到正则表达式如下:(a+b)*baaaABCDEAa*bb*a*bb*aBb*aCbaDbaEabABCDEAa*bb*a*bb*aa*bb*aaBb*aCbaDbaEabABCDEAa*bb*a*bb*aa*bb*aaa*bb*aaaBb*aCbaDbaEabABCDEAa*bb*a*bb*aa*bb*aaa*bb*aaaBb*b*(ab)*ab*aab*aaaCbb*bb*aaDbb*bb*abb*aaa+bb*aaaEabb*bb*(ab)*aABCDEAa*bb*a*bb*a(bb*a)*a*bb*aaa*bb*aaaBb*b*(ab)*ab*aab*aaaCbb*bb*aaDbb*bb*abb*aaa+bb*aaaEabb*bb*(ab)*a往往是循环里面有循环,分支里面有分支,循环里面有分支,分支里面有循环,这样产生的表达式将会很复杂。

因此目前形式化方法得到的正则表达式并不实用,有赖进一步发现简化的方法先给初始状态赋初值,然后扩展到其他状态,然后反馈回来,反复迭代计算,直到最后稳定下来,计算停止,一个关键点是如何比较两个正则表达式例子3.14反过来,给定正则表达式r=(ll+110)*0,构造有限自动机接受语言L(r)分析:空串不属于语言L,因此初始状态q0不是接受状态,0属于语言L,因此存在从初始状态到接受状态标记为0的转移另外,1和€是可区分字符串(存在字符串110,使得1110被拒绝,而110被接受),因此输入1和€,状态q0应该到达不同的状态,称输入1后的状态为r,因此至少存在3个状态,见图3-8a如果字符串前缀为0或10,则无论后续字符串是什么,都不属于语言L,引入一个状态s,记录字符串判定中到达失败状态,一旦到达s,则不再离开继续分析状态r,由于字符串1和11是可区分的(利用字符串10),而且11与0和€都是可区分的,因此需要再加一个状态t,同样发现可区分字符串110,增加状态u,这样得到两个接受状态我们发现没有新的可区分状态了,因此不用再添加状态了,剩下的任务就是完善各个状态的转移函数上面的方法称为hit-or-miss,只要需要,就添加新状态,直到不再添加新状态,构造自动机的过程才停止。

定理3.1保证了构造正则表达式表示的语言的自动机的过程能够最终完成,即状态数是有限的现在方法的最大难点是判断是否需要加入新状态,如果不需要,那么哪个已有状态是合适的?第4章描述的形式化方法将避开这个难点3.4区别字符串利用有限自动机识别语言的基础是自动机不需要区分所有的字符串,不需要在识别过程中记住前缀的具体内容,正如上节例子显示,自动机状态用来区分那些需要区分的字符串有限自动机仅仅判别字符串是否属于某个语言,不需要区别不同的字符串,因此不需要记住输入的整个字符串有限自动机不同状态的数目与不同字符串的数目相关下面我们形式化这种思想,并揭示状态数与区分字符串数之间的关系定义3.5给定字符串x和y,如果存在字符串z,使得xz和yz只有一个属于语言L,则称z在语言L上区分x和y如果不存在z,则称x和y在L上是不可区分的根据定义3.5,如果x和y是不可区分的,则对任意的字符串z,xz和yz到达同样的状态,同时被接受,或同时被拒绝例如语言L={xe{0,1}*Ix以10结尾}(参见例子3.7),字符串01011和100在L上是可区分的,因为存在z=0,区分这两个字符串,而0和100是不可区分的引理3.1M=(Q,,,q0,8,A)识别语言L,如果字符串x和y,8*(qQ,x)=8*(qQ,y),则x和y在L上不可区分。

证明:设z是,上的任意一个字符串,分别考察xz和yz,根据练习3.25,8*(q0,xz)=8*(8*(q0,x),z)8*(q0,yz)=8*(8*(q0,y),z)根据条件,€*(q0,xz)=€*(q0,yz)可见xz和yz要么同时被M接受,要么同时被拒绝,因此x和y在M所识别的语言L上是不可区分的定理3.2假设n个字符串在语言L上两两可区分,那么识别L的有限自动机的状态数不少于n证明:设这n个在L上两两可区分的字符串是X],x2,…,xn,存在一个识别L、状态数小于n的自动机M,那么根据鸽笼法则,€*(q0,x/、€*(q0,x2)、...、€*(q0,x)中必定存在i和j,使得€*(q0,xi)=€*(q0,x.)0根据引理3.1,xi和x.不可区分,与前提矛盾,即假设不成立,状态数少于n的识别L的有限自动机不存在1J定理3.2提供了一个估计有限自动机状态数下限的办法同时如果能够证明语言L有无穷个可区分的字符串,则说明L不是有限自动机能够接受的语言,也不是正则语言例如回文语言就不是正则语言0例子3.15语言Ln={xe{0,1}*Ilxl>=n,且从右数起的第n个字符为1}分析:一个直观的方法是,给每个长度小于等于n的字符串构造一个状态(参见例子3.11),这样自动机能够记住当前输入字符串的最后n个字符,当然也记住了倒数第n个字符。

长度为n的字符串共有2n个,那么长度小于等于n的字符串共有:20+21+.+2n=2n+1-1这就是总的状态数,图3-9显示了识别n=3的语言的自动机,它的转移函数很简单:€(abc,d)=bcd也许其他方法能够发现更简单(状态数大大少于2n+1-1)的自动机,但根据定理3.2我们能够证明接受语言L的自动机至少需要2n个状态,因为长度为n的字符串在L上两两可区分,nn即至少存在2n个可区分的字符串设x和y是两个长度为n的不同的字符串,它们在从右数第i个字符不同(1=viv=n),任意选取一个长度为n-i的字符串z,则xz和yz的右数第n个字符不同,因此有且只有一个属于语言Ln,x和y可区分定理3.2保证了识别某个语言L的任何自动机的状态数不少于某个常数,如果对任何一个常数n,都能证明任何识别L的自动机的状态数都不少于n,则说明在L上存在无限多的可区分字符串,没有有限自动机能够识别它,这种语言也不是正则语言0反过来,如果能够证明L上有无限多个可区分字符串,就能证明不存在接受L的有限自动机,L不是正则语言引申例子3.10,我们得到定理3.3,这也是我们显示的第一个非正则语言0定理3.3字母表{0,1}上的回文语言pal(palindromes)是非正则的。

证明:根据例子3.10,字母表上的任何两个字符串都是可区分的,因此存在无限多的可区分字符串,根据定理3.2,pal不是正则语言在第5章,我们考察其他一些非正则语言,并提出其他方法去判定语言的正则性,定义3.5将再次出现,可以用来很好地描述“最小状态”自动机的概念3.5并集、交集和补集设L1和L2都是字母表工上的正则语言,则存在有限自动机M]和M2分别接受-和L2(根据定理3.1),同时另外三种语言L],L2、L]L2和L]*也是正则语言(根据定义3.1),因此也存在接受这三种新语言的有限自动机,一个问题很自然提出来:接受新语言的有限自动机能否根据M1和M2构造出来?有关连接和Kleene连接运算的问题我们到第4章后再讨论,此处讨论合并运算,容易看到,合并运算的处理方法稍作修改就能处理交集和差集运算设M1=(Q1,工,q1?片,A)且M2=(Q2,工,q2,笃,人2),现在要构造FAM接受语言L1,L2,显然如果M在识别字符串x的每一步都能记住足够多的信息,并最终知道x与L1和L2的关系,那么M就能判定x与语言L1,L2的关系我们可以将M的状态设计成一个二元组(p,q),用它来同时跟踪M1和M2的状态转移,其中p„Q1,q„Q2,(p,q)„Q1xQ2,M的初始状态是(q1,q2),分别来自M1和M2的初始状态,M的转移函数定义如下:8((p,q),a)=(51(p,a),82(q,a))现在我们来确定接受状态集。

x被M接受,即它或者被M1接受,或者被M2接受,因此状态(p,q)是接受状态,当且仅当p、q中至少有一个分别在M1和M2中是接受状态对于交集语言L1CL2,则要求p和q同时为接受状态,差集语言可做类似处理定理3.4已知接受语言L1和L2的有限自动机分别是M1和M2,则构造识别两种语言的并集、交集和差集的方法如下:设M1=(Q1,工,q1,51,A1),M2=(Q2,工,q2,52,A2),得到M=(Q,工,q0,5,A)Q=Q1xQ2q0=(q1,q2)5((p,q),a)=(51(p,a),52(q,a))1) 如果A={(p,q)Ip„A1或q„A2},则M接受语言L1,L22) 如果A={(p,q)Ip„A1且q„A2},则M接受语言L1cL23) 如果A={(p,q)Ip„A1且q《A2},则M接受语言L1-L2证明:只要证明对任意字符串x和M的状态(p,q),都成立:5*((p,q),x)=(51*(p,x),52*(q,x))这可以用数学归纳法证明有了这个等式就能够很容易证明上面三个结论,下面以1)为例说明字符串x被M接受,当且仅当5*((q1,q2),x)„A,当且仅当(51*(q1,x),52*(q2,x))„A,根据1)的条件,当且仅当51*(q1,x)„A1或52*(q2,x)„A2,即x被M1或M2接受。

因此x„L1,L22)和3)可类似证明现在差集运算的一个特殊情况,设语言L1是全集Z*,那么差集L1-L2就是L2的补集L2',根据图3-5,我们知道存在接受工*的有限自动机,因此接受L2'的有限自动机能够根据定理3.4中的差集方式构造出来更简单的方法是交换M2中的接受状态集和非接受状态集,即M2,=(Q2,€,q2,52,Q2-A2)定理3.4尽管提供了形式化方法,但构造的自动机往往比较繁琐(这是许多形式化方法的通病),举例如下例子3.16设有下面两个定义在字母表{0,1}上语言:L1={x|x不含00子串}L2={x|x以01结尾}接受它们的自动机见图3-10a,为了构造接受L1,L2的自动机,首先构造初始状态(A,P),然后从初始状态出发,计算转移函数的各种结果,如5((A,P),0)=(51(A,0),52(P,0))=(B,Q)5((A,P),1)=(51(A,1),52(P,1))=(A,P)产生一个新状态(B,Q),再计算新状态的转移函数结果,整个过程直到没有新状态加入才停止,最后确定接受状态,本例的接手状态是(A,P)和(B,Q),参见图3-10b根据定理3.4的方法生成的状态集显然太大了,有些状态无法从初始状态到达,可以省略掉,参见图3-10c。

本例还可以进一步简化,状态(C,P)、(C,Q)、(C,R)都不是接受状态,而且一旦进入这三个状态,就不能出去,可以合并成一个失败状态,简化后的结果参见图3-10d陶晓鹏Copyright200314。

下载提示
相关文档
正为您匹配相似的精品文档