Не уверен, что мне следовало размещать это на math.stackexchange вместо этого, но он включает больше программ, поэтому я разместил его здесь.
Вопрос кажется действительно простым, но я просидел здесь по крайней мере час, не разбираясь в этом. Я пробовал разные решения, читал математические формулы для него и т. Д., Но он не дает мне правильного ответа при его кодировании! Я сделал два разных решения, и оба они дали мне неправильный ответ. Первое решение дает мне 265334, а второе - 232169. Ответ - 233168, поэтому второе решение ближе.
Я должен упомянуть, что это вопрос из Project Euler, первый к будь точным.
Вот мой код. What is the best way to do that? First clue is to find it all, accumulate to a list and return it length. ...
I need to count all X
, that some_predicate(X)
and there really a lot of such 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(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) Как я могу объявить предикат, чтобы получить правильный ответ?