我是Prolog的新手,我正在试图理解一个语法如何从DCG转化为正常的明确子句。 我知道DCG符号只是Prolog中正常定义子句的语法糖。我开始描述正常语法和DCG之间的一些相似之处,但是没有应用相同的模式,所以我在问是否存在一些我缺少的规则或可能有效的转换算法。有没有一种方法或算法将DCG转换为Prolog中的正常子句?
这里是我的工作的语法,这里是我为了做翻译的是语法:
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).
在SWI-Prolog中,您可以使用'listing/1'来查看为DCG生成的Prolog代码。例如,试试:“? - 列出(expr // 0).'和'? - 列出(factor // 0)。”。 – mat