2010-12-04 4 views

答えて

14

述語 IFFその引数が整数です。用語truncate(sqrt(9))は整数ないあるため、述語は  ないホールドを行い、従って、この 用語ため失敗します。

解決方法1:クイックと

あなたは、異なる数の表現の間の変換のための述語(is)/2を使用することができます壊れ

は、あなたが望む結果を得るには、少なくとも2つの方法があります。特に、算術 機能round,およびceilingをチェックしてください。例えば:

 
?- X is round(sqrt(9)). 
X = 3. 

しかし、浮動小数点数を使用して常に非常に問題であることに注意。例:

 
?- X is sqrt(2^10000). 
ERROR: is/2: Arithmetic: evaluation error: `float_overflow' 

また、丸め誤差やアンダーフローの可能性もあります。

解決方法2:クイック及び一般

により浮動小数点数の固有の欠点には、私は強くあなたがより一般的なメカニズムの代わりにを使用することを推奨します。たとえば、いくつかのPrologシステムでは、有理数のと無限の精度の整数がサポートされていますが、浮動小数点は常に機械精度に制限されています。

整数平方根が必要な場合は、たとえば有限ドメイン制約を使用します。より大きな整数の

 
?- X*X #= 9, X #>= 0. 
X = 3. 

この作品:

 
?- X*X #= 2^10000, X #>= 0. 
X = 1412467032...(1496 digits omitted) 

ためを参照してください制約と、それはが正四角 ルートを示し整数  Xためを保持しているものを述べることで十分詳しくは。