List appendAll-将列表附加到列表中的所有列表

List appendAll-将列表附加到列表中的所有列表,list,recursion,mapping,prolog,iso-prolog,List,Recursion,Mapping,Prolog,Iso Prolog,我试图找到一种方法,将列表附加到列表中的所有列表 比如: appendAll([a,b],[[q,w],[z,x]],X). X = [[a,b,q,w],[a,b,z,x]]. 我对prolog还是个新手,嵌套列表让我有点厌烦 我已经盯着这个看了几个小时了: appendAll([], _, []). appendAll(_, [], []). appendAll([H1|T1], [H2|T2], X) :- append(H1,H2,R), appendAll(T1,[H2|T2

我试图找到一种方法,将列表附加到列表中的所有列表

比如:

appendAll([a,b],[[q,w],[z,x]],X).
X = [[a,b,q,w],[a,b,z,x]].
我对prolog还是个新手,嵌套列表让我有点厌烦

我已经盯着这个看了几个小时了:

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

非常感谢您的帮助,谢谢

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

嗯,我肯定这很好,但我不完全理解这很好。我发现了我的错误。谢谢