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)

2 番目の引数は、 によって実行されるゴールcall/1です。追加の引数は必要ありません。これが0私たちに伝えていることです。

一方、表示するコードには、別のメタ述語宣言が含まれています。

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

ここで、2 番目の引数は a:です。SICStus、YAP、および SWI では、次の:ことを意味します。この引数は、モジュール情報をさらに渡すことができるように、現在のモジュールで自動的に修飾されます。考えてみてくださいasserta(:)。ここで、引数はゴールではなく節です。

したがって、これを修正する必要があるのは、に置き換える:こと0です。そして、使用する変数名でこの事実を示すことができます。つまり、Goal_0for call(Goal_0)Goal_1for call(Goal_1, Arg1)Goal_2forcall(Goal_2, Arg1, Arg2)などです。

悪いモード

1+番目と 3 番目の引数の は不適切です。3 番目の引数は通常、結果のリストと統合されるインスタンス化されていない変数です。

プロローグのsetof/3バロック?

% Prologs set_of はバロックです

setof/3余計な装飾が含まれていると言いたいのでしょう。実際、setof/3言及されているよりもはるかに用途が広いset_of/3です。この最近の質問またはそれを取ってください。多くの場合、非常に具体的な状況について最初に考えます。たとえば、特定の映画の俳優のリストが必要だとします。次に、後でどんな映画があるか尋ねたいとします。この一般化は非常にスムーズに機能しsetof/3ますが、それがなければ非常に複雑です。

もう 1 つの非常に便利な使用方法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 に答える