2

所以,我对 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).
4

1 回答 1

3

我假设你想要结果,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-doc]

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

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

:- use_module(library(aggregate))

num_chem_lessons(N) :-
    aggregate(count, X^happening(X, chemistry), N).
于 2020-10-06T10:35:25.693 回答