00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "expr_value.h"
00022 #include "notifylist.h"
00023
00024 using namespace std;
00025
00026 namespace CVC3 {
00027
00028
00029
00030
00031
00032 std::hash<char*> ExprValue::s_charHash;
00033 std::hash<long int> ExprValue::s_intHash;
00034
00035
00036
00037
00038
00039
00040
00041 ExprValue::~ExprValue() {
00042
00043
00044 if (d_find) {
00045 CDO<Theorem>* find = d_find;
00046 d_find = NULL;
00047 delete find;
00048 free(find);
00049 }
00050 if (d_eqNext) {
00051 CDO<Theorem>* eqNext = d_eqNext;
00052 d_eqNext = NULL;
00053 delete eqNext;
00054 free(eqNext);
00055 }
00056 if(d_notifyList != NULL) {
00057 NotifyList* nl = d_notifyList;
00058 d_notifyList = NULL;
00059 delete nl;
00060 }
00061
00062 d_type = Type();
00063 d_simpCache=Theorem();
00064
00065 }
00066
00067
00068 bool ExprValue::operator==(const ExprValue& ev2) const {
00069 DebugAssert(getMMIndex() == EXPR_VALUE,
00070 "ExprValue::operator==() called from a subclass");
00071 if(getMMIndex() != ev2.getMMIndex())
00072 return false;
00073
00074 return (d_kind == ev2.d_kind);
00075 }
00076
00077
00078 ExprValue* ExprValue::copy(ExprManager* em, ExprIndex idx) const {
00079 DebugAssert(getMMIndex() == EXPR_VALUE,
00080 "ExprValue::copy() called from a subclass");
00081 return new(em->getMM(EXPR_VALUE)) ExprValue(em, d_kind, idx);
00082 }
00083
00084
00085 bool ExprNodeTmp::operator==(const ExprValue& ev2) const {
00086 return getMMIndex() == ev2.getMMIndex() &&
00087 d_kind == ev2.getKind() &&
00088 getKids() == ev2.getKids();
00089 }
00090
00091 ExprValue* ExprNodeTmp::copy(ExprManager* em, ExprIndex idx) const {
00092 if (d_em != em) {
00093 vector<Expr> children;
00094 vector<Expr>::const_iterator
00095 i = d_children.begin(), iend = d_children.end();
00096 for (; i != iend; ++i)
00097 children.push_back(rebuild(*i, em));
00098 return new(em->getMM(getMMIndex())) ExprNode(em, d_kind, children, idx);
00099 }
00100 return new(em->getMM(getMMIndex())) ExprNode(em, d_kind, d_children, idx);
00101 }
00102
00103
00104 ExprNode::~ExprNode()
00105 {
00106
00107
00108 if (d_sig) {
00109 CDO<Theorem>* sig = d_sig;
00110 d_sig = NULL;
00111 delete sig;
00112 free(sig);
00113 }
00114 if (d_rep) {
00115 CDO<Theorem>* rep = d_rep;
00116 d_rep = NULL;
00117 delete rep;
00118 free(rep);
00119 }
00120 }
00121
00122
00123 bool ExprNode::operator==(const ExprValue& ev2) const {
00124 if(getMMIndex() != ev2.getMMIndex())
00125 return false;
00126
00127 return (d_kind == ev2.getKind())
00128 && (getKids() == ev2.getKids());
00129 }
00130
00131 ExprValue* ExprNode::copy(ExprManager* em, ExprIndex idx) const {
00132 if (d_em != em) {
00133 vector<Expr> children;
00134 vector<Expr>::const_iterator
00135 i = d_children.begin(), iend = d_children.end();
00136 for (; i != iend; ++i)
00137 children.push_back(rebuild(*i, em));
00138 return new(em->getMM(getMMIndex())) ExprNode(em, d_kind, children, idx);
00139 }
00140 return new(em->getMM(getMMIndex())) ExprNode(em, d_kind, d_children, idx);
00141 }
00142
00143
00144 bool ExprString::operator==(const ExprValue& ev2) const {
00145 if(getMMIndex() != ev2.getMMIndex())
00146 return false;
00147
00148 return (getString() == ev2.getString());
00149 }
00150
00151 ExprValue* ExprString::copy(ExprManager* em, ExprIndex idx) const {
00152 return new(em->getMM(getMMIndex())) ExprString(em, d_str, idx);
00153 }
00154
00155
00156 bool ExprSkolem::operator==(const ExprValue& ev2) const {
00157 if(getMMIndex() != ev2.getMMIndex())
00158 return false;
00159
00160 return (getBoundIndex() == ev2.getBoundIndex()
00161 && getExistential() == ev2.getExistential());
00162 }
00163
00164 ExprValue* ExprSkolem::copy(ExprManager* em, ExprIndex idx) const {
00165 if (d_em != em) {
00166 return new(em->getMM(getMMIndex()))
00167 ExprSkolem(em, getBoundIndex(), rebuild(getExistential(), em), idx);
00168 }
00169 return new(em->getMM(getMMIndex()))
00170 ExprSkolem(em, getBoundIndex(), getExistential(), idx);
00171 }
00172
00173
00174 bool ExprRational::operator==(const ExprValue& ev2) const {
00175 if(getMMIndex() != ev2.getMMIndex())
00176 return false;
00177
00178 return (getRational() == ev2.getRational());
00179 }
00180
00181 ExprValue* ExprRational::copy(ExprManager* em, ExprIndex idx) const {
00182 return new(em->getMM(getMMIndex())) ExprRational(em, d_r, idx);
00183 }
00184
00185
00186 bool ExprVar::operator==(const ExprValue& ev2) const {
00187 if(getMMIndex() != ev2.getMMIndex())
00188 return false;
00189
00190 return (getKind() == ev2.getKind() && getName() == ev2.getName());
00191 }
00192
00193 ExprValue* ExprVar::copy(ExprManager* em, ExprIndex idx) const {
00194 return new(em->getMM(getMMIndex())) ExprVar(em, d_name, idx);
00195 }
00196
00197
00198 bool ExprSymbol::operator==(const ExprValue& ev2) const {
00199 if(getMMIndex() != ev2.getMMIndex())
00200 return false;
00201
00202 return (getKind() == ev2.getKind() && getName() == ev2.getName());
00203 }
00204
00205 ExprValue* ExprSymbol::copy(ExprManager* em, ExprIndex idx) const {
00206 return new(em->getMM(getMMIndex())) ExprSymbol(em, d_kind, d_name, idx);
00207 }
00208
00209
00210 bool ExprBoundVar::operator==(const ExprValue& ev2) const {
00211 if(getMMIndex() != ev2.getMMIndex())
00212 return false;
00213
00214 return (getKind() == ev2.getKind() && getName() == ev2.getName()
00215 && getUid() == ev2.getUid());
00216 }
00217
00218 ExprValue* ExprBoundVar::copy(ExprManager* em, ExprIndex idx) const {
00219 return new(em->getMM(getMMIndex())) ExprBoundVar(em, d_name, d_uid, idx);
00220 }
00221
00222
00223 bool ExprApply::operator==(const ExprValue& ev2) const {
00224 if(getMMIndex() != ev2.getMMIndex())
00225 return false;
00226
00227 return (getOp() == ev2.getOp())
00228 && (getKids() == ev2.getKids());
00229 }
00230
00231 ExprValue* ExprApply::copy(ExprManager* em, ExprIndex idx) const {
00232 if (d_em != em) {
00233 vector<Expr> children;
00234 vector<Expr>::const_iterator
00235 i = d_children.begin(), iend = d_children.end();
00236 for (; i != iend; ++i)
00237 children.push_back(rebuild(*i, em));
00238 return new(em->getMM(getMMIndex()))
00239 ExprApply(em, Op(rebuild(d_opExpr, em)), children, idx);
00240 }
00241 return new(em->getMM(getMMIndex()))
00242 ExprApply(em, Op(d_opExpr), d_children, idx);
00243 }
00244
00245
00246 bool ExprApplyTmp::operator==(const ExprValue& ev2) const {
00247 if(getMMIndex() != ev2.getMMIndex())
00248 return false;
00249
00250 return (getOp() == ev2.getOp())
00251 && (getKids() == ev2.getKids());
00252 }
00253
00254 ExprValue* ExprApplyTmp::copy(ExprManager* em, ExprIndex idx) const {
00255 if (d_em != em) {
00256 vector<Expr> children;
00257 vector<Expr>::const_iterator
00258 i = d_children.begin(), iend = d_children.end();
00259 for (; i != iend; ++i)
00260 children.push_back(rebuild(*i, em));
00261 return new(em->getMM(getMMIndex()))
00262 ExprApply(em, Op(rebuild(d_opExpr, em)), children, idx);
00263 }
00264 return new(em->getMM(getMMIndex()))
00265 ExprApply(em, Op(d_opExpr), d_children, idx);
00266 }
00267
00268
00269 bool ExprClosure::operator==(const ExprValue& ev2) const {
00270 if(getMMIndex() != ev2.getMMIndex())
00271 return false;
00272
00273 return (getKind() == ev2.getKind())
00274 && (getBody() == ev2.getBody())
00275 && (getVars() == ev2.getVars());
00276 }
00277
00278 ExprValue* ExprClosure::copy(ExprManager* em, ExprIndex idx) const {
00279 if (d_em != em) {
00280 vector<Expr> vars;
00281 vector<Expr>::const_iterator i = d_vars.begin(), iend = d_vars.end();
00282 for (; i != iend; ++i)
00283 vars.push_back(rebuild(*i, em));
00284
00285 vector<vector<Expr> > manual_trigs;
00286 vector<vector<Expr> >::const_iterator j = d_manual_triggers.begin(), jend = d_manual_triggers.end();
00287 for (; j != jend; ++j) {
00288 vector<Expr >::const_iterator k = j->begin(), kend = j->end();
00289 vector<Expr> cur_trig;
00290 for (; k != kend; ++k){
00291 cur_trig.push_back(rebuild(*k,em));
00292 }
00293
00294 manual_trigs.push_back(cur_trig);
00295 }
00296
00297 return new(em->getMM(getMMIndex()))
00298 ExprClosure(em, d_kind, vars, rebuild(d_body, em), manual_trigs, idx);
00299 }
00300 return new(em->getMM(getMMIndex()))
00301 ExprClosure(em, d_kind, d_vars, d_body, d_manual_triggers, idx);
00302 }
00303
00304
00305
00306
00307
00308
00309
00310 size_t ExprValue::hash(const int kind, const std::vector<Expr>& kids) {
00311 size_t res(s_intHash((long int)kind));
00312 for(std::vector<Expr>::const_iterator i=kids.begin(), iend=kids.end();
00313 i!=iend; ++i) {
00314 void* ptr = i->d_expr;
00315 res = res*PRIME + pointerHash(ptr);
00316 }
00317 return res;
00318 }
00319
00320
00321
00322 Unsigned ExprValue::sizeWithChildren(const std::vector<Expr>& kids)
00323 {
00324 Unsigned res = 1;
00325 for(vector<Expr>::const_iterator i=kids.begin(), iend=kids.end();
00326 i!=iend; ++i) {
00327 res += (*i).d_expr->getSize();
00328 }
00329 return res;
00330 }
00331
00332
00333 size_t ExprClosure::computeHash() const {
00334 return d_body.hash()*PRIME + ExprValue::hash(d_kind, d_vars);
00335 }
00336
00337
00338 }