このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/138
#  [1] 授業単元:プログラミング 
#  [2] 問題文:[1] 授業単元:
http://ime.nu/www.fluid.cse.nagoya-u.ac.jp/~ishihara/c/Sec6kadai20.html 
#  
#  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つの自然数aとbの最大公約数gcd(a, b)を求め、それを出力する'(_a,_b,_最大公約数) :-
        ユークリッドの互除法で最大公約数を求める(_a,_b,_最大公約数).

ユークリッドの互除法で最大公約数を求める(_a,_b,_b) :-
        0 is _a mod _b.
ユークリッドの互除法で最大公約数を求める(_a,_b,_最大公約数) :-
        _m is _a mod _b,
        ユークリッドの互除法で最大公約数を求める(_b,_m,_最大公約数).

'2つの自然数aとbを入力させ、a 人から b 人を選ぶ組み合わせ comb(a, b) を求め、それを出力する' :-
        '2つの自然数aとbを入力させ'(_a,_b),
        'a 人から b 人を選ぶ組み合わせ comb(a, b)を求め'(_a,_b,X),
        それを出力する'(_a,_b,X).

'2つの自然数aとbを入力させ'(_a,_b) :-
        整数を得る(自然数,_a),
        整数を得る(自然数,_b),
        _a > 0,
        _b > 0.

'a 人から b 人を選ぶ組み合わせ'(_a,0,1).
'a 人から b 人を選ぶ組み合わせ'(_a,_a,1).
'a 人から b 人を選ぶ組み合わせ'(_a,_b,_x) :-
        _a_1 is _a - 1,
        _b_1 is _b - 1,
        'a 人から b 人を選ぶ組み合わせ'(_a_1,_b,_x_1),
        'a 人から b 人を選ぶ組み合わせ'(_a_1,_b_1,_x_2),
        _x is _x_1 + _x_2.

それを出力する(_a,_b,X) :-
        writef('%t 人から %t 人を選ぶ組み合わせは %t 通りです。\n',[_a,_b,X]).