Skip to content

Primes

Trial division primality test and a simple enumerator up to N.

is_prime(2).
is_prime(3).
is_prime(N) :-
    integer(N), N > 3, N mod 2 =\= 0,
    \+ has_factor(N, 3).

has_factor(N, F) :- N mod F =:= 0.
has_factor(N, F) :- F*F < N, F2 is F + 2, has_factor(N, F2).

primes_to(2, [2]).
primes_to(N, Ps) :-
    N > 2,
    N1 is N - 1,
    primes_to(N1, P1),
    ( is_prime(N) -> append(P1, [N], Ps) ; Ps = P1 ).

% append/3
append([], Ys, Ys).
append([X|Xs], Ys, [X|Zs]) :- append(Xs, Ys, Zs).
?- primes_to(20, Ps).
Ps = [2,3,5,7,11,13,17,19].

Note: This is a simple approach for small N. More efficient sieves are possible but longer.