

% euclid's greatest common divisor algorithm
%   gcd(A, B, G).
% ----------------
% base case
gcd(A, 0, A) :- integer(A).
% general case
gcd(A, B, G) :- integer(A), integer(B), L is max(A, B),
    S is min(A, B), R is L mod S, gcd(S, R, G).

% least common multiple
%    lcm(X, Y, L).
% ----------------------
lcm(X, Y, L) :- var(L), gcd(X, Y, G), L is X * Y / G.
lcm(X, Y, L) :- integer(L), gcd(X, Y, G), L =:= X * Y / G.

