我试图在给定列表中附加一个列表的总和,但是没有得到我需要的内容:
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]].
我在两个列表中展示了这个示例,但我也试图让它适用于任何数量的列表,包括一个,但我的输出变得更糟。
答案 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).