SatSolver *d_satSolver;
/** Cache of what literal have been registered to a node. */
- __gnu_cxx::hash_map<Node, SatLiteral, NodeHashFcn> d_translationCache;
+ typedef __gnu_cxx::hash_map<Node, SatLiteral, NodeHashFcn> TranslationCache;
+ TranslationCache d_translationCache;
+
+ /** Cache of what nodes have been registered to a literal. */
+ typedef __gnu_cxx::hash_map<SatLiteral, Node, SatSolver::SatLiteralHashFcn> NodeCache;
+ NodeCache d_nodeCache;
protected:
* Acquires a new variable from the SAT solver to represent the node and
* inserts the necessary data it into the mapping tables.
* @param node a formula
+ * @param theoryLiteral is this literal a theory literal (i.e. theory to be
+ * informed when set to true/false
* @return the literal corresponding to the formula
*/
- SatLiteral newLiteral(const TNode& node);
+ SatLiteral newLiteral(const TNode& node, bool theoryLiteral = false);
public:
*/
virtual void convertAndAssert(const TNode& node) = 0;
+ /**
+ * Returns a node the is represented by a give SatLiteral literal.
+ * @param literal the literal from the sat solver
+ * @return the actual node
+ */
+ Node getNode(const SatLiteral& literal) {
+ Node node;
+ NodeCache::iterator find = d_nodeCache.find(literal);
+ if (find != d_nodeCache.end()) {
+ node = find->second;
+ }
+ return node;
+ }
+
}; /* class CnfStream */
/**
** SAT Solver.
**/
-#include "cvc4_private.h"
-#include "context/context.h"
-#include "theory/theory_engine.h"
-
#ifndef __CVC4__PROP__SAT_H
#define __CVC4__PROP__SAT_H
+#include "cvc4_private.h"
+
#define __CVC4_USE_MINISAT
#ifdef __CVC4_USE_MINISAT
namespace prop {
class PropEngine;
+class CnfStream;
/** Type of the SAT variables */
typedef minisat::Var SatVariable;
/** Type of the SAT clauses */
typedef minisat::vec<SatLiteral> SatClause;
+/**
+ * The proxy class that allows us to modify the internals of the SAT solver.
+ * It's only accessible from the PropEngine, and should be treated with major
+ * care.
+ */
+class SatSolver {
+
+ /** The prop engine we are using */
+ PropEngine* d_propEngine;
+
+ /** The CNF engine we are using */
+ CnfStream* d_cnfStream;
+
+ /** The theory engine we are using */
+ TheoryEngine* d_theoryEngine;
+
+ /** Context we will be using to synchronzie the sat solver */
+ context::Context* d_context;
+
+ /** Minisat solver */
+ minisat::SimpSolver* d_minisat;
+
+ /** Remember the options */
+ Options* d_options;
+
+public:
+
+ /** Hash function for literals */
+ struct SatLiteralHashFcn {
+ inline size_t operator()(const SatLiteral& literal) const;
+ };
+
+ inline SatSolver(PropEngine* propEngine, TheoryEngine* theoryEngine, context::Context* context,
+ const Options* options);
+
+ inline ~SatSolver();
+
+ inline bool solve();
+
+ inline void addClause(SatClause& clause);
+
+ inline SatVariable newVar(bool theoryAtom = false);
+
+ inline void theoryCheck(SatClause& conflict);
+
+ inline void enqueueTheoryLiteral(const SatLiteral& l);
+
+ inline void setCnfStream(CnfStream* cnfStream);
+};
+
+}/* CVC4::prop namespace */
+}/* CVC4 namespace */
+
+#include "context/context.h"
+#include "theory/theory_engine.h"
+#include "prop/prop_engine.h"
+#include "prop/cnf_stream.h"
+
+namespace CVC4 {
+namespace prop {
+
/**
* Returns the variable of the literal.
* @param lit the literal
return minisat::sign(lit);
}
-inline std::ostream& operator << (std::ostream& out, SatLiteral lit) {
+inline std::ostream& operator <<(std::ostream& out, SatLiteral lit) {
const char * s = (literalSign(lit)) ? "~" : " ";
out << s << literalToVariable(lit);
return out;
}
-inline std::ostream& operator << (std::ostream& out, const SatClause& clause) {
+inline std::ostream& operator <<(std::ostream& out, const SatClause& clause) {
out << "clause:";
for(int i = 0; i < clause.size(); ++i) {
out << " " << clause[i];
return out;
}
-/**
- * The proxy class that allows us to modify the internals of the SAT solver.
- * It's only accessible from the PropEngine, and should be treated with major
- * care.
- */
-class SatSolver {
+size_t SatSolver::SatLiteralHashFcn::operator()(const SatLiteral& literal) const {
+ return (size_t) minisat::toInt(literal);
+}
- /** The prop engine we are using */
- PropEngine* d_propEngine;
+SatSolver::SatSolver(PropEngine* propEngine, TheoryEngine* theoryEngine,
+ context::Context* context, const Options* options) :
+ d_propEngine(propEngine),
+ d_cnfStream(NULL),
+ d_theoryEngine(theoryEngine),
+ d_context(context)
+{
+ // Create the solver
+ d_minisat = new minisat::SimpSolver(this, d_context);
+ // Setup the verbosity
+ d_minisat->verbosity = (options->verbosity > 0) ? 1 : -1;
+ // Do not delete the satisfied clauses, just the learnt ones
+ d_minisat->remove_satisfied = false;
+ // Make minisat reuse the literal values
+ d_minisat->polarity_mode = minisat::SimpSolver::polarity_user;
+}
- /** The theory engine we are using */
- TheoryEngine* d_theoryEngine;
+SatSolver::~SatSolver() {
+ delete d_minisat;
+}
- /** Context we will be using to synchronzie the sat solver */
- context::Context* d_context;
+bool SatSolver::solve() {
+ return d_minisat->solve();
+}
- /** Minisat solver */
- minisat::SimpSolver* d_minisat;
+void SatSolver::addClause(SatClause& clause) {
+ d_minisat->addClause(clause);
+}
- /** Remember the options */
- Options* d_options;
+SatVariable SatSolver::newVar(bool theoryAtom) {
+ return d_minisat->newVar(true, true, theoryAtom);
+}
- public:
-
- SatSolver(PropEngine* propEngine, TheoryEngine* theoryEngine,
- context::Context* context, const Options* options)
- : d_propEngine(propEngine),
- d_theoryEngine(theoryEngine),
- d_context(context)
- {
- // Create the solver
- d_minisat = new minisat::SimpSolver(this, d_context);
- // Setup the verbosity
- d_minisat->verbosity = (options->verbosity > 0) ? 1 : -1;
- // Do not delete the satisfied clauses, just the learnt ones
- d_minisat->remove_satisfied = false;
- // Make minisat reuse the literal values
- d_minisat->polarity_mode = minisat::SimpSolver::polarity_user;
- }
-
- ~SatSolver() {
- delete d_minisat;
- }
-
- inline bool solve() {
- return d_minisat->solve();
- }
-
- inline void addClause(SatClause& clause) {
- d_minisat->addClause(clause);
- }
-
- inline SatVariable newVar() {
- return d_minisat->newVar();
- }
-
- inline void theoryCheck(SatClause& conflict) {
- }
-};
+void SatSolver::theoryCheck(SatClause& conflict) {
+ d_theoryEngine->check(theory::Theory::STANDARD);
+}
+void SatSolver::enqueueTheoryLiteral(const SatLiteral& l) {
+ Node literalNode = d_cnfStream->getNode(l);
+ // We can get null from the prop engine if the literal is useless (i.e.)
+ // the expression is not in context anyomore
+ if(!literalNode.isNull()) {
+ d_theoryEngine->assertFact(literalNode);
+ }
+}
+
+void SatSolver::setCnfStream(CnfStream* cnfStream) {
+ d_cnfStream = cnfStream;
+}
}/* CVC4::prop namespace */
#endif
-
#endif /* __CVC4__PROP__SAT_H */