如何在prolog中附加给定列表中的列表总和?

时间:2016-05-12 21:27:28

标签: 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 个答案:

答案 0 :(得分:2)

你所拥有的是相当接近的,但有几个问题。

你的基本情况很好(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电话。只需X = [[Lname, Lvalues, Sum]|Out]即可。

现在您的递归调用如下所示:

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