add([],X,X). add([1|X],Y,[1|Z]) :- add(X,Y,Z). multiply([],_,[]). multiply([1|X],Y,Z) :- le(X,Z),le(Y,Z),multiply(X,Y,TMP),add(Y,TMP,Z). le([],_). le([1|X],[1|Y]) :- le(X,Y). fact([],[1]). fact([1|N],M) :- le([1|N],M),fact(N,M1),multiply([1|N],M1,M). i2l(0,[]). i2l(N,[1|M]) :- N > 0, N1 is N-1, i2l(N1,M). l2i(0,[]). l2i(N,[1|M]) :- l2i(N1,M), N is N1+1. invfact(X,N) :- i2l(X,XL),fact(NL,XL),l2i(NL,N).