このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/104
#  [1] 授業単元:プログラミング演習 
#  [2] 問題文(含コード&リンク): 
#    100以下までの素数を求め、その表示をするプログラムを作成せよ。 
#    ただし、求める素数の量は引数として関数側に渡して求めることとする。 
#   
#    【関数仕様】 
#    戻り値:なし 
#    関数名:prime 
#    引数:int n 
#  


'100以下までの素数を求め、その表示をするプログラムを作成せよ。ただし、求める素数の量は引数として関数側に渡して求めることとする。'(_n) :-
        findall(N,between(2,100,N),L),
        計数付きエラトステネスの篩(0,_m,L,_素数),
        writef('%t\n',[_素数]),
        _m = _n.

計数付きエラトステネスの篩(M,N,[A|R1],X) :-
        エラトステネスの篩(A,R1,L),
        計数付きエラトステネスの篩(M,N,A,L,X).

計数付きエラトステネスの篩(M,N,A,L,A) :-
        N is M + 1.
計数付きエラトステネスの篩(M,N,_,L,X) :-
        M_2 is M + 1,
        計数付きエラトステネスの篩(M_2,N,L,X).

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