diff options
author | Andrew Reynolds <andrew.j.reynolds@gmail.com> | 2020-10-06 09:31:16 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-06 09:31:16 -0500 |
commit | 6d663abe421c07976755c224180b1a1ee93442f6 (patch) | |
tree | dfcc35c47d786bc19f311b1097f7ed73b0116224 /src/expr | |
parent | f3c6bb510a87f390c51bf3cecc079cc9c9615ea4 (diff) |
(proof-new) Allow null proofs from generators in LazyCDProof (#5196)
In some cases, a proof generator provided to a LazyCDProof may provide a null proof, which causes a segfault on proof-new currently. This PR makes LazyCDProof robust to this case; nullptr is interpreted as the fact is an assumption.
Diffstat (limited to 'src/expr')
-rw-r--r-- | src/expr/lazy_proof.cpp | 27 | ||||
-rw-r--r-- | src/expr/proof_node_manager.cpp | 3 |
2 files changed, 22 insertions, 8 deletions
diff --git a/src/expr/lazy_proof.cpp b/src/expr/lazy_proof.cpp index d66a8984b..a96e30fde 100644 --- a/src/expr/lazy_proof.cpp +++ b/src/expr/lazy_proof.cpp @@ -83,16 +83,27 @@ std::shared_ptr<ProofNode> LazyCDProof::getProofFor(Node fact) // the current proof. Instead, it is only linked, and ignored on // future calls to getProofFor due to the check above. std::shared_ptr<ProofNode> pgc = pg->getProofFor(cfactGen); - if (isSym) + // If the proof was null, then the update is not performed. This is + // not considered an error, since this behavior is equivalent to + // if pg had provided the proof (ASSUME cfactGen). Ensuring the + // proper behavior wrt closed proofs should be done outside this + // method. + if (pgc != nullptr) { - d_manager->updateNode(cur, PfRule::SYMM, {pgc}, {}); - } - else - { - d_manager->updateNode(cur, pgc.get()); + Trace("lazy-cdproof-gen") + << "LazyCDProof: stored proof: " << *pgc.get() << std::endl; + + if (isSym) + { + d_manager->updateNode(cur, PfRule::SYMM, {pgc}, {}); + } + else + { + d_manager->updateNode(cur, pgc.get()); + } + Trace("lazy-cdproof") << "LazyCDProof: Successfully added fact for " + << cfactGen << std::endl; } - Trace("lazy-cdproof") << "LazyCDProof: Successfully added fact for " - << cfactGen << std::endl; } else { diff --git a/src/expr/proof_node_manager.cpp b/src/expr/proof_node_manager.cpp index 9f60a49e4..8ed9779d3 100644 --- a/src/expr/proof_node_manager.cpp +++ b/src/expr/proof_node_manager.cpp @@ -254,6 +254,8 @@ bool ProofNodeManager::updateNode( bool ProofNodeManager::updateNode(ProofNode* pn, ProofNode* pnr) { + Assert(pn != nullptr); + Assert(pnr != nullptr); if (pn->getResult() != pnr->getResult()) { return false; @@ -296,6 +298,7 @@ bool ProofNodeManager::updateNodeInternal( const std::vector<Node>& args, bool needsCheck) { + Assert(pn != nullptr); // ---------------- check for cyclic std::unordered_map<const ProofNode*, bool> visited; std::unordered_map<const ProofNode*, bool>::iterator it; |