Prolog:将列表中的元素附加到列表中

时间:2014-12-07 23:30:54

标签: list recursion prolog append

我试图创建一个给出的程序:combine([[1],[2,3]],Q)。它将生成:Q = [1,2,3]。

换句话说,如果我给出了一个元素列表,我需要将它们全部附加到一个列表中。并非每个元素都可以是列表,因此我必须将任何非列表元素变为列表,以便可以追加。无论列表元素中包含哪些其他元素都无关紧要。

到目前为止我的尝试:

combine(L,Q) :- match(L,Q).

match([],Q).
match([H|T],Q) :- H = [], append(H,Q,Z), match(T,Z).
match([H|T],Q) :- H = [_|_], append(H,Q,Z), match(T,Z).
match([H|T],Q) :- append([H],Q,Z), match(T,Z).

我的想法是,当我调用辅助函数时,我试图找出H是列表还是非列表。如果它是非列表,它将把H放在一个列表中并将其附加到递归传递的列表中。当列表到达结尾时,最重要的事实取消。可悲的是,我得到的是Q = [ giberish giberish ,...]; Q = [更多的胡言乱语,....];

编辑:修正了我需要的描述。

1 个答案:

答案 0 :(得分:1)

你去吧。基本上,如果列表为空,则展平版本也是如此。如果它没有将第一个元素附加到其余部分的展平版本,但如果头部不是列表,则首先将其设置为一个。

combine([],[]).
combine([H|T],Q) :- is_list(H), combine(T,Q1), append(H,Q1,Q).
combine([H|T],Q) :- not(is_list(H)), combine(T,Q1), append([H],Q1,Q).