7

プロローグで浮動小数点数を整数に変換するには?

私は試した:

?- integer(truncate(sqrt(9))).
false.

?- integer(round(sqrt(9))).
false.
4

2 に答える 2

16

引数が整数の場合、使用した述語integer/1はtrueです。項は整数ではないため、述語は成り立た したがってこの項では失敗します。truncate(sqrt(9))

必要なものを取得するには、少なくとも2つの方法があります。

解決策1:迅速で壊れている

(is)/2異なる数値表現間の変換に述語を使用できます。特に、算術関数、、 roundtruncateチェックしてくださいceiling。例えば:

?-Xはround(sqrt(9))です。
X=3。

ただし、浮動小数点数の使用は常に非常に問題があることに注意してください。例えば:

?-Xはsqrt(2 ^ 10000)です。
エラー:is / 2:算術:評価エラー: `float_overflow '

丸め誤差やアンダーフローの可能性など、他の問題もあります。

解決策2:迅速かつ一般

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

整数平方根が必要な場合は、たとえば有限ドメイン制約を使用します。制約がある場合、正の平方根を表す整数 に何が当てはまるかを述べるだけで十分です。X

?-X * X#= 9、X#>=0。
X=3。

これは、より大きな整数でも機能します。

?-X * X#= 2 ^ 10000、X#>=0。X
 =1412467032 ...(1496桁は省略)

詳細については、 を参照してください。

于 2010-12-04T16:49:51.587 に答える