質問

すべてを数える必要があります 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

よりも、私は交換しようとしています findallsetof そして、何も変わりません。

ついに、私は設立しました 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)正しい答えを得るために述語を宣言するにはどうすればよいですか?

正しい解決策はありません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top