summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Noetzli <andres.noetzli@gmail.com>2019-10-28 08:59:44 -0700
committerAndrew Reynolds <andrew.j.reynolds@gmail.com>2019-10-28 10:59:44 -0500
commit885ec2cf131450f7f651b68a1cae3920665da31a (patch)
treead1ddb5be206baead992983b4e376d45cb37f292
parent3af2dfea22aae0d527fcfa93600c451b323c15b7 (diff)
Fix integer division rewrite (#3415)
-rw-r--r--src/theory/arith/arith_rewriter.cpp6
-rw-r--r--test/regress/CMakeLists.txt2
-rw-r--r--test/regress/regress0/arith/issue3412.smt24
-rw-r--r--test/regress/regress0/arith/issue3413.smt29
4 files changed, 19 insertions, 2 deletions
diff --git a/src/theory/arith/arith_rewriter.cpp b/src/theory/arith/arith_rewriter.cpp
index 6dd6ffd56..86e5b3195 100644
--- a/src/theory/arith/arith_rewriter.cpp
+++ b/src/theory/arith/arith_rewriter.cpp
@@ -742,8 +742,10 @@ RewriteResponse ArithRewriter::rewriteIntsDivModTotal(TNode t, bool pre){
// (mod x (- c)) ---> (mod x c)
NodeManager* nm = NodeManager::currentNM();
Node nn = nm->mkNode(k, t[0], nm->mkConst(-t[1].getConst<Rational>()));
- Node ret = k == kind::INTS_DIVISION ? nm->mkNode(kind::UMINUS, nn) : nn;
- return RewriteResponse(REWRITE_AGAIN, nn);
+ Node ret = (k == kind::INTS_DIVISION || k == kind::INTS_DIVISION_TOTAL)
+ ? nm->mkNode(kind::UMINUS, nn)
+ : nn;
+ return RewriteResponse(REWRITE_AGAIN, ret);
}else if(dIsConstant && n.getKind() == kind::CONST_RATIONAL){
Assert(d.getConst<Rational>().isIntegral());
Assert(n.getConst<Rational>().isIntegral());
diff --git a/test/regress/CMakeLists.txt b/test/regress/CMakeLists.txt
index 7c0ab47a0..c1264a122 100644
--- a/test/regress/CMakeLists.txt
+++ b/test/regress/CMakeLists.txt
@@ -26,6 +26,8 @@ set(regress_0_tests
regress0/arith/integers/arith-int-042.cvc
regress0/arith/integers/arith-int-042.min.cvc
regress0/arith/issue1399.smt2
+ regress0/arith/issue3412.smt2
+ regress0/arith/issue3413.smt2
regress0/arith/leq.01.smtv1.smt2
regress0/arith/miplib.cvc
regress0/arith/miplib2.cvc
diff --git a/test/regress/regress0/arith/issue3412.smt2 b/test/regress/regress0/arith/issue3412.smt2
new file mode 100644
index 000000000..798659048
--- /dev/null
+++ b/test/regress/regress0/arith/issue3412.smt2
@@ -0,0 +1,4 @@
+(set-logic QF_NIA)
+(assert (= (div 1 (- 1)) (- 1)))
+(set-info :status sat)
+(check-sat)
diff --git a/test/regress/regress0/arith/issue3413.smt2 b/test/regress/regress0/arith/issue3413.smt2
new file mode 100644
index 000000000..290850d1a
--- /dev/null
+++ b/test/regress/regress0/arith/issue3413.smt2
@@ -0,0 +1,9 @@
+(set-logic QF_NIA)
+(declare-fun a () Int)
+(declare-fun e () Int)
+(declare-fun f () Bool)
+(assert (= (div a e) (- 1)))
+(assert (= f (not (= e (- 1)))))
+(assert (ite f false (= (div a (- 1)) (- 1))))
+(set-info :status sat)
+(check-sat)
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback