2012-02-19 197 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 2012-02-19 03:11:25

+1

好吧,这是伟大的。我发现我的错误。谢谢! – ftsk33 2012-02-19 03:32:09