这可能与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。
答案 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_0
为call(Goal_0)
,Goal_1
为call(Goal_1, Arg1)
,Goal_2
为call(Goal_2, Arg1, Arg2)
等。
第一个和第三个参数中的+
是不合适的。第三个参数通常是一个未实例化的变量,与结果列表统一。
setof/3
巴洛克?%Prologs set_of是巴洛克式的
评论可能想说setof/3
包含多余的饰物。事实上,setof/3
比提到的set_of/3
更加通用。选择this recent question或that。通常你首先考虑一个非常具体的情况。说,你想要一个特定电影的演员列表。然后,你想问下那些电影。正是这种概括与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
用于一个目标即可。通过这种方式,预处理几乎是徒劳的。