2016-05-12 68 views
0

我想追加定列表內的列表的總和,但沒有得到正是我需要這樣的:如何在prolog的給定列表中追加列表的總和?

list_sum([],[]). 
list_sum([[Lname|[Lvalues|_]]|List],X):- 
    sum(Lvalues,Sum), 
    app([Lname,Lvalues,Sum],[Out],X), 
    list_sum(List,Out). 

讓我輸入的是:

list_sum([[list1,[1,1]],[list2,[2,2]]],X). 

我的輸出:

X = [list1, [1, 1], 2, [list2, [2, 2], 4, []]]. 

但期待:

X = [[list1, [1, 1], 2], [list2, [2, 2], 4]]. 

我爲兩個列表展示了這個例子,但我也試圖讓它適用於任何數量的列表,包括一個,但是我的輸出變得更糟。

回答

1

你有什麼是相當接近,但有幾個問題。

您的基本情況良好(list_sum([], []).)。您的遞歸子句的頭奇怪的說:

list_sum([[Lname|[Lvalues|_]] | List], X) :- ... 

你的第一個參數列表的頭,[Lname | [Lvalues|_]]相當於[Lname, Lvalues | _]。既然你計劃一個兩個元素列表作爲每個元素,_將始終是[]。那麼它就相當於[Lname, Lvalues]。所以遞歸條款的頭變:

list_sum([[Lname, Lvalues] | List], X) :- ... 

下一條語句,sum(Lvalues,Sum)看起來不錯。下面追加不正確:

app([Lname,Lvalues,Sum],[Out],X) 

你的目的是使[Lname, Lvalues, Sum]是一個新的列表頭,用Out的尾巴。看起來像,[[Lname, Lvalues, Sum]|Out]。但上面的追加會給你,​​[Lname, Lvalues, Sum | Out]這是不一樣的事情。你不需要撥打app。簡單來說,​​會做。

現在你的遞歸調用看起來是這樣的:

list_sum([[Lname, Lvalues] | List], X) :- 
    sum(Lvalues, Sum), 
    X = [[Lname, Lvalues, Sum]|Out], 
    list_sum(List, Out). 

哪個應產生的結果你之後。您可以通過在條款的開頭直接包含X的統一來簡化這一點:

list_sum([[Lname, Lvalues] | List], [[Lname, Lvalues, Sum]|Out]) :- 
    sum(Lvalues, Sum), 
    list_sum(List, Out).