据我了解,在 Prolog 中,您在解析时捕获功能,如下所示:
foo(feature(X)) --> [X], bar.
这在设计 DCG 时很常见吗?
foo(featureA(X), featureB(Y)) --> [X], [Y], bar.
DCG 描述列表和非终结符参数之间的关系。然而,这些论点只是术语。它们可以用来表示特征,但不能直接表示它们。要查看差异,假设您要将特征数量与每个节点相关联。在 DCG 中,您现在必须逐个决定如何表示该特征。在一个节点中它是feature(X, singular)
,而在另一个节点中它可能看起来不同。或者您可能决定用一个列表统一表示所有特征,因此[nodename=idx,..., numerus=singular,...]
.
这是完全有效的,而且非常有用。例如,考虑这条规则,取自经典(现在免费!)书籍PNLA,它使用两个参数来捕捉及物动词的屈折变化和“意义”(逻辑形式,LF
)tv
:
tv(nonfinite, LF) --> [TV], {tv(TV, _, _, _, _, LF)}.
tv(finite, LF) --> [TV], {tv(_, TV, _, _, _, LF)}.
tv(finite, LF) --> [TV], {tv(_, _, TV, _, _, LF)}.
tv(past_participle, LF) --> [TV], {tv(_, _, _, TV, _, LF)}.
tv(pres_participle, LF) --> [TV], {tv(_, _, _, _, TV, LF)}.
一个动词可以定义为
tv( write, writes, wrote, written, writing, X^Y^ `writes(X,Y) ).
(见完整的例子。)