PDA到CFG转化例子.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PDA到CFG转化例子

关于由PDA向CFG的构造 PDA与CFG的等价的,意味着对任意上下文无关文法(CFL),都相应地存在一个PDA接受它。而这个等价性证明对于大部分学生而言都是形式语言中能与图灵机(Turing Machian)构造相提并论的绝对难点之一。而这其中最让人难以理解的便是如何由PDA转换为相应的CFG。 “你可以先用两周的时间开明白它是怎么构造的,然后再花一个月的时间,你就会逐渐理解它为什么这么构造。” SDL讲这部分内容的时候如是说。这是我写这篇文章的动机。尽管下午两小时形式语言考试的结束意味着至少在相当一段时间里我不会再去研究相关的问题,可是在饱尝口授之苦之后,我觉得依然有必要把我对这部分的理解写下来,算是裨益后人吧。希望对看到它的人有所帮助。 ? 首先是所构造的CFG中每个变元所表示的涵义: 形式:[qxp] 涵义:PDA中的状态q在pop(x)之后到达p状态 来源:PDA中的每个转移 生成式:以下将用例题来阐述生成式的构造方法以及其原理。? 例:将PDA ?P=({p, q}, {0, 1}, {X, Z},δ, q,z)转换为CFG,其中δ为: 1:δ(q, 1, Z) = {(q, XZ)}? 2:δ(q, 1, X) = {(q, XX)} 3:δ(q, 0, X) = {(p, X)} 4:δ(q,ε,X) = {(q,ε)} 5:δ(p, 1, X) = {(p,ε)} 6:δ(p, 0, Z) = {(q, Z)} ? OK,我们来开始构造: 令所要构造的CFG?G=(V, T, P, S) 首先看P接受哪些串。显然对它接受的串w, 都满足由初始状态(start state)读入串w之后达到empty stack。细心的人可能会发现P是以空栈方式接受的PDA,但聪明的人会更深一步去想,为什么转换成CFG的PDA必须是以空栈方式接受的,而不能是以终态方式接受的? 好了,既然如此,那么所构造的CFG应该有什么样的生成式呢? 很显然:S - [qZq] | [qZp]  即每个生成式都是由PDA中的初始状态q通过一系列变换之后pop(Z)的结果,至于终态是什么,我们不知道,因为它是以空栈方式接受的,因此PDA中存在多少个状态,q将栈底元素pop之后就能到达多少个状态。 ???????? 接下来,我们将为每个转移过程构造相应的生成式: 1:δ(q, 1, Z) = {(q, XZ)} 由于我们所构造的CFG中的变元形式为[qxp], 它的涵义在上面已经讲过。而针对这个转移并不是执行pop操作,而是执行push操作。那我们应该怎么办呢?这是整个转换过程中最抽象的地方,也是最难理解的地方。 回想一下我们对start symbol的构造,我们最终是要将栈底元素Z弹出,而这个过程我们可以将它划分为n个子过程,即我们现在所看到的生成式。每个生成式都是一个pop的过程,最终所有的pop过程迭加起来便得到最终的空栈状态。这是为什么针对push操作(包括其他任何操作)我们都构造pop形式变元的原因。 ? 对于该转移,我们得到的生成式是: [qZq] - 1[qXq][qZq] [qZq] - 1[qXp][pZq] [qZp] - 1[qXq][qZp] [qZp] - 1[qXp][pZp]为什么是这样? 首先看-左边的变元,显然根据转移δ(q, 1, Z) = {(q, XZ)}我们知道这是一个push操作,因此q在pop栈底元素Z后我们不知道它会发生什么,同样的,它会转移到什么状态对于我们而言也是完全透明的,因此我们必须考虑进所有情况。 而它因何会生成-右边这种形式的生成式呢,我们来考虑一个例子: 比如说郭先生想从哈尔滨去广州看望故人,当然他可以选择直接从哈尔滨飞往广州,这也是最快的方法。而郭先生喜爱享受旅途的过程,于是他先从哈尔滨飞往大连,再由大连坐船至杭州,再由杭州乘火车至广州。从逻辑上讲(或者从形式上说)这两种方法显然是等价的。 好的,我们现在来考虑这个过程与我们所构造文法的内在关联。 第一个过程是郭先生直接从哈尔滨飞往广州。对,这就是-左边的变元涵义。由此说来右边生成式的涵义也容易理解了,郭先生身上原有Z元钱,从哈尔滨(状态q)乘飞机(读入1)至大连(状态q),这个过程中他往银行取了X元钱。再由大连坐船至杭州,花费X元钱([qXq]),接着由杭州坐火车至广州,花费Z元钱([qZq]),同时他的目的地也到达了。 想通了么?是不是忽然发现这个过程有点简单的匪夷所思?呵,everything is easy. 当然了,中间站是可以选择的,因此从大连出发,我可以去杭州,也可以去天津,南京等其他城市。 ???????? 有了这个描述过程,我想接下来的转换可以不必再详细解释了。 2:δ(q, 1, X) = {(q, XX)}

文档评论(0)

cgtk187 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档