列表PROLOG上的列表清单

时间:2017-11-11 17:07:33

标签: list recursion prolog

我有一个这样的列表列表:[[a,b],[b,c],[c,d]],我想要[a,b,c]。

我的代码是:

unMakeTuple([],_).
    unMakeTuple([[A,_]|T],Ret):-
    insertOnList(A,Ret,Ret1),
    nl,write(Ret),
    nl,write(Ret1),
    unMakeTuple(T,Ret1).

insertOnList(E,[],[E]).
    insertOnList(E,[H|T],[H|T1]):-
    insertOnList(E,T,T1).

然后给我一个空列表。 有人可以帮帮我吗? 谢谢。

2 个答案:

答案 0 :(得分:2)

这里你基本上想要我们获得每个子列表的 head 的映射。

因此我们可以定义谓词head/2

head([H|_],H).

然后使用maplist/3

unMakeTuple(A,B) :-
    maplist(head,A,B).
然后我们获得:

?- unMakeTuple([[a,b],[b,c],[c,d]],X).
X = [a, b, c].

虽然编写自定义谓词当然也是有益的。这里的优点是(a)我们将列表A映射到映射B非常具有说明性且易于理解,因为每个元素通过{{1}统一两个列表的元素谓词; (b)我们可以确定head正常工作,(c)我们可以预期maplist/3将得到优化,以便快速完成处理。

答案 1 :(得分:1)

@Willem Van Onsem上面使用maplist/3的解决方案是更好的方法,但另一种方法是编写一个谓词,将内部列表的所有头部添加到结果列表中。像这样的某种递归解决方案应该有效:

head([H|_], H).

get_heads([], []).
get_heads([X|Xs], List) :-
    head(X, H),
    List = [H|Rest],
    get_heads(Xs, Rest).

其工作原理如下:

?- get_heads([[a,b],[b,c],[c,d]], X).
X = [a, b, c].