/*****************************************************************************/
/*!
*\file cnf_theorem_producer.cpp
*\brief Implementation of CNF_TheoremProducer
*
* Author: Clark Barrett
*
* Created: Thu Jan 5 05:49:24 2006
*
*
*
* License to use, copy, modify, sell and/or distribute this software
* and its documentation for any purpose is hereby granted without
* royalty, subject to the terms and conditions defined in the \ref
* LICENSE file provided with this distribution.
*
*
*
*/
/*****************************************************************************/
#include "cnf_manager.h"
#define _CVC3_TRUSTED_
#include "cnf_theorem_producer.h"
using namespace std;
using namespace CVC3;
using namespace SAT;
/////////////////////////////////////////////////////////////////////////////
// class CNF_Manager trusted methods
/////////////////////////////////////////////////////////////////////////////
CNF_Rules* CNF_Manager::createProofRules(TheoremManager* tm) {
return new CNF_TheoremProducer(tm);
}
/////////////////////////////////////////////////////////////////////////////
// Proof rules
/////////////////////////////////////////////////////////////////////////////
Theorem CNF_TheoremProducer::learnedClause(const Theorem& thm)
{
IF_DEBUG(if(debugger.trace("cnf proofs")) {
ostream& os = debugger.getOS();
os << "learnedClause {" << endl;
os << thm;
});
if(CHECK_PROOFS) {
CHECK_SOUND(withAssumptions(),
"learnedClause: called while running without assumptions");
}
vector assumptions;
thm.getLeafAssumptions(assumptions, true /*negate*/);
vector::iterator iend = assumptions.end();
for (vector::iterator i = assumptions.begin();
i != iend; ++i) {
DebugAssert(i->isAbsLiteral(), "Expected only literal assumptions");
}
if (!thm.getExpr().isFalse())
assumptions.push_back(thm.getExpr());
Proof pf;
if(withProof()) {
pf = newPf("learned_clause", thm.getProof());
}
// Use ExprManager in newExpr, since assumptions may be empty
DebugAssert(assumptions.size() > 0, "Expected at least one entry");
Theorem thm2;
if (assumptions.size() == 1) {
thm2 = newTheorem(assumptions[0], Assumptions::emptyAssump(), pf);
}
else {
thm2 = newTheorem(Expr(OR, assumptions), Assumptions::emptyAssump(), pf);
}
thm2.setQuantLevel(thm.getQuantLevel());
return thm2;
}
Theorem CNF_TheoremProducer::ifLiftRule(const Expr& e, int itePos) {
if(CHECK_PROOFS) {
CHECK_SOUND(e.getType().isBool(),
"CNF_TheoremProducer::ifLiftRule("
"input must be a Predicate: e = " + e.toString()+")");
CHECK_SOUND(itePos >= 0, "itePos negative"+int2string(itePos));
CHECK_SOUND(e.arity() > itePos && e[itePos].isITE(),
"CNF_TheoremProducer::ifLiftRule("
"input does not have an ITE: e = " + e.toString()+")");
}
const Expr& ite = e[itePos];
const Expr& cond = ite[0];
const Expr& t1 = ite[1];
const Expr& t2 = ite[2];
if(CHECK_PROOFS) {
CHECK_SOUND(cond.getType().isBool(),
"CNF_TheoremProducer::ifLiftRule("
"input does not have an ITE: e = " + e.toString()+")");
}
vector k1 = e.getKids();
Op op(e.getOp());
k1[itePos] = t1;
Expr pred1 = Expr(op, k1);
k1[itePos] = t2;
Expr pred2 = Expr(op, k1);
Expr resultITE = cond.iteExpr(pred1, pred2);
Proof pf;
if (withProof())
pf = newPf("if_lift_rule", e, d_em->newRatExpr(itePos));
return newRWTheorem(e, resultITE, Assumptions::emptyAssump(), pf);
}