このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1332279659/101
#  a, b, c, d, e, zの昇順ソートされた整数配列があります。 
#  それぞれ、1000万要素程度あり、mallocで領域を確保してあります。 
#   
#  a〜eの配列のそれぞれの要素から、zに含まれている要素を抜いてから、 
#  全て結合してソートして出力したいです。 
#  どういった方法が一番早いでしょうか? 
#   
#  それぞれの配列で 
#  aとz 
#  bとz 
#  cとzと順番に、それぞれでa[0]とz[0]から逐一比較していって、 
#  一致しない要素をメモリに持っておき、 
#  最後に結合して、ソート 
#  というのを考えましたがこれが最良なのかどうか…朝からずっと悩んでいます。 
#   

'a〜eの配列のそれぞれの要素から、zに含まれている要素を抜いてから、全て結合してソートして出力する' :-
        'a〜eの配列のそれぞれの要素から、zに含まれている要素を抜いてから'(_z,_a_1,_b_1,_c_1,_d_1,_e_1,_a_2,_b_2,_c_2,_d_2,_e_2),
        '全て結合してソートして出力する'(_a_2,_b_2,_c_2,_d_2,_e_2).

'a〜eの配列のそれぞれの要素から、zに含まれている要素を抜いてから'(_z,_a_1,_b_1,_c_1,_d_1,_e_1,_a_2,_b_2,_c_2,_d_2,_e_2,L) :-
        'zに含まれている要素を抜いてから'(_z,_a_1,_a_2),
        'zに含まれている要素を抜いてから'(_z,_b_1,_b_2),
        'zに含まれている要素を抜いてから'(_z,_c_1,_c_2),
        'zに含まれている要素を抜いてから'(_z,_d_1,_d_2),
        'zに含まれている要素を抜いてから'(_z,_e_1,_e_2),!.

'zに含まれている要素を抜いてから'(_,[],[]) :-!.
'zに含まれている要素を抜いてから'([],L,L) :- !.
'zに含まれている要素を抜いてから'([Z|R],[Z|R1],R2) :-
        'zに含まれている要素を抜いてから'([Z|R],R1,R2).
'zに含まれている要素を抜いてから'([Z|R],[A|R1],R2) :-
        Z @< A,
        'zに含まれている要素を抜いてから'(R,[A|R1],R2).
'zに含まれている要素を抜いてから'([Z|R],[A|R1],R2) :-
        Z @> A,
        'zに含まれている要素を抜いてから'([Z|R],R1,R2).

'全て結合してソートして出力する'(_a_2,_b_2,_c_2,_d_2,_e_2) :-
        '全て結合してソートして'(_a_2,_b_2,_c_2,_d_2,_e_2,L),
        出力する(L).

'全て結合してソートして'([],[],[],[],[],[]).
'全て結合してソートして'(_a_1,_b_1,_c_1,_d_1,_e_1,[Min|R]) :-
        最小値と残りならび(_a_1,_b_1,_c_1,_d_1,_e_1,Min,_a_2,_b_2,_c_2,_d_2,_e_2),
        '全て結合してソートして'(_a_2,_b_2,_c_2,_d_2,_e_2,R).

最小値と残りならび(_a,_b,_c,_d,_e,Min,R,_b,_c,_d,_e) :-
        先頭が最小(_a,_b,_c,_d,_e,1,Min,R),!.
最小値と残りならび(_a,_b,_c,_d,_e,Min,_a,Min,_c,_d,_e) :-
        先頭が最小(_a,_b,_c,_d,_e,2,Min,R),!.
最小値と残りならび(_a,_b,_c,_d,_e,Min,_a,_b,R,_d,_e) :-
        先頭が最小(_a,_b,_c,_d,_e,3,Min,R),!.
最小値と残りならび(_a,_b,_c,_d,_e,Min,_a,_b,_c,R,_e) :-
        先頭が最小(_a,_b,_c,_d,_e,4,Min,R),!.
最小値と残りならび(_a,_b,_c,_d,_e,Min,_a,_b,_c,_d,R) :-
        先頭が最小(_a,_b,_c,_d,_e,5,Min,R),!.

先頭が最小(_a,_b,_c,_d,_e,Nth,Min,R) :-
        選択(_a,A,Ra),
        選択(_b,B,Rb),
        選択(_c,C,Rc),
        選択(_d,D,Rd),
        選択(_e,E,Re),
        先頭が最小(1,[A,B,C,D,E],1,A,Nth,Min),
        nth1(Nth,[Ra,Rb,Rc,Rd,Re],R).

選択([_先頭|_残りならび],_先頭,_残りならび) :- !.
選択([],[],[]) :- !.

先頭が最小(_,[],Nth,Min,Nth,Min) :- !.
先頭が最小(N,[A|R],Nth_1,Min_1,Nth,Min) :-
        A @< Min_1,
        N_2 is N + 1,
        先頭が最小(N_2,R,N,A,Nth,Min).
先頭が最小(N,[A|R],Nth_1,Min_1,Nth,Min) :-
        A @>= Min_1,
        N_2 is N + 1,
        先頭が最小(N_2,R,Nth_1,Min_1,Nth,Min).

出力する([]) :- !.
出力する([N|R]) :-
        writef('%t ',[N]),
        出力する(R).