Я понял, что лучший способ - написать современный пролог с использованием предикатов высокого порядка:
pred(List, Count) :-
maplist([In,Out] >> (In>2 -> Out=1 ; Out=0), List, BinaryList),
foldl([In1,In2,Out] >> (Out is In1+In2), BinaryList, 0, Count).
, который работает, отображая каждый элемент в 1, если он больше 2, в противном случае в 0, а затем суммируя 1 и 0.
Некоторые тесты:
?- pred([1,0,0,1,3,2,3], Count).
Count = 2.
?- pred([0,1,1,2,3,4,5,6,6], Count).
Count = 5.
Бонус: это можно обобщить, чтобы подсчитать, сколько элементов удерживает предикат:
count(Pred, List, Count) :-
maplist([In,Out] >> (call(Pred,In) -> Out=1 ; Out=0), List, BinaryList),
foldl([In1,In2,Out] >> (Out is In1+In2), BinaryList, 0, Count).
чтобы мы могли передать (X>2)
в качестве аргумента:
?- count([X] >> (X>2), [1,0,0,1,3,2,3], Count).
Count = 2.
или что-то еще:
?- count([X] >> (X<2), [1,0,0,1,3,2,3], Count).
Count = 4.