语言编号a的npda小于或等于b {'44}

时间:2016-11-11 15:49:11

标签: computer-science discrete-mathematics automata pushdown-automaton finite-state-automaton

我正在尝试为L = {w∈{a,b} * |构造一个npda n a (w)< = 3 * n b (w)}。 这意味着对于每个 b ,最多可以有3个 a

首先,这是我到目前为止所做的。 从开始状态开始,我们推送单个" a "在堆栈上。 (在一天结束时,如果每个b超过3个,我们需要看到这个" a "才能进入最终状态,我们会弹出这个" a ",我们不会达到最终状态。

然后对于字符串上的每个 b ,我会推送3 a 。对于输入中的每个 a ,我会弹出一个" a "。

最后,如果堆栈上有 a ,我们会进入最终状态。

Click here for the npda drawing

因此,我们考虑一个字符串,其中nb(w)= 1且na(w)= 3。 我们可以有baaa,aaab,abaa,aaba这样的字符串。 (还有其他人)

如果我们要为baaa运行npda。这样可以正常工作。

什么都读(lambda)我们推 a 。然后我们阅读 b ,然后按 aaa 。堆栈内容是(aaaa)。然后我们读了一个并弹出一个a。我们这样做3次,堆栈变成(a)。读完字符串后,堆栈上有一个左边,所以我们很高兴进入最终状态。

问题是,这种结构只有在 b a 出现之前首先向堆栈提供3 a的时候才有效在字符串上。如果我们在字符串aaab上运行npda,这将不再有效。我们会在堆栈上单个a,读取第一个 a 我们必须弹出 a 。读第二个a,没有可以完成的操作。堆栈中没有任何内容,我们无法推送 a ,因为这会弄乱一切。

我怎样才能修复这个结构,或者是否有更好的npda结构。

我已经做了好几天了。非常感谢帮助。

也知道我对npda很新,所以我可能会做一些根本错误的事情。所以,在解释中要清楚。

谢谢

2 个答案:

答案 0 :(得分:1)

我不确定能否给出我的确切答案,因为我很确定我们属于同一类335。洛尔。

主要问题是你没有考虑所有可能性。

初始状态在其循环中有14种可能性,它可以分支到2个返回初始状态的分支。在看到堆栈符号结束时,它也会转换到最终状态。

除了注明的所有这些都是在初始状态循环中完成的。

看到:

a input:
    Push a onto the stack

b input:
    You can pop it or replace it with 1 or 2 b's
    Or
    You can pop one b
    Or
    You can pop 2 or 3 b's (Done by branching into 2 different branches of
    states that do just that, respectively, and return to the initial state)

看到b:

a input:
    Pop b (Only way to meet criteria for final state)

b input:
    Push 0 to 3 b's

看到堆栈符号结束时:

empty string input:
    Go to final state.

如果我有另一种沟通方式,我可以提供更多帮助。

答案 1 :(得分:1)

好的,这是一个暗示。到目前为止,您的解决方案基本上只是使用堆栈作为计数器,在扫描字符串时计算值3 * nb(w) - na(w),使用堆栈深度作为计数器的值。在“b”上添加3,在“a”上减去1。基本上,一个很好的解决方案。

问题是,只有在计数器永远不会消极的情况下,这才有效。为了使其适用于所有情况,您需要一种方法让您的计数器记录一个负数。考虑一种方法,你可以使用堆栈作为一个计数器,可以很容易地记录正数或负数,并告诉你最后的值是否>> 0 ...