5

因此,我正在为一项关于下推自动机和无上下文语言的测试而学习,我被困在这个结构上。

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

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

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

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

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

如果有办法在正常推送后反转堆栈的内容,这也将使我得出解决方案。

任何帮助将不胜感激。谢谢。

4

1 回答 1

7

解决方案有点棘手。

实际上没有办法在 PDA 中反转堆栈的内容。这一切都与 npda 的非确定性性质有关,这使得这个问题可以解决。

从这个更简单的版本开始

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

解决方案:

从状态q开始。为 x 的每个字母推一个$,直到第 k 个字母(k 不重要,不确定地选择 k),然后检查第 k 个字母,如果它是0 ,则转到q0 ,如果它是1 ,则转到q1 . 忽略 x 的其余部分,直到达到#。为 w 的每个字母弹出一个$,直到到达堆栈底部(例如z)。检查 w 的第 k 个字母。如果 [你在q0并且字母不是0 ] 或 [你在q1并且字母不是1 ] 接受。

就是这样,巫术!

于 2015-03-24T10:31:55.207 回答