Necesito contar todos X
, que some_predicate(X)
y realmente hay un montón de tales X
. ¿Cuál es la mejor manera de hacerlo?agregado/3 en swi-prolog
La primera pista es encontrarlo todo, acumularlo en una lista y devolverlo.
countAllStuff(X) :-
findall(Y
, permutation([1,2,3,4,5,6,7,8,9,10], Y)
, List
),
length(List, X).
(permutation/2
es único ejemplo que muestra que hay muchas variantes y es mala manera de recolectar todo)
Obviamente, he apilar-desbordamiento.
?- countAllStuff(X).
ERROR: Out of global stack
Than, estoy tratando de reemplazar a findall
setof
y nada cambia.
Por fin, he fundado los predicados aggregate
(clics) y trato de usarlo.
?- 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 ;
Todo está mal, creo. Prefiero obtener algo como
?- aggregate(count, permutation([1,2,3,4], X), Y).
Y = 24 .
1) ¿Qué estoy haciendo mal?
2) ¿Cómo puedo declarar el predicado para obtener la respuesta correcta?
Qué es x^permutación en ese caso? –
@ garm0nboz1a: 'X ^' significa "existe' X' ", por lo que toda la fórmula significa algo así como" contar el número de formas en que 'permutación ([1,2,3,4], X)' tiene éxito * para algunos * 'X' y llaman a ese número' N'." –