如何在 Prolog 代码本身中编写 'findall'?
How do I write 'findall' in a Prolog code itself?
所以,我是 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(<b>Bag</b>) :-
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
library [swi-doc] and use the aggregate/3
predicate [swi-doc]:
?- aggregate(count, X^happening(X, chemistry), Total).
Total = 3.
所以我们可以计算化学课的数量:
:- use_module(<b>library(aggregate)</b>)
num_chem_lessons(N) :-
<b>aggregate(count</b>, X^happening(X, chemistry), N<b>)</b>.
所以,我是 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(<b>Bag</b>) :-
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
library [swi-doc] and use the aggregate/3
predicate [swi-doc]:
?- aggregate(count, X^happening(X, chemistry), Total).
Total = 3.
所以我们可以计算化学课的数量:
:- use_module(<b>library(aggregate)</b>)
num_chem_lessons(N) :-
<b>aggregate(count</b>, X^happening(X, chemistry), N<b>)</b>.