summaryrefslogtreecommitdiff
path: root/gcd.pro
blob: 793d307b402467c38ec4a258e0511d84db20d1c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
% SYNOPSIS.
%
% Tested with GNU Prolog 1.3.1
%
% # gplc --no-top-level -o gcd-pro gcd.pro
% # ./gcd-pro 22 33 44 121


% It is true that GCD of A and 0 is A
% (The fact is GCD of A and 0 is A)
gcd2(A, 0, A).

% It is true that G is GCD of A and B
% when A>0 and B>0 and G is GCD of B and A % B
gcd2(A, B, G) :- A>0, B>0, N is mod(A, B), gcd2(B, N, G).

gcdn(A, [], A).
gcdn(A, [B|Bs], G) :- gcd2(A, B, N), gcdn(N, Bs, G).
gcdn([A|As], G) :- gcdn(A, As, G).

str2int([], []).
str2int([S|St], [N|Nt]) :- number_atom(N, S), str2int(St, Nt).

not_empty([]) :- halt.
not_empty(_).

main :-
    argument_list(Args),
    not_empty(Args),
    str2int(Args, Numbers),
    gcdn(Numbers, G),
    write(G), nl.

:- initialization(main).