このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1335517816/49
#  [1] 授業単元 情報工学 
#  [2] 問題文 
#  n枚のカードからr枚のカードを選ぶ組み合わせを計算するプログラムを作成せよ。 
#  但し、n≧1  r≧1  n≧rを前提してよい。(入力エラーの処理は不要)  
#  

'n枚のカードからr枚のカードを選ぶ組み合わせを計算する'(_n,_r,_n枚のカードからr枚のカードを選ぶ組み合わせ) :-
        findall(N,between(1,_n,N),L),
        count(組合せ(L,_r,_),_n枚のカードからr枚のカードを選ぶ組み合わせ).

組合せ(X,1,[A]) :-
        member(A,X).
組合せ([A|Y],N,[A|X]) :-
        N > 1,
        M is N - 1,
        組合せ(Y,M,X).
組合せ([_|Y],N,A) :-
        N > 1,
        組合せ(Y,N,A).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

nCr(_n,_r,_組合せ数) :-
        _z is _n - _r + 1,
        階乗(_n,_z,_組合せ数).

階乗(_r,_r,_r).
階乗(_n,_r,_組合せ数) :-
        _n_1 is _n - 1,
        階乗(_n_1,_r,_組合せ数_1),
        _組合せ数 is _組合せ数_1 * _n.