gcd(X, 0, D) :- D is X.
gcd(X, Y, D) :-
  Y > 0,
  XmodY is X mod Y,
  gcd(Y, XmodY, D).

rfactorial(1, 1).
rfactorial(N, F) :-
  N > 1,
  N1 is N-1,
  rfactorial(N1, F1),
  F is N * F1.

ifactorial(N, F) :- fact(N, 1, F).

fact(1, Acc, Acc).
fact(N, Acc, F) :-
  N > 1,
  N1 is N-1,
  Acc1 is N*Acc,
  fact(N1, Acc1, F).
