The ProofManager now allows theory solvers to get their lemmas that participate in...
authorGuy <katz911@gmail.com>
Fri, 15 Jul 2016 23:48:25 +0000 (16:48 -0700)
committerGuy <katz911@gmail.com>
Fri, 15 Jul 2016 23:48:25 +0000 (16:48 -0700)
Currently this is only limited to lemmas generated via the d_out->lemma() interface, i.e. no propagations
and conflict lemmas.

src/proof/lemma_proof.cpp
src/proof/lemma_proof.h
src/proof/proof_manager.cpp
src/proof/proof_manager.h
src/theory/theory_engine.cpp

index a12a516cf30ef4769967e5bb03143804d3d9190c..3a962f9878e5cd41ac36558bbd4a5d4ac80537f6 100644 (file)
@@ -65,6 +65,10 @@ void LemmaProofRecipe::dump(const char *tag) const {
     Debug(tag) << std::endl << "[Simple lemma]" << std::endl << std::endl;
   }
 
+  if (d_originalLemma != Node()) {
+    Debug(tag) << std::endl << "Original lemma: " << d_originalLemma << std::endl << std::endl;
+  }
+
   unsigned count = 1;
   Debug(tag) << "Base assertions:" << std::endl;
   for (std::set<Node>::iterator baseIt = d_baseAssertions.begin();
@@ -190,4 +194,13 @@ unsigned LemmaProofRecipe::getNumSteps() const {
   return d_proofSteps.size();
 }
 
+void LemmaProofRecipe::setOriginalLemma(Node lemma) {
+  d_originalLemma = lemma;
+}
+
+Node LemmaProofRecipe::getOriginalLemma() const {
+  return d_originalLemma;
+}
+
+
 } /* namespace CVC4 */
index e96ff53377ae681805363c84be566c15ad23f10c..9c838cee76f790f62e68ab58fcb2c2049941006e 100644 (file)
@@ -51,6 +51,10 @@ public:
   bool wasRewritten(Node assertion) const;
   Node getExplanation(Node assertion) const;
 
+  //* Original lemma */
+  void setOriginalLemma(Node lemma);
+  Node getOriginalLemma() const;
+
   //* Proof Steps */
   void addStep(ProofStep& proofStep);
   const ProofStep* getStep(unsigned index) const;
@@ -72,6 +76,9 @@ private:
 
   //* A map from assertions to their rewritten explanations (toAssert --> toExplain) */
   std::map<Node, Node> d_assertionToExplanation;
+
+  //* The original lemma, as asserted by the owner theory solver */
+  Node d_originalLemma;
 };
 
 } /* CVC4 namespace */
index d155630e516d48c2d6afec8e031303777baff06d..43328e1de05b9fdbedcb792e029e9ddcce451669 100644 (file)
@@ -69,6 +69,7 @@ ProofManager::~ProofManager() {
 }
 
 ProofManager* ProofManager::currentPM() {
+  Assert(PROOF_ON(), "Cannot call ProofManager when proofs are off");
   return smt::currentProofManager();
 }
 
@@ -292,6 +293,36 @@ void ProofManager::traceUnsatCore() {
   }
 }
 
+void ProofManager::getLemmasInUnsatCore(theory::TheoryId theory, std::vector<Node> &lemmas) {
+  d_satProof->constructProof();
+
+  IdToSatClause used_lemmas;
+  IdToSatClause used_inputs;
+  d_satProof->collectClausesUsed(used_inputs, used_lemmas);
+
+  IdToSatClause::const_iterator it;
+
+  for (it = used_lemmas.begin(); it != used_lemmas.end(); ++it) {
+    std::set<Node> lemma;
+    for(unsigned i = 0; i < it->second->size(); ++i) {
+      prop::SatLiteral lit = (*(it->second))[i];
+      Node node = getCnfProof()->getAtom(lit.getSatVariable());
+      Expr atom = node.toExpr();
+      if (atom.isConst()) {
+        Assert (atom == utils::mkTrue());
+        continue;
+      }
+      lemma.insert(lit.isNegated() ? node.notNode() : node);
+    }
+
+    LemmaProofRecipe recipe = getCnfProof()->getProofRecipe(lemma);
+
+    if (recipe.simpleLemma() && recipe.getTheory() == theory) {
+      lemmas.push_back(recipe.getOriginalLemma());
+    }
+  }
+}
+
 void ProofManager::addAssertion(Expr formula) {
   Debug("proof:pm") << "assert: " << formula << std::endl;
   d_inputFormulas.insert(formula);
index 14793f3809c4f9bd15d0869546a4c4deaefbf76c..954b65bbcd26f6d04d7f951e94dffd815707cf66 100644 (file)
@@ -246,6 +246,8 @@ public:
   assertions_iterator end_unsat_core() const { return d_outputCoreFormulas.end(); }
   size_t size_unsat_core() const { return d_outputCoreFormulas.size(); }
 
+  void getLemmasInUnsatCore(theory::TheoryId theory, std::vector<Node> &lemmas);
+
   int nextId() { return d_nextId++; }
 
   void setLogic(const LogicInfo& logic);
index 913a6800b327d4b158e24982d42c1dadd7f3928b..b4c6c97cda4ff2fe830ca108bfec3d94c330789b 100644 (file)
@@ -91,6 +91,8 @@ theory::LemmaStatus TheoryEngine::EngineOutputChannel::lemma(TNode lemma,
       Node emptyNode;
       LemmaProofRecipe::ProofStep proofStep(d_theory, emptyNode);
 
+      proofRecipe->setOriginalLemma(lemma);
+
       Node rewritten;
       if (lemma.getKind() == kind::OR) {
         for (unsigned i = 0; i < lemma.getNumChildren(); ++i) {
@@ -156,7 +158,7 @@ void TheoryEngine::EngineOutputChannel::conflict(TNode conflictNode, Proof* pf)
 void TheoryEngine::finishInit() {
   // initialize the quantifiers engine
   d_quantEngine = new QuantifiersEngine(d_context, d_userContext, this);
-  
+
   //initialize the model
   if( d_logicInfo.isQuantified() ) {
     d_curr_model = d_quantEngine->getModel();