1、语言与计算理论导引 上下文无关语言与非上下文无关语言陶晓鹏 Copyright 2003 18 上下文无关语言和非上下文无关语言8.1 上下文无关语言的泵引理从第 6 章到第 7 章,我们给出了两种描述 CFL 的模型,CFG 和 PDA。这两种模型都没有提供直接、明确的方法来判断一个形式语言不是 CFL。然而,正如例子 6.7 对自然语言的一个简单考察,我们发现 CFG 存在描述能力的局限。本节中,我们精确定义和讨论 CFL 的一个性质,它类似于正则语言的泵引理。利用这个性质能够发现许多不是 CFL 的语言。正则语言的泵引理基于这样的事实,如果一个足够长的输入字符串 x 导致 FA 在状态转
2、移中,到达某个状态超过一次,即接受路径上存在回路,根据回路容易将 x 分成三部分,u 是回路之前的字符串,v 是回路的字符串,w 是回路后的字符串,那么在回路上的多次重复,得到的新的字符串也应该被 FA 接受,即对任意的 m=0,uv mw 被 FA 接受。如果我们用 CFG 生成(而不是 PDA 移动)CFL,容易得到类似的观察。设 CFG G 的一个推导出现同一个非终结符的嵌套重复,如下面的形式,S*vAz*vwAyz*vwxyz其中,v, w, x, y, z*。推导过程中,出现了 A*wAy,我们可以多次重复这个推导过程,如S*vAz*vwAyz*vw2Ay2z*vw3Ay3z*.*v
3、wmAymz又由于 A*x,因此所有这类字符串 vxz, vwxyz, vw2xy2z, ., vwmxymz 都输入语言 L(G)。为了将上面的观察总结成 CFL 的泵引理,我们必须说明对于足够长的字符串的推导过程中都会出现非终结符的嵌套重复。同时我们也尽量发现分解得到的 5 个子串:v, w, x, y, z,的一些性质。这类似于我们处理正则语言的泵引理。在 6.6 节,我们证明了所有的 CFG 产生式都可以改写成 Chomsky 范式,而不会影响 CFG接受语言的能力(唯一的影响是不能接受空字符,由于此处仅仅关心足够长的字符串,因此这个影响可以忽略)。因此我们的讨论可以局限在 Choms
4、ky 范式(CNF )表示的 CFG,显然这类文法得到的推导树都是二叉树,即每个父节点至多有两个子节点。我们先定义几个与二叉树相关的概念。路径是一串节点组成的序列,前后节点之间有父子关系;路径的长度是路径包含的节点的个数;二叉树的高度是最长路径的长度。由于非终结符数目有限,如果推导树足够高,那么存在一个路径,某个非终结符在该路径上出现了两次,即出现了前面提到的嵌套重复现象。引理 8.1 任给 h=1,如果二叉树的叶结点个数2 h-1,那么该二叉树的高度h。证明:这是一个数学问题。我们用数学归纳法证明它的逆反命题:如果二叉树的高度=1 时,命题成立。要证明 k+1 时,命题也成立。设二叉树 T
5、的高度为 k+1,则它的根节点的两个子树(以子节点为跟的二叉树)的叶节点数都=2 p+1的属于 L(G)的字符串,都能找到 5 个字符串 v, w, x, y, z 满足下面的条件:u=vwxyz|wy|0|wxy|=0证明:根据引理 8.1,任何一个生成 u 的推导树高度=p+2,即至少存在一个长度=p+2的路径,不妨设 d 是其中的一个,显然 d 的最底部是一个终结符,其上的符号都是非终结符,语言与计算理论导引 上下文无关语言与非上下文无关语言陶晓鹏 Copyright 2003 2共有 p+1 个,而不同的非终结符只有 p 个,根据鸽笼法则,至少存在一个非终结符 A 在路径d 上出现了至
6、少两次,分别将其中最接近根和最接近叶的标记为 A1 和 A2,设 A2 生成的字符串是 x, A1 生成的字符串是 wxy。在 wxy 之前的字符串记为 v,在 wxy 之后的字符串记为 z。图 8-1 直观地给出了这 5 个字符串在推导树上的位置。由于 A1 为根的推导树高度0。最后,存在如下的嵌套重复,S*vAz*vwAyz*vwxyz因此满足第 4 个条件。类似有限自动机的泵引理,我们也给出一系列 CFG 的泵引理。定理 8.1a (CFL 的泵引理)语言 L 是 CFL,则存在一个整数 n,使得对每个uL,|u|=n,都存在 5 个字符串 v, w, x, y, z,满足下面的条件,u
7、=vwxyz (8.1)|wy|0 (8.2)|wxy|=0 (8.4)证明:L 是 CFL,则存在一个 CNF 形式的 CFG 生成 L-,它的非终结符个数是 p,则令 n=2p+1,根据定理 8.1 直接得到定理 8.1a 的结论。类似 FA 的泵引理(见第 5 章),本节的泵引理也常常用来证明某个语言不是 CFL。通常采用反证法,即要证明对任给的整数 n,都存在一个 uL,|u|n,找不到满足上面 4 个条件的5 个字符串。还有另外的方法说明一个语言不是 CFL。根据第 7 章,由一个 FA 加一个辅助存储空间(栈)组成的 PDA 能够接受一个 CFL,如果我们能够说明接受一个语言的抽象
8、机至少需要两个栈,那么就能说明这个语言不是 CFL。比如我们知道接受语言 aibi 的抽象机只需要一个栈,即用一个栈记住前面的 a 的个数,然后与后面的 b 比较。那么容易想到,仅仅一个栈不能接受语言 aibici。下面我们用泵引理来证明我们的直观判断。例子 8.1 语言 L=aibici | i=1,证明 L 不是 CFL。分析:反证法。假设 L 是 CFL,则存在定理 8.1a 定义的 n,选择 u=anbncn,显然|u|n,设存在 5 个字符串 v, w, x, y, z 满足式子(8.1)-(8.4)。由于|wxy|0,因此无法满足式子 vwmxymzL(G), m=0,得到矛盾,得
9、证。显然这个方法实际上证明了更大的语言 L1=ua, b, c* | na(u)=nb(u)=nc(u)是非 CFL(选取同样的 u)。例子 8.2 语言 L=ss | sa, b*是非 CFL。分析:前面我们讨论了语言ss r | sa, b*是 CFL。例子 8.1 揭示了一个栈不够用的情况,这个例子则显示了数据结构栈不合适的情况。显然,如果 PDA 用到的辅助空间不是栈,而是队列,那么就能够类似接受回文语言那样接受 L。反证法,设 L 是 CFL,则存在 n,选择 u(n)=anbnanbn,设存在 v, w, x, y, z 满足式子(8.1)-(8.4),我们来发现其中的矛盾。类似例
10、子 8.1,由于|wxy|=0, aibjaibj | i,j=0, scs | sa, b*, c 是特殊字符等。上面证明中如何选择 u 成为关键,尽管正确的选择可能不止一个,但大多数选择不能导出矛盾。一旦 u 选好后,则往往需要分情况讨论。比如例子 8.2,可以分下面 7 种情况讨论,1. wy 只包含第一组的 a2. wy 包含第一组的 a 和第二组的 b3. wy 只包含第二组的 b4. wy 包含第二组的 b 和第三组的 a5. wy 只包含第三组的 a6. wy 包含第三组的 a 和第四组的 b7. wy 只包含第四组的 b这些情况的讨论中,常常有相似之处,可以互相借用。最后要选择
11、 m 的值来导致矛盾,通常有多种值可选择,不过用得最多的是 m=0 或 m=2。例子 8.3 语言 L=xa, b, c* | na(x)=0不是 CFL,C 语言中函数调用可以转换成这种形式,比如有两个函数 f 和 g,分别有 n 和 m 个参数,每次调用都遵循 anbm 的形式。语言与计算理论导引 上下文无关语言与非上下文无关语言陶晓鹏 Copyright 2003 4类似 FA 的泵引理有多种弱形式,本节也给出 CFG 的泵引理的弱形式,它应用的范围更广,称为 Ogden 引理。泵引理给出了字符串的“泵”,w 和 y,的一些信息,但没有谈及这些子串在 u 中的位置。Ogden 引理能够明
12、确指示 u 中某部分包含 “泵”,因此提供了比泵引理更丰富的信息,有时能够解决泵引理无法解决的问题。定理 8.2 (Ogden 引理)L 是一个 CFL,则存在一个整数 n,使得任给 uL, |u|=n,给 u中=n 个字符做标记,则存在 5 个字符串 v, w, x, y, z 满足,u=vwxyz (8.5)wy 至少包含一个标记字符 (8.6)wxy 包含不超过 n 个标记字符 (8.7)x 至少包含一个标记字符 (8.8)vwmxymzL(G), m=0 (8.9)证明:类似泵引理的证明,设接受 L-的 CNF 形式的 CFG 有 p 个非终结符,令n=2p+1,设 uL, |u|=n
13、,且 u 上 n 个字符作了标记,在泵引理的证明中,我们选择最长的路径,它自动满足条件(8.5)和(8.9) ,为了满足(8.6)-(8.8),我们需要更仔细地选择路径。从根节点出发,每次我们选择子树的叶节点标记多的子节点,扩充进路径。如果内部节点的两个子节点对应的子树都带有标记的叶节点,则称为 branch point。按照我们的选法,每个新加入路径的节点含有的标记叶节点至少是它的父节点含有的数目的一半。在这种情况下,可以应用下面的引理来完成证明(类似定理 8.1 的证明用到了引理 8.1)。引理 8.2 d 是二叉树上的一个路径, r 是 d 上的一个接点,如果 r 的后代包含=0 and
14、 ji不是 CFL。分析:反证法。假设 L 是 CFL,根据定理 8.2,存在 n,选择 u=anbncn+n!,我们将前面的 n个 a 作标记,根据定理 8.2,存在 5 个字符串 v, w, x, y, z。满足(8.5)-(8.9) 式。分情况讨论:1. w 或 y 包含不同的字母,则 vw2xy2zL(不再是 a*b*c*的形式)。2. 由于 wy 至少含有一个标记字符 a,则只可能 w=aj, y=bj,当 m 足够大时,如m=n!/j+1,vw mxymzL。问题:例子 8.5 可以用普通的泵引理来说明吗?例子 8.6 语言 L=apbqcrds | p=0 or q=r=s不是
15、CFL。分析:例子 8.1 说明了b qcqdq不是 CFL,似乎预示了 L 也不是 CFL。本例先说明 L 满足普通泵引理,因此不能用普通泵引理说明 L 不是 CFL。设 n 是任意的正整数,任给 uL, |u|=n,设 u= apbqcrds,则我们都能找到 5 个字符串 v, w, x, y, z 满足式子(8.1)-(8.4)。如果 p=0,则令 w=b, v=x=y=, z=bq-1crds, vwmxymz=bm+q-1crdsL;语言与计算理论导引 上下文无关语言与非上下文无关语言陶晓鹏 Copyright 2003 5如果 p0,则令 w=a, v=x=y=, z=ap-1bq
16、crds, vwmxymz=am+p-1brcrdsL。现在我们使用定理 8.2,设 L 是 CFL,根据定理 8.2 存在 n,令 u=abncndn,除了第一个字符 a,其他字符都作标记。设存在 v, w, x, y, z 满足(8.5)-(8.9) 式,则 wy 至少包含b, c, d中的一个,但不能三个都包含,则 vw2xy2z 包含一个 a,但 b, c, d 的数目不相等,不属于 L。 8.2 上下文无关语言的交集和补集根据定理 6.1,CFL 在合并、连接和 Kleene*运算下保持封闭性。对于正则语言,保持封闭性的运算还可以增加两个:交集和补集。CFL 是更复杂的语言,它在交集
17、和补集运算下不一定保持封闭性。定理 8.3 存在两个 CFL L1 和 L2,它们的交集 L1L2 不是 CFL。存在 CFL L,它的补集L不是 CFL。证明:我们利用例子 8.3 构造 CFL 如下,L1=aibjck | i=j,由于 R 是正则语言,因此 R也是正则语言,同时也是 CFL。另外,a ibjck | i=j=am | m=0ajbj | j=0ck | k=0,根据 CFL 在连接运算下的封闭性, aibjck也是 CFL。类似的方法能够说明 L2也是 CFL,因此 L1L2=Raibjck | i=j or i=k也是 CFL。而(L 1L2)不是 CFL。可见前面两次
18、的补集保持了 CFL 的性质,最后一个补集失去了 CFL 的性质。回想定理 3.4,两个正则语言的交集仍然是正则语言,我们在已有的两个 FA 上构造了接受交集语言的 FA,那么为什么 PDA 无法完成类似的构造呢?在构造 FA 时,我们定义了新的状态(p, q),用这个 2 元组同时跟踪原来 FA 的状态变化,当 p 和 q 都处于接受状态时,新 FA就到达了接受状态。类似地,设接受 CFL L1 和 CFL L2 的 PDA 分别是 M1=(Q1, , , q1, Z1, A1, 1)和 M2=( Q2, , , q2, Z2, A2, 2),新的 PDA 的状态集 Q=Q1Q2,我们还需要
19、跟踪栈的变化情况。根据 7.1 节的讨论,我们可以严格地限制栈顶处理的规则,比如只允许压入或弹出操作,而不会语言与计算理论导引 上下文无关语言与非上下文无关语言陶晓鹏 Copyright 2003 6影响 PDA 识别语言的能力,因此 M1 和 M2 输入同一个字符 a 时都只有两种移动,而转移函数则分别有四种可能,1(p, a, X)= | (p, XX) | (p, ) | (p, XX), (p, )2(q, a, Y)= | (q, YY) | (q, ) | (q, YY), (q, )那么如何求(p,q), a, (X,Y)?1 和2 的组合有 16 种情况,我们用下面的表讨论 的
20、计算。12 (p, XX) (p, ) (p, XX), (p, ) (q, YY) (p, q), (X, Y)(X, Y) (p, q), (, Y)(X, Y)? ?(q, ) (p, q), (X, )(X, Y)? (p, q), ?(q, YY), (q, ) ? ? ?另一种计算方式是,12 (p, XX) (p, ) (p, XX), (p, ) (q, YY) (p, q), (XX, YY) (p, q), (, YY)? ?(q, ) (p, q), (XX, )? (p, q), ?(q, YY), (q, ) ? ? ?可见我们无法用一个栈模拟两个栈的变化,比如一个栈
21、要压入,另一个栈要弹出,那么用于模拟的栈应该压入还是弹出?显然,两个 PDA 中,其中一个没有栈或栈内容没有变化,则能够构造同时跟踪它们的 PDA,因此有下面的定理。定理 8.4 L1 是 CFL,L2 是正则语言,则 L1L2 是 CFL。证明:用构造法证明。设接受 L1 的 PDA M1=(Q1, , , q1, Z0, A1, 1),接受 F2 的 FA M2=(Q2, , q2, A2, 2)(注意,此处的 FA 是没有空转移的确定型 FA)。构造接受 L1L2 的PDA M=(Q, , , q0, Z0, A, )如下,Q=Q1Q2q0=(q1, q2)A=A1A2(p, q), a
22、, Z)=(p, q), ) | (p, )1(p, a, Z) and 2(q, a)=q (1)(p, q), , Z)=(p, q), ) | (p, )1(p, , Z) (2)其中,pQ1, qQ2, Z , a。我们看到 M 的状态跟踪了 M1 和 M2 的状态的变化,M 的栈跟踪了 M1 的栈的变化。为了证明 M 接受 L1L2,我们证明一个更普遍的结论:字符串 y 使得 M1 到达状态 p,且栈内容为 ,使得 M2 到达状态 q,当且仅当 y 使得 M 到达状态 (p, q),且栈内容为。用数学语言描述如下,任给 n=0, pQ1, qQ2, y,z*, *,那么,(q 1,
23、yz, Z1)nM1(p, z, )且 2*(q2, y)=q,当且仅当,(q 1,q2), yz, Z1)nM(p,q), z, )。这里 n 表示移动的步数,对 n 使用数学归纳法,我们证明必要性。1. n=0,(q 1, yz, Z1)0M1(p, z, )且 2*(q2, y)=q,显然 y=, p=q1, =Z1, q=q2,则得到,(q1, q2), yz, Z1) 0M(q1, q2), z, )=(q1, q2), yz, Z1),得证。2. 设 k=0, n=k 时命题成立,要证明 n=k+1 时也成立。设(q1, yz, Z1)k+1M1(p, z, )且2*(q2, y)
24、=q,考虑 M1 在 k+1 步移动中的最后一步,如果是空移动,则语言与计算理论导引 上下文无关语言与非上下文无关语言陶晓鹏 Copyright 2003 7(q1, yz, Z1)kM1(p, z, )M1(p, z, )根据归纳假设有,(q1, q2), yz, Z1) kM(p, q), z, ),根据转移函数 (2)有,(p, q), z, )M(p, q), z, ),得证。如果最后一步不是空转移,令 y=ya, a,有(q1, yz, Z1)kM1(p, az, )M1(p, z, )设 q=2*(q2, y),根据归纳假设有, (q1, q2), yz, Z1)kM(p, q),
25、 az, ),再根据转移函数(1)有,(p, q), az, )M(p, q), z, ),得证。充分性证明省略。受到定理 8.4 证明的启发,我们再考虑一下是什么原因导致 CFL 的补集不一定是 CFL。对于 FA M=(Q, , q0, A, ),我们只要略作修改 M=( Q, , q0, Q-A, ),则 M接受的语言就是L(M)的补集。那么类似地,对于 PDA M=(Q, , , q0, Z0, A, ),同样的修改得到 M=( Q, , , q0, Z0, Q-A, ),M接受的语言是否是 L(M)的补集呢?定理 8.3 证明了不一定,原因在于 PDA的不确定性,比如存在(q0, x
26、, Z0)*M(p, , ),也存在(q0, x, Z0)*M(q, , ),pA 且 qA,此时 xL(M),而按照上面的构造方法,也有 xL(M)。而 FA 尽管也有非确定型 FA,但都能发现等价的确定型 FA,因此能够避免这种现象。那么是不是确定型 PDA(DPDA) M 接受的语言 L 的补集,可以通过上面方法构造的PDA M来接受呢?答案仍然是否定的,这是因为一个不被 M 接受的字符串 x 可能导致 M 出现无限移动,那么 x 同样导致 M出现无限移动,因此也不能被 M接受(FA 上不可能出现无限转移的情况)。利用练习 7.27 的结论可以解决 DPDA 无限移动的问题,因此可以构造
27、接受补集的 DPDA。这说明了确定型上下文无关语言(DCFL )的补集也是 DCFL,特别地,如果一个 CFL 的补集不是 CFL,则该 CFL 不是 DCFL(定理 8.3 和例子 8.7)。8.3 与上下文无关语言相关的判定问题在第 5 章最后部分,我们考察了许多涉及正则语言的判定问题,其中第一个问题就是成元资格问题,这些问题可以类似地放到 CFL 上。我们将发现,有些问题可以用相似的方法解决,有些问题涉及到 CFL 内在不确定性带来的差异,需要寻找新方法,还有些问题,可能没有办法解决,这需要用到更复杂的计算模型来证明。对于 CFL 基本的乘员资格问题,即任给一个 PDA M 和字符串 x
28、,M 是否接受 x,原来得简单的方法:将 x 放入 M 运行,不再是可行的办法。8.2 节我们已经提到,由于 PDA 的非确定性,一个不被接受的字符串可能导致 M 无限移动,尽管可能存在某个移动到达拒绝状态,但仍然要等待其他移动结束后,才能判断 x 是否属于 L(M)。我们可以在 DPDA 上解决这个问题,另外我们从 CFG 的角度讨论,借助第 6 章的结论,如果一个 CFG 没有空产生式和单一产生式,则生成长度为 n 的字符串的推导步骤至多 2n-1 步。而对每个 PDA 都能构造出对应的CFG,因此可以通过 CFG 来解决这个问题。成员资格问题的判定算法(给定一个 PDA M 和字符串 x
29、,M 是否接受 x?)定理 7.4 给出了从 PDA M 构造 CFG G 的算法,且 L(G)=L(M)。如果待判定的字符串 x=,则用 FindNull算法(见 6.6 节)确定 G 的起始非终结符是否是可空非终结符;否则利用算法 6.1 和算法 6.2去掉 G 中的空产生式和单一产生式,得到新文法 G,然后用 G完成从 1 步到 2|x|-1 步的所有推导,如果发现其中一个推导生成了 x,则 xL(M),否则 xL(M)。语言与计算理论导引 上下文无关语言与非上下文无关语言陶晓鹏 Copyright 2003 8我们考察对应第 5 章问题 1 和问题 2 的两个与 CFL 相关的问题:1
30、. 给定一个 CFG G,L(G)=?2. 给定一个 CFG G,L(G)是否是有限集?定理 8.1 提供了回答这两个问题的方法。首先将 G 转换成 CNF 形式的 CFG G,设 p 是G的非终结符的个数,令 n=2p+1。如果 G能够生成某个字符串,则它一定能够生成某个长度=1,一个叶节点2-h-1 的二叉树的高度h。定理 8.1 CFG G 是一个具有 Chomsky 范型的上下文无关文法,共有 p 个变量,任何一个uL(G)且|u|=2-p+1 ,可以写成 u=vwxyz,满足:1)|wy|02)|wxy|=0,vw-mxy-mzL(G)证明:存在一个长度p 的路径,因此存在 S*vA
31、z*vwAyz*vwxyz。定理 8.1a(上下文无关语言的泵引理)L 是一个 CFL,则存在 n,对于所有的 uL 且|u|=n,则有:u=vwxyz|wy|0|wxy|=0,vw-mxy-mz L。类似正规语言的泵引理,可用于证明某个语言不是 CFL,往往需要多个栈的语言( CFL 仅需要一个栈)。定理 8.2(Ogden 引理)L 是上下文无关语言,则存在整数 n,任给 uL 且|u|=n,标记 u 中 n个或更多的位置为区别位置,则存在 v, w, x, y, z 满足:u=vwxyz语言与计算理论导引 上下文无关语言与非上下文无关语言陶晓鹏 Copyright 2003 9wy 包含
32、至少一个区别位置wxy 包含不多过 n 个区别位置x 包含至少一个区别位置任给 m=0,vw-mxy-mz L证明:branch point 的定义8.2 上下文无关语言的交集和补集定理 8.3 两个 CFL 的交集不一定是 CFL,CFL 的补集不一定是 CFL。定理 8.4 CFL 和正规语言的交集是 CFL。证明:构造法。补集不是 CFL 的主要原因是非确定型 PDA 的存在,DPDA 的补集是 CFL。8.3 与 CFL 有关的判定问题的解决给定一个 PDA M 和字符串 x,判定 x 是否被 M 接受?从一步推导开始检查,直到长度为 2|x|-1 的推导,如果没有 x 的推导,则 x
33、L(M),否则xL(M)。给定一个 CFG G,判定 L(G)是否为空?给定一个 CFG G,判定 L(G)是否是有限集?首先,测试是否属于 L(G),如果是则 L(G)不空。构造 G 的 Chomsky 范型 G,p 是 G的变量数,n=2-p+1,测试从 1 到n 的所有字符串,如果没有字符串属于 L(G),且L(G),则 L(G)=L(G)=,再测试 n=i2n 的所有字符串,如果没有字符串属于 L(G),则 L(G)是有限集,否则是无限集。CFL 在交集运算下不封闭,并不是说判定一个字符串同时属于两个 CFL 的问题是不可解的(unsolvable),在第十二章我们将讨论它确实是不可解的。语言与计算理论导引 上下文无关语言与非上下文无关语言陶晓鹏 Copyright 2003 10