このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1258320456/276
#  ゴールドバッハの予想 
#  与えられた値を2つの素数の和で現してください 
#  verは出来れば2.6で 
#  エラトステネスのふるいを用いた素数リストを使って値を出すようにしてください 
#  お願いします 
# 
# 

'与えられた値を2つの素数の和で現してください。エラトステネスのふるいを用いた素数リストを使って値を出す'(_与えられた値,_素数組ならび) :-
        findall([_素数_1,_素数_2],(
                    '与えられた値を2つの素数の和で現してください。エラトステネスのふるいを用いた素数リストを使って値を出す'(_与えられた値,_素数_1,_素数_2)),
                _素数組ならび).

'与えられた値を2つの素数の和で現してください。エラトステネスのふるいを用いた素数リストを使って値を出す'(_与えられた値,_素数_1,_素数_2) :-
        ひとまず2から与えられた値までの数値ならびを作る(_与えられた値,_数値ならび),
        素数ならびの生成(_数値ならび,_素数ならび),
        素数の和(_与えられた値,_素数ならび,_素数_1,_素数_2).

ひとまず2から与えられた値までの数値ならびを作る(_与えられた値,_数値ならび) :-
        findall(N,for(2,N,_与えられた値),_数値ならび).

素数ならびの生成(_数値ならび,_素数ならび) :-
        エラトステネスの篩(_数値ならび,_素数ならび).

素数の和(_与えられた値,[N|R1],_素数_1,_素数_2) :-
        _素数_2 is _与えられた値 - N,
        _素数_2 =< N,
        !,fail.
素数の和(_与えられた値,[_素数_1|R1],_素数_1,_素数_2) :-
        _素数_2 is _与えられた値 - _素数_1,
        append(_,[_素数_2|_],R1).
素数の和(_与えられた値,[_|R1],_素数_1,_素数_2) :-
        素数の和(_与えられた値,R1,_素数_1,_素数_2).

% *** user: エラトステネスの篩 / 3 ***
エラトステネスの篩(_,[],[]) :- !.
エラトステネスの篩(N,[A|R1],R2) :-
        0 is A mod N,
        エラトステネスの篩(N,R1,R2),!.
エラトステネスの篩(N,[A|R1],[A|R2]) :-
        エラトステネスの篩(N,R1,R2).

% *** user: エラトステネスの篩 / 2 ***
エラトステネスの篩([],[]) :- !.
エラトステネスの篩([A|R1],[A|R2]) :-
        エラトステネスの篩(A,R1,L),
        エラトステネスの篩(L,R2).