このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1247438792/776
#  [1] 授業単元:プログラミング演習  
#  [2] 問題文(含コード&リンク):  
#  以下の機能を持った関数を含むプログラムを作成せよ. 
#  1.正の整数n,rを読み込み,その組み合わせnCrを計算する関数を再帰呼び出しを用いて作成せよ.  
#  2.正の整数n,rを読み込み,その組み合わせnCrを計算する関数を再帰呼び出しを用いないで作成せよ.  

t606_1(N,R,X) :- nCr(N,R,X).

nCr(N,R,X) :-
    U is N-R,
    階乗(N,K1),
    階乗(R,K2),
    階乗(U,K3),
    Y is K1 // K3,
    X is Y // K2.

% 以下は見かけ再帰を含みませんが、実はfor/3やconcat_atom/3は再帰なしには書けない・・
t606_2(N,R,X) :-
    Y is N-R+1,
    findall(N1,for(N,N1,Y),L1),
    findall(N2,for(R,N2,1),L2),
    concat_atom(L1,'*',S1),
    concat_atom(L2,'*',S2),
    atom_to_term(S1,Term1,_),
    atom_to_term(S2,Term2,_),
    X is Term1 // Term2.

/*
t606_2(N,R,X) :-
    length(L,N),
    findsum(1,組み合わせ(L,R,_),Y),
    X is truncate(Y).
*/

階乗(0,1) :- !.
階乗(1,1) :- !.
階乗(N,X) :- N2 is N - 1,階乗(N2,Y),X is N * Y.