diff options
author | Alex Ozdemir <aozdemir@hmc.edu> | 2021-05-19 18:16:12 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-20 01:16:12 +0000 |
commit | 8bb85b0f1664f6d03bcbf3997533140204c29251 (patch) | |
tree | 4979d8adedcf00d55706b5b6967a7f5bf3cddcaa /src/smt/proof_post_processor.cpp | |
parent | 12770db5ef8a0a86dd264311955e105a78ae0b29 (diff) |
Expand arith's farkas lemma rule as a macro (#6577)
reflects that it is a macro, which we will eliminate
Diffstat (limited to 'src/smt/proof_post_processor.cpp')
-rw-r--r-- | src/smt/proof_post_processor.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/smt/proof_post_processor.cpp b/src/smt/proof_post_processor.cpp index 618cdebac..f98d1d727 100644 --- a/src/smt/proof_post_processor.cpp +++ b/src/smt/proof_post_processor.cpp @@ -1028,6 +1028,58 @@ Node ProofPostprocessCallback::expandMacros(PfRule id, // otherwise no update Trace("final-pf-hole") << "hole: " << id << " : " << eq << std::endl; } + else if (id == PfRule::MACRO_ARITH_SCALE_SUM_UB) + { + Debug("macro::arith") << "Expand MACRO_ARITH_SCALE_SUM_UB" << std::endl; + if (Debug.isOn("macro::arith")) + { + for (const auto& child : children) + { + Debug("macro::arith") << " child: " << child << std::endl; + } + Debug("macro::arith") << " args: " << args << std::endl; + } + Assert(args.size() == children.size()); + NodeManager* nm = NodeManager::currentNM(); + ProofStepBuffer steps{d_pnm->getChecker()}; + + // Scale all children, accumulating + std::vector<Node> scaledRels; + for (size_t i = 0; i < children.size(); ++i) + { + TNode child = children[i]; + TNode scalar = args[i]; + bool isPos = scalar.getConst<Rational>() > 0; + Node scalarCmp = + nm->mkNode(isPos ? GT : LT, scalar, nm->mkConst(Rational(0))); + // (= scalarCmp true) + Node scalarCmpOrTrue = steps.tryStep(PfRule::EVALUATE, {}, {scalarCmp}); + Assert(!scalarCmpOrTrue.isNull()); + // scalarCmp + steps.addStep(PfRule::TRUE_ELIM, {scalarCmpOrTrue}, {}, scalarCmp); + // (and scalarCmp relation) + Node scalarCmpAndRel = + steps.tryStep(PfRule::AND_INTRO, {scalarCmp, child}, {}); + Assert(!scalarCmpAndRel.isNull()); + // (=> (and scalarCmp relation) scaled) + Node impl = + steps.tryStep(isPos ? PfRule::ARITH_MULT_POS : PfRule::ARITH_MULT_NEG, + {}, + {scalar, child}); + Assert(!impl.isNull()); + // scaled + Node scaled = + steps.tryStep(PfRule::MODUS_PONENS, {scalarCmpAndRel, impl}, {}); + Assert(!scaled.isNull()); + scaledRels.emplace_back(scaled); + } + + Node sumBounds = steps.tryStep(PfRule::ARITH_SUM_UB, scaledRels, {}); + cdp->addSteps(steps); + Debug("macro::arith") << "Expansion done. Proved: " << sumBounds + << std::endl; + return sumBounds; + } // TRUST, PREPROCESS, THEORY_LEMMA, THEORY_PREPROCESS? |