您可以将,
DCG 中的内容读取为然后或连接:
s -->
[a],
[b].
和
t -->
[a,b].
是一样的:
?- phrase(s,X).
X = [a, b].
?- phrase(t,X).
X = [a, b].
它与,
非 DCG/常规 Prolog 规则不同,这意味着逻辑合取 (AND):
a.
b.
u :-
a,
b.
?- u.
true.
ieu
如果a
且为真则为b
真(这里就是这种情况)。
另一个区别也是谓词s/0
不存在:
?- s.
ERROR: Undefined procedure: s/0
ERROR: However, there are definitions for:
ERROR: s/2
false.
这样做的原因是语法规则s
被翻译成 Prolog 谓词,但这需要额外的参数。评估语法规则的预期方法是phrase/2
如上所述使用 ( phrase(startrule,List)
)。如果你愿意,我可以添加关于从 DCG 到普通规则的翻译的解释,但如果你是 Prolog 的初学者,我不知道这是否太令人困惑。
附录:一个更好的例子是定义t
为:
t -->
[b],
[a].
带有短语的评估结果在列表中[b,a]
(这绝对不同于[a,b]
):
?- phrase(t,X).
X = [b, a].
但是如果我们重新排序规则中的目标,谓词为真的情况永远不会改变(*),所以在我们的例子中,定义
v :-
b,
a.
相当于u
。
(*) 因为 prolog 使用深度优先搜索来找到解决方案,所以它可能需要尝试无限多个候选者才能在重新排序后找到解决方案。(在更专业的术语中,解决方案不会改变,但如果您重新排序目标,您的搜索可能不会终止)。