summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>2020-10-06 09:31:16 -0500
committerGitHub <noreply@github.com>2020-10-06 09:31:16 -0500
commit6d663abe421c07976755c224180b1a1ee93442f6 (patch)
treedfcc35c47d786bc19f311b1097f7ed73b0116224 /src
parentf3c6bb510a87f390c51bf3cecc079cc9c9615ea4 (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')
-rw-r--r--src/expr/lazy_proof.cpp27
-rw-r--r--src/expr/proof_node_manager.cpp3
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;
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback