, это довольно медленно, но позволяет избежать проблемы "вне стека":

ужно посчитать всеX, этоsome_predicate(X) и таких действительно многоX, Каков наилучший способ сделать это?

Первый ключ - найти все это, собрать в список и вернуть его длину.

countAllStuff( X ) :-
    findall( Y
           , permutation( [1,2,3,4,5,6,7,8,9,10], Y )
           , List
           ),
    length( List, X ).

(permutation/2 это всего лишь пример, показывающий, что вариантов много, и это плохой способ собрать все)

Очевидно, у меня переполнение стека.

?- countAllStuff( X ).
ERROR: Out of global stack

Чем пытаюсь заменитьfindall вsetof и ничего не меняется.

Наконец, я основалaggregate(кликабельно) предикаты и пытается использовать его.

?- aggregate(count, permutation([1,2,3,4], X), Y ).
X = [1, 2, 3, 4],
Y = 1 .

?- aggregate(count, [1,2,3,4], permutation([1,2,3,4], X), Y ).
X = [1, 2, 3, 4],
Y = 1 ;
X = [1, 2, 4, 3],
Y = 1 ;

Это все неправильно, я думаю. Я предпочитаю получить что-то вроде

?- aggregate(count, permutation([1,2,3,4], X), Y ).
Y = 24 .

1) Что я делаю не так?

2) Как я могу объявить предикат, чтобы получить правильный ответ?

Ответы на вопрос(3)

Ваш ответ на вопрос