【发布时间】:2012-06-19 02:16:58
【问题描述】:
我需要从 DCG 形式的上下文无关文法中得到一个非确定性下推自动机的 delta 函数,而这样做的算法非常简单:
对于语法中的每个规则 A --> B,将转换 [q1, lambda, A] --> [B] 添加到 delta 函数。
对于语法中的每个规则 E --> c,将转换 [q1, c, c] --> [lambda] 添加到 delta 函数。
将转换 [q0, lambda, z0] --> [q1, S*z0] 和 [q1, lambda, z0] --> [q2, z0] 添加到 delta 函数。
每个大写字母都是非终结符,每个小写字母都是终结符。 lambda 是空字符串,S 是语法的初始符号,* 是连接运算符,z0 是栈顶符号。
这表示语法
S --> A*b | B | y
A --> w*x | x
B --> A*b
使用 delta 函数生成下推自动机
[q0, lambda, z0] --> [q1, S*z0]
[q1, lambda, S] --> [q1, A*b]
[q1, lambda, S] --> [q1, B]
[q1, lambda, S] --> [q1, y]
[q1, lambda, A] --> [q1, w*x]
[q1, lambda, A] --> [q1, x]
[q1, lambda, B] --> [q1, A*b]
[q1, b, b] --> [q1, lambda]
[q1, w, w] --> [q1, lambda]
[q1, x, x] --> [q1, lambda]
[q1, y, y] --> [q1, lambda]
[q1, lambda, z0] --> [q2, z0]
我必须在 Prolog 中实现这个算法(从用户那里获取语法并返回 delta 函数),我很困惑,因为这是我第一次使用逻辑编程语言。
我想我可以将语法翻译成它的谓词形式,然后“迭代”所有谓词,并以某种方式将已经“遍历”的谓词添加到一个列表中,这样我就可以处理这个列表并返回 delta 函数。但我认为这是一种非常复杂的命令式做事方式,使用 Prolog 是没有意义的。
也许这个问题有更优雅的解决方案,所以我想知道这样的解决方案是否存在。
【问题讨论】:
-
我认为你应该标记为家庭作业并向我们展示一些解决方案
-
已将其标记为作业,对此感到抱歉。我已经尝试从文件中读取语法并仅附加文本,但我意识到这是另一种命令式解决方案,因为我需要一个条件来确定符号是终端还是非终端。