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


'100以下までの素数を求め、その表示をするプログラムを作成せよ。ただし、求める素数の量は引数として関数側に渡して求めることとする。'(_n個まで) :-
        '2から100までのリストを生成する'(L),        
        m個目の素数は(_m個目,L,_素数),
        その表示をする(_m個目,_素数),
        _m個目 = _n個まで.

'2から100までのリストを生成する'(L) :-
        findall(N,between(2,100,N),L).

m個目の素数は(_m,L,_素数) :-
        計数付きエラトステネスの篩(0,_m,L,_素数).

計数付きエラトステネスの篩(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).

その表示をする(_m個目,_素数) :-
        writef('%t個目の素数は %t です\n',[_m個目,_素数]).