2

这可能与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。

4

1 回答 1

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(+,:,+) .

这里,第二个参数是 a :。在 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。以最近的这个那个问题为例。通常,您首先会考虑一个非常具体的情况。比如说,你想要某部电影的演员名单。然后,稍后你想问有什么电影。正是这种概括可以非常顺利地工作,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单一目标即可。以这种方式,预处理几乎是零。

于 2014-06-15T13:54:38.727 回答