2017-11-11 180 views
2

我有这样的列表中的一个列表:[[A,B],[B,C],[C,D],我想有[A,B,C ]。列表对列表的对列表PROLOG

我的代码是:

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). 

,并返回我一个空列表。 有人可以帮助我吗? 谢谢。

+1

你能解释一下为什么你认为上面的代码应该工作? –

回答

2

你想在这里基本上使我们所获得的每子表的的映射。

因此,我们可以定义一个谓词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映射到地图B通过对每个元素统一由head谓词的两个数组中的元素; (b)我们可以肯定maplist/3正常工作,并且(c)我们可以预期maplist/3将被优化,使得处理快速完成。

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].