Prolog DCG的多项功能?

dno*_*len 7 parsing prolog dcg

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

 foo(feature(X)) --> [X], bar.
Run Code Online (Sandbox Code Playgroud)

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

 foo(featureA(X), featureB(Y)) --> [X], [Y], bar.
Run Code Online (Sandbox Code Playgroud)

fal*_*lse 6

DCG描述了列表与非终端参数之间的关系.但是,这些论点只是条款.它们可用于表示要素但不直接表示它们.要想看到差异,想象一下您想要将一个特征数字与每个节点相关联.在DCG中,您现在可以根据具体情况决定如何表示该功能.在一个节点中,它feature(X, singular)在另一个节点中可能看起来不同.或者,您可能决定使用列表统一表示所有要素[nodename=idx,..., numerus=singular,...].

  • 它更加统一:因此提取特征要简单得多.将特征放入某些复合术语的参数中意味着您必须为每种复合术语编写访问代码. (3认同)

Fre*_*Foo 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)}.
Run Code Online (Sandbox Code Playgroud)

然后可以将动词定义为

tv( write,   writes,   wrote,     written,   writing,    X^Y^ `writes(X,Y)   ).
Run Code Online (Sandbox Code Playgroud)

(见完整的例子.)