我正在尝试编写一个谓词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
If you are using SWI-Prolog you could use the exclude
predicate from the "apply" library
我确信存在一个内置操作来执行此操作......但基本上你只是想对传递谓词的列表成员进行查找。试试这个过滤器的实现。运行 findall 的第二个 arg 直到所有结果都用完并且 M 的所有值都收集到 Result 中。
filter(List,PredName,Result) :-
findall(M, ( member(M, List), call(PredName,M)), Result).
一种方法是使用递归和“调用”谓词
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).