Towards proper usage of TO_REAL (#8680)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Fri, 29 Apr 2022 19:35:04 +0000 (14:35 -0500)
committerGitHub <noreply@github.com>
Fri, 29 Apr 2022 19:35:04 +0000 (14:35 -0500)
commit06105f6ccf1cb73fd8e3335c855177c1fcdcd800
tree179c6ee5c059caa03eb97fc90294a52130fce68d
parentce63921d31b4b21d11867e75941fdd6fe06e830d
Towards proper usage of TO_REAL (#8680)

This is work towards making the rewriter preserve types, which is work towards eliminating subtyping.

This makes it so that the arithmetic rewriter does not simply drop TO_REAL from all terms, as this may change the type of the Node. Instead, TO_REAL is pulled upwards, and can be removed beneath arithmetic relations. TO_REAL is not eliminated if it occurs as a child of an operator not belonging to arithmetic. For example if x,y : Int:

(= (+ (to_real x) y) 0.0) ---> (= (to_real (+ x y)) 0.0) ---> (= (+ x y) 0.0) ; note this is the same rewritten form as before
(P (+ (to_real x) y)) ---> (P (to_real (+ x y))).

The one exception is that to_real applied to constants is simply dropped (for now), for example:

(to_real 5) ---> 5

where above, a Real term is rewritten to an Int term. (Fixing this will require further PRs that make integer constants of kind CONST_INTEGER and integral CONST_RATIONAL have Real type, thus we can have the above rewrite return 5 that is constant and has type Real).

Several quantifiers utilities are patched to preserve their behavior wrt handling TO_REAL.

Finally, a few fixes for subtypes are made to the regressions that we were not catching as errors before, and adds one regression.

The net effect of this PR is that the rewritten form of terms may have to_real applications that occur as direct children of symbols from other theories. Special care is required for preregistration, shared terms, and getting model values in the linear solver to strip off TO_REAL if necessary before using the (unmodified) interface to the linear solver.

FYI @barrettcw
17 files changed:
src/theory/arith/arith_rewriter.cpp
src/theory/arith/arith_rewriter.h
src/theory/arith/linear/theory_arith_private.cpp
src/theory/arith/rewriter/rewrite_atom.cpp
src/theory/arith/rewriter/rewrite_atom.h
src/theory/arith/rewrites.cpp
src/theory/arith/rewrites.h
src/theory/arith/theory_arith.cpp
src/theory/evaluator.cpp
src/theory/quantifiers/cegqi/ceg_arith_instantiator.cpp
src/theory/quantifiers/cegqi/ceg_instantiator.cpp
src/theory/quantifiers/fmf/full_model_check.cpp
test/regress/cli/CMakeLists.txt
test/regress/cli/regress0/arith/bug549.cvc.smt2
test/regress/cli/regress0/bug339.smt2
test/regress/cli/regress0/nl/dd.fuzz01.smtv1-to-real-idem.smt2 [new file with mode: 0644]
test/regress/cli/regress0/quantifiers/mix-match.smt2