在下推自动机中以相反的顺序推送/弹出堆栈

时间:2015-03-11 07:31:31

标签: automata non-deterministic pushdown-automaton automata-theory

所以我正在学习测试,我已经开始使用下推自动机和无上下文语言,我坚持这一结构。

我让这个自动机的每个部分都完全正常工作,除了我将在下面解释的一部分。

需要识别的语言是: {x#y#z#w | x,y,z,w在{0,1} +中,x≠w且y≠z}。

所以我遇到的问题是将Xi与Wi进行比较,因为在自动机处理W时我们不知道Wi的元素,就像我设计的那样。

如果我存储X的内容,当弹出时间并将每个元素与W的元素进行比较时,它们将以相反的顺序弹出,因此将000111和111000视为相同的字符串,PDA将拒绝,什么时候应该明确接受(它们是不同的字符串)。这只是一个例子,这也会导致其他输入被错误地分析。

如果有办法以相反的顺序将X的内容压入堆栈,它们将以原始形式弹出,允许我正确地比较字符串的内容。

如果在正常推动后有一种方法可以反转堆栈的内容,这也可以让我找到解决方案。

非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:6)

解决方案有点棘手。

实际上没有办法在PDA中反转堆栈的内容。 这完全是关于npda的非确定性特性,这使得这个问题可以解决。

从这个更简单的版本开始

L = {x#w: x,w in {0,1}+ and x≠w}.

<强>解决方案:

以州 q 开头。为x的每个字母推送 $ 直到第k个字母(k不重要,选择k非确定性),然后检查第k个字母并转到 q0 如果它是 0 或者如果它是 1 则转到 q1 。忽略x的其余部分,直到到达。为w的每个字母弹出 $ ,直到到达堆栈的底部(例如 z )。 检查w的第k个字母。如果[你在 q0 且信件不是 0 ]或[你在 q1 并且信件不是 1 ]接受。

就是这样,巫术!