我有一个这样的列表列表:[[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).
然后给我一个空列表。 有人可以帮帮我吗? 谢谢。
答案 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].