Один из способов сделать это - использовать рекурсию и предикат 'call'
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).