如何避免SICStus SPIDER中的元参数警告?

时间:2014-06-15 13:24:29

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

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

我正在使用Eclipse和SICStus SPIDER获得这样的警告:

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。

1 个答案:

答案 0 :(得分:3)

您展示的代码中存在几个问题。

错误的元参数

首先,内置谓词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_0call(Goal_0)Goal_1call(Goal_1, Arg1)Goal_2call(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用于一个目标即可。通过这种方式,预处理几乎是徒劳的。