このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1269438098/379
#  [1] 授業単元: プログラム演習 
#  [2] 問題文(含コード&リンク):10000未満の正の整数を考える(xとする)。このとき、ある2つの整数の3乗の和として表す表し方が2通りある数をすべて求めなさい。つまり、異なる2通りの数の組(a,b)と(c,d)があって、 
#  x = a^3 + b^3 
#  = c^3 + d^3 
#  とできる数xを表示するプログラムを実行しなさい。例えば、1027は 
#  1027 = 3^3 + 10^3 
#  と表せますが、それ以外は表せません((3,10)と(10,3)は同じものと考える)。 
#   
#    
#  

'10000未満の正の整数を考える(xとする)。このとき、ある2つの整数の3乗の和として表す表し方が2通りある数をすべて求める'(L) :-
       findall([A,B,C,D,X],'10000未満の正の整数を考える(xとする)。このとき、ある2つの整数の3乗の和として表す表し方が2通りある数をすべて求める'(A,B,C,D,X),L1),
      重複削除(L1,[],L).

'10000未満の正の整数を考える(xとする)。このとき、ある2つの整数の3乗の和として表す表し方が2通りある数をすべて求める'(A,B,C,D,X) :-
      findall([N,N3],(for(1,N,9999),N3 is N * N * N,N3 < 10000),L),
      組合せ(L,2,[[A,A3],[B,B3]]),
      X is A3 + B3,
      X < 10000,
      組合せ(L,2,[[C,C3],[D,D3]]),
      \+(member(C,[A,B])),
      \+(member(D,[A,B])),
      X is C3 + D3.

重複削除([],L,L).
重複削除([[A,B,C,D,X]|R1],L2,L) :-
      member([C,D,A,B,X],L2),
      重複削除(R1,L2,L).
重複削除([[A,B,C,D,X]|R1],L2,L) :-
      \+(member([C,D,A,B,X],L2)),
      重複削除(R1,[[A,B,C,D,X]|L2],L).