language-theory - 如何设计这个下推自动机的转换函数?

标签 language-theory pushdown-automaton

我正在学习 PDA 测试,我想知道如何设计一个识别以下语言的下推自动机:

L = {a^max(0,n-m)b^n a^m| n,m >=0} 

如何设计一个转换函数来识别 n-m 是否大于 0

如果您有一些已解决此级别练习的类(class) Material ,请添加一个链接。

最佳答案

您可以根据堆栈顶部的值决定从当前状态转到哪里,您使用堆栈上的符号来记录解析状态。

我认为这是可行的: this 是从输入读取的符号,THIS 是堆栈上的符号。 堆栈底部的符号 X 表示 n <= m 不要将 XZ 混淆,后者是堆栈的初始符号,有助于确定堆栈何时为空。

这个解决方案可能存在一些问题,但总体方法应该是正确的。

...祝你考试顺利:-)


首先,从字符串开头读取所有a符号,并将A添加到每个符号的堆栈中,或者压入X> 如果没有a

然后你读到所有的b符号:

  • 如果堆栈为空(Z 在顶部)、B 在顶部或 X 在顶部,则插入另一个B 到堆栈。
  • 如果堆栈顶部有A,则将其删除。

最后一步是读取最后的a符号。

  • 如果堆栈上有B,请将其移除。
  • 如果堆栈上有X,则将其保留在那里
  • 如果堆栈为空(Z 在顶部),那么这一定是字符串的结尾

另一个编辑:

抱歉,如果以上内容不清楚……我会尝试将其形式化。

接受状态是(4)和(5),起始状态是(1)。而且它是不确定的

以及转换规则:

状态(1):读取第一批a符号

  • (1) aZ/AZ -> (1)
  • (1) aA/AA -> (1)
  • (1) ε; A/A -> (2)
  • (1) ε; Z/Z -> (2)

状态(2):读取b符号

  • (2) b; Z/BZ -> (2)
  • (2) b; X/BX -> (2)
  • (2) b; B/BB -> (2)
  • (2) b; A/epsilon -> (2)
  • (2) ε; B/B -> (3)
  • (2) ε; X/X -> (3)
  • (2) ε; Z/Z -> (3)

状态(3):读取最后一个as

  • (3) a; B/无 -> (3)
  • (3) ε; X/X -> (4)
  • (3) ε; Z/Z -> (5)

状态 (4):如果 m > n,则尾随 as

  • (4) a; X/X -> (4)

状态 (5) 用于在 m < n 时接受确切的字符串

(并且要绝对清楚 - 当没有状态的方式并且阅读光标不在单词的末尾时,则该单词不被接受)

通过使用附加状态而不是堆栈符号X,这可能会变得更简单,但我想你可以自己做:-)

关于language-theory - 如何设计这个下推自动机的转换函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1055098/

相关文章:

regex - 出于好奇,这里有多少人知道正则表达式是如何编译的?

scala - Option [T]来自Scala的什么地方?

c++ - FSM 中的状态应该与上下文类型成为 friend 吗?

context-free-grammar - 设计一个下推自动机来计算字符数

haskell - 在haskell中接受/拒绝下推自动机

pushdown-automaton - 具有不等变量的下推自动机

grammar - 有人可以举一个上下文相关语法的简单但非玩具示例吗?

language-agnostic - 从 "Atoms"构建 OOP 编程语言