所以我正在学习测试,我已经开始使用下推自动机和无上下文语言,我坚持这一结构。
我让这个自动机的每个部分都完全正常工作,除了我将在下面解释的一部分。
需要识别的语言是: {x#y#z#w | x,y,z,w在{0,1} +中,x≠w且y≠z}。
所以我遇到的问题是将Xi与Wi进行比较,因为在自动机处理W时我们不知道Wi的元素,就像我设计的那样。
如果我存储X的内容,当弹出时间并将每个元素与W的元素进行比较时,它们将以相反的顺序弹出,因此将000111和111000视为相同的字符串,PDA将拒绝,什么时候应该明确接受(它们是不同的字符串)。这只是一个例子,这也会导致其他输入被错误地分析。
如果有办法以相反的顺序将X的内容压入堆栈,它们将以原始形式弹出,允许我正确地比较字符串的内容。
如果在正常推动后有一种方法可以反转堆栈的内容,这也可以让我找到解决方案。
非常感谢任何帮助。感谢。
答案 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 ]接受。
就是这样,巫术!