質問
すべてを数える必要があります 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)正しい答えを得るために述語を宣言するにはどうすればよいですか?
正しい解決策はありません
所属していません StackOverflow