Prolog 中的聚合

问题描述 投票:0回答:1

我尝试了解 swi-Prolog 中的聚合是如何工作的。

因此,我使用带有属性 Employee_Id、Projectnumber、Hours 的works_on 表。

在 Prolog 中,该表的事实看起来像works_on(1,2,3)。

现在我想知道每个项目花了多少小时。因此我进口了 使用以下命令聚合库:use_module(library(aggregate))。

现在我可以使用aggregate/3函数,但我不明白这个函数是如何工作的...... 我猜函数的第一个参数是变量,第二个参数是 查询绑定这些变量,第三个应该是其中的变量 结果已存储。

所以我对查询的猜测是聚合((X,sum(Y)),(works_on(_,X,Y),结果)。 但是这个查询抛出了一个错误,我不明白文档......

我希望有人能告诉我正确的查询并解释,aggregate/3 是如何工作的。

感谢您的帮助:)

prolog aggregation swi-prolog
1个回答
0
投票

我从来没有在网上看到过对

aggregate/3
的合理解释。我最好的猜测是,您用作第一个参数的谓词在某种程度上是特殊的。它们的行为不像正常的谓词或函数。

也就是说,这是一个解决您问题的示例:

work_on("roy", "drink_coffee", 3).
work_on("roy", "watch_video", 2).
work_on("max", "drink_coffee", 3).
work_on("max", "watch_video", 2).

bagof([Project,Total],
      aggregate(sum(Hour), Name^work_on(Name,Project,Hour), Total),
      Hours_Per_Project).

% [["drink_coffee", 6], ["watch_video", 4]].
© www.soinside.com 2019 - 2024. All rights reserved.