Если вам нужно узнать, сколько X
удовлетворяет некоторым предикатам, вам не нужно знать их все. Использование findall/3
действительно избыточно в подобных задачах. Когда у вас 6 или 606, это X
- это, конечно, не так уж важно. Но когда у вас действительно большой и тяжелый генератор - вам не нужно хранить все значения в списке, а затем считать его длину.
Aggregate
хорошо решает эту проблему:
numberr(1).
numberr(3).
numberr(6).
numberr(8).
numberr(9).
numberr(12).
countNumbers( Numbers ) :-
aggregate( count, X^numberr( X ), Numbers ).
X^
означает «существует X», поэтому вся формула означает что-то вроде «посчитайте число X, которое numberr(X)
, и назовите это число Numbers
.
So
?- countNumbers(X).
X = 6.