From c8f7cff1911b1fb3136f41e67d92a3d66280add7 Mon Sep 17 00:00:00 2001 From: Clark Barrett Date: Fri, 15 Jun 2012 19:05:56 +0000 Subject: [PATCH] Fixes some assertion failures --- src/smt/smt_engine.cpp | 116 ++++++------ .../theory_bv_rewrite_rules_normalization.h | 13 +- src/theory/theory_engine.cpp | 4 + src/theory/unconstrained_simplifier.cpp | 2 +- test/regress/regress0/aufbv/Makefile.am | 3 +- test/regress/regress0/aufbv/fuzz10.smt | 168 ++++++++++++++++++ 6 files changed, 245 insertions(+), 61 deletions(-) create mode 100644 test/regress/regress0/aufbv/fuzz10.smt diff --git a/src/smt/smt_engine.cpp b/src/smt/smt_engine.cpp index 7492be465..e86353eea 100644 --- a/src/smt/smt_engine.cpp +++ b/src/smt/smt_engine.cpp @@ -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 d_lastSubstitutionPos; + context::CDO 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_class>(THEORY); + d_theoryEngine->addTheory::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 > 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); diff --git a/src/theory/bv/theory_bv_rewrite_rules_normalization.h b/src/theory/bv/theory_bv_rewrite_rules_normalization.h index 896133e46..13c049c85 100644 --- a/src/theory/bv/theory_bv_rewrite_rules_normalization.h +++ b/src/theory/bv/theory_bv_rewrite_rules_normalization.h @@ -615,8 +615,7 @@ Node RewriteRule::apply(TNode node) { template<> inline bool RewriteRule::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::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::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::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; } diff --git a/src/theory/theory_engine.cpp b/src/theory/theory_engine.cpp index d85d8915b..30b9cd098 100644 --- a/src/theory/theory_engine.cpp +++ b/src/theory/theory_engine.cpp @@ -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(); diff --git a/src/theory/unconstrained_simplifier.cpp b/src/theory/unconstrained_simplifier.cpp index 7e06297fb..d925a3366 100644 --- a/src/theory/unconstrained_simplifier.cpp +++ b/src/theory/unconstrained_simplifier.cpp @@ -694,7 +694,7 @@ void UnconstrainedSimplifier::processAssertions(vector& 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)); } } diff --git a/test/regress/regress0/aufbv/Makefile.am b/test/regress/regress0/aufbv/Makefile.am index 30a88f4a2..8c663f9ce 100644 --- a/test/regress/regress0/aufbv/Makefile.am +++ b/test/regress/regress0/aufbv/Makefile.am @@ -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 index 000000000..b838f80f0 --- /dev/null +++ b/test/regress/regress0/aufbv/fuzz10.smt @@ -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 +))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) + -- 2.30.2