2014-11-24 66 views
-1

我有一个包含5个成员的数据库,其中包含一个收入属性。我想总结所有成员的收入。 为此,我想创建收入列表并添加它们。将元素添加到序言中的列表中

创造收入的名单,我已经写了追加谓语

append(Element, List, OutputList) 

这增加了元素的列表和outputlist返回。

现在我想把每个成员的收入放在一个列表中,并添加列表中的元素。 但我无法将所有元素放入列表中。你能帮我创建这两个谓词吗? 这是我写的代码。

member(a,2). 
member(b,1). 
member(c,2). 
member(d,3). 
member(e,1). 

append([],L,L). 
append(Elem,L,X):- append([],[Elem|L],X). 

% this add predicate is incorrect 
add(L,X) :- member(_,Income),append(Income,L,L),X is L. 

我想生成输出列表为[2,1,2,3,1],总结他们,并得到2 + 1 + 2 + 3 + 1 = 9

+0

你想你'add'做什么?并且要注意'member'和'append'的名字。这些可以是内建谓词的名称。 – 2014-11-24 17:34:39

回答

2

您需要收集查询的所有结果member(_, Income),然后对其进行总结。要收集所有匹配结果,您可以使用metapredicate bagofsetoffindall之一。 你的任务可以简单地实现:

member(a,2). 
member(b,1). 
member(c,2). 
member(d,3). 
member(e,1). 


sum([], 0). 
sum([H|T], S) :- 
    sum(T, S1), 
    S is S1 + H. 

,然后查询:

findall(Income, m(_, Income), Incomes), sum(Incomes, S). 

为您提供:

Incomes = [2, 1, 2, 3, 1], 
S = 9