3

我正在尝试编写一个谓词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
4

3 回答 3

3

If you are using SWI-Prolog you could use the exclude predicate from the "apply" library

于 2011-07-13T18:32:05.987 回答
1

我确信存在一个内置操作来执行此操作......但基本上你只是想对传递谓词的列表成员进行查找。试试这个过滤器的实现。运行 findall 的第二个 arg 直到所有结果都用完并且 M 的所有值都收集到 Result 中。

filter(List,PredName,Result) :-
  findall(M, ( member(M, List), call(PredName,M)), Result).
于 2011-07-13T18:03:22.337 回答
-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 回答