このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1301553333/83
#  [1] 授業単元:整数演算 
#  [2] 問題文(含コード&リンク):1個以上32個以下の正整数の最大・最小・最小公倍数・最大公約数を求めよ 
#  

1個以上32個以下の正整数の最大・最小・最小公倍数・最大公約数を求めよ(_N個,_整数ならび,_最大,_最小,_最小公倍数,_最大公約数) :-
        _N個 >= 1,_N個 =< 32,
        'N個の正の整数を得る'(_N個,_整数ならび),
        _整数ならび = [_最初の整数|_残りならび],
        最大値と最小値を同時に取得する(_残りならび,_最初の整数,_最初の整数,_最大値,_最小値),
        最大公約数(_整数ならび,_最大公約数),
        最小公倍数(_整数ならび,_最小公倍数).

'N個の正の整数を得る'(_N個,_整数ならび) :-
        length(L,_N個),
        _整数ならび = L,
        findall(_正の整数,(
                    append(_,[_正の整数|R],L),
                    length([_正の整数|R],_残り個数),
                    正の整数を得る(_残り個数,_正の整数)),
                L).

正の整数を得る(_残り個数,_正の整数) :-
        write_formatted('正の整数を入力してください(残り%t個) : ',[_残り個数]),
        get_line(Line),
        正の整数診断(Line,_正の整数),!.
正の整数を得る(_残り個数,_正の整数) :-
        正の整数を得る(_残り個数,_正の整数).

正の整数診断(Line,_正の整数) :-
        atom_to_term(Line,_正の整数,_),
        integer(_正の整数),
        _正の整数 > 0,!.
正の整数診断(Line,_正の整数) :-
        write_formatted('入力された %t から正の整数は得られません。再入力をお願いします。',[Line]),
        fail.

最大公約数([N1|R],_最大公約数) :-
        最大公約数の三(R,N1,_最大公約数).

最大公約数の三([],_最大公約数,_最大公約数).
最大公約数の三([N|R],_最大公約数_1,_最大公約数) :-
        最大公約数(N,_最大公約数_1,_最大公約数_2),
        最大公約数の三(R,_最大公約数_2,_最大公約数).

最小公倍数([N1|R],_最小公倍数) :-
        最小公倍数の三(R,N1,_最小公倍数).

最小公倍数の三([],_最小公倍数,_最小公倍数).
最小公倍数の三([N|R],_最小公倍数_1,_最小公倍数) :-
        最小公倍数(N,_最小公倍数_1,_最小公倍数_2),
        最小公倍数の三(R,_最小公倍数_2,_最小公倍数).

最大公約数(M,N,X) :-
        最大公約数をユークリッドの互除法で求める(M,N,X),!.

最大公約数をユークリッドの互除法で求める(M,N,N) :-
        0 is M mod N,!.
最大公約数をユークリッドの互除法で求める(M,N,X) :-
        Mod is M mod N,
        最大公約数をユークリッドの互除法で求める(N,Mod,X).

最小公倍数(A,B,X) :-
        integer(A),
        integer(B),
        最大公約数をユークリッドの互除法で求める(A,B,C),
        X is A * B // C.

最大値と最小値を同時に取得する([],_最大値,_最小値,_最大値,_最小値) :-
最大値と最小値を同時に取得する([N|R],_最大値_1,_最小値_1,_最大値,_最小値) :-
        N > _最大値,
        最大値と最小値を同時に取得する(R,N,_最小値_1,_最大値,_最小値),!.
最大値と最小値を同時に取得する([N|R],_最大値_1,_最小値_1,_最大値,_最小値) :-
        N < _最小値,
        最大値と最小値を同時に取得する(R,_最大値_1,N,_最大値,_最小値),!.
最大値と最小値を同時に取得する([N|R],_最大値_1,_最小値_1,_最大値,_最小値) :-
        最大値と最小値を同時に取得する(R,_最大値_1,_最小値_1,_最大値,_最小値),!.