私が正しくあなたの質問を理解していれば
...
まず、あなたのプロローグは、マッピングのために、より高次の述語を持っていた、あなたの入力がそれにネストの正確二つのレベルを持っていることを知っていれば、そして場合について
merge_foldl([], []).
merge_foldl([X|Xs], R) :-
reverse([X|Xs], [Y|Ys]),
foldl(maplist(append), Ys, Y, R).
これは、SWI-Prologで期待どおりに動作します。 ここでは、それはあなたの二つの例である:これは、すべてではありません
merge([], []).
merge([X|Xs], Result) :-
merge_maplist(Xs, X, Result).
merge_maplist([], Result, Result).
、しかし:あなたはfoldr
もfoldl
どちらへのアクセス権を持っていない場合、あなたは折り畳みをハードコーディングする必要があります
?- merge_foldl([ [[a,b,c],[g,h,i]], [[j,k,l],[m,n,o]], [[s,t,u],[v,w,x]] ], R).
R = [[a, b, c, j, k, l, s, t, u], [g, h, i, m, n, o, v, w, x]].
?- merge_foldl([ [[a,b], [c,d], [e,f]], [[g,h], [i,j], [k,l]] ], R).
R = [[a, b, g, h], [c, d, i, j], [e, f, k, l]].
あなたがリストのリストの最後にいれば、最後の要素が結果であると言います。
ここで、各サブリストの先頭に追加するステップを定義する必要があります。これはmaplist
と簡単です:私たちは逆に、追記をしている、再帰的ステップの後:ここでは、非末尾再帰定義を使用して、右折り目を「エミュレート」されている
merge_maplist([X|Xs], Prev, Result) :-
merge_maplist(Xs, X, Result0),
maplist(append, Prev, Result0, Result).
注意。テール再帰的な定義(ハードコードされた左の折り畳みと同じ)の場合、最初に元のリストを逆にする必要があります。
これで、入力が完了するまでリストから1つのリストを削除し続けます。次に、maplist
を使用して、append/3
を前の要素からの各リストのペアとこれまでの結果に適用して、最終結果を取得します。
maplist
にアクセスできない場合は、マッピングもハードコーディングする必要があります。3つの引数についてappend/3
がかかること:
map_append([], [], []).
map_append([X|Xs], [Y|Ys], [Z|Zs]) :-
append(X, Y, Z),
map_append(Xs, Ys, Zs).
とあなたのmerge/2
となっmerge_/3
:これは非常にうまく、あなたが高次の述語を持っている場合は解決することができる何かのために多くのコードがある
を
merge([], []).
merge([X|Xs], Result) :-
merge_(Xs, X, Result).
merge_([], Result, Result).
merge_([X|Xs], Prev, Result) :-
merge_(Xs, X, Result0),
map_append(Prev, Result0, Result).
。
質問:1)入力は2つのリストのリストを持つ単一のリストですか? 2)リストのリストがすべて長さ2であることを知っていますか? –
いいえ、それ以上の場合もあります。3,4など – gyeresicsaba
最後に、最初の引数が_n_リストのリストで、それぞれに_m_サブリストがある場合、結果は_m_サブリストのリストになりますか? –