事实清单中所有实例的Prolog总和

时间:2013-03-27 23:31:23

标签: list prolog sum tail-recursion

我有一份事实清单。每个事实都定义了两个主题之间的关系以及他们完成的项目数量。它们的定义如下:

label(allGroups,[group(a,b,10),group(b,c,3),group(c,d,12)]).

我正在尝试编写一个函数,该函数将列出个人完成的所有项目。例如,'b'已完成总共13个项目,而c已完成总共15个项目。

这是我现在要做的功能。

individualSum([],_,0).
individualSum([group(Name,_,Projects)|Tail],Name,Sum) :-
    individualSum(Tail,Name,Tailsum),
    Sum is Projects + Tailsum.
individualSum([group(_,Name,Projects)|Tail],Name,Sum) :-
    individualSum(Tail,Name,Tailsum),
    Sum is Projects + Tailsum.

我一直变得虚假,无法弄清楚这是由于递归的基本原理不完整还是完全不同。这就是我正在运行的:

?- [groupSum].
?- label(allGroups,L),Groups=L).

(吐出所有组,然后:)

?- individualSum($Groups,b,Total).
false.

知道我哪里出错了吗?我感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您需要添加另一个子句来跳过群组,这两个主题都不是您正在寻找的主题:

individualSum([group(Name1,Name2,Projects)|Tail],Name,Sum):-
  Name \= Name1,
  Name \= Name2,
  individualSum(Tail,Name,Sum).

答案 1 :(得分:0)

古斯布罗已经发现了这个问题(+1)。由于您使用的是SWI-Prolog,因此可以使用内置aggregation

individualSum(L,Name,Sum) :-
    aggregate_all(sum(Projects),
       ( member(group(A,B,Projects), L), ( A = Name ; B = Name )), Sum).