【问题标题】:How to avoid a meta argument warning in SICStus SPIDER?如何避免 SICStus SPIDER 中的元参数警告?
【发布时间】:2014-06-15 13:24:29
【问题描述】:

这可能与a comp.lang.prolog-discussion有关。

我在使用带有 SICStus SPIDER 的 Eclipse 时收到了几个类似的警告:

The plain meta argument (Y) is passed as a closure argument
(with 0 suppressed arguments) to the callee.

这是一个代码示例:

% Prologs set_of is baroque %% RS-140614  130sec runtime vs. 28sec runtime
:- meta_predicate set_of(+,:,+) .
set_of(X,Y,Z):-           %%
    setof(X,Y^Y,Z),!;     %% Trick to avoid alternatives
    Z=[].                 %% What is wrong with empty sets ?

如何消除 SPIDER 警告? 我对简单地抑制警告并不感兴趣。 我正在使用最新版本的 SPIDER IDE (0.0.51) 和 SICStus Prolog 4.2.3。

【问题讨论】:

    标签: eclipse prolog sicstus-prolog prolog-setof meta-predicate


    【解决方案1】:

    您显示的代码中有几个问题。

    错误的元参数

    首先,内置谓词setof/3具有以下属性:

    | ?- predicate_property(setof(A,B,C),P).
    P = (meta_predicate setof(?,0,?)) ? ;
    P = built_in ? ;
    P = jittable ? ;
    no
    

    与 ISO/IEC 13211-1 中的 ISO 声明紧密对应:

    8.10.3.2 模板和模式

    setof(?term, +callable_term, ?list)

    第二个参数是由call/1 执行的目标。不需要额外的参数。这是0 告诉我们的。

    另一方面,您显示的代码包含不同的元谓词声明:

    :- meta_predicate set_of(+,:,+) .
    

    这里,第二个参数是:。在 SICStus、YAP 和 SWI 中,: 表示:此参数将自动与当前模块一起限定,以便可以进一步传递模块信息。想想asserta(:)。在这里,论点不是目标,而是从句。

    因此,您需要解决此问题,将: 替换为0。您可能会在使用的变量名中指出这一事实。也就是说,Goal_0 对应于call(Goal_0)Goal_1 对应于call(Goal_1, Arg1)Goal_2 对应于call(Goal_2, Arg1, Arg2) 等等。

    不良模式

    第一个和第三个参数中的+ 不合适。第三个参数通常是一个未实例化的变量,要与结果列表统一。

    Prolog 的 setof/3 巴洛克风格?

    % Prologs set_of 是巴洛克式的

    评论大概想说setof/3包含多余的装饰。事实上,setof/3 比提到的set_of/3 更通用。采取this recent questionthat。通常,您首先会考虑一个非常具体的情况。比如说,你想要某部电影的演员名单。然后,稍后你想问有什么电影。正是这种泛化与setof/3 一起工作非常顺利,而如果你没有它,它会非常复杂。

    使用setof/3 的另一种非常有用的方法是当您想要消除多余的答案时:

    | ?- (X = 2;X=1;X=2).
    X = 2 ? ;
    X = 1 ? ;
    X = 2 ? ;
    no
    | ?- setof(t, (X=2;X=1;X=2), _).
    X = 1 ? ;
    X = 2 ? ;
    no
    

    尝试有效地效仿。

    运行时开销

    它们几乎可以忽略不计。如果您真的认为存在开销,只需使用 setof/3 来实现单一目标。以这种方式,预处理几乎是零。

    【讨论】:

      猜你喜欢
      • 2010-09-10
      • 2015-02-27
      • 2016-12-25
      • 2021-02-04
      • 2019-04-16
      • 2021-04-29
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      相关资源
      最近更新 更多