Do not insist on bound values being constant in arithmetic instantiation (#3643)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Tue, 28 Jan 2020 21:19:41 +0000 (15:19 -0600)
committerGitHub <noreply@github.com>
Tue, 28 Jan 2020 21:19:41 +0000 (15:19 -0600)
src/theory/quantifiers/cegqi/ceg_arith_instantiator.cpp
test/regress/CMakeLists.txt
test/regress/regress1/sygus/issue3633.smt2 [new file with mode: 0644]
test/regress/regress1/sygus/issue3648.smt2 [new file with mode: 0644]

index 0a3775807c72a945a9ca50cf9e605159b7f717d5..2984c23be67be495e3651d4b10f2dc2174e91ff2 100644 (file)
@@ -236,9 +236,11 @@ bool ArithInstantiator::processAssertion(CegInstantiator* ci,
           // since the quantifier-free arithmetic solver may pass full
           // effort with no lemmas even when we are not guaranteed to have a
           // model. By convention, we use GEQ to compare the values here.
+          // It also may be the case that cmp is non-constant, in the case
+          // where lhs or rhs contains a transcendental function. We consider
+          // the bound to be an upper bound in this case.
           Node cmp = nm->mkNode(GEQ, lhs_value, rhs_value);
           cmp = Rewriter::rewrite(cmp);
-          Assert(cmp.isConst());
           is_upper = !cmp.isConst() || !cmp.getConst<bool>();
         }
       }
@@ -466,8 +468,9 @@ bool ArithInstantiator::processAssertions(CegInstantiator* ci,
               cmp_bound = Rewriter::rewrite(cmp_bound);
               // Should be comparing two constant values which should rewrite
               // to a constant. If a step failed, we assume that this is not
-              // the new best bound.
-              Assert(cmp_bound.isConst());
+              // the new best bound. We might not be comparing constant
+              // values (for instance if transcendental functions are
+              // involved), in which case we do update the best bound value.
               if (!cmp_bound.isConst() || !cmp_bound.getConst<bool>())
               {
                 new_best = false;
index 176eb0bf821e388c35744fdfa447e4e6a845173f..418670fa6b9590dc0eb92740ee2941f525746312 100644 (file)
@@ -1786,8 +1786,10 @@ set(regress_1_tests
   regress1/sygus/issue3514.smt2
   regress1/sygus/issue3507.smt2
   regress1/sygus/issue3580.sy
+  regress1/sygus/issue3633.smt2
   regress1/sygus/issue3634.smt2
   regress1/sygus/issue3635.smt2
+  regress1/sygus/issue3648.smt2
   regress1/sygus/issue3654.sy
   regress1/sygus/large-const-simp.sy
   regress1/sygus/let-bug-simp.sy
diff --git a/test/regress/regress1/sygus/issue3633.smt2 b/test/regress/regress1/sygus/issue3633.smt2
new file mode 100644 (file)
index 0000000..564a50c
--- /dev/null
@@ -0,0 +1,6 @@
+; EXPECT: sat
+; COMMAND-LINE: --sygus-inference
+(set-logic ALL)
+(declare-fun a () Real)
+(assert (distinct a (sin 2)))
+(check-sat)
diff --git a/test/regress/regress1/sygus/issue3648.smt2 b/test/regress/regress1/sygus/issue3648.smt2
new file mode 100644 (file)
index 0000000..e7b7547
--- /dev/null
@@ -0,0 +1,7 @@
+; EXPECT: sat
+; COMMAND-LINE: --sygus-inference --no-check-models
+(set-logic ALL)
+(declare-fun a () Real)
+(assert (> a 0.000001))
+(assert (< (- (sin 1) a) 0.000001))
+(check-sat)