このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1258158172/392
#  [1] 授業単元:プログラミング演習 
#  [2] 問題文(含コード&リンク): 
#  3つの自然数を辺にもつ直角三角形を1000個出力するプログラムを書きなさい。 
#  ただし、3つの辺 a, b, c は a <= b <= c とする。 
#  また、3辺の比率が同じものはカウントしないこととする。 

'3つの自然数を辺にもつ直角三角形を1000個出力' :-
    '3つの自然数を辺にもつ直角三角形'(1,1000,1,[],X),
    member(L,X),
    write_formatted('%t\n',[L]),
    fail.
'3つの自然数を辺にもつ直角三角形を1000個出力'.

'3つの自然数を辺にもつ直角三角形'(M,Max,_,_,[]) :- M > Max,!.
'3つの自然数を辺にもつ直角三角形'(M,Max,C,Y,[[A,B,C]|R]) :-
    約数が存在しない(C,Y),
    C1 is truncate(C ^ 2),
    自然数の2乗(3,N,A,A1),
    自然数の2乗(3,N,B,B1),
    A =< B,
    C1 is A1 + B1,
    M2 is M + 1,C2 is C + 1,
    '3つの自然数を辺にもつ直角三角形'(M2,Max,C2,[C|Y],R).
'3つの自然数を辺にもつ直角三角形'(M,Max,C,Y,X) :- C2 is C + 1,'3つの自然数を辺にもつ直角三角形'(M,Max,C2,Y,X).

自然数の2乗(M,N,M,X) :- M =< N,X is truncate(M * M).
自然数の2乗(M1,N,M,X) :- M =< N,M2 is M1 + 1,自然数の2乗(M2,N,M,X).

約数が存在しない(A,L) :- \+((member(B,L),0 is A mod B)),!.