我正在尝试为 L = {w ∈ {a,b}*| 构建一个 npda n a (w) <= 3*n b (w)}。这意味着对于每个b最多可以有 3 个a。
首先,这是我到目前为止所做的。从开始状态开始,我们将一个“ a ”压入堆栈。(在一天结束时,我们需要看到这个“ a ”才能到达最终状态,如果每个 b 有 3 个以上的 a,我们就会弹出这个“ a ”,并且我们不会到达最终状态状态)。
然后对于字符串上的每个b,我会推动 3 个a。对于输入上的每个a我都会弹出一个“ a ”。
最后,如果堆栈上有一个a,我们就进入最终状态。
因此,让我们考虑一个字符串,其中 nb(w)= 1 和 na(w) = 3。我们可以有排序为 baaa、aaab、abaa、aaba 的字符串。(还有其他的)
如果我们要为 baaa 运行 npda。这会很好。
什么都不读(lambda)我们推一个. 然后我们读b,然后按aaa。堆栈内容为 (aaaa)。然后我们读取 a 并弹出一个 a。我们这样做 3 次,堆栈变为 (a)。读取字符串后,堆栈上有一个左侧,所以我们可以进入最终状态。
问题在于,这种结构仅在b在a出现在字符串上之前首先向堆栈提供 3 个 a时才有效。如果我们在字符串 aaab 上运行 npda,这将不再有效。我们将在堆栈上有一个 a ,读取第一个a我们必须弹出一个a。读第二个,没有什么可以做的操作。堆栈上没有任何东西,我们不能压入a,因为那会搞砸一切。
我该如何修复这种结构,或者该语言是否有更好的 npda 结构。
我已经为此工作了好几天。帮助将不胜感激。
也知道我对 npda 很陌生,所以可能是我在做一些根本错误的事情。所以,解释清楚。
谢谢