Prolog DCG的多项功能?

时间:2011-06-30 00:17:11

标签: parsing prolog dcg

根据我的理解,在Prolog中,您可以在解析时捕获功能:

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

在设计DCG时这是常见的吗?

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

2 个答案:

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

See full example.