можно ли усечь (7 ^ sqrt (8) -8 ^ sqrt (7)) через CLP (FD)? - PullRequest
1 голос
/ 13 февраля 2020

CLP (FD) - отличный инструмент Prolog . Он расширяет большое количество прологов до ограничений и маркировки. Но универсально ли это? Можем ли мы, например, определить это целочисленное значение:

 truncate(7^sqrt(8)-8^sqrt(7)) = ?

Как будет выглядеть решение Prolog CLP (FD)? Или есть другие рекомендуемые способы определения ответа, такие как CLP (?) Или что-то еще?

1 Ответ

0 голосов
/ 14 февраля 2020

Используя арифметику с плавающей точкой c, мы не можем быть на 100% уверены, каков будет результат усечения. Посредством числа с плавающей точкой мы получаем приближение x ~, которое может отличаться от истинного x:

SWI-Prolog (threaded, 64 bits, version 8.1.21)

?- X is 7, Y is 8, Z is X**sqrt(Y)-Y^sqrt(X).
X = 7,
Y = 8,
Z = 0.5348772168447056.

Используя арифметический интервал c, мы можем получить больше уверенности. Если арифметический результат интервала c указывает на интервал [x1, x2], то мы точно знаем, что истинный x находится внутри этого интервала:

ECLiPSe Version 7.0 #52 (x86_64_nt)

?- X is breal(7), Y is breal(8), Z is X^sqrt(Y)-Y^sqrt(X).
X = 7.0__7.0
Y = 8.0__8.0
Z = 0.534877216844194__0.53487721684518874

Поскольку интервал полностью находится внутри [0,1 ) усечение будет равно нулю.

...