【发布时间】:2011-06-30 00:17:10
【问题描述】:
据我了解,在 Prolog 中,您会在解析时捕获特征:
foo(feature(X)) --> [X], bar.
在设计 DCG 时这很常见吗?
foo(featureA(X), featureB(Y)) --> [X], [Y], bar.
【问题讨论】:
据我了解,在 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) 987654324@:
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) ).
【讨论】:
tv/6)被所有参数索引,否则按单词形式(例如“书面”)查找会很慢。更快的词典表示是tv(written, past_participle, X^Y^writes(X,Y))。