目標が失敗したすべての要素をfilter(List, PredName, Result)
フィルタリングし、その後リストを返す述語を作成しようとしています。述語は、プロシージャを呼び出すときに定義する必要があり、たとえば次のようになります。List
PredName
Result
PredName/1
filter/3
test(N) :- N >= 0
クエリは次のように作成できます。
?- filter([-6,7,-1,0], test, L)
L = [7, 0];
no
目標が失敗したすべての要素をfilter(List, PredName, Result)
フィルタリングし、その後リストを返す述語を作成しようとしています。述語は、プロシージャを呼び出すときに定義する必要があり、たとえば次のようになります。List
PredName
Result
PredName/1
filter/3
test(N) :- N >= 0
クエリは次のように作成できます。
?- filter([-6,7,-1,0], test, L)
L = [7, 0];
no
SWI-Prolog を使用している場合は、 「適用」ライブラリexclude
の述語を使用できます。
これを行うための組み込み操作が存在すると確信しています...しかし、本質的には、述語を渡すリストのメンバーに対してfindallを実行しようとしています。このフィルター アウトの実装を試してください。findall の 2 番目の引数は、すべての結果がなくなるまで実行され、M のすべての値が Result に収集されます。
filter(List,PredName,Result) :-
findall(M, ( member(M, List), call(PredName,M)), Result).
それを行う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).