このディレクトリの索引

#  [15回演習問題1.1.4]
#  1.1.2と1.1.3で定義したremove_multi/3とsieve/2を用いて、
#  第1引数で指定した自然数以下の素数のリストが、第2引数として得られる
#  述語primes/2を定義せよ。

primes(N,L) :-
        findall(M,for(2,M,N),L1),
        sieve(L1,L).        

sieve([],[]).
sieve([N|R1],[N|R2]) :-
        remove_multi(N,R1,L2),
        sieve(L2,R2).

remove_multi(_,[],[]) :- !.
remove_multi(N,[M|R1],L) :-
        0 is M mod N,
        remove_multi(N,R1,L).
remove_multi(N,[M|R1],[M|R2]) :-
        \+(0 is M mod N),
        remove_multi(N,R1,R2).