2016-05-12 44 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).