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

:- dynamic(素数候補/1).
:- dynamic(素数/1).


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

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

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

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

'2からXまでのならび'(X) :-
        between(2,X,N),
        assertz(素数候補(N)),
        X = N.

エラトステネスの篩 :-
        retract(素数候補(M)),
        assertz(素数(M)),
        エラトステネスの篩_1(M).
エラトステネスの篩.

エラトステネスの篩_1(M) :-
        素数候補(N),
        0 is N mod M,
        retract(素数候補(N)),
        fail.
エラトステネスの篩_1(M) :-
        エラトステネスの篩.

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

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