7

据我了解,在 Prolog 中,您在解析时捕获功能,如下所示:

 foo(feature(X)) --> [X], bar.

这在设计 DCG 时很常见吗?

 foo(featureA(X), featureB(Y)) --> [X], [Y], bar.
4

2 回答 2

6

DCG 描述列表和非终结符参数之间的关系。然而,这些论点只是术语。它们可以用来表示特征,但不能直接表示它们。要查看差异,假设您要将特征数量与每个节点相关联。在 DCG 中,您现在必须逐个决定如何表示该特征。在一个节点中它是feature(X, singular),而在另一个节点中它可能看起来不同。或者您可能决定用一个列表统一表示所有特征,因此[nodename=idx,..., numerus=singular,...].

于 2011-06-30T06:46:27.613 回答
5

这是完全有效的,而且非常有用。例如,考虑这条规则,取自经典(现在免费!)书籍PNLA,它使用两个参数来捕捉及物动词的屈折变化和“意义”(逻辑形式,LFtv

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)   ).

见完整的例子。

于 2011-06-30T10:30:26.460 回答