2012-02-19 21 views
1

リスト内のすべてのリストにリストを追加する方法を見つけようとしています。以下のようなappendAll - リスト内のすべてのリストにリストを追加する

何か:私はまだプロローグおよびネストされたリストに新たなんだ

appendAll([a,b],[[q,w],[z,x]],X). 
X = [[a,b,q,w],[a,b,z,x]]. 

はかなり私を投げています。

私は今、数時間のために、このを見つめてきた:

appendAll([], _, []). 
appendAll(_, [], []). 
appendAll([H1|T1], [H2|T2], X) :- 
    append(H1,H2,R), 
    appendAll(T1,[H2|T2],X). 
    % recurse down to [], and append back up 

すべてのヘルプは非常に感謝感謝です!

答えて

3

Prologでプログラミングするのが難しいのは、後ろにある実際の再帰パターンに慣れることです。多くの場合、再帰を直接考えるのではなく、すべての構造に単純なものがここで働くかどうかを尋ねるのが最善です。

この場合、リストのリストと別のリストのリストの間に関係が必要です。両方の要素が同じ長さであり、要素が要素ごとに対応しているからです。

appendAll(Prefix, Lists, Prefixedlists) :- 
    maplist(append(Prefix), Lists, Prefixedlists). 

述語maplist/3は、多くのPrologシステムで定義されています。ない場合は、ISO準拠のシステムにそうようにそれを定義します。ここでは

maplist(_Cont_2, [], []). 
maplist(Cont_2, [X|Xs], [Y|Ys]) :- 
    call(Cont_2, X, Y), 
    maplist(Cont_2, Xs, Ys). 

が同じで、プレーンな述語として:

maplist_append(Prefix, [], []). 
maplist_append(Prefix, [X|Xs], [Y|Ys]) :- 
    append(Prefix, X, Y), 
    maplist_append(Prefix, Xs, Ys). 
+0

うーん、私は、これは素晴らしいです確信しているが、私は全くないんだけどそれを理解する – ftsk33

+1

これは素晴らしいです。私は間違いを見つけました。ありがとう! – ftsk33

関連する問題