このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1305867431/555
#  内容: 
#  [1] 授業単元:C  
#  [2] 問題文(含コード&リンク):  
#  正の整数を入力したとき、その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と表示するプログラムを作成しなさい  
#  入力した値が0または負の整数であれば、繰り返し再入力させるようにプログラムを作成すること  
#   

'正の整数を入力したとき、その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と表示する' :-
        '正の整数を入力する'(_1以上の正の整数),
        その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と(_1以上の正の整数,_診断),
        表示する(_診断).

正の整数を入力する(_1以上の正の整数) :-
        write('1以上の正の整数を入力してください : '),
        get_line(Line),
        正の整数入力診断(Line,_1以上の正の整数),!.
正の整数を入力する(_1以上の正の整数) :-
        正の整数を入力する(_1以上の正の整数).

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

その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と(_その数値,_診断) :-
        _その数値 > 0,
        Y is _その数値 - 1,
        階乗(Y,Z),
        0 is (Z + 1) mod _その数値,!.
その数値が素数であれば「素数です」、素数でないなら「素数ではありません」と(_その数値,素数ではありません) :-
        _その数値 > 0,
        Y is _その数値 - 1,
        階乗(Y,Z),
        \+(0 is (Z + 1) mod _その数値),!.

階乗(M,N,1) :-
        M > N, !.
階乗(M,N,X) :-
        M2 is M + 1,
        階乗(M2,N,Y),
        X is M * Y.

階乗(0,1) :- !.
階乗(1,1) :- !.
階乗(N,X) :-
        N2 is N - 1,
        階乗(N2,Y),
        X is N * Y,!.

表示する(_診断) :-
        writef('%t\n',[_診断]).