このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1286978599/593
#  [1] 授業単元:プログラム実習 
#  [2] 問題文(含コード&リンク):nとrを入力して 
#  順列 nPr と組み合わせ nCr を表示するものを作成すること。 
#  

'nとrを入力して 順列 nPr と組み合わせ nCr を表示する' :-
        nとrを入力して(_n,_r),
        '順列 nPr と組み合わせ nCr を表示する'(_n,_r).

nとrを入力して(_n,_r) :-
        nの入力(_n),
        rの入力(_r),!.

nの入力(_n) :-
        write(n : ),
        get_line(Line),
        nの入力診断(Line,_n),!.
nの入力(_n) :- nの入力(_n).

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

rの入力(_r) :-
        write(r : ),
        get_lire(Line),
        rの入力診断(Line,_r),!.
rの入力(_r) :- rの入力(_r).

rの入力診断(Line,_r) :-
        atom_to_term(Line,_r,_),
        irteger(_r),
        _r > 0,!.
rの入力診断(Line,_r) :-
        write_formatted('入力された %t からは適切な整数rが得られませんでした\r再入力をお願いします\r',[Line]),
        fail.

'順列 nPr と組み合わせ nCr を表示する'(_n,_r) :-
        nPr(_n,_r,X),
        nCr(_n,_r,Y),
        write_formatted('n=%t,r=%tの時の nPr=%t\nn=%t,r=%tの時の nCr=%t\n',[_n,_r,X,_n,_r,Y]).

nPr(N,R,X) :-
        M is N - R + 1,
        階乗(M,N,X).

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