このディレクトリの索引
http://pc11.2ch.net/test/read.cgi/db/1252492296/777
#  ・A, B, C, D・・・列があり、全て文字型(レコードは数値のみ)。 
#    A, Bがプライマリーキー  
#  ・以下の条件を満たすA, Bの値 
#  Cが'04', '08', '09'のいずれかの行の中で、 
#  Dの値が最小のレコードのA, Bの組み合わせのうち、 
#  Bの値が最小のレコードすべてのA, B 
#  ・説明  
#  自分でsqlを作成すると、同じSELECT文が何度も出てきてしまいます。 
#  もっと重複のない文にできないのでしょうか? 
#  select A, MIN(B) as B from 
#  ( 
#  (select A, B, D from foo where C in ('04', '08', '09')) T1 
#  inner join 
#  ( 
#  select A, MIN(D) as D from foo where C in ('04', '08', '09') 
#  group by A 
#  ) T2 
#    on T2.A = T1.A and T2.D = T1.D 
#  ) T0 
#  group by A 
# 
# 

% ここでは要素をA,B,C,Dに限って考えることとする。

'Cが''04'', ''08'', ''09''のいずれかの行の中で、 Dの値が最小のレコードのA, Bの組み合わせのうち、 Bの値が最小のレコードすべてのA, B'(A,B) :-
        findmin([D,B],(
                    foo(A,B,C,D),member(C,['04','08','09'])),
                L),
        foo(A,B,C,D),
        member([D,B],L).