このディレクトリの索引
http://test/read.cgi/tech/1354715494/33
#  【お題】 
#  ウィルソンの定理を使って素数を判定する関数is_primeを実装し、 
#  10000以下の素数以外の数の和を求めよ 
#  
#  ウィルソンの定理 
#  pが素数 <=> (p-1)!+1 (mod p) == 0 

:- dynamic(階乗保存計算/2).
:- retract((階乗保存計算(_,_) :- _)),fail;true.

'ウィルソンの定理を使って素数を判定する関数is_primeを実装し、
10000以下の素数以外の数の和を求めよ

ウィルソンの定理
pが素数 <=> (p-1)!+1 (mod p) == 0'(_10000以下の素数以外の数の和) :-
        findsum(_p,(
                    between(1,10000,_p),
                    \+(is_prime(_p))),
                _10000以下の素数以外の数の和).


is_prime(_p) :-
        'ウィルソンの定理とは pが素数 <=> (p-1)!+1 (mod p) == 0'(_p).


'ウィルソンの定理とは pが素数 <=> (p-1)!+1 (mod p) == 0'(_p) :-
        _p > 0,
        Y is _p - 1,
        階乗保存計算(Y,Z),
        0 is (Z + 1) mod _p,!.

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