このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1307166756/31
#  [1] 授業単元:繰り返し(for)・条件分岐 
#  [2] 問題文(含コード&リンク): 
#  2〜100までの数値について、素因数に分解して実行結果例のように表示するプログラムを作成しなさい。 
#  例 
#  2 = 素数です。 
#  3 = 素数です。 
#  4 = 2 × 2 
#  ...(省略)... 
#  99 = 3 × 3 × 11 
#  100 = 2 × 2 × 5 × 5 
#  

'2〜100までの数値について、素因数に分解して実行結果例のように表示する' :-
        _素数候補の限界値Max is truncate(sqrt(100)),
        findall(N1,for(2,N1,_素数候補の限界値),_素数候補),
        エラトステネスの篩(_素数候補,_この問題に必要な素数ならび),
        findall(N2,for(2,N2,100),_2〜100までの数値ならび),
        素因数分解表示(_2〜100までの数値ならび,_この問題に必要な素数ならび).

素因数分解表示([],_) :- !.
素因数分解表示([N|R1],L) :-
        素因数分解(N,L,L1),
        素因数分解一行表示(N,L1),
        素因数分解表示(R1,L),!.

素因数分解(0,_,[]) :- !.
素因数分解(N,L,[N|R3]) :-
        append(_,[M|L],L),
        0 is N mod M,
        N2 is N // M,
        素因数分解(N2,L,R3),!.
素因数分解(N,L,[N]).

素因数分解一行表示(N,[N]) :-
        writef('%t = 素数です。\n',[N]),!.
素因数分解一行表示(N,L1) :-
        concat_atom(L1,'×',S),
        writef('%t = %t\n',[N,S]),!.

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