'エラトステネスの篩とは、素数判定法の一つで、
                古代数学者エラトステネスが考案したことが記されているためこの名がある。
                2以上N以下の順序数の集合から素数と解ったものの倍数を篩に掛けるように
                削除していって、すべての要素を検査し終わるまで、すなわち
                素数以外の要素がなくなるまでこれを繰り返す。こうして素数集合を
                得るものである。
                なお、述語名はこれ以後、
                "エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)"と
                簡約する'(_N以下,_N以下の素数ならび) :-
                        'エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)により、N以下の素数ならびを得る'(_N以下,_N以下の素数ならび).


                'エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)により、N以下の素数ならびを得る'(_N以下,_N以下の素数ならび) :-
                        '2以上N以下の順序数集合'(_N以下,_2以上N以下の順序数ならび),
                        'エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)'(_2以上N以下の順序数ならび,_N以下の素数ならび).


                'エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)'([],[]) :- !.
                'エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)'([A|R1],[A|R2]) :-
                        篩は素数の倍数で篩に掛けるものとする(R1,A,L),        
                        'エラトステネスの篩(篩は素数の倍数で篩に掛けるものとする)'(L,R2).


                篩は素数の倍数で篩に掛けるものとする(R1,A,L) :-
                        findall(B,(
                                    member(B,R1),
                                    \+(0 is B mod A)),L).



                '2以上N以下の順序数集合'(_N以下,_2からNまでの順序数ならび) :-
                        findall(M,between(2,_N以下,M),_2からNまでの順序数ならび).