根据我的理解,在Prolog中,您可以在解析时捕获功能:
foo(feature(X)) --> [X], bar.
在设计DCG时这是常见的吗?
foo(featureA(X), featureB(Y)) --> [X], [Y], bar.
答案 0 :(得分:6)
DCG描述了列表与非终端参数之间的关系。但是,这些论点只是条款。它们可用于表示要素但不直接表示它们。要想看到差异,想象一下您想要将一个特征数字与每个节点相关联。在DCG中,您现在可以根据具体情况决定如何表示该功能。在一个节点中,它是feature(X, singular)
,在另一个节点中,它可能看起来不同。或者您可能决定使用列表统一表示所有要素,因此[nodename=idx,..., numerus=singular,...]
。
答案 1 :(得分:5)
这完全有效,而且非常有用。作为一个例子,考虑这个规则,取自经典(现在是免费的!)书籍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) ).