このディレクトリの索引
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 Table  \n  a1  a2  \n  -- --  \n  1  A  \n  3  B  \n  5  C  \n  6  D  \n  B Table  \n  b1  b2  \n  -- --  \n  2  E  \n  4  F  \n  6  G  \n  を \n  a1 a2 b1 b2 \n  -- -- -- -- \n  1 A null null \n  3 B 2 E \n  5 C 4 F \n  6 D 6 G  にしたい'(_a1,_a2,_b1,_b2) :-
        'A テーブルの_aをキーにB テーブルの_b1が_aに等しいか最も近い小さな値である組と結合する。ただし対象組が見つからない時はBテーブルの二つのフィールドはnullで埋める'.

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

'B Table の中で _b1 の値が _a1 に等しいか最も近い組'(_a1,B1,B2) :-
        setof(_b1,[_b1,_b2,_a1] ^ (
                    'B Table'(_b1,_b2),
                    _b1 @=< _a1),L1),
        '_b1の最大値'(L1,B1,B2).

'_b1の最大値'(L,'','') :-
        'L が[]の時はB1,B2はそれぞれnull'(L).
'_b1の最大値'(L,B1,B2) :-
        findmax(B1,(
                    member(B1,L)),MaxB1),
        findmax([MaxB1,B2],(
                    'B Table'(MaxB1,B2)),[B1,B2])

'L が[]の時はB1,B2はそれぞれnull'([]).