このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1276810079/840
#  [1] 授業単元:プログラミング演習I  
#  [2] 問題文(含コード&リンク):  
#  課題  
#  (1000以下の完全数)正整数kが等式  
#     k=(kの約数の内、k以外のものの総和)  
#  を満たす時、kは完全数であるという。たとえば、6の約数は 1,2,3,6の4個であり、6=1+2+3であるため、6は完全数である。1000以下の完全数をすべて出力するJavaプログラムを作れ。  
#  

'1000以下の完全数をすべて出力する' :-
        for(1,N,1000),
        完全数(N),
        write_formatted('%t\n',[N]),
        N = 1000,!.
'1000以下の完全数をすべて出力する'.

完全数(N) :-
        '1以外の最初の約数は'(N,N1),
        NX is N // N1,
        N2 is N1 + 1,
        S1 is N1 + NX + 1,
        完全数(N2,S1,N),!.

完全数(N1,N,N) :- (N // N1) < N1,!.
完全数(N1,S1,N) :- (N // N1) >= N1,
        0 is N mod N1,
        Y is N // N1,
        S2 is S1 + N1 + Y,
        N2 is N1 + 1,
        完全数(N2,S2,N).
完全数(N1,S,N) :- (N // N1) >= N1,
        \+(0 is N mod N1),
        N2 is N1 + 1,
        完全数(N2,S,N).

'1以外の最初の約数は'(N,N1) :-
        N > 1,
        for(2,N1,N // 2 + 1),
        0 is N mod N1,!.