このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1284632294/625
#  [1] 授業単元:C++ベーシック  
#  [2] 問題文(含コード&リンク): 1~100までの素数を探し、そのすべての素数とその値を合計を表示するプログラムを作成しなさい。 
#  
http://nojiriko.asia/prolog/t660.html

'1~100までの素数を探し、そのすべての素数とその値を合計を表示する' :-
        findsum(N,(
                    for(1,N,100),
                    ウィルソンの定理による素数判定(N,素数です),
                    write_formatted('%t\n',[N])),
                _素数の合計),
        write_formatted('合計は %t です\n',[_素数の合計]).

ウィルソンの定理による素数判定(X,素数です) :-
    X > 0,
    Y is X - 1,
    階乗保存計算(Y,Z),
    0 is (Z + 1) mod X,!.
ウィルソンの定理による素数判定(X,素数ではありません) :-
    X > 0,
    Y is X - 1,
    階乗保存計算(Y,Z),
    \+(0 is (Z + 1) mod X),!.

階乗保存計算(0,1) :- !.
階乗保存計算(1,1) :- !.
階乗保存計算(N,X) :-
    N2 is N - 1,
    階乗保存計算(N2,Y),
    X is N * Y,
    asserta((階乗保存計算(N,X) :- !)).