このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1288531658/781
#  こんにちは。基礎クラスで恐縮ですがよろしくお願いします。 
#  [1] 授業単元: C基礎 
#  [2] 問題文(含コード&リンク):   
#  問題2 キーボードから正の整数を1つ入力しその数が素数であるかを判定するプログラムを 
#  for文 break文などを用いて作成せよ 
# 
% http://nojiriko.asia/prolog/c140_625.html

キーボードから正の整数を1つ入力しその数が素数であるかを判定する :-
        キーボードから正の整数を1つ入力し(_正の整数),
        ウィルソンの定理による素数判定(_正の整数,_診断),
        write_formatted('%t\n',[_診断]).

正の整数を1つ入力し(_正の整数) :-
        get_line(Line),
        正の整数の入力診断(Line,_正の整数),!.
正の整数を1つ入力し(_正の整数) :- 正の整数を1つ入力し(_正の整数).

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

ウィルソンの定理による素数判定(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) :- !)).