algorithm - 有没有一种方法或算法可以将 DCG 转换为 Prolog 中的正常定性子句?

标签 algorithm parsing prolog grammar dcg

我是 Prolog 的新手,我想了解如何将文法从 DC​​G 翻译成普通的定语从句。 我知道 DCG 表示法只是 Prolog 中普通定语子句的语法糖。我开始描述正常的确定语法和 DCG 之间的一些相似之处,但未能应用相同的模式,所以我想问是否有一些我遗漏的规则或可能有效的转换算法。

这是我正在研究的语法,这是我为翻译该语法所做的工作:

expr --> term, addterm.
addterm --> [].
addterm --> [+], expr.
term --> factor, multfactor.
multfactor --> [].
multfactor --> [*], term.
factor --> [I], {integer(I)}.
factor --> ['('], expr, [')'].

这个文法实际上是检查算术运算的句法正确性。 第一条规则实际上很容易转换,因为它的模式类似于普通的确定文法,第四条规则也是如此。但是我对其他四个一无所知。这是我如何转换规则:

expr(E0,E) :- term(E0,E1), addterm(E1,E).

最佳答案

如果您的 Prolog 系统提供了一个 expand_term/2 内置谓词,您可以使用 usually 将语法规则扩展为子句。例如:

?- expand_term((a --> b, c), Clause).
Clause = (a(_G1012, _G1013):-b(_G1012, _G1028), c(_G1028, _G1013)).

要获得更具可读性的输出(并且为此目的),请尝试:

?- expand_term((a --> b, c), Clause), numbervars(Clause, 0, _).
Clause = (a(A, B):-b(A, C), c(C, B)).

numbervars/3 是大多数 Prolog 系统上的事实上的标准谓词。

关于algorithm - 有没有一种方法或算法可以将 DCG 转换为 Prolog 中的正常定性子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29993566/

相关文章:

io - Prolog:将用户输入作为参数传递

algorithm - 最佳矩形孵化算法

javascript - 如何抑制来自 PhantomJS 的错误消息?

python - Minidom(XML解析)与Python - 不想获取任何 child 的子节点

php - 更新 wordpress 时解析错误 : syntax error, 意外 T_FUNCTION

Prolog 变量名以下划线开头,然后大写

c# - 按特定项目对枚举类型列表的成员进行排序

algorithm - 查找矩阵子矩阵的最有效方法 [matlab]

java - 如何将 Int/String 数组转换为带有节点的二叉树?

compiler-errors - Prolog错误: Full stop in clause-body?无法重新定义,/2