:-use_module(library(clpfd)).

% is_prime(P) :- P is a prime number
%    (integer) (+)

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

% has_factor(N,L) :- N has an odd factor F >= L.
%    (integer, integer) (+,+)

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

mult(X,Y,Z) :- Z #= X*Y.

liste_facteur_premier(N,LFP):-
    facteur_premier(N,LFP),
    foldl(mult,LFP,1,N),!.

liste_facteur_premier(N,Res):-
    facteur_premier(N,LFP),
    foldl(mult,LFP,1,MLFP),
    Reste #= N div MLFP,
    liste_facteur_premier(Reste,NLFP),
    append(NLFP,LFP,Res).

facteur_premier(N, Res) :-
    findall(X,(between(2,N,X),is_prime(X), N mod X =:= 0),Res).