あなたがlibrary(ic)
を使用する場合の基本的な制約で使用された場合、その後、一般の変数は、デフォルトでは無限の境界を取得:
?- lib(ic).
Yes (0.13s cpu)
?- sum([X,Y,Z]) #= 0.
X = X{-1.0Inf .. 1.0Inf}
Y = Y{-1.0Inf .. 1.0Inf}
Z = Z{-1.0Inf .. 1.0Inf}
There is 1 delayed goal.
Yes (0.00s cpu)
しかし、におけるアルゴリズムは、世界的な制約の実装の一部は無限の境界を扱うことができません、したがって、あなたが言及デフォルトの境界を課す:
?- ic_global:ordered_sum([X,Y,Z], 0).
X = X{-10000000 .. 0}
Y = Y{-5000000 .. 5000000}
Z = Z{0 .. 10000000}
There are 5 delayed goals.
Yes (0.06s cpu)
これを回避するには、より大きな有限の境界を持つ変数を初期化することができます前に、グローバルな制約呼び出す:、数字は任意に大きくすることができます(そのCLP(FD)ライブラリを含む)等SWI-Prologのような他のシステムではまあ
?- [X,Y,Z] :: -1000000000000000..1000000000000000, ic_global:ordered_sum([X,Y,Z], 0).
X = X{-1000000000000000 .. 0}
Y = Y{-500000000000000 .. 500000000000000}
Z = Z{0 .. 1000000000000000}
There are 5 delayed goals.
Yes (0.00s cpu)
を – Fatalize
@Fatalize(...あなたはもちろんの十分なメモリを持っていると仮定) : 'X#> = 0'のような式は、' X 'の上のすべての数字を含みます。 – false