2017-11-11 181 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].