このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1340242041/333
#  御題1:
#  回文になる素数(例: 7, 11, 101)を小さい順に50個表示せよ

'回文になる素数(例: 7, 11, 101)を小さい順に50個表示せよ' :-
        回文になる50個の素数を小さい順に(1,[],[3,2],_回文になる50個の素数ならび),
        表示する(_回文になる50個の素数ならび).

回文になる50個の素数を小さい順に(M,L1,L2,L) :-
        'L2の要素数が50以上になったら小さい順に50個切り取る'(L2,L),!.
回文になる50個の素数を小さい順に(M,L1,L2,L) :-
        '6の倍数の前後の数が素数ならばL1に追加し、かつ回文ならL2にも追加する'(M,L1,L2,L1_2,L2_2),
        M_2 is M + 1,
        回文になる50個の素数を小さい順に(M_2,L1_2,L2_2,L).

'L2の要素数が50以上になったら小さい順に50個切り取る'(L2,L) :-
        length(L2,Len),
        Len >= 50,
        小さい順に(L2,L3),
        length(L,50),
        append(L,_,L3).

小さい順に(L1,L2) :-
        reverse(L1,L2).

'6の倍数の前後の数が素数ならばL1に追加し、かつ回文ならL2にも追加する'(M,L1,L2,L1_2,L2_2) :-
        N_1 is 6 * M - 1,
        '素数ならばL1に追加し、かつ回文ならL2にも追加する'(N_1,L1,L2,L1_1,L2_1),
        N_2 is 6 * M + 1,
        '素数ならばL1に追加し、かつ回文ならL2にも追加する'(N_2,L1_1,L2_1,L1_2,L2_2).

'素数ならばL1に追加し、かつ回文ならL2にも追加する'(N,L1,L2,L1,L2) :-
        member(J,L1),
        0 is N mod J,!.
'素数ならばL1に追加し、かつ回文ならL2にも追加する'(N,L1,L2,[N|L1],[N|L2]) :-
        回文になる数字(N),!.
'素数ならばL1に追加し、かつ回文ならL2にも追加する'(N,L1,L2,[N|L1],L2).

回文になる数字(N) :-
        number_chars(N,Chars),
        reverse(Chars,Chars).

表示する(_回文になる50個の素数ならび) :-
        append(_,[N|R],_回文になる50個の素数ならび),
        writef('%t ',[N]),
        R = [],
        write('\n').