このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1301553333/286
#  [1] 授業単元: C  
#  [2] 問題文(含コード&リンク):  
#  エラトステネスの篩 
#  第一引数にint型の変数m, 第二引数にint型の配列Pが与えられたとき、 
#  配列Pにm以下のすべての素数を格納し、格納した素数の個数を返す関数 
#  int eratosthenes(int m, intP[]) 
#  を作成せよ。 
#  なお、格納した素数の個数がhの場合、素数の配列PのP[0]からP[h-1]に昇順に 
#  格納されているものとする。 
#  

'エラトステネスの篩 第一引数にint型の変数m, 第二引数にint型の配列Pが与えられたとき、配列Pにm以下のすべての素数を格納し、格納した素数の個数を返す関数'(_m,_格納した素数の個数) :-
        findall(N,for(2,N,_m),L),
        エラトステネスの篩(L,_P),
        length(_P,_格納した素数の個数).

エラトステネスの篩([],[]) :- !.
エラトステネスの篩([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).