要绘制接受L的NPDA的转换图,我认为可以通过阅读a
,编写a
,然后向右移动,然后对{{{ 1}}所以有一些状态q 1 正在得到那些" ab"动作。但是,如何让b
获得bb
?
我有一些我觉得有用的东西,但我自己也在教这个,所以也许有人可以告诉我n-1
和n
可以正确完成的地方。
编辑:
但现在应该是它 -
答案 0 :(得分:1)
实际上很简单。每次读取“ab”时,都会在堆栈中存储令牌。然后在读完“c”后,你从那个标记中拿出一个。然后对于每个“bb”,您从堆栈中获取一个令牌。当堆栈为空时,您接受。
对于NPDA本身,这取决于您如何定义接受度。从你的问题来看,我不是通过“写a
,然后向右移动”得到你的意思。您是否将NPDA与图灵机混淆? NPDA非常类似于NFA(非确定性有限自动机),除了它配备了一个堆栈,您可以在其中放置堆栈符号。在此处阅读更多内容:http://www.cs.duke.edu/~rodger/courses/cps140/lects/sectnpdaH.pdf
下面是转换表,假设堆栈符号{A,Z}
,其中Z
是初始堆栈符号。当我们处于唯一接受状态q a 时接受,我们已经读完输入磁带。假设每个转换总是消耗一个堆栈符号,并且如果在NPDA未处于接受状态时没有更多符号要消耗,则NPDA不接受(或拒绝)该字符串。
在下表中,第一列表示我们当前所处的状态以及我们正在读取的堆栈符号。后续列表示在读取输入字符串中的特定字符时推送到堆栈的新状态和堆栈符号(或者根本不读取任何字符ε)
+------++---------+-------+--------+-------+ | || a | b | c | ε | +------++---------+-------+--------+-------+ |(q1,Z)|| (q2,Z) | - | - | - | +------++---------+-------+--------+-------+ |(q1,A)|| (q2,A) | - | (q3,ε) | - | +------++---------+-------+--------+-------+ |(q2,Z)|| - |(q1,ZA) | - | - | +------++---------+-------+--------+-------+ |(q2,A)|| - |(q1,AA) | - | - | +------++---------+-------+--------+-------+ |(q3,Z)|| - | - | - |(qa,ε) | +------++---------+-------+--------+-------+ |(q3,A)|| - | (q4,A) | - | - | +------++---------+-------+--------+-------+ |(q4,A)|| - | (q3,ε) | - | - | +------++---------+-------+--------+-------+
这里的关键思想是堆栈中的A数表示输入字符串中出现短语“ab”的次数。
你可以看到,在状态q 1 中用堆栈符号Z读取“a”时,我们将Z推回堆栈。意思是仍然没有检测到“ab”。然后它将转到q 2 。
在q 2 中,我们只接受“b”,任何其他输入都会导致它挂起(因此拒绝)。它将读入的状态推回到堆栈中,加上额外的A,有效地将堆栈中的A数增加1,因为此转换表示输入字符串中的附加短语“ab”。
状态q 3 表示成功读取“c”后的部分。请注意,从q 1 到q 3 的转换必须使用A,而不是Z,因为我们有约束n >= 1
。然后,在读“b”时,它将进入状态q 4 以等待另一个“b”。稍后q 4 ,在读取“b”时,将消耗堆栈符号A,匹配
在状态q 3 ,一旦到达堆栈符号Z,我们还希望转换到接受状态q a ,指的是n
的状态“bb”的副本“ab”和n-1
。
状态q 4 仅接受带有堆栈符号A的输入字符串“b”,表示查找新短语“bb”应匹配先前找到的一个短语“ab”。
希望这有帮助!