【发布时间】:2015-12-08 15:49:41
【问题描述】:
我正在研究定从句语法,但我在理解 Prolog 如何将 DCG 规则转换为定从句时遇到了一些问题。 例如,这里有一个写成 DCG 的小语法:
s --> np, vp.
np --> det, n.
vp --> v, np.
vp --> v.
det --> [the].
det --> [a].
n --> [woman].
n --> [man].
v --> [kisses].
如果我提出疑问:
?-listing(s).
它回答我:
s(A,C) :-
np(A,B),
vp(B,C).
这是什么意思?为什么有两个论点?
另外,这里的“C”是什么意思:
det(A,B) :-
'C'(A,the,B).
?
谢谢!
【问题讨论】:
-
你在哪里看到
'C'(A,the,B).?当我尝试时,您的原始 DCG 源的列表没有显示det/2的定义。但是直接回答这个问题,'C'是一个原子,所以'C'(A,the,B)是一个名为'C'的谓词的调用,带有三个参数:A(变量)、the(原子)和@987654333 @ (多变的)。s(A,C)有两个参数,因为 Prolog 在内部为差异列表添加了一个参数,这就是它实现 DCG 的方式。您通常会使用phrase(s, L)致电 DCG。 -
只是出于好奇。我读到有时 Prolog 实现会转换规则,例如:det --> [the]。不进入 det([the|W],W)。但进入 det(A,B) :- 'C'(A,the,B)。
-
好的,很有趣。正如我所提到的,
'C'是一个原子,就像任何其他原子一样,所以它只是一个谓词的名称。它没有特别的意义。如果你愿意,你可以命名一个谓词'This is my awesome predicate'(X, Y)。 :) -
也许this question 有帮助?
-
非常感谢您的回答 :),但我仍然怀疑 s(A,C) 的工作原理:/