【问题标题】:Prolog DCGs Multiple Features?Prolog DCG 的多种功能?
【发布时间】:2011-06-30 00:17:10
【问题描述】:

据我了解,在 Prolog 中,您会在解析时捕获特征:

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

在设计 DCG 时这很常见吗?

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

【问题讨论】:

    标签: parsing prolog dcg


    【解决方案1】:

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

    【讨论】:

    • 将它们统一表示为列表而不是复合(?)术语的优点/缺点是什么?
    • 更统一:因此提取特征要简单得多。将特征放入某些复合词的参数中意味着您必须为每种复合词编写访问代码。
    【解决方案2】:

    它完全有效,而且非常有用。例如,考虑这条规则,取自经典(现在免费!)书籍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)   ).
    

    (See full example.)

    【讨论】:

    • 只是指出,除非事实(例如tv/6)被所有参数索引,否则按单词形式(例如“书面”)查找会很慢。更快的词典表示是tv(written, past_participle, X^Y^writes(X,Y))。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    相关资源
    最近更新 更多