Мне нужно посчитать все 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) Как я могу объявить предикат, чтобы получить правильный ответ?