3

目標が失敗したすべての要素をfilter(List, PredName, Result)フィルタリングし、その後リストを返す述語を作成しようとしています。述語は、プロシージャを呼び出すときに定義する必要があり、たとえば次のようになります。ListPredNameResultPredName/1filter/3

test(N) :- N >= 0

クエリは次のように作成できます。

?- filter([-6,7,-1,0], test, L)
L = [7, 0];
no
4

3 に答える 3

3

SWI-Prolog を使用している場合は、 「適用」ライブラリexcludeの述語を使用できます。

于 2011-07-13T18:32:05.987 に答える
1

これを行うための組み込み操作が存在すると確信しています...しかし、本質的には、述語を渡すリストのメンバーに対してfindallを実行しようとしています。このフィルター アウトの実装を試してください。findall の 2 番目の引数は、すべての結果がなくなるまで実行され、M のすべての値が Result に収集されます。

filter(List,PredName,Result) :-
  findall(M, ( member(M, List), call(PredName,M)), Result).
于 2011-07-13T18:03:22.337 に答える
-1

それを行う1つの方法は、再帰と「呼び出し」述語を使用することです

filter([],_,[]).
filter([H|T], PredName, [H|S]) :-  call(PredName,H),filter(T,PredName,S),!.
filter([H|T], PredName, S) :- filter(T,PredName,S).

=..そのための他の方法は、呼び出しの代わりに(univ) 演算子を使用できることです。

filter([],_,[]).
filter2([H|T], PredName, [H|S]) :-  Goal =.. [PredName,H],Goal,filter(T,PredName,S),!.
filter([H|T], PredName, S) :- filter(T,PredName,S).

=..演算子は、述語名とその引数を含むリストを取り、新しく作成された用語を返します。例えば:

?-X =.. [f,a,b].
X = f(a, b).
于 2011-07-13T18:22:25.237 に答える