2016-10-10 26 views
1

私は約1週間Prologを学んでいるので、私は初心者です。 私は、リストのリストの要素を追加する関数を実行しようとしています。Prologのリストの要素のリスト

ので、入力は次のようになります。[ [[a,b,c],[g,h,i]], [[j,k,l],[m,n,o]], [[s,t,u],[v,w,x]] ].

、出力は次のようになります。[ [a,b,c,j,k,l,s,t,u], [g,h,i,m,n,o,v,w,x] ].

それとも

入力:[ [[a,b], [c,d]], [[e,f], [g,h]], [[i,j],[k,l]] ].

出力:[ [a,b,e,f,i,j], [c,d,g,h,k,l] ].

それは重要であろう、それは3だけでなく、多くの要素で動作しなければならないということです。 私はこれを書いていますが、2つの要素でしか動作しないため、ペアでしかできません。

merge([],[],[]). 
merge(L1,[],L1). 
merge([H1|T1],[H2|T2],LL):- 
    append(H1, H2, HE), 
    merge(T1,T2,TE), 
    append([HE], TE, LL). 
+0

質問:1)入力は2つのリストのリストを持つ単一のリストですか? 2)リストのリストがすべて長さ2であることを知っていますか? –

+0

いいえ、それ以上の場合もあります。3,4など – gyeresicsaba

+0

最後に、最初の引数が_n_リストのリストで、それぞれに_m_サブリストがある場合、結果は_m_サブリストのリストになりますか? –

答えて

1
私が正しくあなたの質問を理解していれば

...

まず、あなたのプロローグは、マッピングのために、より高次の述語を持っていた、あなたの入力がそれにネストの正確二つのレベルを持っていることを知っていれば、そして場合について

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). 

、しかし:あなたはfoldrfoldlどちらへのアクセス権を持っていない場合、あなたは折り畳みをハードコーディングする必要があります

?- 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). 

+0

maplistを使用するライブラリはどのように使用できますか? – gyeresicsaba

+0

@gyeresicsaba私はSICSTUSについて詳しくは分かりません。なぜそれを自分で定義できるのかを示しています。 'map'や' maplist'のドキュメンテーションを検索するには、それを行う方法があります。 –

+0

@gyeresicsabaこれは本当に複雑な問題文ですが、それは宿題ですか、それとも実用的なものが必要ですか? –

関連する問題