繁体   English   中英

下推自动机构造

[英]Pushdown Automata Construction

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

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

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

为 a^(2n) 获得一个 PDA | n > 0,我们只需要保证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 获取 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',然后添加一个新的开始 state 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

至于你的第二个问题:

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

  2. 假设我们有一个 PDA 通过空堆栈接受但不一定是最终的 state; 也就是说,如果 PDA 在堆栈为空的同时用完输入,则 PDA 接受。 添加一个新的 state 并将 PDA 中的所有状态转换到空堆栈上的它。 让这个 state 接受并且不给它任何转换。 PDA 将崩溃,除非输入已经用尽,并且只有在堆栈也为空时才能到达。 这个结构表明,如果我们可以单独通过空堆栈接受,我们可以通过空堆栈接受和同时接受 state。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM