このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1274827528/599
#  2つの自然数aとbの最大公約数gcd(a, b)を求め、それを出力するプログラムを作成せよ。 
#  なお、m = a % b としたとき、gcd(a, b) は m≠0 の場合 gcd(b, m) に等しく、 m=0 の場合 b に等しい。 
#   
#   
#  2つの自然数aとbを入力させ、a 人から b 人を選ぶ組み合わせ comb(a, b)を求め、それを出力するプログラムを作成せよ。 
#  なお、comb(a, b) = comb( a-1, b) + comb( a-1, b-1) であり、 b==0 もしくは b==a のとき comb(a, b) = 1 である。 
#   
#   
#  今週は2つありますが。。。よろしくお願いしますorz 
# 
# 

'2つの自然数aとbの最大公約数gcd(a, b)を求め、それを出力する' :-
        催促付き整数入力('自然数aを入力してください : ',_a),
        催促付き整数入力('自然数bを入力してください : ',_b),
        gcd(_a,_b,X),
        write_formatted('%tと%tの最大公約数は%tです\n',[_a,_b,X]).

'2つの自然数aとbを入力させ、a 人から b 人を選ぶ組み合わせ comb(a, b)を求め、それを出力する' :-
        催促付き整数入力('自然数aを入力してください : ',_a),
        催促付き整数入力('自然数bを入力してください : ',_b),
        comb(_a,_b,X),
        write_formatted('%t人から%t人を選ぶ組み合わせは%t通りです\n',[_a,_b,X]).

gcd(_a,_b,X) :-
        M is _a mod _b,
        \+(M = 0),
        gcd(_b,M,X),!.
gcd(_a,_b,_b).

comb(N,N,1) :- !.
comb(_,0,1) :- !.
comb(_a,_b,X) :-
        _a_1 is _a - 1,
        _b_1 is _b - 1,
        comb(_a_1,_b,Y),
        comb(_a_1,_b_1,Z),
        X is Y + Z.