我正在学习PDA测试,我想知道如何设计一个能够识别以下语言的下推式自动机:
L = {a^max(0,n-m)b^n a^m| n,m >=0}
如何设计转换函数以识别n-m
是否大于0
?
并且,如果你有一些课程材料解决了这个级别的练习,请点击链接。
答案 0 :(得分:2)
您可以根据堆栈顶部的值决定从当前状态到哪里,使用堆栈上的符号来记录解析的状态。
这是我认为这将如何工作: 此是从输入中读取的符号, THIS 是堆栈中的符号。 堆栈的botoom上的符号 X 表示n <= m 不要将 X 与 Z 混淆,后者是堆栈的初始符号,有助于确定堆栈何时为空。
此解决方案可能存在一些问题,但整体方法应该是正确的。
...祝你的考试好运: - )
首先,您从字符串的开头读取所有 a 符号,并为每个符号添加 A ,或推送 X 如果没有 a
然后您阅读了所有 b 符号:
最后一步是阅读最终的 a 符号。
另一个编辑:
抱歉,如果上述内容不明确......我会尝试将其正式化。
接受状态是(4)和(5),起始状态是(1)。这是不确定的
和过渡规则:
州(1):阅读第一批 a 符号
状态(2):读取 b 符号
州(3):阅读最后的 a s
状态(4):如果m&gt;则尾随 a s Ñ
状态(5)用于在m <0时接受精确的字符串。 Ñ
(并且只是绝对清楚 - 当没有状态的方式且读取光标不在单词的末尾时,则不接受该单词)
通过使用adidional状态而不是堆栈符号 X ,这可能会变得更简单,但我想你可以自己做: - )
答案 1 :(得分:1)
最简单的方法可能是为该语言编写语法,然后为此构建一个PDA。 编写语法的最简单方法是首先根据“max”分割语言,以便更容易看到正在发生的事情
L = L1 \union L2
L1 = { b^n a^m | m >= n >= 0 }
L2 = { a^(n-m) b^n a^m | n >= m >= 0 }
现在重写L1和L2以使它们更简单(j = m-n,k = n-m)
L1 = { b^n a^n a^j | j,n >= 0 }
L2 = { a^k b^k b^m a^m | k,m >= 0 }
这些变成了非常简单的语法
L1 := BA A
L2 := AB BA
AB := a AB b | \epsilon
BA := b BA a | \epsilon
A := a A | \epsilon
L := L1 | L2
现在从他们建立一个PDA - 最容易使用自动化工具,但如果你需要显示所有的工作,可以手动完成
答案 2 :(得分:0)
我认为语言L是Chompsky层次结构中的上下文敏感或类型1语言。我错了。
语言L1 = { a^n b^n c^n : n >= 1 }
是类型1语言的一个示例。这看起来非常相似。这听起来像是一个棘手的问题!我不认为有一种类型2或无上下文的语法或PDA可以识别或生成L.