【发布时间】:2011-03-12 23:53:48
【问题描述】:
我正在寻找一种将确定性有限自动机转换为下推自动机的算法。
任何帮助表示赞赏。
谢谢!
【问题讨论】:
我正在寻找一种将确定性有限自动机转换为下推自动机的算法。
任何帮助表示赞赏。
谢谢!
【问题讨论】:
DFA 的 PDA 版本看起来是一样的,只是每个状态转换也不向堆栈推送任何内容,也不从堆栈中弹出任何内容。
【讨论】:
PDS 符号中为 DFA 中的每个状态引入符号。
N 状态的有限自动化都可以模拟为2 状态PDA 和N 堆栈符号。 ..虽然你的答案很简单/
由于 PDA 是 DFA 的扩展,只有一个附加功能:堆栈。
因为 PDA 的转换由三元组(当前状态、输入、堆栈顶部的元素)决定,而 DFA 的转换由元组(当前状态、输入)决定。唯一的区别是堆栈顶部的元素。您可以通过将元组转换为三元组来转换 DFA 的所有转换,e(空字符串)作为 堆栈顶部的元素插入
并且在改变状态后,将e(空字符串)压入栈中。
【讨论】:
我正在回答这个老问题,以防其他人看到它。
只需添加一个堆栈,就可以轻松地将 DFA 转换为 PDA。但是 DFA 的语义可能会发生变化,并且在您手动更改它之后,您最终可能会得到一个状态数较少的 PDA。我最近遇到了这个问题。有点像这样,
在系统(不是编译器或类似的东西)中,由于某些原因,之前编写的代码是使用 DFA 编写的。当用户使用各种功能完成代码时,就会发生转换。一段时间后,一组新的转换函数出现了,可以按任何顺序使用。并且这些新功能中的任何一个之后的状态都可以通过这些功能之一变回以前的状态。使用 FST 解决这个问题的唯一方法是添加大量新状态来支持这种行为,这是一项巨大的工作。但相反,我只是从 DFA 更改为 PDA。堆栈非常好地跟踪转换,并且以更少的状态解决了问题。实际上我只需要添加 N 个状态,其中 N 是到达的新函数的数量。
我不知道是否有人可以轻松地自动化这种过程。但是你去吧,以防有人对此感到好奇。
【讨论】:
下推自动机不同于有限 状态机有两种方式:
- 他们可以使用堆栈的顶部来决定哪个过渡到 拿走。
- 他们可以在执行转换的过程中操纵堆栈。
下推自动机选择一个转换 通过输入信号索引表, 当前状态,以及在 栈顶。这意味着 这三个参数完全 确定过渡路径是 选择。有限状态机只是 看看输入信号和 当前状态:他们没有堆栈 一起工作。下推自动机添加 堆栈作为参数供选择。
...
下推自动机等价于 上下文无关文法:对于每个 上下文无关文法,存在一个 下推自动机使得 语法生成的语言是 与生成的语言相同 由自动机,这很容易 证明。反之亦然 更难证明:每次下推 自动机存在一个上下文无关的 语法使得语言 自动机生成的是 与生成的语言相同 根据语法。
【讨论】: