我正在尝试找到一种方法将列表附加到列表中的所有列表中。
类似的东西:
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
非常感谢任何帮助谢谢!
答案 0 :(得分: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).