factorial( N, NFact ) :-
	( N > 0 -> 
		factorial( N, 1, NFact )
		;
		N =:= 0,
		NFact is 1
	).
factorial( 1, Acc, Acc ) :- !.
factorial( N, Acc, NFact ) :-
		NxAcc is Acc * N,
		NxN is N - 1,
		factorial( NxN, NxAcc, NFact ).

/*
factorial( N, Acc, NFact ) :-
	( N > 1 -> 
		NxAcc is Acc * N,
		NxN is N - 1,
		factorial( NxN, NxAcc, NFact )
		;
		NFact is Acc
	).
*/