mirror of
https://github.com/Z3Prover/z3
synced 2025-04-15 21:38:44 +00:00
qe_lite> fix crash in is_var_eq()
(by me & Nikolaj) Signed-off-by: Nuno Lopes <t-nclaud@microsoft.com>
This commit is contained in:
parent
b1fc6a5cac
commit
b427958b9e
|
@ -201,9 +201,15 @@ namespace eq {
|
|||
return (*m_is_variable)(e);
|
||||
}
|
||||
|
||||
bool is_neg_var(ast_manager & m, expr * e) {
|
||||
bool is_neg_var(ast_manager & m, expr * e, var*& v) {
|
||||
expr* e1;
|
||||
return m.is_not(e, e1) && is_variable(e1);
|
||||
if (m.is_not(e, e1) && is_variable(e1)) {
|
||||
v = to_var(e1);
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -328,18 +334,19 @@ namespace eq {
|
|||
|
||||
bool is_var_eq(expr * e, ptr_vector<var>& vs, expr_ref_vector & ts) {
|
||||
expr* lhs, *rhs;
|
||||
var* v;
|
||||
|
||||
// (= VAR t), (iff VAR t), (iff (not VAR) t), (iff t (not VAR)) cases
|
||||
if (m.is_eq(e, lhs, rhs) || m.is_iff(e, lhs, rhs)) {
|
||||
// (iff (not VAR) t) (iff t (not VAR)) cases
|
||||
if (!is_variable(lhs) && !is_variable(rhs) && m.is_bool(lhs)) {
|
||||
if (!is_neg_var(m, lhs)) {
|
||||
if (!is_neg_var(m, lhs, v)) {
|
||||
std::swap(lhs, rhs);
|
||||
}
|
||||
if (!is_neg_var(m, lhs)) {
|
||||
if (!is_neg_var(m, lhs, v)) {
|
||||
return false;
|
||||
}
|
||||
vs.push_back(to_var(lhs));
|
||||
vs.push_back(v);
|
||||
ts.push_back(m.mk_not(rhs));
|
||||
TRACE("qe_lite", tout << mk_pp(e, m) << "\n";);
|
||||
return true;
|
||||
|
@ -378,9 +385,9 @@ namespace eq {
|
|||
}
|
||||
|
||||
// VAR = false case
|
||||
if (is_neg_var(m, e)) {
|
||||
if (is_neg_var(m, e, v)) {
|
||||
ts.push_back(m.mk_false());
|
||||
vs.push_back(to_var(to_app(e)->get_arg(0)));
|
||||
vs.push_back(v);
|
||||
TRACE("qe_lite", tout << mk_pp(e, m) << "\n";);
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue