fac_fact((N, F)) :- N = 0, F = 1. fac_step((N, F), (N1, F0)) :- N #> 0, F #= F0*N, N1 #= N - 1. fac(N,F) :- fac((N,F)). fac(NF) :- fac_fact(NF), garbage_collect. fac(NF) :- fac_step(NF, N1F0), garbage_collect, fac(N1F0). % ?- fac(N, F), fac(M, F), N > 10. % ?- F = 87178291200, fac(M, F). fac14(N,F) :- S0 = (N,F), fac_step(S0,S1), fac_step(S1,S2), fac_step(S2,S3), fac_step(S3,S4), fac_step(S4,S5), fac_step(S5,S6), fac_step(S6,S7), fac_step(S7,S8), fac_step(S8,S9), fac_step(S9,S10), fac_step(S10,S11), fac_step(S11,S12), fac_step(S12,S13), fac_step(S13,S14), fac_fact(S14). fac15(N,F) :- S0 = (N,F), fac_step(S0,S1), fac_step(S1,S2), fac_step(S2,S3), fac_step(S3,S4), fac_step(S4,S5), fac_step(S5,S6), fac_step(S6,S7), fac_step(S7,S8), fac_step(S8,S9), fac_step(S9,S10), fac_step(S10,S11), fac_step(S11,S12), fac_step(S12,S13), fac_step(S13,S14), fac_step(S14,S15), fac_fact(S15).