このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1370255305/35
#  【質問テンプレ】 
#  [1] 授業単元:プログラミング 
#  [2] 問題文(含コード&リンク):標準入力から正の数Xを入力し、1からXまでの整数のうち、素数だけを出力するプログラムを作成し、実行せよ。 
#  実行時にはX = 50となるように数字を入力する。 
#  

'標準入力から正の数Xを入力し、1からXまでの整数のうち、素数だけを出力するプログラムを作成し、実行せよ。
実行時にはX = 50となるように数字を入力する。' :-
        標準入力から正の数Xを入力し(X),
        '1からXまでの整数のうち、素数だけを出力する'(X).

標準入力から正の数Xを入力し(X) :-
        整数を得る(正の整数X,X > 0,X).

'1からXまでの整数のうち、素数だけを出力する'(X) :-
        素数だけ選別する(X,_素数ならび),
        '1からXまでの整数のうち'(_整数),
        素数だけ出力する(_整数,_素数ならび),
        X = _整数.

素数だけ選別する(X,_素数ならび) :-
        '2からXまでのならび'(_2からXまでのならび),
        エラトステネスの篩(_2からXまでのならび,_素数ならび).

'2からXまでのならび'(_2からXまでのならび) :-
        findall(N,between(2,X,N),_2からXまでのならび).

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

'1からXまでの整数のうち'(_整数) :-
        between(1,X,_整数).

素数だけ出力する(_素数,_素数ならび) :-
        member(_素数,_素数ならび),
        writef('%t ',[_素数]),!.
素数だけ出力する(_,_).