primes(Limit, Ps) :- integers(2, Limit, Is), sift(Is, Ps). integers(Low, High, [Low | Rest]) :- Low =< High, M is Low + 1, integers(M, High, Rest). integers(Low, High, []) :- Low > High. sift([], []). sift([I | Is], [I | Ps]) :- remove(I, Is, New), sift(New, Ps). remove(P, [], []). remove(P, [I | Is], [I | Nis]) :- \+ (0 is I mod P), remove(P, Is, Nis). remove(P, [I | Is], Nis) :- 0 is I mod P, remove(P, Is, Nis).