X
私はすべてを数える必要がありsome_predicate(X)
、そのようなものは本当にたくさんありX
ます。それを行う最善の方法は何ですか?
最初の手がかりはfindall
、リストに蓄積し、リストの長さを返すことです。
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
述語の [ ][1] (クリック可能) ファミリを見つけて、 and を使用しようとしましaggregate/3
たaggregate/4
。
?- 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]: http://www.swi-prolog.org/pldoc/doc/home/vnc/prolog/lib/swipl/library/aggregate.pl