如何在Prolog代码本身中编写'findall'?



所以,我是Prolog的新手,我必须写一个关于时间表的简短代码。如何将findall函数添加到代码本身?

happening(monday,chemistry).
happening(monday,english).
happening(tuesday,chemistry).
happening(wednesday,maths).
happening(friday,chemistry).
happening(friday,maths).

现在我想写一个命令,显示我一周内有多少次化学反应。

find_lessons(X) :-
findall(X,happening(X,chemistry), Bag).

我想你想要结果,所以Bag,所以你应该把find_lessons(X)重写为find_lessons(Bag):

find_lessons(Bag) :-
findall(X, happening(X,chemistry), Bag).

这将给出一个列表,列出有化学课的天数,因此:

?- find_lessons(Bag).
Bag = [monday, tuesday, friday].

要计算课程数量,可以使用length/2:

?- find_lessons(Bag), length(Bag, N).
Bag = [monday, tuesday, friday],
N = 3.

但我们可以更有效地做到这一点。现在,在构建列表和计算元素方面存在开销。我们可以使用aggregate库[swi-doc],并使用aggregate/3谓词[swi-dok]:

?- aggregate(count, X^happening(X, chemistry), Total).
Total = 3.

所以我们可以用计算化学课的数量

:- use_module(library(aggregate))
num_chem_lessons(N) :-
aggregate(count, X^happening(X, chemistry), N).

相关内容

  • 没有找到相关文章

最新更新