このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1311089619/658
#  助けてください。5つあります。 
#  明日提出期限です。 
#   
#  入力した数の階乗を計算するプログラムを作れ。 
#     nの階乗とは、n!と書いて、次のような計算をするものである。 
#        n! = n × (n – 1) × (n – 2) × … × 2 × 1 
#   
#  ヒント)関数 fact(n)を n!を計算するプログラムとする。 
#  この時、 
#   n! = n × (n – 1)! 
#  だから、fact(n) を計算するには、fact(n-1)を計算してから、nをかければ良い。 
#   

'n!'(_n,_階乗) :-
        階乗式評価項文字列の生成(N,_階乗式評価項文字列),
        atom_to_term(_階乗式評価項文字列,P,VL),
        '文字列の中の変数と_論理変数を結びつける'('_n',VL,_n),
        '文字列の中の変数と_論理変数を結びつける'('_階乗',VL,_階乗),
        call(P).

階乗式評価項文字列の生成(_n,_階乗式評価項文字列) :-
        階乗式文字列の生成(_n,_階乗式文字列),
        swritef(_階乗式評価項文字列,'_階乗 is %t,[_階乗式文字列]).

階乗式文字列の生成(_n,_階乗式文字列) :-
        _n_3 is _n - 3,
        findall(S,(
                    for(0,M,_n_3),
                    concat_atom(['(','_n',' - ',M,')'],S)),
                L),
        append(L,['2','1'],L1),
        concat_atom(L1,' * ',_階乗式文字列),!.

'文字列の中の変数と_論理変数を結びつける'(_変数文字列,[_変数文字列=V],V) :- !.
'文字列の中の変数と_論理変数を結びつける'(_変数文字列,[_|R],V) :-
        '文字列の中の変数と_論理変数を結びつける'(_変数文字列,R,V).