このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1307166756/239
#  [1] 授業単元:配列の並び替え  
#  [2] 問題文(含コード&リンク):  
#  整数Nとしたとき、素数をN個リストアップするプログラムを作成しなさい。 
#  ※実行にあたり、Nの値を小さな値から慎重に変化させ、結果とプログラム動作の変化に注意すること 
#  ※N=1としたとき、答えは1ではありません 
#  

'整数Nとしたとき、素数をN個リストアップする'(N,L) :-
        length(L,N),
        素数をリストアップする([],L).

素数をリストアップする(L1,[]) :- !.
素数をリストアップする(L1,[M|R]) :-
        素数を得る(M),
        \+(append(_,[M|_],L1)),
        素数をリストアップする([M|L1],R),!.
素数をリストアップする(L1,L) :-
        素数をリストアップする(L1,L),!.

素数を得る(M) :-
        M is random mod 4998 + 2,
        findall(I,for(2,I,M),L1),
        エラトステネスの篩(L1,L2),
        last(L2,M),!.
素数を得る(M) :-
        素数を得る(M).

エラトステネスの篩([],[]) :- !.
エラトステネスの篩([A|R1],[A|R2]) :-
        エラトステネスの篩(A,R1,L),
        エラトステネスの篩(L,R2).

エラトステネスの篩(_,[],[]) :-!.
エラトステネスの篩(N,[A|R1],R2) :-
        0 is A mod N,
        エラトステネスの篩(N,R1,R2),!.
エラトステネスの篩(N,[A|R1],[A|R2]) :-
        エラトステネスの篩(N,R1,R2).