Если ваш предикат действительно должен иметь только 2 аргумента, один из которых является результатом, R, а другой - заданным списком, [H | T], вы можете сделать что-то вроде этого. Обратите внимание, что первый предикат вызывает второй «naturales» с 3 аргументами, а затем запускает рекурсивный процесс. C является только счетчиком, где вы можете добавить количество положительных элементов и затем скопировать это значение в результат в последней строке кода. Первая строка просто для того, чтобы убедиться, что пустой список возвращает 0 положительных элементов. Вероятно, есть лучшие способы сделать это, этот, вероятно, самый интуитивный.
naturales(X, []):- X = 0.
naturales(R, [H|T]):- naturales(R, [H|T], 0).
naturales(R, [H|T], C):- (H > 0, C1 is C + 1, naturales(R1, T, C1), R = R1) ; naturales(R1, T, C), R = R1.
naturales(X, [], X).