diff options
Diffstat (limited to 'src/smt/proof_post_processor.cpp')
-rw-r--r-- | src/smt/proof_post_processor.cpp | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/src/smt/proof_post_processor.cpp b/src/smt/proof_post_processor.cpp index dedb686c3..a27a5697e 100644 --- a/src/smt/proof_post_processor.cpp +++ b/src/smt/proof_post_processor.cpp @@ -33,12 +33,15 @@ namespace smt { ProofPostprocessCallback::ProofPostprocessCallback(ProofNodeManager* pnm, SmtEngine* smte, - ProofGenerator* pppg) - : d_pnm(pnm), d_smte(smte), d_pppg(pppg), d_wfpm(pnm) + ProofGenerator* pppg, + bool updateScopedAssumptions) + : d_pnm(pnm), + d_smte(smte), + d_pppg(pppg), + d_wfpm(pnm), + d_updateScopedAssumptions(updateScopedAssumptions) { d_true = NodeManager::currentNM()->mkConst(true); - // always check whether to update ASSUME - d_elimRules.insert(PfRule::ASSUME); } void ProofPostprocessCallback::initializeUpdate() @@ -53,9 +56,26 @@ void ProofPostprocessCallback::setEliminateRule(PfRule rule) } bool ProofPostprocessCallback::shouldUpdate(std::shared_ptr<ProofNode> pn, + const std::vector<Node>& fa, bool& continueUpdate) { - return d_elimRules.find(pn->getRule()) != d_elimRules.end(); + PfRule id = pn->getRule(); + if (d_elimRules.find(id) != d_elimRules.end()) + { + return true; + } + // other than elimination rules, we always update assumptions as long as + // d_updateScopedAssumptions is true or they are *not* in scope, i.e., not in + // fa + if (id != PfRule::ASSUME + || (!d_updateScopedAssumptions + && std::find(fa.begin(), fa.end(), pn->getResult()) != fa.end())) + { + Trace("smt-proof-pp-debug") + << "... not updating in-scope assumption " << pn->getResult() << "\n"; + return false; + } + return true; } bool ProofPostprocessCallback::update(Node res, @@ -1108,6 +1128,7 @@ void ProofPostprocessFinalCallback::initializeUpdate() } bool ProofPostprocessFinalCallback::shouldUpdate(std::shared_ptr<ProofNode> pn, + const std::vector<Node>& fa, bool& continueUpdate) { PfRule r = pn->getRule(); @@ -1146,9 +1167,10 @@ bool ProofPostprocessFinalCallback::wasPedanticFailure(std::ostream& out) const ProofPostproccess::ProofPostproccess(ProofNodeManager* pnm, SmtEngine* smte, - ProofGenerator* pppg) + ProofGenerator* pppg, + bool updateScopedAssumptions) : d_pnm(pnm), - d_cb(pnm, smte, pppg), + d_cb(pnm, smte, pppg, updateScopedAssumptions), // the update merges subproofs d_updater(d_pnm, d_cb, true), d_finalCb(pnm), |