dodati( [], L, L ):- !.
dodati( [G|R], L, [G|R1] ):-dodati( R, L, R1 ).

kandidat( 2 ).

faktori( A, [X] ):- kandidat(X), X =:=A, 
  retractall( kandidat( _ ) ), assert( kandidat(2) ),  !.

faktori( A, L ):- kandidat(X), 
  A mod X =:=0, 
  C is (A // X), faktori( C, L1 ), 
  dodati( [X], L1, L).
   
faktori( A, L ):- kandidat(X), 
  Y is X+1, 
  retractall( kandidat( _ ) ), 
  assert( kandidat(Y) ), 
  faktori( A, L ).

faktori2( A, L ) :-  X is 2, !,
  (   (A mod X =:=0, A is (A // X), faktori2( A, L1 ), dodati(L1, [X], L) ) 
    ; (X is X+1, faktori2(A, L) ) 
  ),X > A. 