filter(_P,[],[]) :- !.
filter(P,[N|LI],[N|NLI]) :-
N mod P =\= 0,
!,
filter(P,LI,NLI).
filter(P,[N|LI],NLI) :-
filter(P,LI,NLI).
delay integers(_, List) if var(List).
integers(_, []).
integers(N, [N|Rest]) :-
N1 is N + 1,
integers(N1, Rest).
?- integers(2, Ints), filter(2, Ints, [X1,X2]).
The idea here is that integers/2 fills a list with integers on demand,
i.e. whenever new list elements appear.
Filter/3 is a predicate that removes all integers that are a multiple
of P. In the example query, the call to
filter(_P,[],[]).
filter(P,[N|LI],LL) :-
(N mod P =\= 0 ->
LL = [N|NLI],
filter(P, LI, NLI)
;
filter(P,LI,LL)
).