FP: Fix wrong model due to partial assignment (#2910)
authorAndres Noetzli <andres.noetzli@gmail.com>
Mon, 1 Apr 2019 22:07:05 +0000 (15:07 -0700)
committerGitHub <noreply@github.com>
Mon, 1 Apr 2019 22:07:05 +0000 (15:07 -0700)
commit8a9ffdbb248ddcc6a41f628f6dcbc070b57e6a28
treebf9e85f9950c2c52f7795bdebdfd0183f114060d
parent41355e412a142809f63a1939a4515486ccd4c6fb
FP: Fix wrong model due to partial assignment (#2910)

For a simple query `(not (= (fp.isSubnormal x) false))`, we were getting
a wrong model. The issue was that `(sign x)` was not assigned a value
and did not appear in the shared terms. In
`TheoryFp::collectModelInfo()`, however, we generate an expression that
connects the components of `x` to `x`, which contains `(sign x)`. As a
result, the normalization while building a model did not result in a
constant. This commit fixes the issue by marking `(sign x)` (and
`(significand x)`) as assignable. Assignable terms can take any value
while building a model if there is no existing value.
src/theory/fp/theory_fp.cpp
src/theory/theory_model_builder.cpp
test/regress/CMakeLists.txt
test/regress/regress0/fp/wrong-model.smt2 [new file with mode: 0644]