Removing DioSolver::acceptableOriginalNodes(). This assertion was too strong, and...
authorTim King <taking@cs.nyu.edu>
Mon, 26 Nov 2012 17:30:44 +0000 (17:30 +0000)
committerTim King <taking@cs.nyu.edu>
Mon, 26 Nov 2012 17:30:44 +0000 (17:30 +0000)
src/theory/arith/dio_solver.cpp
src/theory/arith/dio_solver.h
test/regress/regress0/auflia/Makefile.am
test/regress/regress0/auflia/x2.smt [new file with mode: 0644]

index 46ca717bf6ccf627b12ce4ebaf4aa2e141975945..4d9d66cec97cec113426d71fd11aa9f6a4e89b52 100644 (file)
@@ -132,27 +132,11 @@ bool DioSolver::debugEqualityInInputEquations(Node eq){
   return false;
 }
 
-bool DioSolver::acceptableOriginalNodes(Node n){
-  Kind k = n.getKind();
-  if(k == kind::EQUAL){
-    return true;
-  }else if(k == kind::AND){
-    Node ub = n[0];
-    Node lb = n[1];
-    Kind kub = Comparison::comparisonKind(ub);
-    Kind klb = Comparison::comparisonKind(lb);
-    Debug("nf::tmp") << n << endl;
-    return (kub == kind::GEQ || kub==kind::LT) && (klb == kind::GEQ || klb == kind::LT);
-  }else{
-    return false;
-  }
-}
 
 void DioSolver::pushInputConstraint(const Comparison& eq, Node reason){
   Assert(!debugEqualityInInputEquations(reason));
   Assert(eq.debugIsIntegral());
   Assert(eq.getNode().getKind() == kind::EQUAL);
-  Assert(acceptableOriginalNodes(reason));
 
   SumPair sp = eq.toSumPair();
   uint32_t length = sp.maxLength();
@@ -209,7 +193,6 @@ Node DioSolver::proveIndex(TrailIndex i){
     Variable v = vl.getHead();
 
     Node input = proofVariableToReason(v);
-    Assert(acceptableOriginalNodes(input));
     if(input.getKind() == kind::AND){
       for(Node::iterator input_iter = input.begin(), input_end = input.end(); input_iter != input_end; ++input_iter){
        Node inputChild = *input_iter;
@@ -689,9 +672,10 @@ std::pair<DioSolver::SubIndex, DioSolver::TrailIndex> DioSolver::decomposeIndex(
 
   TrailIndex ci = d_trail.size();
   d_trail.push_back(Constraint(newSI, Polynomial::mkZero()));
+  // no longer reference av safely!
 
   Debug("arith::dio") << "Decompose ci(" << ci <<":" <<  d_trail[ci].d_eq.getNode()
-                      << ") for " << av.getNode() << endl;
+                      << ") for " << d_trail[i].d_minimalMonomial.getNode() << endl;
   Assert(d_trail[ci].d_eq.getPolynomial().getCoefficient(vl) == Constant::mkConstant(-1));
 
   SumPair newFact = r + fresh_a;
index 7d1faed86621b6bd04b25740e1973d49de801372..bfcd1902175940ad226af760473cadde46348409 100644 (file)
@@ -237,11 +237,6 @@ private:
    */
   size_t allocateVariableInPool();
 
-  /**
-   * Returns true if the node can be accepted as a reason according to the
-   * kinds.
-   */
-  bool acceptableOriginalNodes(Node n);
 
   /** Empties the unproccessed input constraints into the queue. */
   void enqueueInputConstraints();
index d12bb04418f12d59b4c2f6820f80368d7beabffa..cc4a1556ff797f609bc99fdf81f87e963f07a351 100644 (file)
@@ -21,7 +21,8 @@ TESTS =       \
        fuzz04.smt \
        fuzz05.smt \
        a17.smt \
-       error72.delta2.smt
+       error72.delta2.smt \
+       x2.smt
 
 EXTRA_DIST = $(TESTS)
 
diff --git a/test/regress/regress0/auflia/x2.smt b/test/regress/regress0/auflia/x2.smt
new file mode 100644 (file)
index 0000000..3566d98
--- /dev/null
@@ -0,0 +1,28 @@
+(benchmark fuzzsmt
+:logic QF_AUFLIA
+:extrafuns ((v4 Array))
+:extrafuns ((f0 Int Int))
+:extrapreds ((p0 Int Int Int))
+:status sat
+:formula
+(let (?n1 0)
+(flet ($n2 (p0 ?n1 ?n1 ?n1))
+(let (?n3 1)
+(let (?n4 (ite $n2 ?n3 ?n1))
+(flet ($n5 (< ?n1 ?n4))
+(flet ($n6 (p0 ?n3 ?n1 ?n1))
+(let (?n7 (ite $n6 ?n3 ?n1))
+(let (?n8 (ite $n5 ?n7 ?n3))
+(flet ($n9 (< ?n1 ?n8))
+(flet ($n10 true)
+(let (?n11 3)
+(let (?n12 (f0 ?n1))
+(let (?n13 (* ?n11 ?n12))
+(let (?n14 (select v4 ?n1))
+(flet ($n15 (> ?n13 ?n14))
+(flet ($n16 (xor $n10 $n15))
+(flet ($n17 false)
+(flet ($n18 (implies $n16 $n17))
+(flet ($n19 (and $n9 $n18))
+$n19
+))))))))))))))))))))