1

我在 SWI Prolog 上创建了一个简单的数据库。我的任务是根据生产计划计算每个部门的工作时间。我快完成了,但我不知道如何总结我的结果。至于现在我得到这样的东西

部门金额

b 20

一个 5

c 50

c 30

我怎么能把它变成这个?

b 20

一个 5

c 80

我的代码https://gist.github.com/senioroman4uk/d19fe00848889a84434b

4

2 回答 2

1

由于格式错误,提供的代码不会解释count谓词。您应该将其重写为count:-而不是count():-. 据我所知,所有零元谓词都需要像这样定义。

其次,您的计数谓词不会将结果收集到您可以操作的列表中。以下是如何更改它以收集列表中的所有部门金额对findall

count_sum(DepAmounts):-
    findall((Department,Sum),
            (   productionPlan(FinishedProduct, Amount),
                resultOf(FinishedProduct, Operation),
                executedIn(Operation, Department, Time),
                Sum is Amount * Time
            ),
            DepAmounts
    ).

然后,在该列表中,您可以使用类似 SWI-Prolog 的东西aggregate

 ?- count_sum(L), aggregate(sum(A),L,member((D,A),L),X).

通过回溯,这将产生 D 中的部门和 X 中的金额总和:

D = a,
X = 15 ;
D = b,
X = 20 ;
D = c,
X = 80.

顺便说一句,如果我是你,为了简单起见,我会替换所有双引号字符串,用于部门名称和操作等。

于 2015-11-01T20:25:42.220 回答
0

你应该考虑库(聚合):例如,调用 data/2 有趣的数据库子集,你得到

?- aggregate(set(K-A),aggregate(sum(V),data(K,V),A),L).
L = [a-5, b-20, c-80]
于 2015-11-03T13:03:08.787 回答