このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1357748713/345
#  [1] 授業単元:  
#      計算機概論  
#  [2] 問題文(含コード&リンク):  
#      キーボードから入力された自然数が素数であるかを調べるプログラムを作りなさい。 
#      ただし、0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること。  
#  

'キーボードから入力された自然数が素数であるかを調べるプログラムを作りなさい。
ただし、0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること。' :-
        'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数),
        素数であるかを調べる(_入力された自然数).

'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数) :-
        write('自然数を入力してください : '),
        get_line(Line),
        '診断 :: 自然数入力'(Line,_入力された自然数),!.
'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数) :-
        'キーボードから入力された自然数が(0以下の整数(-1など)を入力した場合は再入力を促し、1を入力した場合はプログラムを終了するようにすること)'(_入力された自然数).

'診断 :: 自然数入力'(Line,_入力された自然数) :-
        atom_to_term(Line,_入力された自然数,_),
        integer(_入力された自然数),
        _入力された自然数 > 0,!.
'診断 :: 自然数入力'(Line,_) :-
        writef('入力された %t から自然数を得ることができません。再入力をお願いします。\n',[Line]),
        fail.

素数であるかを調べる(1) :-
        write('プログラムを終了します\n'),!.
素数であるかを調べる(X) :-
        ウィルソンの定理による素数判定(X),
        write('素数です\n'),!.
素数であるかを調べる(_) :-
        write('素数ではありません\n').

ウィルソンの定理による素数判定(X) :-
        X > 0,
        Y is X - 1,
        階乗(Y,Z),
        0 is (Z + 1) mod X.

階乗(_n,X) :-
        findall(M,between(1,N,M),L),
        atomic_list_concat(L,*,S),
        atom_to_term(S,_式,_),
        X is _式.