Писал не с нуля, часть кода подсмотрел в сети (так как "давненько я не брал в руки шашки"), но идея довольно проста: нужно разобраться с принципами вывода в прологе, в том смысле, что кандидаты должны быть сгенерированы каким-то процессом.
К прочтению
The Art of Prolog
Идея на самом деле проста, нужно написать "генераторы", которые будут давать кандидатов для решения. В коде ниже это списки простых чисел меньше заданного, тогда кандидат -- это просто простое число из списка, выдергивается стандартной функцией member
Вывод делается вот так
?- factorization(143,P1,P2).
1113
P1 = 11,
P2 = 13 .
?- factorization(25,P1,P2).
55
P1 = P2, P2 = 5 .
Код решения
divisible(X,Y) :- 0 is X mod Y, !.
divisible(X,Y) :- X > Y+1, divisible(X, Y+1).
is_prime(2) :- true,!.
is_prime(X) :- X < 2,!,false.
is_prime(X) :- not(divisible(X, 2)).
factorization(X,P1,P2) :- prime_list(2,X,L), member(P1,L), member(P2,L), is_prime(P1), is_prime(P2), X is P1 * P2.
prime_list(A,B,L) :- A =< 2, !, p_list(2,B,L).
prime_list(A,B,L) :- A1 is (A // 2) * 2 + 1, p_list(A1,B,L).
p_list(A,B,[]) :- A > B, !.
p_list(A,B,[A|L]) :- is_prime(A), !, next(A,A1), p_list(A1,B,L).
p_list(A,B,L) :- next(A,A1), p_list(A1,B,L).
next(2,3) :- !.
next(A,A1) :- A1 is A + 2.