00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _cvc3__include__cnf_manager_h_
00022 #define _cvc3__include__cnf_manager_h_
00023
00024 #include "cnf.h"
00025 #include "expr.h"
00026 #include "expr_map.h"
00027 #include "cdmap.h"
00028 #include "statistics.h"
00029
00030 namespace CVC3 {
00031
00032 class CommonProofRules;
00033 class CNF_Rules;
00034 class ValidityChecker;
00035 class Statistics;
00036
00037 }
00038
00039 namespace SAT {
00040
00041 class CNF_Manager {
00042
00043
00044 CVC3::ValidityChecker* d_vc;
00045
00046
00047 bool d_minimizeClauses;
00048
00049
00050 CVC3::CommonProofRules* d_commonRules;
00051
00052
00053 CVC3::CNF_Rules* d_rules;
00054
00055
00056 struct Varinfo {
00057 CVC3::Expr expr;
00058 std::vector<Lit> fanins;
00059 std::vector<Var> fanouts;
00060 };
00061
00062
00063 std::vector<Varinfo> d_varInfo;
00064
00065
00066 CVC3::ExprHashMap<Var> d_cnfVars;
00067
00068
00069 CVC3::ExprHashMap<CVC3::Theorem> d_iteMap;
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 int d_clauseIdNext;
00082
00083
00084
00085
00086
00087 int d_bottomScope;
00088
00089
00090 std::deque<CVC3::Theorem> d_translateQueueThms;
00091
00092
00093 std::deque<Var> d_translateQueueVars;
00094
00095
00096 std::deque<bool> d_translateQueueFlags;
00097
00098
00099 CVC3::Statistics& d_statistics;
00100
00101
00102 const CVC3::CLFlags& d_flags;
00103
00104
00105 const CVC3::Expr& d_nullExpr;
00106
00107 public:
00108
00109 class CNFCallback {
00110 public:
00111 CNFCallback() {}
00112 virtual ~CNFCallback() {}
00113
00114 virtual void registerAtom(const CVC3::Expr& e,
00115 const CVC3::Theorem& thm) = 0;
00116 };
00117
00118 private:
00119
00120 CNFCallback* d_cnfCallback;
00121
00122 CVC3::CNF_Rules* createProofRules(CVC3::TheoremManager* tm, const CVC3::CLFlags&);
00123
00124
00125 void registerAtom(const CVC3::Expr& e, const CVC3::Theorem& thm);
00126
00127
00128 CVC3::Expr concreteExpr(const CVC3::Expr& e, const Lit& literal);
00129
00130
00131
00132
00133
00134 Lit translateExprRec(const CVC3::Expr& e, CNF_Formula& cnf,
00135 const CVC3::Theorem& thmIn);
00136
00137
00138
00139
00140
00141 CVC3::Theorem replaceITErec(const CVC3::Expr& e, Var v, bool translateOnly);
00142
00143
00144
00145
00146 Lit translateExpr(const CVC3::Theorem& thmIn, CNF_Formula& cnf);
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 public:
00158 CNF_Manager(CVC3::TheoremManager* tm, CVC3::Statistics& statistics,
00159 const CVC3::CLFlags& flags);
00160 ~CNF_Manager();
00161
00162
00163 void registerCNFCallback(CNFCallback* cnfCallback)
00164 { d_cnfCallback = cnfCallback; }
00165
00166
00167 void setBottomScope(int scope) { d_bottomScope = scope; }
00168
00169
00170 unsigned numVars() { return d_varInfo.size(); }
00171
00172
00173
00174
00175
00176
00177
00178 unsigned numFanins(Var c) {
00179 if (!c.isVar()) return 0;
00180 if (unsigned(c) >= d_varInfo.size()) return 0;
00181 return d_varInfo[c].fanins.size();
00182 }
00183
00184
00185 Lit getFanin(Var c, unsigned i) {
00186 DebugAssert(i < numFanins(c), "attempt to access unknown fanin");
00187 return d_varInfo[c].fanins[i];
00188 }
00189
00190
00191
00192
00193
00194 unsigned numFanouts(Var c) {
00195 if (!c.isVar()) return 0;
00196 if (unsigned(c) >= d_varInfo.size()) return 0;
00197 return d_varInfo[c].fanouts.size();
00198 }
00199
00200
00201 Lit getFanout(Var c, unsigned i) {
00202 DebugAssert(i < numFanouts(c), "attempt to access unknown fanin");
00203 return Lit(d_varInfo[c].fanouts[i]);
00204 }
00205
00206
00207
00208
00209 const CVC3::Expr& concreteVar(Var v) {
00210 if (v.isNull()) return d_nullExpr;
00211 if (unsigned(v) >= d_varInfo.size() ||
00212 (!d_varInfo[v].expr.isTranslated()))
00213 return d_nullExpr;
00214 return d_varInfo[v].expr;
00215 }
00216
00217
00218
00219
00220 CVC3::Expr concreteLit(Lit l, bool checkTranslated = true) {
00221 if (l.isNull()) return d_nullExpr;
00222 bool inverted = !l.isPositive();
00223 int index = l.getVar();
00224 if ((unsigned)index >= d_varInfo.size() ||
00225 (checkTranslated && !d_varInfo[index].expr.isTranslated()))
00226 return d_nullExpr;
00227 return inverted ? !d_varInfo[index].expr : d_varInfo[index].expr;
00228 }
00229
00230
00231
00232
00233 Lit getCNFLit(const CVC3::Expr& e) {
00234 if (e.isFalse()) return Lit::getFalse();
00235 if (e.isTrue()) return Lit::getTrue();
00236 if (e.isNot()) return !getCNFLit(e[0]);
00237 CVC3::ExprHashMap<Var>::iterator i = d_cnfVars.find(e);
00238 if (!e.isTranslated() || i == d_cnfVars.end()) return Lit();
00239 return Lit((*i).second);
00240 }
00241
00242 void cons(unsigned lb, unsigned ub, const CVC3::Expr& e2, std::vector<unsigned>& newLits);
00243
00244
00245
00246 void convertLemma(const CVC3::Theorem& thm, CNF_Formula& cnf);
00247
00248
00249
00250
00251 Lit addAssumption(const CVC3::Theorem& thm, CNF_Formula& cnf);
00252
00253
00254
00255
00256
00257
00258 Lit addLemma(CVC3::Theorem thm, CNF_Formula& cnf);
00259
00260 };
00261
00262 }
00263
00264 #endif