(自动机总结)PDA与CFG的转化

来源:互联网 发布:python冒泡排序详解 编辑:程序博客网 时间:2024/06/03 17:41


         



 
 
好了,既然如此,那么所构造的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形式变元的原因。
 
对于该转移,我们得到的生成式是:
1. [qZq] -> 1[qXq][qZq]  2. [qZq] -> 1[qXp][pZq]  3. [qZp] -> 1[qXq][qZp]  4. [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)} 它的生成式如下:
1. [qXq] -> 1[qXq][qXq]        S->1SS 2. [qXq] -> 1[qXp][pXq]        S 3. [qXp] -> 1[qXq][qXp] 4. [qXp] -> 1[qXp][pXp] 3:δ(q, 0, X) = {(p, X)} 1. [qXq] -> 0[pXq] 2.
[qXp] -> 0[pXp]
这里会有疑惑?想想郭先生为什么一定要途中经过两个城市再到广州呢?
明白了吧,我们继续。 4:δ(q,ε,X) = {(q,ε)}


 
 
当然了,中间站是可以选择的,因此从大连出发,我可以去杭州,也可以去天津,南京等其他城市。
         有了这个描述过程,我想接下来的转换可以不必再详细解释了。 
  [qXq] -> e
这是一个pop操作,因此不需要任何中介。
5:δ(p, 1, X) = {(p,ε)}
  [pXp] -> 1
 
6:δ(p, 0, Z) = {(q, Z)} 1. [pZq] -> 0[qZq]  2. [pZp] -> 0[qZp]
0 0
原创粉丝点击