質問のコードからわかるように、ソートされた数値のリストをマージしています。これらの数値がすべて整数であり、Prologシステムがclpfdを提供している場合は、ここに示されているコードの使用を検討してください。なんで?
- 実装は論理純度を保持します。
- コードは単調であり、堅牢で柔軟性があります。地上以外のデータで作業している場合でも、常に論理的に適切な回答を得ることができます。
- 主述語
sorted1_sorted2_merged/3
は実際の関係のように動作します。
- 組み込みとは異なり
sort/2
、このコードはすべての重複を(まったく同じ多重度で)保持します。
- マージされるリスト内の等しいアイテムに関しては、合理的に動作します。入力#2の一部のアイテムと等しい入力#1のアイテムは、マージされた結果のアイテムよりも前になります。
- 実装は、のような目標を持つ無駄な選択ポイントを残さないという意味で効率的
sorted1_sorted2_merged([1,3,5],[2,4,5,6],Zs)
です。
それ以上の苦労なしに...ここにコードがあります:
:- use_module(library(clpfd)).
sorted1_sorted2_merged([] ,Ys,Ys).
sorted1_sorted2_merged([X|Xs],Ys,Zs) :-
sorted2_hd1_tl1_merged(Ys,X,Xs,Zs).
hd1_tl1_hd2_tl2_merged(X,Xs,Y,Ys,Zs) :-
zcompare(Op,X,Y),
op_hd1_tl1_hd2_tl2_merged(Op,X,Xs,Y,Ys,Zs).
sorted1_hd2_tl2_merged([] ,Y,Ys,[Y|Ys]).
sorted1_hd2_tl2_merged([X|Xs],Y,Ys,Zs) :-
hd1_tl1_hd2_tl2_merged(X,Xs,Y,Ys,Zs).
sorted2_hd1_tl1_merged([] ,X,Xs,[X|Xs]).
sorted2_hd1_tl1_merged([Y|Ys],X,Xs,Zs) :-
hd1_tl1_hd2_tl2_merged(X,Xs,Y,Ys,Zs).
op_hd1_tl1_hd2_tl2_merged(<,X,Xs,Y,Ys,[X|Zs]) :-
sorted1_hd2_tl2_merged(Xs,Y,Ys,Zs).
op_hd1_tl1_hd2_tl2_merged(=,X,Xs,Y,Ys,[X|Zs]) :-
sorted1_hd2_tl2_merged(Xs,Y,Ys,Zs).
op_hd1_tl1_hd2_tl2_merged(>,X,Xs,Y,Ys,[Y|Zs]) :-
sorted1_hd2_tl2_merged(Ys,X,Xs,Zs).
いくつかの質問に移りましょう!初め:
?- sorted1_sorted2_merged([1,3,4,6],[2,4,5,5,7],Xs).
Xs = [1,2,3,4,4,5,5,6,7]. % succeeds deterministically
それは「他の方向」でも機能しますか?
?- sorted1_sorted2_merged([1,3,4,6],Ys,[1,2,3,4,4,5,5,6,7]).
Ys = [2,4,5,5,7] ; % succeeds, but leaves behind choicepoint
false.
?- sorted1_sorted2_merged(Xs,[2,4,5,5,7],[1,2,3,4,4,5,5,6,7]).
Xs = [1,3,4,6] ; % succeeds, but leaves behind choicepoint
false.
最後に、非常に一般的な使用法:
?- sorted1_sorted2_merged(Xs,Ys,[0,1,2,3]).
Xs = [ ], Ys = [0,1,2,3] ;
Xs = [0,1,2,3], Ys = [ ] ;
Xs = [0 ], Ys = [ 1,2,3] ;
Xs = [0,1 ], Ys = [ 2,3] ;
Xs = [0,1,2 ], Ys = [ 3] ;
Xs = [0,1, 3], Ys = [ 2] ;
Xs = [0, 2,3], Ys = [ 1] ;
Xs = [0, 3], Ys = [ 1,2 ] ;
Xs = [0, 2 ], Ys = [ 1, 3] ;
Xs = [ 1,2,3], Ys = [0 ] ;
Xs = [ 2,3], Ys = [0,1 ] ;
Xs = [ 3], Ys = [0,1,2 ] ;
Xs = [ 2 ], Ys = [0,1, 3] ;
Xs = [ 1 ], Ys = [0, 2,3] ;
Xs = [ 1,2 ], Ys = [0, 3] ;
Xs = [ 1, 3], Ys = [0, 2 ] ;
false.