1

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

何かのようなもの:

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

どんな助けでも大歓迎ですありがとう!

4

1 に答える 1

3

Prolog を使用したプログラミングで難しいのは、背後にある実際の再帰パターンに慣れて識別することです。多くの場合、再帰を直接考えるのではなく、単純な for all 構造がここで機能するかどうかを尋ねるのが最善です。

この場合、リストのリストと別のリストのリストの間の関係が必要です。要素は要素ごとに互いに対応しているため、両方とも同じ長さです。

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).
于 2012-02-19T01:46:53.140 に答える