Fixes some assertion failures
authorClark Barrett <barrett@cs.nyu.edu>
Fri, 15 Jun 2012 19:05:56 +0000 (19:05 +0000)
committerClark Barrett <barrett@cs.nyu.edu>
Fri, 15 Jun 2012 19:05:56 +0000 (19:05 +0000)
src/smt/smt_engine.cpp
src/theory/bv/theory_bv_rewrite_rules_normalization.h
src/theory/theory_engine.cpp
src/theory/unconstrained_simplifier.cpp
test/regress/regress0/aufbv/Makefile.am
test/regress/regress0/aufbv/fuzz10.smt [new file with mode: 0644]

index 7492be4653fda41945936c80c5ac0491f14a905a..e86353eea7319f3d9ae0e2bb7f52e2b97063bb1e 100644 (file)
@@ -130,7 +130,7 @@ class SmtEnginePrivate {
   IteSkolemMap d_iteSkolemMap;
 
   /** The top level substitutions */
-  theory::SubstitutionMap d_topLevelSubstitutions;
+  SubstitutionMap d_topLevelSubstitutions;
 
   /**
    * The last substitution that the SAT layer was told about.
@@ -141,7 +141,7 @@ class SmtEnginePrivate {
    * that was pushed out to SAT.
    * If d_lastSubstitutionPos == d_topLevelSubstitutions.end(),
    * then nothing has been pushed out yet. */
-  context::CDO<theory::SubstitutionMap::iterator> d_lastSubstitutionPos;
+  context::CDO<SubstitutionMap::iterator> d_lastSubstitutionPos;
 
   static const bool d_doConstantProp = true;
 
@@ -299,7 +299,7 @@ SmtEngine::SmtEngine(ExprManager* em) throw(AssertionException) :
 #undef CVC4_FOR_EACH_THEORY_STATEMENT
 #endif
 #define CVC4_FOR_EACH_THEORY_STATEMENT(THEORY) \
-    d_theoryEngine->addTheory<theory::TheoryTraits<THEORY>::theory_class>(THEORY);
+    d_theoryEngine->addTheory<TheoryTraits<THEORY>::theory_class>(THEORY);
   CVC4_FOR_EACH_THEORY;
 
   // global push/pop around everything, to ensure proper destruction
@@ -458,57 +458,57 @@ void SmtEngine::setLogicInternal() throw(AssertionException) {
 
   // by default, symmetry breaker is on only for QF_UF
   if(! Options::current()->ufSymmetryBreakerSetByUser) {
-    bool qf_uf = d_logic.isPure(theory::THEORY_UF) && !d_logic.isQuantified();
+    bool qf_uf = d_logic.isPure(THEORY_UF) && !d_logic.isQuantified();
     Trace("smt") << "setting uf symmetry breaker to " << qf_uf << std::endl;
     NodeManager::currentNM()->getOptions()->ufSymmetryBreaker = qf_uf;
   }
   // by default, nonclausal simplification is off for QF_SAT and for quantifiers
   if(! Options::current()->simplificationModeSetByUser) {
-    bool qf_sat = d_logic.isPure(theory::THEORY_BOOL) && !d_logic.isQuantified();
+    bool qf_sat = d_logic.isPure(THEORY_BOOL) && !d_logic.isQuantified();
     bool quantifiers = d_logic.isQuantified();
     Trace("smt") << "setting simplification mode to <" << d_logic.getLogicString() << "> " << (!qf_sat && !quantifiers) << std::endl;
     NodeManager::currentNM()->getOptions()->simplificationMode = (qf_sat || quantifiers ? Options::SIMPLIFICATION_MODE_NONE : Options::SIMPLIFICATION_MODE_BATCH);
   }
 
   // If in arrays, set the UF handler to arrays
-  if(d_logic.isPure(theory::THEORY_ARRAY) && !d_logic.isQuantified()) {
-    theory::Theory::setUninterpretedSortOwner(theory::THEORY_ARRAY);
+  if(d_logic.isPure(THEORY_ARRAY) && !d_logic.isQuantified()) {
+    Theory::setUninterpretedSortOwner(THEORY_ARRAY);
   } else {
-    theory::Theory::setUninterpretedSortOwner(theory::THEORY_UF);
+    Theory::setUninterpretedSortOwner(THEORY_UF);
   }
   // Turn on ite simplification for QF_LIA and QF_AUFBV
   if(! Options::current()->doITESimpSetByUser) {
     bool iteSimp = !d_logic.isQuantified() &&
-      ((d_logic.isPure(theory::THEORY_ARITH) && d_logic.isLinear() && !d_logic.isDifferenceLogic() &&  !d_logic.areRealsUsed()) ||
-       (d_logic.isTheoryEnabled(theory::THEORY_ARRAY) && d_logic.isTheoryEnabled(theory::THEORY_UF) && d_logic.isTheoryEnabled(theory::THEORY_BV)));
+      ((d_logic.isPure(THEORY_ARITH) && d_logic.isLinear() && !d_logic.isDifferenceLogic() &&  !d_logic.areRealsUsed()) ||
+       (d_logic.isTheoryEnabled(THEORY_ARRAY) && d_logic.isTheoryEnabled(THEORY_UF) && d_logic.isTheoryEnabled(THEORY_BV)));
     Trace("smt") << "setting ite simplification to " << iteSimp << std::endl;
     NodeManager::currentNM()->getOptions()->doITESimp = iteSimp;
   }
   // Turn on multiple-pass non-clausal simplification for QF_AUFBV
   if(! Options::current()->repeatSimpSetByUser) {
     bool repeatSimp = !d_logic.isQuantified() &&
-      (d_logic.isTheoryEnabled(theory::THEORY_ARRAY) && d_logic.isTheoryEnabled(theory::THEORY_UF) && d_logic.isTheoryEnabled(theory::THEORY_BV));
+      (d_logic.isTheoryEnabled(THEORY_ARRAY) && d_logic.isTheoryEnabled(THEORY_UF) && d_logic.isTheoryEnabled(THEORY_BV));
     Trace("smt") << "setting repeat simplification to " << repeatSimp << std::endl;
     NodeManager::currentNM()->getOptions()->repeatSimp = repeatSimp;
   }
   // Turn on unconstrained simplification for QF_AUFBV
   if(! Options::current()->unconstrainedSimpSetByUser || Options::current()->incrementalSolving) {
-    //    bool qf_sat = d_logic.isPure(theory::THEORY_BOOL) && !d_logic.isQuantified();
+    //    bool qf_sat = d_logic.isPure(THEORY_BOOL) && !d_logic.isQuantified();
     //    bool uncSimp = false && !qf_sat && !Options::current()->incrementalSolving;
     bool uncSimp = !Options::current()->incrementalSolving && !d_logic.isQuantified() &&
-      (d_logic.isTheoryEnabled(theory::THEORY_ARRAY) && d_logic.isTheoryEnabled(theory::THEORY_BV));
+      (d_logic.isTheoryEnabled(THEORY_ARRAY) && d_logic.isTheoryEnabled(THEORY_BV));
     Trace("smt") << "setting unconstrained simplification to " << uncSimp << std::endl;
     NodeManager::currentNM()->getOptions()->unconstrainedSimp = uncSimp;
   }
   // Turn on arith rewrite equalities only for pure arithmetic
   if(! Options::current()->arithRewriteEqSetByUser) {
-    bool arithRewriteEq = d_logic.isPure(theory::THEORY_ARITH) && !d_logic.isQuantified();
+    bool arithRewriteEq = d_logic.isPure(THEORY_ARITH) && !d_logic.isQuantified();
     Trace("smt") << "setting arith rewrite equalities " << arithRewriteEq << std::endl;
     NodeManager::currentNM()->getOptions()->arithRewriteEq = arithRewriteEq;
   }
   if(!  Options::current()->arithHeuristicPivotsSetByUser){
     int16_t heuristicPivots = 5;
-    if(d_logic.isPure(theory::THEORY_ARITH) && !d_logic.isQuantified()){
+    if(d_logic.isPure(THEORY_ARITH) && !d_logic.isQuantified()){
       if(d_logic.isDifferenceLogic()){
         heuristicPivots = -1;
       }else if(!d_logic.areIntegersUsed()){
@@ -520,7 +520,7 @@ void SmtEngine::setLogicInternal() throw(AssertionException) {
   }
   if(! Options::current()->arithPivotThresholdSetByUser){
     uint16_t pivotThreshold = 2;
-    if(d_logic.isPure(theory::THEORY_ARITH) && !d_logic.isQuantified()){
+    if(d_logic.isPure(THEORY_ARITH) && !d_logic.isQuantified()){
       if(d_logic.isDifferenceLogic()){
         pivotThreshold = 16;
       }
@@ -530,7 +530,7 @@ void SmtEngine::setLogicInternal() throw(AssertionException) {
   }
   if(! Options::current()->arithStandardCheckVarOrderPivotsSetByUser){
     int16_t varOrderPivots = -1;
-    if(d_logic.isPure(theory::THEORY_ARITH) && !d_logic.isQuantified()){
+    if(d_logic.isPure(THEORY_ARITH) && !d_logic.isQuantified()){
       varOrderPivots = 200;
     }
     Trace("smt") << "setting arithStandardCheckVarOrderPivots  " << varOrderPivots << std::endl;
@@ -545,13 +545,13 @@ void SmtEngine::setLogicInternal() throw(AssertionException) {
     Options::DecisionMode decMode = 
       //QF_BV
       ( !d_logic.isQuantified() &&
-        d_logic.isPure(theory::THEORY_BV)
+        d_logic.isPure(THEORY_BV)
         ) ||
       //QF_AUFBV
       (!d_logic.isQuantified() &&
-       d_logic.isTheoryEnabled(theory::THEORY_ARRAY) &&
-       d_logic.isTheoryEnabled(theory::THEORY_UF) &&
-       d_logic.isTheoryEnabled(theory::THEORY_BV)
+       d_logic.isTheoryEnabled(THEORY_ARRAY) &&
+       d_logic.isTheoryEnabled(THEORY_UF) &&
+       d_logic.isTheoryEnabled(THEORY_BV)
        )
       ? Options::DECISION_STRATEGY_JUSTIFICATION
       : Options::DECISION_STRATEGY_INTERNAL;
@@ -872,7 +872,7 @@ void SmtEnginePrivate::removeITEs() {
   // Remove all of the ITE occurrences and normalize
   RemoveITE::run(d_assertionsToCheck, d_iteSkolemMap);
   for (unsigned i = 0; i < d_assertionsToCheck.size(); ++ i) {
-    d_assertionsToCheck[i] = theory::Rewriter::rewrite(d_assertionsToCheck[i]);
+    d_assertionsToCheck[i] = Rewriter::rewrite(d_assertionsToCheck[i]);
   }
   
 }
@@ -912,6 +912,7 @@ bool SmtEnginePrivate::nonClausalSimplify() {
   Trace("simplify") << "SmtEnginePrivate::nonClausalSimplify(): "
                     << "asserting to propagator" << endl;
   for (unsigned i = 0; i < d_assertionsToPreprocess.size(); ++ i) {
+    Assert(Rewriter::rewrite(d_assertionsToPreprocess[i]) == d_assertionsToPreprocess[i]);
     Trace("simplify") << "SmtEnginePrivate::nonClausalSimplify(): asserting " << d_assertionsToPreprocess[i] << endl;
     d_propagator.assert(d_assertionsToPreprocess[i]);
   }
@@ -929,14 +930,15 @@ bool SmtEnginePrivate::nonClausalSimplify() {
   }
 
   // No, conflict, go through the literals and solve them
-  theory::SubstitutionMap constantPropagations(d_smt.d_context);
+  SubstitutionMap constantPropagations(d_smt.d_context);
   unsigned j = 0;
   for(unsigned i = 0, i_end = d_nonClausalLearnedLiterals.size(); i < i_end; ++ i) {
     // Simplify the literal we learned wrt previous substitutions
     Node learnedLiteral = d_nonClausalLearnedLiterals[i];
+    Assert(Rewriter::rewrite(learnedLiteral) == learnedLiteral);
     Node learnedLiteralNew = d_topLevelSubstitutions.apply(learnedLiteral);
     if (learnedLiteral != learnedLiteralNew) {
-      learnedLiteral = theory::Rewriter::rewrite(learnedLiteralNew);
+      learnedLiteral = Rewriter::rewrite(learnedLiteralNew);
     }
     for (;;) {
       learnedLiteralNew = constantPropagations.apply(learnedLiteral);
@@ -944,7 +946,7 @@ bool SmtEnginePrivate::nonClausalSimplify() {
         break;
       }
       ++d_smt.d_numConstantProps;
-      learnedLiteral = theory::Rewriter::rewrite(learnedLiteralNew);
+      learnedLiteral = Rewriter::rewrite(learnedLiteralNew);
     }
     // It might just simplify to a constant
     if (learnedLiteral.isConst()) {
@@ -973,7 +975,7 @@ bool SmtEnginePrivate::nonClausalSimplify() {
         // The literal should rewrite to true
         Trace("simplify") << "SmtEnginePrivate::nonClausalSimplify(): "
                           << "solved " << learnedLiteral << endl;
-        Assert(theory::Rewriter::rewrite(d_topLevelSubstitutions.apply(learnedLiteral)).isConst());
+        Assert(Rewriter::rewrite(d_topLevelSubstitutions.apply(learnedLiteral)).isConst());
         //        vector<pair<Node, Node> > equations;
         //        constantPropagations.simplifyLHS(d_topLevelSubstitutions, equations, true);
         //        if (equations.empty()) {
@@ -1026,26 +1028,6 @@ bool SmtEnginePrivate::nonClausalSimplify() {
         break;
     }
 
-    if( Options::current()->incrementalSolving ||
-        Options::current()->simplificationMode == Options::SIMPLIFICATION_MODE_INCREMENTAL ) {
-      // Tell PropEngine about new substitutions
-      SubstitutionMap::iterator pos = d_lastSubstitutionPos;
-      if(pos == d_topLevelSubstitutions.end()) {
-        pos = d_topLevelSubstitutions.begin();
-      } else {
-        ++pos;
-      }
-
-      while(pos != d_topLevelSubstitutions.end()) {
-        // Push out this substitution
-        TNode lhs = (*pos).first, rhs = (*pos).second;
-        Node n = NodeManager::currentNM()->mkNode(lhs.getType().isBoolean() ? kind::IFF : kind::EQUAL, lhs, rhs);
-        d_assertionsToCheck.push_back(n);
-        Trace("simplify") << "SmtEnginePrivate::nonClausalSimplify(): will notify SAT layer of substitution: " << n << endl;
-        d_lastSubstitutionPos = pos;
-        ++pos;
-      }
-    }
 #ifdef CVC4_ASSERTIONS
     // Check data structure invariants:
     // 1. for each lhs of d_topLevelSubstitutions, does not appear anywhere in rhs of d_topLevelSubstitutions or anywhere in constantPropagations
@@ -1085,15 +1067,16 @@ bool SmtEnginePrivate::nonClausalSimplify() {
     Node assertion = d_assertionsToPreprocess[i];
     Node assertionNew = d_topLevelSubstitutions.apply(assertion);
     if (assertion != assertionNew) {
-      assertion = theory::Rewriter::rewrite(assertionNew);
+      assertion = Rewriter::rewrite(assertionNew);
     }
+    Assert(Rewriter::rewrite(assertion) == assertion);
     for (;;) {
       assertionNew = constantPropagations.apply(assertion);
       if (assertionNew == assertion) {
         break;
       }
       ++d_smt.d_numConstantProps;
-      assertion = theory::Rewriter::rewrite(assertionNew);
+      assertion = Rewriter::rewrite(assertionNew);
     }
     s.insert(assertion);
     d_assertionsToCheck.push_back(assertion);
@@ -1104,21 +1087,44 @@ bool SmtEnginePrivate::nonClausalSimplify() {
   d_assertionsToPreprocess.clear();
 
   NodeBuilder<> learnedBuilder(kind::AND);
+  Assert(d_realAssertionsEnd <= d_assertionsToCheck.size());
   learnedBuilder << d_assertionsToCheck[d_realAssertionsEnd-1];
 
+  if( Options::current()->incrementalSolving ||
+      Options::current()->simplificationMode == Options::SIMPLIFICATION_MODE_INCREMENTAL ) {
+    // Keep substitutions
+    SubstitutionMap::iterator pos = d_lastSubstitutionPos;
+    if(pos == d_topLevelSubstitutions.end()) {
+      pos = d_topLevelSubstitutions.begin();
+    } else {
+      ++pos;
+    }
+
+    while(pos != d_topLevelSubstitutions.end()) {
+      // Push out this substitution
+      TNode lhs = (*pos).first, rhs = (*pos).second;
+      Node n = NodeManager::currentNM()->mkNode(lhs.getType().isBoolean() ? kind::IFF : kind::EQUAL, lhs, rhs);
+      learnedBuilder << n;
+      Trace("simplify") << "SmtEnginePrivate::nonClausalSimplify(): will notify SAT layer of substitution: " << n << endl;
+      d_lastSubstitutionPos = pos;
+      ++pos;
+    }
+  }
+
   for (unsigned i = 0; i < d_nonClausalLearnedLiterals.size(); ++ i) {
     Node learned = d_nonClausalLearnedLiterals[i];
     Node learnedNew = d_topLevelSubstitutions.apply(learned);
     if (learned != learnedNew) {
-      learned = theory::Rewriter::rewrite(learnedNew);
+      learned = Rewriter::rewrite(learnedNew);
     }
+    Assert(Rewriter::rewrite(learned) == learned);
     for (;;) {
       learnedNew = constantPropagations.apply(learned);
       if (learnedNew == learned) {
         break;
       }
       ++d_smt.d_numConstantProps;
-      learned = theory::Rewriter::rewrite(learnedNew);
+      learned = Rewriter::rewrite(learnedNew);
     }
     if (s.find(learned) != s.end()) {
       continue;
@@ -1260,7 +1266,9 @@ bool SmtEnginePrivate::simplifyAssertions()
       // Call the theory preprocessors
       d_smt.d_theoryEngine->preprocessStart();
       for (unsigned i = 0; i < d_assertionsToCheck.size(); ++ i) {
+        Assert(Rewriter::rewrite(d_assertionsToCheck[i]) == d_assertionsToCheck[i]);
         d_assertionsToCheck[i] = d_smt.d_theoryEngine->preprocess(d_assertionsToCheck[i]);
+        Assert(Rewriter::rewrite(d_assertionsToCheck[i]) == d_assertionsToCheck[i]);
       }
     }
 
@@ -1406,7 +1414,7 @@ void SmtEnginePrivate::processAssertions() {
   for (unsigned i = 0; i < d_assertionsToPreprocess.size(); ++ i) {
     Trace("simplify") << "applying to " << d_assertionsToPreprocess[i] << endl;
     d_assertionsToPreprocess[i] =
-      theory::Rewriter::rewrite(d_topLevelSubstitutions.apply(d_assertionsToPreprocess[i]));
+      Rewriter::rewrite(d_topLevelSubstitutions.apply(d_assertionsToPreprocess[i]));
     Trace("simplify") << "  got " << d_assertionsToPreprocess[i] << endl;
   }
 
@@ -1510,7 +1518,7 @@ void SmtEnginePrivate::addFormula(TNode n)
   Trace("smt") << "SmtEnginePrivate::addFormula(" << n << ")" << endl;
 
   // Add the normalized formula to the queue
-  d_assertionsToPreprocess.push_back(theory::Rewriter::rewrite(n));
+  d_assertionsToPreprocess.push_back(Rewriter::rewrite(n));
 
   // If the mode of processing is incremental prepreocess and assert immediately
   if (Options::current()->simplificationMode == Options::SIMPLIFICATION_MODE_INCREMENTAL) {
@@ -1714,7 +1722,7 @@ Expr SmtEngine::getValue(const Expr& e)
   Node n = d_private->applySubstitutions(e.getNode());
 
   // Normalize for the theories
-  n = theory::Rewriter::rewrite(n);
+  n = Rewriter::rewrite(n);
 
   Trace("smt") << "--- getting value of " << n << endl;
   Node resultNode = d_theoryEngine->getValue(n);
@@ -1787,7 +1795,7 @@ SExpr SmtEngine::getAssignment() throw(ModalException, AssertionException) {
     Assert((*i).getType() == boolType);
 
     // Normalize
-    Node n = theory::Rewriter::rewrite(*i);
+    Node n = Rewriter::rewrite(*i);
 
     Trace("smt") << "--- getting value of " << n << endl;
     Node resultNode = d_theoryEngine->getValue(n);
index 896133e464d4e7f707601d910e146971cbdb01fc..13c049c854d4c61b5566b77f3f2a4a8343869e43 100644 (file)
@@ -615,8 +615,7 @@ Node RewriteRule<SolveEq>::apply(TNode node) {
 
 template<> inline
 bool RewriteRule<BitwiseEq>::applies(TNode node) {
-  if (node.getKind() != kind::EQUAL ||
-      utils::getSize(node[0]) != 1) {
+  if (node.getKind() != kind::EQUAL) {
     return false;
   }
   TNode term;
@@ -636,11 +635,15 @@ bool RewriteRule<BitwiseEq>::applies(TNode node) {
     case kind::BITVECTOR_AND:
     case kind::BITVECTOR_OR:
       //operator BITVECTOR_XOR 2: "bitwise xor"
-    case kind::BITVECTOR_NOT:
     case kind::BITVECTOR_NAND:
     case kind::BITVECTOR_NOR:
       //operator BITVECTOR_XNOR 2 "bitwise xnor"
     case kind::BITVECTOR_COMP:
+      if (utils::getSize(node[0]) != 1) {
+        return false;
+      }
+      break;
+    case kind::BITVECTOR_NOT:
     case kind::BITVECTOR_NEG:
       return true;
       break;
@@ -678,7 +681,7 @@ Node RewriteRule<BitwiseEq>::apply(TNode node) {
     term = node[0];
   }
 
-  bool eqOne = (c == BitVector(1,(unsigned)1));
+  bool eqOne = (c == BitVector(utils::getSize(node[0]),(unsigned)1));
 
   switch (term.getKind()) {
     case kind::BITVECTOR_AND:
@@ -724,7 +727,7 @@ Node RewriteRule<BitwiseEq>::apply(TNode node) {
         return term[0].eqNode(term[1]).notNode();
       }
     case kind::BITVECTOR_NEG:
-      return term[0].eqNode(utils::mkConst(c));
+      return term[0].eqNode(utils::mkConst(-c));
     default:
       break;
   }
index d85d8915bc6091c44a5b324eb31b916bcc75b019..30b9cd098cd1479340d55af5ab8df0b4e19b816b 100644 (file)
@@ -719,6 +719,7 @@ Node TheoryEngine::preprocess(TNode assertion) {
     // If this is an atom, we preprocess its terms with the theory ppRewriter
     if (Theory::theoryOf(current) != THEORY_BOOL) {
       d_ppCache[current] = ppTheoryRewrite(current);
+      Assert(Rewriter::rewrite(d_ppCache[current]) == d_ppCache[current]);
       continue;
     }
 
@@ -735,6 +736,9 @@ Node TheoryEngine::preprocess(TNode assertion) {
       }
       // Mark the substitution and continue
       Node result = builder;
+      if (result != current) {
+        result = Rewriter::rewrite(result);
+      }
       Debug("theory::internal") << "TheoryEngine::preprocess(" << assertion << "): setting " << current << " -> " << result << endl;
       d_ppCache[current] = result;
       toVisit.pop_back();
index 7e06297fb3578607e883c86e02c0987a1d4cb9bc..d925a336665a0363668dd662bb1a239e9384ba76 100644 (file)
@@ -694,7 +694,7 @@ void UnconstrainedSimplifier::processAssertions(vector<Node>& assertions)
     processUnconstrained();
     //    d_substitutions.print(Message.getStream());
     for (it = assertions.begin(); it != iend; ++it) {
-      (*it) = d_substitutions.apply(*it);
+      (*it) = Rewriter::rewrite(d_substitutions.apply(*it));
     }
   }
 
index 30a88f4a27ed143ca2336fc3e32d9f70ac4d0f63..8c663f9cedad1055b1e9b8a0d9d1a055a3299cd9 100644 (file)
@@ -34,7 +34,8 @@ TESTS =       \
        fuzz06.smt \
        fuzz07.smt \
        fuzz08.smt \
-       fuzz09.smt 
+       fuzz09.smt \
+       fuzz10.smt
 
 # failing
 #      fuzz01.smt \
diff --git a/test/regress/regress0/aufbv/fuzz10.smt b/test/regress/regress0/aufbv/fuzz10.smt
new file mode 100644 (file)
index 0000000..b838f80
--- /dev/null
@@ -0,0 +1,168 @@
+(benchmark fuzzsmt
+:logic QF_AUFBV
+:status unsat
+:extrafuns ((v0 BitVec[11]))
+:extrafuns ((v1 BitVec[8]))
+:extrafuns ((a2 Array[15:1]))
+:extrafuns ((a3 Array[6:8]))
+:extrafuns ((a4 Array[11:10]))
+:formula
+(let (?e5 bv8[4])
+(let (?e6 bv4728[14])
+(let (?e7 (bvsdiv (sign_extend[4] ?e5) v1))
+(let (?e8 (bvcomp (zero_extend[3] ?e7) v0))
+(let (?e9 (bvsrem ?e6 ?e6))
+(let (?e10 (store a3 (extract[12:7] ?e9) v1))
+(let (?e11 (store a4 (sign_extend[10] ?e8) (extract[9:0] ?e9)))
+(let (?e12 (select a2 (zero_extend[7] ?e7)))
+(let (?e13 (store ?e10 (extract[6:1] ?e7) v1))
+(let (?e14 (select ?e13 (zero_extend[2] ?e5)))
+(let (?e15 (bvudiv (sign_extend[13] ?e12) ?e9))
+(let (?e16 (bvsdiv (zero_extend[10] ?e12) v0))
+(let (?e17 (ite (bvsle ?e15 (zero_extend[13] ?e12)) bv1[1] bv0[1]))
+(let (?e18 (ite (bvuge (sign_extend[6] v1) ?e9) bv1[1] bv0[1]))
+(let (?e19 (ite (bvugt ?e16 (zero_extend[3] ?e14)) bv1[1] bv0[1]))
+(let (?e20 (bvneg ?e6))
+(let (?e21 (bvlshr (zero_extend[10] ?e5) ?e9))
+(let (?e22 (bvshl ?e20 (zero_extend[13] ?e12)))
+(let (?e23 (ite (= bv1[1] (extract[0:0] ?e12)) ?e21 ?e20))
+(let (?e24 (bvcomp ?e7 v1))
+(let (?e25 (bvsmod (zero_extend[3] ?e16) ?e15))
+(let (?e26 (bvsub ?e7 (sign_extend[7] ?e17)))
+(let (?e27 (bvnor (zero_extend[13] ?e8) ?e23))
+(flet ($e28 (bvsge (zero_extend[13] ?e18) ?e25))
+(flet ($e29 (bvugt ?e24 ?e17))
+(flet ($e30 (bvsle (sign_extend[13] ?e8) ?e21))
+(flet ($e31 (bvuge ?e20 (sign_extend[13] ?e19)))
+(flet ($e32 (bvugt (sign_extend[13] ?e8) ?e25))
+(flet ($e33 (distinct (sign_extend[13] ?e12) ?e27))
+(flet ($e34 (bvsgt (sign_extend[6] v1) ?e25))
+(flet ($e35 (bvult (zero_extend[7] ?e24) ?e7))
+(flet ($e36 (bvugt ?e20 ?e27))
+(flet ($e37 (= (zero_extend[7] ?e24) ?e26))
+(flet ($e38 (bvugt ?e25 (zero_extend[13] ?e24)))
+(flet ($e39 (bvsgt v0 (sign_extend[10] ?e18)))
+(flet ($e40 (bvult ?e8 ?e8))
+(flet ($e41 (bvsgt ?e27 ?e25))
+(flet ($e42 (bvslt ?e9 ?e6))
+(flet ($e43 (= ?e22 ?e23))
+(flet ($e44 (bvult (zero_extend[10] ?e19) v0))
+(flet ($e45 (bvsgt ?e24 ?e24))
+(flet ($e46 (bvsgt ?e26 (zero_extend[7] ?e24)))
+(flet ($e47 (bvule (sign_extend[13] ?e12) ?e9))
+(flet ($e48 (= ?e27 ?e21))
+(flet ($e49 (bvult ?e6 (sign_extend[3] v0)))
+(flet ($e50 (bvsle ?e23 (sign_extend[13] ?e17)))
+(flet ($e51 (bvugt ?e8 ?e12))
+(flet ($e52 (bvugt ?e22 (zero_extend[3] ?e16)))
+(flet ($e53 (bvsle ?e23 (sign_extend[6] ?e7)))
+(flet ($e54 (distinct (zero_extend[7] ?e12) ?e26))
+(flet ($e55 (bvult ?e23 (sign_extend[13] ?e19)))
+(flet ($e56 (= ?e27 ?e20))
+(flet ($e57 (bvule ?e15 (zero_extend[6] ?e7)))
+(flet ($e58 (bvsle (sign_extend[13] ?e18) ?e22))
+(flet ($e59 (bvuge ?e23 ?e25))
+(flet ($e60 (bvslt ?e20 (zero_extend[13] ?e17)))
+(flet ($e61 (bvsge (sign_extend[6] ?e14) ?e23))
+(flet ($e62 (bvugt ?e22 (sign_extend[13] ?e8)))
+(flet ($e63 (bvugt (zero_extend[7] ?e24) ?e26))
+(flet ($e64 (bvugt ?e9 (sign_extend[13] ?e18)))
+(flet ($e65 (bvsge ?e27 (zero_extend[6] v1)))
+(flet ($e66 (= (zero_extend[13] ?e18) ?e9))
+(flet ($e67 (bvsgt ?e15 (sign_extend[13] ?e8)))
+(flet ($e68 (distinct v0 (sign_extend[10] ?e17)))
+(flet ($e69 (bvugt ?e23 (sign_extend[3] v0)))
+(flet ($e70 (bvslt (zero_extend[3] ?e14) ?e16))
+(flet ($e71 (bvslt ?e27 (zero_extend[6] ?e7)))
+(flet ($e72 (bvsle ?e26 (zero_extend[7] ?e18)))
+(flet ($e73 (= ?e27 (zero_extend[3] ?e16)))
+(flet ($e74 (bvuge (zero_extend[3] v0) ?e15))
+(flet ($e75 (distinct (sign_extend[6] v1) ?e6))
+(flet ($e76 (bvsgt ?e17 ?e8))
+(flet ($e77 (bvsle ?e27 (zero_extend[6] ?e26)))
+(flet ($e78 (distinct ?e20 ?e9))
+(flet ($e79 (bvult (sign_extend[6] v1) ?e20))
+(flet ($e80 (bvule ?e17 ?e8))
+(flet ($e81 (bvult (sign_extend[13] ?e24) ?e20))
+(flet ($e82 (bvslt (zero_extend[6] v1) ?e25))
+(flet ($e83 (bvslt ?e19 ?e8))
+(flet ($e84 (bvsle ?e7 (sign_extend[7] ?e19)))
+(flet ($e85 (= ?e20 (sign_extend[6] ?e14)))
+(flet ($e86 (bvsge ?e16 (sign_extend[10] ?e24)))
+(flet ($e87 (bvsle ?e21 ?e15))
+(flet ($e88 (= ?e12 ?e12))
+(flet ($e89 (bvult (zero_extend[13] ?e19) ?e22))
+(flet ($e90 (= ?e5 ?e5))
+(flet ($e91 (iff $e68 $e86))
+(flet ($e92 (not $e49))
+(flet ($e93 (iff $e30 $e51))
+(flet ($e94 (not $e84))
+(flet ($e95 (not $e69))
+(flet ($e96 (if_then_else $e81 $e92 $e58))
+(flet ($e97 (or $e31 $e85))
+(flet ($e98 (and $e48 $e97))
+(flet ($e99 (implies $e70 $e70))
+(flet ($e100 (xor $e91 $e60))
+(flet ($e101 (or $e57 $e93))
+(flet ($e102 (xor $e63 $e76))
+(flet ($e103 (xor $e46 $e59))
+(flet ($e104 (not $e36))
+(flet ($e105 (or $e83 $e53))
+(flet ($e106 (or $e33 $e100))
+(flet ($e107 (if_then_else $e71 $e73 $e77))
+(flet ($e108 (xor $e47 $e45))
+(flet ($e109 (if_then_else $e90 $e64 $e74))
+(flet ($e110 (implies $e78 $e87))
+(flet ($e111 (iff $e28 $e80))
+(flet ($e112 (and $e101 $e103))
+(flet ($e113 (or $e102 $e40))
+(flet ($e114 (iff $e106 $e105))
+(flet ($e115 (if_then_else $e44 $e75 $e107))
+(flet ($e116 (not $e109))
+(flet ($e117 (if_then_else $e82 $e72 $e116))
+(flet ($e118 (xor $e65 $e108))
+(flet ($e119 (implies $e61 $e39))
+(flet ($e120 (not $e111))
+(flet ($e121 (if_then_else $e42 $e79 $e34))
+(flet ($e122 (iff $e96 $e41))
+(flet ($e123 (or $e99 $e55))
+(flet ($e124 (xor $e35 $e38))
+(flet ($e125 (iff $e110 $e50))
+(flet ($e126 (iff $e115 $e104))
+(flet ($e127 (or $e95 $e117))
+(flet ($e128 (or $e32 $e88))
+(flet ($e129 (if_then_else $e37 $e43 $e94))
+(flet ($e130 (and $e66 $e120))
+(flet ($e131 (implies $e118 $e119))
+(flet ($e132 (xor $e114 $e124))
+(flet ($e133 (if_then_else $e89 $e125 $e113))
+(flet ($e134 (implies $e126 $e122))
+(flet ($e135 (or $e130 $e127))
+(flet ($e136 (not $e98))
+(flet ($e137 (if_then_else $e135 $e132 $e136))
+(flet ($e138 (implies $e123 $e129))
+(flet ($e139 (or $e137 $e121))
+(flet ($e140 (and $e67 $e54))
+(flet ($e141 (not $e112))
+(flet ($e142 (and $e134 $e62))
+(flet ($e143 (if_then_else $e140 $e141 $e128))
+(flet ($e144 (iff $e138 $e131))
+(flet ($e145 (or $e143 $e133))
+(flet ($e146 (or $e139 $e142))
+(flet ($e147 (if_then_else $e145 $e146 $e144))
+(flet ($e148 (not $e52))
+(flet ($e149 (if_then_else $e147 $e29 $e148))
+(flet ($e150 (and $e149 $e149))
+(flet ($e151 (and $e56 $e150))
+(flet ($e152 (and $e151 (not (= ?e9 bv0[14]))))
+(flet ($e153 (and $e152 (not (= v0 bv0[11]))))
+(flet ($e154 (and $e153 (not (= v0 (bvnot bv0[11])))))
+(flet ($e155 (and $e154 (not (= v1 bv0[8]))))
+(flet ($e156 (and $e155 (not (= v1 (bvnot bv0[8])))))
+(flet ($e157 (and $e156 (not (= ?e15 bv0[14]))))
+(flet ($e158 (and $e157 (not (= ?e15 (bvnot bv0[14])))))
+(flet ($e159 (and $e158 (not (= ?e6 bv0[14]))))
+(flet ($e160 (and $e159 (not (= ?e6 (bvnot bv0[14])))))
+$e160
+)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+