Parsing Prolog DCGs多功能?

Parsing Prolog DCGs多功能?,parsing,prolog,dcg,Parsing,Prolog,Dcg,据我所知,在Prolog中,您可以在解析时捕获特性,如下所示: foo(feature(X)) --> [X], bar. 这在设计DCG时常见吗 foo(featureA(X), featureB(Y)) --> [X], [Y], bar. DCG描述列表和非终端参数之间的关系。然而,这些论点只是术语。它们可以用来表示特征,但不能直接表示特征。若要查看差异,请假设您希望将特征编号与每个节点关联。在DCGs中,您现在必须逐个决定如何表示该特性。在一个节点中,它是特征(X,单

据我所知,在Prolog中,您可以在解析时捕获特性,如下所示:

 foo(feature(X)) --> [X], bar.
这在设计DCG时常见吗

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

DCG描述列表和非终端参数之间的关系。然而,这些论点只是术语。它们可以用来表示特征,但不能直接表示特征。若要查看差异,请假设您希望将特征编号与每个节点关联。在DCGs中,您现在必须逐个决定如何表示该特性。在一个节点中,它是
特征(X,单数)
,而在另一个节点中,它可能看起来不同。或者,您可能决定用一个列表统一表示所有功能,因此
[nodename=idx,…,numerus=singular,…]
它是完全有效的,而且非常有用。作为一个例子,考虑这一规则,取自经典(现在是免费的)书,它使用两个参数来捕捉动词及物动词的“意义”(逻辑形式,<代码> LF < /代码>):<代码>电视< /代码>:

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
)被所有参数索引,否则按单词形式(例如“writed”)进行查找会很慢。更快的词汇表示法是
tv(书面,过去分词,X^Y^书面(X,Y))