1、1,计算理论,第2章 上下文无关文法,2,主要内容,2.1 上下文无关文法概述2.1.1 上下文无关文法的形式化定义2.1.2 上下文无关文法举例2.1.3 设计上下文无关文法2.1.4 歧义性2.1.5 乔姆斯基范式 2.2 下推自动机2.2.1 下推自动机的形式化定义2.2.2 下推自动机举例2.2.1 与上下文无关文法的等价性 2.3 非上下文无关语言,3,上下文无关文法 (CFG) 概述,A 0A1 A B B #,变量 (Variables) A, B,终止符 (Terminals) 0,1,#,起始变元 (Start Variable) A,箭头的左侧只有一个变量,替换规则又称为产
2、生式,描述语言的方法: 有穷自动机 正则表达式,4,如何利用 CFG 产生字符串,A 0A1 A B A #,获取一个字符串的替换过程叫派生。 例如字符串 000#111 的过程如下:A 0A1 00A11 000A111 000B111 000#111,(1) 写下起始变元第一条规则左边的变元。 (2) 取一个已写下的变元,并找到以该变元开始的规则,把这个变元替换成规则右边的字符串。 (3) 重复步骤2,直到写下的字符串没有变元。,5,如何利用 CFG 产生字符串,A 0A1 A B A #,可以用语法生成树形象地表示派生过程。,A,A,A,B,#,0,0,0,1,1,1,A,6,文法的语言
3、,A 0A1 A B A #,文法 G1 可以产生的字符串包括:#, 0#1, 00#11, 000#111, 用文法 生成的所有字符串的集合称为文法的语言。 L(G1) 表示文法 G1 产生的语言。L(G1) = 0n#1n | n 0 用上下文无关文法产生的语言叫上下文无关语言。 文法 G1 的简写:A 0A1 | BB #,7,上下文无关文法的形式化定义,定义 2.1,上下文无关文法是一个 4 元组 ( V, , R, S ),且 (1) V 是一个有穷集合,称为变元集。 (2) 是一个与 V 不相交的有穷集合,称为终结符集。 (3) R 是一个有穷规则集,每条规则由一个变元和一个由变元
4、及终结符组成的字符串构成。 (4) SV 是起始变元。,8,CFG的术语,假设 u 与 v 由变元及终结符构成的字符串,Aw 是文法的一条规则,称 uAv 生成 uwv,记作 uAv uwv 。 如果 u = v ,或者存在 u1, u2, , uk, k 0 使得u u1 u2 uk v,则称 u 派生 v,记作 u * v。 文法 G = (V,T,R,S)的语言为 L(G) = wT*| S w ,9,上下文无关文法举例,例2.1 考虑文法 G = ( S, a,b, R, S ),其中规则集 R 为: S aSb | SS | 。 该文法生成 abab,aaabbb,aababb, 如
5、果将 a 看作 (,将 b 看作 ), L(G)是所有正常嵌套的括号字符串构成的语言。,10,设计上下文无关文法,设计如下语言的上下文无关文法0n1n | n 01n0n | n 0 0n1n | n 01n0n | n 0 设计技巧化繁为简,利用正则,考察子串,利用递归。,11,设计上下文无关文法,CFG for L1 = 0n1n | n 0S 0S1 | CFG for L2 = 1n0n | n 0S 1S0 | CFG for L1L2S S1 | S2S1 0S11 | S2 1S20 | CFG for L3 = 02n13n | n 0?S 00S111 | ,12,上下文无关
6、文法与正则语言,任何正则语言可以由 CFG 描述。,如果 (qi, a) = qj,则增加规则 Vi aVj 如果 qi 是接受状态,则增加规则 Vi 如果 q0 是起始状态,则 V0 是起始变元。,CFG,G = ( V0, V1, 0,1, R, V0 )V0 0V0 | 1V1 | V1 1V1 | 0V0,13,最左派生,对于文法 G 中的一个字符串 w 的派生,如果在每一步都是替换左边剩下的变元,则称这个派生是最左派生。 例如G=( S, (,), R, S ) ,其中规则为 S ( S ) | SS | S SS (S)S ( )S ( ) ( S ) ( ) ( )S SS S(
7、S) (S)(S) ( ) ( S ) ( ) ( ),14,歧义性,一个串可能有两个甚至更多的最左派生。 例如 CFG G=( S, +,*,a, R, S) ,其中规则为 S S + S | S * S | a 产生串 a + a * a S S + S a + S a +S *S a + a * S a + a * a S S *S S + S * S a +S * S a + a * S a + a * a,15,歧义性,S,S,S,S,S,+,a,a,a,x,S,S,S,S,S,x,+,a,a,a,16,歧义性,定义 2.4,如果字符串 w 在上下文无关文法 G 中有两个或两个以上不
8、同的最左派生,则称 G 歧义地(ambiguously) 产生字符串 w,如果文法 G 歧义地产生某个字符串,则称 G 是歧义的。 某些上下文无关语言只能用歧义文法产生,这样的语言是固有二义的。,REVIEW(2011-03-14),广义非确定型有穷自动机(GNFA) GNFA与NFA等价非正则语言B= 0n1n | n0 证明非正则性的技术泵引理,所有的正则语言都有一种特殊的性质,如果一个语言没有这个性质,则其不是正则的。,17,若 A 是一个正则语言,则存在一个数 p (泵长度) 使得,如果 s 是 A 中任一长度不小于 p 的字符串,那么 s 可以被分成 3 段,s = xyz,满足下述
9、条件:对于每一个 i 0, xyizA (2) | y | 0 (3) | xy | p,REVIEW(2011-03-14),广义非确定型有穷自动机(GNFA) GNFA与NFA等价非正则语言B= 0n1n | n0 证明非正则性的技术泵引理,所有的正则语言都有一种特殊的性质,如果一个语言没有这个性质,则其不是正则的。,18,若 A 是一个正则语言,则存在一个数 p (泵长度) 使得,如果 s 是 A 中任一长度不小于 p 的字符串,那么 s 可以被分成 3 段,s = xyz,满足下述条件:对于每一个 i 0, xyizA (2) | y | 0 (3) | xy | p,REVIEW(2
10、011-03-14),泵引理的证明 泵引理的应用 例:非正则语言B= 0n1n | n0 描述语言的方法:自动机正则表达式非正则性上下文无关文法 上下文无关文法 变元、转换规则、终止符、起始变元 上下文无关文法的形式化定义 uAv 生成 uwv,记作 uAv uwv 。 u 派生 v,记作 u * v。 文法 G = (V,T,R,S)的语言为 L(G) = wT*| S w ,19,REVIEW(2011-03-14),设计上下文无关文法 任何正则语言可以由 CFG 描述。,20,如果 (qi, a) = qj,则增加规则 Vi aVj 如果 qi 是接受状态,则增加规则 Vi 如果 q0
11、是起始状态,则 V0 是起始变元。,CFG,G = ( V0, V1, 0,1, R, V0 )V0 0V0 | 1V1 | V1 1V1 | 0V0,REVIEW(2011-03-14),最左派生 文法 G 中的一个字符串 w 的派生,如果在每一步都是替换左边剩下的变元。 歧义性 如果字符串 w 在上下文无关文法 G 中有两个或两个以上不同的最左派生,则称 G 歧义地(ambiguously) 产生字符串 w,如果文法 G 歧义地产生某个字符串,则称 G 是歧义的。乔姆斯基范式,21,22,乔姆斯基范式,定义 2.5,称一个上下文无关文法是为乔姆斯基范式(Chomsky normal for
12、m),如果它的每一个规则具有如下形式:A BCA a 其中 a 是任意的终结符,A、B 和 C 是任意的变元,且 B 和 C 不能同时是起始变元。此外,允许规则 S ,其中 S 是起始变元。,23,乔姆斯基范式,定理 2.6,任一上下文无关语言都可以用一个乔姆斯基范式的上下文无关文法产生。,Step 1: 增加起始变元 S0 和规则 S0 S, 其中S是原来的起始变元。 Step 2: 考虑所有的 规则。 对于 A , 删去每个A都会产生一个新规则。例如 R uAvAw R uAvw, R uvAw, R uvw,24,乔姆斯基范式,定理 2.6,任一上下文无关语言都可以用一个乔姆斯基范式的上
13、下文无关文法产生。,Step 3: 考虑单一产生式A B。例如: A B, B aC, B CC, 则增加A aC, A CC 。 Step 4: 考虑A u1 u2 uk, 其中 k 2且ui 是变量或终结符。替换该规则A u1A1, A1 u2A2, A2 u3A3, , Ak-2 uk-1uk,25,例题,S ASA | aB A B | S B b | ,S0 S S ASA | aB A B | S B b | ,26,例题,After that, we remove B ,S0 S S ASA | aB A B | S B b | ,S0 S S ASA | aB | a A B
14、| S | B b,Before removing B ,After removing B ,27,例题,After that, we remove A ,S0 S S ASA | aB | a A B | S | B b,Before removing A ,After removing A ,S0 S S ASA | aB | a | SA | AS | S A B | S B b,28,例题,Then, we remove S S and S0 S,After removing S S,After removing S0 S,S0 S S ASA | aB | a | SA | AS A
15、 B | S B b,S0 ASA | aB | a | SA | AS S ASA | aB | a | SA | AS A B | S B b,29,例题,Then, we remove A B,Before removing A B,After removing A B,S0 ASA | aB | a | SA | AS S ASA | aB | a | SA | AS A B | S B b,S0 ASA | aB | a | SA | AS S ASA | aB | a | SA | AS A b | S B b,30,例题,Then, we remove A S,Before re
16、moving A S,After removing A S,S0 ASA | aB | a | SA | AS S ASA | aB | a | SA | AS A b | S B b,S0 ASA | aB | a | SA | AS S ASA | aB | a | SA | AS A b | ASA | aB |a | SA | AS B b,31,例题,Then, we apply Step 4,Before Step 4,After Step 4 Grammar is in CNF,S0 ASA | aB | a | SA | AS S ASA | aB | a | SA | AS
17、A b | ASA | aB |a | SA | AS B b,S0 AA1 | UB | a | SA | AS S AA1 | UB | a | SA | AS A b | AA1 | UB | a | SA | AS B b A1 SA U a,32,主要内容,2.1 上下文无关文法概述2.1.1 上下文无关文法的形式化定义2.1.2 上下文无关文法举例2.1.3 设计上下文无关文法2.1.4 歧义性2.1.5 乔姆斯基范式 2.2 下推自动机2.2.1 下推自动机的形式化定义2.2.2 下推自动机举例2.2.1 与上下文无关文法的等价性 2.3 非上下文无关语言,33,2.2 下推自动
18、机,下推自动机Pushdown Automata (PDA),计算模型PDA = NFA + 栈(无限)在控制器的有限存储量之外提供了附加的存储,使得PDA能够识别某些非正则语言。能力上与上下文无关文法等价在证明一个语言是上下文无关的时候有两种选择:可以给出生成他的上下文无关文法,或者给出识别他的PDA。,34,下面介绍识别CFL的自动机下推自动机。 1PDA的结构,输入带: 带上存放被识别的符号串。 有限控制器: 存放PDA的状态转移函数。 下推栈: 后进先出的下推栈。两个只读头: 分别用来读取带上符号和栈内符号。,2.2 下推自动机,PDA可以把符号写到栈上并在随后读取他,35,栈的作用:
19、-体现在可以保存无限的信息量。 例0n1n|n0,PDA工作过程: 读取输入串的符号,每读一个0,把它推入栈,一旦看见1之后,每读一个1,把一个0弹出栈,当栈中的0被清空时恰好读完输入串,则接受这个输入。如果在还有1的时候栈已经变空;或者在栈中还有0的时候1已经读完了;或者0出现在1的后面,则拒绝这个输入。,2.2 下推自动机,36,1PDA 与 NFA 相似 区别栈(栈字母表 ) 自动机的核心转移函数描述自动机的动作 = , = , 转移函数的定义域: Q 当前状态下,下一个读到的输入符号和栈顶的符号决定了PDA的下一个动作。 转移函数的值域:需要考虑在特定情形下允许自动机做什么。即,可能进
20、入某个新的状态,并可能在栈顶写入一个符号。 因此为:Q,考虑非确定性返回子集,P( Q ),2.2.1 下推自动机的形式化定义,37,2PDA的形式化定义 PDA是一个6元组M=(Q, q0, F),其中Q状态的有限集合。输入字母表。栈字母表。q0q0Q,开始状态。FFQ,终止状态集合。:状态转移函数,Q P( Q ) 。,2.2.1 下推自动机的形式化定义,38,有两种状态转移函数: (1)扫描输入带上符号a, (q,a,Z)=(p1,1),(p2,2),(pm,m), 其中 qQ,a,Z,p1,p2,pmQ, 1,2,m*。 此动作表示:在q状态下,当前栈顶符号为Z,读取带上符 号a后,状
21、态改成pi,,并且用i代替栈顶符号Z(1im), 然后读头右移一个单元,准备读带上下一个符号。 (2)-动作,一般用于读带上符号串的开头或者是末尾。 (q,Z)=(p1,1),( p2,2),( pm,m) 此动作表示:在q状态下,当前栈顶符号为Z ,读取带上符 号(实际上没有读符号,或者带上无符号可读)后,状态 改成pi,,并且用i (1im)代替栈顶符号Z,但是 读头不动。,2.2.1 下推自动机的形式化定义,39,注意:假设栈内符号串从底到顶依次是ABCD,则 要写成 DCBA, 即栈顶符号写在左边,栈底符号写在右边。 3通常使用符号的约定: 1)用小写英文字母a、b、c表示输入带上的符
22、号,即a,b,c,。 2)用小写英文字母x、y、z表示输入带上带符号串,即x,y,z,*。 3)用大写英文字母A、B、C表示栈内符号,即A,B,C,。 4)用希腊字母、表示栈内符号串,即, ,*。,2.2.1 下推自动机的形式化定义,40,4PDA计算过程: 一个 PDA M = (Q, , , , q0, F) 接受输入串 w,如果 w 可以写成w=w1 w2wm ,wi , 并且 存在状态序列 r0, r1, , rm Q, 和 字符串序列 s0, s1, , sm *满足下述三个条件,字符串 si是M在计算的接受分支中的栈内容序列。 Condition 1: r0 = q0, s0 =
23、M从起始状态和空栈开始 Condition 2: 对于 i = 0, 1, , m-1, 有 (ri+1, b) (ri, wi+1, a), 其中 si = at, si+1 = bt , a, b ;t * Condition 3: rm F,2.2.1 下推自动机的形式化定义,M在每一步都完全按照当时的状态,栈顶符号和下一个输入符号进行,41,例子2.9 回想一下0n1n | n 0 , NFA无法识别,但是PDA可以。 状态图描述,2.2.2 下推自动机举例,a, b c 表示机器从输入中读取a时可以用c替换栈顶的符号b。a、b、c中任何一个都可以是 ,如果a是,机器转移而不读取输入中
24、任何符号;若b为,不读栈中任何符号;c为,不在栈中写任何符号。pop b,push c,42,例子2.9 识别语言0n1n | n 0的PDA的形式化定义:,2.2.2 下推自动机举例,M = (q1,q2,q3,q4, 0,1, 0,$, , q1, q1,q4),PDA M的,43,2.2.2 下推自动机举例,例2.10 给出识别下面语言的PDA M2: aibjck | i,j,k 0 and i=j or i=k ,How to construct it? 首先,PDA先读 a ,并且将其推入栈 push a; 读完a时,机器把它们全部放到栈中,以便能与b或c匹配。由于不知道a是与b匹
25、配还是与c匹配非确定性,44,q1,q2,q5,q6, $ ,a, a, $,q7,q3,q4, , , $ ,b, ,c, a , ,c, ,b, a ,2.2.2 下推自动机举例,例2.10 给出识别下面语言的PDA M2: aibjck | i,j,k 0 and i=j or i=k ,45,2.2.2 下推自动机举例,例2.11 给出识别下面语言的PDA M3: wcwR | w 0,1* wR表示倒写的w。,46,解:设计的思想是:PDA M 有两个状态,即Q=q1,q2, 有三个栈内符号,即R,B,G。它的动作设想: 1).开始时,PDA M的状态为q1,栈内符号为R。 2).当
26、读c左边的符号时,M是在q1状态,此时如果读0,则向栈内压入符号B;如果读1,则向栈内压入符号G。 例如,输入符号串是0101c1010, 读完c左边的0101后,栈内符号串为:GBGB。 3).当读符号c时,状态变成q2。 4).在此状态下之后读c右边的符号:如果读0,此时栈顶应该是B,则B退栈;如果读1,此时栈顶应该是G,则G退栈。,2.2.2 下推自动机举例,这样,当带上符号都读完时,栈内应该是符号R。再将R清除,使得 栈内为空,进而接收输入带上的符号串。具体动作如下表所示:栈顶 当前 输 入 符 号 符号 状态 0 1 c B q1 B入栈,状态为q1 G入栈,状态为q1 状态改成q2
27、q2 G q1 B入栈,状态为q1 G入栈,状态为q1 状态改成q2 q2 R q1 B入栈,状态为q1 G入栈,状态为q1 状态改成q2q2,退栈顶,状态为q2 , 退栈顶,状态为q2 ,如果带上无符号可读,则退栈顶R,否则,无动作。,表中符号“”表示无动作。 当带上符号串都读完后,栈内为空,就说明带上符号 串正是L中的句子。 M的形式定义如下:,48,M的形式定义:M(q1,q2,0,1,c,R,B,G,q1,R,) :(q1,0,R)=(q1,BR) (q1,1,R)=(q1,GR)(q1,0,B)=(q1,BB) (q1,1,B)=(q1,GB)(q1,0,G)=(q1,BG) (q1
28、,1,G)=(q1,GG)(q1,c,R)=(q2,R) (q1,c,B)=(q2,B)(q1,c,G)=(q2,G) (q2,0,B)=(q2,)(q2,1,G)=(q2,) (q2,R)=(q2,)(q2,0,R)=(q2,1,R) =(q2,c,R)=(q2,1,B)=(q2,c,B)=(q2,0,G)=(q2,c,G)=这里(q2,R)=(q2,)的作用是:当读完带上所有 符号时,清除下推栈,使之为空,接收带上符号串。,2.2.2 下推自动机举例,49,5PDA的瞬间描述ID (Instantaneous Description )PDA M的当前格局,称之为M的瞬间描述ID。用有序
29、三元组(q,x,)表示瞬间描述ID,其中q- qQ, M的当前状态,x-x*, 输入带上还没有被读到的符号串, - *, 当前栈内符号串。 例如上例中,当带上符号串为0011c1100时, 开始的ID0:(q1,0011c1100,R), 当读完第一个0后,变成ID1:(q1,011c1100,BR)。 :表示由一个ID,经过一个动作变成另一个ID时,ID 之间的转变关系。 例如上例中有 ID0ID1,即 (q1,0011c1100,R) (q1, 011c1100,BR)。 *:表示经过多个动作后,ID之间的转变关系。,2.2.2 下推自动机举例,50,如上例中(q1,0011c1100,R
30、)(q1, 011c1100,BR) (q1,11c1100,BBR)(q1,1c1100,GBBR) (q1,c1100,GGBBR)(q2,1100,GGBBR) 可以写成 (q1,0011c1100,R)*(q1,1100,GGBBR)。 6PDA M所接收的语言 PDA M接收语言有两种方式: 1).空栈接收的语言,记作N(M):令 M=(K,q0,Z0, ),N(M)=w|w*,(q0,w,Z0)* (q,), qK 即当M读完带上符号串w后,栈内为空,则接收w 。 上例中M识别0011c1100时,ID的变化过程: (q1,0011c1100,R) (q1,011c1100,BR)
31、 (q1,11c1100,BBR) (q1,1c1100,GBBR) (q1,c1100,GGBBR) (q2,1100,GGBBR) (q2,100,GBBR) (q2,00,BBR) (q2,0,BR) (q2,R) (q2,) 接收0011c1100。,2.2.2 下推自动机举例,51,2)用终止状态接收的语言,记作T(M):令M=(Q,q0, F), T(M)=w|w*,(q0,w,Z0)* (q,), qF,* 即当M读完带上符号串w后,进入终止状态q,而栈内不 一定为空,则接收输入符号串w 。,2.2.2 下推自动机举例,52,2.2.2 下推自动机举例,例2.12 给出识别下面语
32、言的PDA M: wwR | w 0,1* wR表示倒写的w。此例与前例不同,前例w与wR之间有一个标志c,而此例的w与wR之间无标志,识别起来就麻烦一些。,53,解:设计的思想是:PDA M 有两个状态Q=q1,q2,有三 个栈内符号,即R,B,G。 它的动作设想: 1开始时,PDA M的状态为q1 ,栈顶符号为R。 2 当读左半边的符号串w时,M是在q1状态,这时如果读0,则向栈内压入符号B;如果读1,则向栈内压入符号G。 当读完左半部分符号串w后,状态变成q2, 之后,要读右半边的符号串wR,这时如果读0,此时栈顶应该是B,则B退栈;如果读1,此时栈顶应该是G,则G退栈;当带上符号都读完
33、时,栈内应该是符号R。,2.2.2 下推自动机举例,54, 问题是:如何判断w与wR的分界线。我们注意到w的 末尾符号与wR开始符号相同。因此当连续读的两个符号 相同时,就有两种可能:一种情况是这两个符号都是w中 的符号,此时状态不变;另一种情况是前一个符号是w末 尾的符号,而后一个符号是wR的第一个符号,此时就要 改变状态。构造PDA M(q1,q2,0,1,R,B,G,q1,R,)M的动作如下: (q1,0,R)=(q1,BR) (q1,1,R)=(q1,GR) (q1,0,B)=(q1,BB),(q2,) (q1,1,B)=(q1,GB) (q1,0,G)=(q1,BG) (q1,1,G
34、)=(q1,GG),(q2,) (q2,0,B)=(q2,) (q2,1,G)=(q2,) (q2,R)=(q2,) (q1,R)=(q2,) (q2,0,R)=(q2,1,R)=(q2,1,B)=(q2,0,G)=,2.2.2 下推自动机举例,下面看看M识别110011的ID变换过程: 注:符号“”表示执行动作得到后面的ID;符号“ ”表示执行动作得到下面的ID。(q1,110011,R) (q2,110011,) (q1,10011,GR) (q2, 0011,R) (q2, 0011,) (q1,0011,GGR) (q1,011,BGGR) (q2,11,GGR) (q2,1,GR)
35、(q1,11,BBGGR) (q2,R) (q1,1,GBBGGR) (q2,BBGGR) (q2,) (q1,GGBBGGR),56,左右: 如果一个语言是上下文无关的,则存在一台下推自动机识别它。 右左: 如果一个语言被一台下推自动机识别,则它是上下文无关的。,2.2.3 PDA与CFG之间的等价性,本节证明PDA与CFG在能力上是等价的,都能够描述上下文无关语言类。下面说明如何把任意一个上下文无关文法转换成能识别相同语言的下推自动机,以及相反。,57,2.2.3 PDA与CFG之间的等价性,Proof: We shall prove by construction.,假设L为CFG G产
36、生的语言,我们要说明如何将G转换为一台等价的PDA。,PDA的非形式化描述: 将标记符号$及G的开始变元放入栈中 重复下述步骤: 如果栈顶是变元A,则非确定地选择一个关于A的规则,并且把A替换成这条规则右边的字符串。 如果栈顶是终结符a,则读输入中的下一个符号,并且将其与a比较。如果它们匹配,则重复,如果不匹配,则这个非确定性分支拒绝。 如果栈顶是符号$,则进入接受状态,如果此刻输入已全部读完,则接受这个输入串。,58,An Example Run,Input: 1100 CFG: S SS | 1S0 | 10,1100,At the beginning,1100,PDA uses the
37、rule S 1S0,100,Input char is matched,Next char,Next char,Next char,59,An Example Run (cont.),Input: 1100 CFG: S SS | 1S0 | 10,100,PDA uses the rule S 10,00,Input char is matched,0,Input char is matched,Next char,Next char,Next char,60,Input: 1100 CFG: S SS | 1S0 | 10,Whole input string is processed,
38、The $ in the top of stack tells PDA the stack is empty. PDA accepts the string,Next char,Next char,An Example Run (cont.),61,Another Example Run,Input: 1100 CFG: S SS | 1S0 | 10,1100,At the beginning,1100,PDA uses the rule S 10,100,Input char is matched,Next char,Next char,Next char,62,Another Examp
39、le Run (cont.),Input: 1100 CFG: S SS | 1S0 | 10,100,输入字符与栈顶终结符不匹配,怎么办? It stops exploring this branch of computation,Next char,63,2.2.3 PDA与CFG之间的等价性,证明:转移函数的缩写记号 设q和r是P的状态,a ,s 。我们要求P,当读a并且弹出s时,从q到r,并且同时把整个字符串u=u1ul推入栈。可以如下完成这个动作:引入新的状态q1,ql-1, 并且令转移函数 (q,a,s)包含(q1,ul) (q1, , )=(q2,ul-1) (ql-1, , )
40、=(r,u1) 使用记号(r, u) (q, a, s)表示当q是P的状态,a是下一个输入符号以及s是栈顶符号时,PDA P能够读a和弹出s,然后把字符串u推入栈和转移到状态r。,机器能够一步把一个字符串写入栈内。同时引入附加的状态,实现每次写入这个字符串的一个符号,从而模拟出一次写入字符串的动作。,64,2.2.3 PDA与CFG之间的等价性,证明: P的状态集Q=qstart,qloop,qaccept E,E实现上面描述的缩写所需要的状态集合。 (q, a, s)= (r, u)表示当q是P的状态,a是下一个输入符号以及s是栈顶符号时,PDA P能够读a和弹出s,然后把字符串u推入栈和转
41、移到状态r 转移函数定义如下:从初始化栈开始,把符号$和S推入栈,实现步骤1的非形式描述: (qstart, , )=(qloop,S$),然后进行步骤2循环 首先 ,处理情况1,此时,栈顶为一变元。令 (qloop, , A)=(qloop, w) |Aw是R中的一条规则 其次,处理情况2,这时栈顶是一个终结符。令 (qloop, a, a)=(qloop, ) 最后,处理情况3,这时栈顶是空栈标记符。令 (qloop, , $)=(qaccept, ),65,q,r,q1,q2,a, s z, y, x,Using two dummy states to replace s by xyz
42、at the top of the stack,q,r,a, s xyz,A shorthand notation,a, b c 表示机器从输入中读取a时可以用c替换栈顶的符号b。a、b、c中任何一个都可以是 ,如果a是,机器转移而不读取输入中任何符号;若b为,不读栈中任何符号;c为,不在栈中写任何符号。pop b,push c,66,PDA for Proof of (1),qstart,qloop,start, S$, A xyz for rule A xyz,a, a for terminal a, $ ,qaccept,shorthand notation used here,REVI
43、EW(2011-03-16),乔姆斯基范式 称一个上下文无关文法是为乔姆斯基范式(Chomsky normal form),如果它的每一个规则具有如下形式:A BCA a 任一上下文无关语言都可以用一个乔姆斯基范式的上下文无关文法产生。 Step 1: 增加起始变元 S0 和规则 S0 S, 其中S是原来的起始变元。 Step 2: 考虑所有的 规则。 对于 A , 删去每个A都会产生一个新规则。 Step 3: 考虑单一产生式A B。 Step 4: 考虑A u1 u2 uk, 其中 k 2且ui 是变量或终结符。替换该规则A u1A1, A1 u2A2, A2 u3A3, , Ak-2 u
44、k-1uk例子,67,68,下推自动机Pushdown Automata (PDA),计算模型、PDA = NFA + 栈(无限)、能力上与上下文无关文法等价 PDA的结构:输入带、有限控制器、下推栈、两个只读头 PDA的形式化定义: M=(Q, q0, F), Q P( Q ) 两种状态转移函数: (q,a,Z)=(p1,1),(p2,2),(pm,m)-读头右移一个单元 (q,Z)=(p1,1),( p2,2),( pm,m)-读头不动,REVIEW(2011-03-16),REVIEW(2011-03-16),PDA与CFG之间的等价性 一个语言是上下文无关的,当且仅当存在一台下推自动机识别它。 左右: 如果一个语言是上下文无关的,则存在一台下推自动机识别它。CFGPDA 右左: 如果一个语言被一台下推自动机识别,则它是上下文无关的。 CFGPDA : 将标记符号$及G的开始变元放入栈中 重复下述步骤: 如果栈顶是变元A,则非确定地选择一个关于A的规则,并且把A替换成这条规则右边的字符串。 如果栈顶是终结符a,则读输入中的下一个符号,并且将其与a比较。如果它们匹配,则重复,如果不匹配,则这个非确定性分支拒绝。 如果栈顶是符号$,则进入接受状态,如果此刻输入已全部读完,则接受这个输入串。,