Je dois compter tous X
, que some_predicate(X)
et il ya vraiment beaucoup de tels X
. Quelle est la meilleure façon de faire cela? Le premier indice est de tout trouver, de l'accumuler dans une liste et de lui restituer la longueur.agrégat/3 en swi-prolog
countAllStuff(X) :-
findall(Y
, permutation([1,2,3,4,5,6,7,8,9,10], Y)
, List
),
length(List, X).
(permutation/2
est exemple seulement montrant qu'il existe de nombreuses variantes et il est mauvaise façon de recueillir tous)
De toute évidence, je pile débordement.
?- countAllStuff(X).
ERROR: Out of global stack
Than, je suis en train de remplacer findall
à setof
et rien ne change.
Enfin, j'ai fondé aggregate
(cliquable) prédicats et en essayant de l'utiliser.
?- 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 ;
Tout est faux, je pense. Je préfère obtenir quelque chose comme
?- aggregate(count, permutation([1,2,3,4], X), Y).
Y = 24 .
1) Qu'est-ce que je fais mal?
2) Comment puis-je déclarer le prédicat pour obtenir la bonne réponse?
Qu'est-ce que X^permutation dans ce cas? –
@ garm0nboz1a: 'X ^' signifie "il existe' X' ", donc toute la formule signifie quelque chose comme" compter le nombre de façons dont 'permutation ([1,2,3,4], X)' réussit * pour quelques * X et appellent ce nombre 'N'." –