合并列表列表中的所有元素

时间:2013-06-05 13:08:36

标签: prolog

如何组合列表中列表中的所有列表元素?

例如

combine([[a,b,c],[d,[e,f],g],h],X).
return X = [a,b,c,d,e,f,g,h]

这就是我试过的

flat([], []).
flat([First|Rest], _X):-
    flat(Rest, First).

1 个答案:

答案 0 :(得分:0)

递归。

首先定义您的基本案例 - 如果您没有要合并的列表,则您有一个空列表。

combine([],[]).

如果您有一个元素,则您有一个单例列表

combine(X,[X]).

然后我们定义一般情况 - 非空列表

combine([X|Xs], Y) :-

首先,我们想要递归地压平头部

combine(X,XX),
然后是尾巴

combine(XS,XXs),

然后我们将这些放在一起

append(XX,XXs,Y).

我们必须仔细考虑如何将它们放在一起。单例元素的基本情况想要最后出现。当匹配规则Prolog将匹配第一个适用的规则时 - 带有singleton元素的基本情况将匹配一个列表,所以我们在这种情况下放置它以在这种情况下停止匹配。最后给我们:

combine([],[]).
combine([X|Xs],Y) :- combine(X,XX), combine(Xs,XXs), append(XX,XXs,Y).
combine(X,[X]).