このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1337692704/832
#  【課題】X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい 
#  【 期限 】2013/11/06 
#  【 Ver  】"1.7.0_11" 
#  
#  いまいちわからず困っています。 
#  よろしくお願いします。

'X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい' :-
        'X * Y = 125 になる 素数Xと素数Yを求める'(_X_Y_組合せならび),!,
        forall(member([_X,_Y],_X_Y_組合せならび),
               表示しなさい(_X,_Y)).
'X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい' :-
        writef('解がありません!\n'),
        fail.

'X * Y = 125 になる 素数Xと素数Yを求める'(_X_Y_組合せならび) :-
        '125以下の素数ならびを得る'(_125以下の素数ならび),
        findall([_X,_Y],(
                    組合せ(_125以下の素数ならび,2,[_X,_Y]),
                    125 is X * Y),
                _X_Y_組合せならび),
        \+(_X_Y_組合せならび=[]).

'125以下の素数ならびを得る'(_125以下の素数ならび) :-
        findall(N,between(2,125,N),_2から125までの整数ならび),
        エラトステネスの篩(_2から125までの整数ならび,_125以下の素数ならび).

組合せ(X,1,[A]) :-
        member(A,X) .
組合せ([A|Y],N,[A|X]) :-
        N > 1,
        M is N - 1,
        組合せ(Y,M,X).
組合せ([_|Y],N,A) :-
        N > 1,
        組合せ(Y,N,A).

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

表示しなさい(_X,_Y) :-
        writef('%t %t\n',[_X,_Y]).