このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1337692704/777
#  【課題】X * Y = 123 になる素数 XとYを求め、結果をすべて表示しなさい。
#  【 期限 】2013/10/15 
#  【 Ver  】"1.7.0_11" 
#  がんばってますが期限までに理解できる気がしないので 
#  基礎的なことだとは思いますが、よろしく御願いします

'X * Y = 123 になる素数 XとYを求め、結果をすべて表示しなさい。' :-
        forall('X * Y = 123 になる素数 XとYを求め、'(X,Y),
               '結果をすべて表示しなさい。'(X,Y)).

'X * Y = 123 になる素数 XとYを求め、'(X,Y) :-
        findall(N,between(2,123,N),L),
        エラトステネスの篩(L,_素数ならび),
        重複組合せ(_素数ならび,2,[X,Y]),
        123 is X * Y.

'結果をすべて表示しなさい。'(X,Y) :-
        writef('X=%t,Y=%t\n',[X,Y]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

重複組合せ(X,1,[A]) :-
        member(A,X).
重複組合せ([A|Y],N,[A|X]) :-
        N > 1,
        M is N - 1,
        重複組合せ([A|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).