2017-11-22 7 views
1

私はプロローグと一緒に作業しています。私は膨大な数値を扱う必要があります(プロローグは数字を扱うように設計されていません)。すでに有限の境界を持たない巨大数値のプロローグを扱います

任意の入力変数が10000000

への-10000000デフォルトの境界が与えられます:fd_global:ordered_sum\2が言うように、私は、Eclipse 6.1と述語に建てられたいくつかのドキュメントを使用しています10000000以上の値を扱うにはどうすればよいですか? (一般的に、ECLiPSeと必ずしも一致しません)。

+2

を – Fatalize

+1

@Fatalize(...あなたはもちろんの十分なメモリを持っていると仮定) : 'X#> = 0'のような式は、' X 'の上のすべての数字を含みます。 – false

答えて

2

あなたが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) 
+2

ニースと明確な説明。したがって、利用可能な場合は、 'fd_global'や' fd'ではなく 'ic_global'の述語を使用することをお勧めします。いくつかの大きな違いがありますか? – damianodamiano

+0

@damianodamiano:その答えがあなたに合っていれば、それをupvoteし、チェックマーク – false

+2

をチェックして受け入れます。はい、あなたはライブラリの '' ic''と '' ic_xxx''ファミリーを使うべきです。 '' fd''ファミリは古い実装です。 – jschimpf

関連する問題