Grammar 下推自动机构造

Grammar 下推自动机构造,grammar,Grammar,如何构建接受该语言的PDA: ( {a^ib^kba^i | i>=0,k>0}) 为了获得这种语言的PDA,我建议分别为联盟中的每种语言编写两个PDA,然后不确定地跳转到一个或另一个PDA 要获得^2n | n>0的PDA,我们只需要确保a的数量是偶数;这是一种常规语言,所以DFA就足够了。DFA只是一个PDA,它对堆栈没有任何有趣的作用 /---a---\ state stack input state' stack'

如何构建接受该语言的PDA:

( {a^ib^kba^i | i>=0,k>0}) 

为了获得这种语言的PDA,我建议分别为联盟中的每种语言编写两个PDA,然后不确定地跳转到一个或另一个PDA

要获得^2n | n>0的PDA,我们只需要确保a的数量是偶数;这是一种常规语言,所以DFA就足够了。DFA只是一个PDA,它对堆栈没有任何有趣的作用

       /---a---\         state    stack    input    state'    stack'
       |       |         q0       Z        a        q1        Z
       V       |         q1       Z        a        q0        Z
----->q0--a-->q1
为了得到另一个PDA,我们看到前面和后面的a的数量必须匹配;我们需要这个堆栈。我们可以让PDA推送它读取的a,直到它看到第一个c;然后我们可以让它读c,然后至少读一个d,然后读另一个c,最后读和我们前面推过的相同数量的a:

state    stack    input    state'    stack'    comment
q0       x        a        q0        ax        push a's until we see a c
q0       x        c        q1        x         read the required c
q1       x        d        q2        x         read the required d
q2       x        d        q2        x         read as many d as needed
q2       x        c        q3        x         read the 2nd required c
q3       ax       a        q3        x         pop a's until we run out of input
q3       Z        q4       Z         Z         accept on empty stack+state
要连接这些,只需将第一个状态重命名为q0'和q1',然后添加一个新的开始状态q0,其工作方式如下:

state    stack    input    state'    stack'    comment
q0''     Z        -        q0        Z         guess we're going to the 2nd PDA
q0''     Z        -        q0'       Z         guess we're going to the 1st PDA
至于你的第二个问题:

假设我们有一个PDA,它接受最终状态,但不一定是空堆栈;也就是说,如果PDA在最终状态下没有输入,它会接受,否则会拒绝。我们可以添加一个新状态,使其成为唯一接受的状态,并将所有以前接受状态的空转换添加到该状态。这个新状态本身可以有空的转换,只用于清除堆栈而不消耗任何额外的输入。这个结构表明,如果我们可以单独接受最终状态,那么我们可以接受最终状态和空堆栈

假设我们有一个PDA,它接受空堆栈,但不一定接受最终状态;也就是说,如果PDA在堆栈为空的同时耗尽输入,则PDA接受。添加一个新状态,并将PDA转换中的所有状态放在空堆栈上。使此状态为可接受状态,并且不为其提供任何转换。PDA将崩溃,除非输入已经耗尽,并且只有在堆栈也是空的情况下才能访问它。这个构造表明,如果我们可以单独通过空堆栈接受,那么我们可以通过空堆栈和接受状态一起接受


到目前为止,你尝试了什么?你的尝试让你陷入了什么困境?你可以通过学习PDA的不确定性来解决这个问题,其中一个分支只接受偶数长度的a*字符串,另一个分支像对待任何回文类语言一样推送和弹出。