{2**X==1}. gives false
kwon-young opened this issue · 4 comments
Hello,
Thank you for this wonderful library.
I think I found a bug with 0 exponents.
?- use_module(library(clpBNR)).
% *** clpBNR v0.9.12alpha ***.
true.
?- {2**N==1}.
false.
?- {2**0==D}.
D = 1.
Let me know if you need more information.
And if I do:
$ swipl
Welcome to SWI-Prolog (threaded, 64 bits, version 8.4.2)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. for legal details.
For online help and background, visit https://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).
?- debug(clpBNR).
Warning: clpBNR: no matching debug topic (yet)
true.
?- use_module(library(clpBNR)).
% *** clpBNR v0.9.12alpha ***.
true.
?- N::integer, {2**N==1}.
% Add {2**_10266{integer(-72057594037927936,72057594037927935)}==1}
[Thread 1]: failed to recover from global-overflow
C-stack trace labeled "out-of-stack":
[0] Sopen_string() at ??:? [0x7f93ffe94dd7]
[1] PL_get_long() at ??:? [0x7f93ffe63f59]
[2] PL_next_solution() at ??:? [0x7f93ffdb06da]
[3] PL_atom_generator_w() at ??:? [0x7f93ffd9e9d3]
[4] PL_check_data() at ??:? [0x7f93ffdeb221]
[5] PL_check_data() at ??:? [0x7f93ffdeb5cc]
[6] PL_toplevel() at ??:? [0x7f93ffe6e381]
[7] swipl(+0x10cd) [0x55a6fa4b60cd]
[8] __libc_start_call_main() at ??:? [0x7f93ffb64590]
[9] __libc_start_main_alias_2() at :? [0x7f93ffb64649]
[10] swipl(+0x1115) [0x55a6fa4b6115]
C-stack trace labeled "crash":
[0] Sopen_string() at ??:? [0x7f93ffe94dd7]
[1] PL_get_long() at ??:? [0x7f93ffe64767]
[2] PL_atom_generator_w() at ??:? [0x7f93ffd9e9d3]
[3] PL_check_data() at ??:? [0x7f93ffdeb221]
[4] PL_check_data() at ??:? [0x7f93ffdeb5cc]
[5] PL_toplevel() at ??:? [0x7f93ffe6e381]
[6] swipl(+0x10cd) [0x55a6fa4b60cd]
[7] __libc_start_call_main() at ??:? [0x7f93ffb64590]
[8] __libc_start_main_alias_2() at :? [0x7f93ffb64649]
[9] swipl(+0x1115) [0x55a6fa4b6115]
[FATAL ERROR: at Sat May 21 10:16:59 2022
Sorry, cannot continue]
[1] 458879 IOT instruction (core dumped) swipl
Sorry for the delay in responding. We've been without power for the last 5 days as the result of a bad storm.
Thanks for reporting this bug. The special cases with precise values are not currently handled well and need to be fixed. Imprecise values fair a little better:
?- {2**N==1.0}.
N::real(-1.6017132519074596e-16, 3.2034265038149186e-16).
?- N::integer(-10,10), {2**N==1.0}.
N = 0.
The crash occurs because N::integer
produces, by default, an interval with very large endpoint values:
?- N::integer.
N::integer(-72057594037927936, 72057594037927935).
When the GMP library tries to generate the result of 2**N
using these endpoints, the result is an integer so large it exceeds available memory and SWI-Prolog crashes. Currently this is expected behaviour of the GMP library supporting big integers and rationals. Note that if N is initially defined with a small range (as shown above), things work as expected.
I'll post a followup message here when I push the special case fix. Let me know if this is something you urgently need.
I'll post a followup message here when I push the special case fix. Let me know if this is something you urgently need.
Absolutely not :)
Thank you for your response, I now understand better what is happening and I'll make sure to specify the intervals on my variables.
I'll test the fix as soon as you push it
I decided to push a small update fixing this issue rather than bundling it with current development a work. See Version 0.9.13 alpha
.
Thanks again for reporting.
I've tested the change and now it is working as expected.
Thank you for your help !