このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1316769778/763
#  A Table 
#  a1  a2 
#  -- -- 
#  1  A 
#  3  B 
#  5  C 
#  6  D 
#   
#  B Table 
#  b1  b2 
#  -- -- 
#  2  E 
#  4  F 
#  6  G 
#   
#  を select で 
#  a1 a2 b1 b2
#  -- -- -- --
#  1 A null null
#  3 B 2 E
#  5 C 4 F
#  6 D 6 G
#   
#  にしたいけど、どうしたらいいでしょうか?

'A テーブルの_a1をキーに、B テーブルの_b1が_aに等しいか最も近い小さな値である組と結合する。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める' :-
        'A テーブルの_a1をキーに'(_a1,_a2),
        'B テーブルの_b1が_aに等しいか最も近い小さな値である組と結合する。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'(_a1,_b1_b2).

'A テーブルの_a1をキーに'(_a1,_a2) :-
        'A テーブル'(_a1,_a2).

'B テーブルの_b1が_aに等しいか最も近い小さな値である組と結合する。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'(_a1,_b1_b2) :-
        setof(_b1,[_b1,_b2,_a1] ^ (
                    'B Table'(_b1,_b2),
                    _b1 @=< _a1),L1),
        'Lの最大値から_b1,_b2を見つける。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'(L1,B1,B2).

'Lの最大値から_b1,_b2を見つける。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'([],'','') :- !.
'Lの最大値から_b1,_b2を見つける。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'(L,B1,B2) :-
        findmax(B1,(
                    member(B1,L)),MaxB1),
        findmax([MaxB1,B2],(
                    'B Table'(MaxB1,B2)),[B1,B2]).


%  findmax/3