mirror of
https://github.com/Z3Prover/z3
synced 2025-07-26 22:17:54 +00:00
This commit is contained in:
parent
46f8b15c14
commit
fb75dac63f
5 changed files with 32 additions and 14 deletions
|
@ -59,6 +59,7 @@ class bit_blaster : public bit_blaster_tpl<bit_blaster_cfg> {
|
||||||
public:
|
public:
|
||||||
bit_blaster(ast_manager & m, bit_blaster_params const & params);
|
bit_blaster(ast_manager & m, bit_blaster_params const & params);
|
||||||
bit_blaster_params const & get_params() const { return this->m_params; }
|
bit_blaster_params const & get_params() const { return this->m_params; }
|
||||||
|
void set_flat(bool f) { m_rw.set_flat(f); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1029,7 +1029,7 @@ namespace sat {
|
||||||
return false;
|
return false;
|
||||||
} while (m_qhead < m_trail.size());
|
} while (m_qhead < m_trail.size());
|
||||||
|
|
||||||
if (m_ext && !is_probing())
|
if (m_ext && (!is_probing() || at_base_lvl()))
|
||||||
m_ext->unit_propagate();
|
m_ext->unit_propagate();
|
||||||
}
|
}
|
||||||
if (m_inconsistent)
|
if (m_inconsistent)
|
||||||
|
|
|
@ -174,6 +174,10 @@ namespace array {
|
||||||
SASSERT(store->get_num_args() == 1 + select->get_num_args());
|
SASSERT(store->get_num_args() == 1 + select->get_num_args());
|
||||||
ptr_buffer<expr> sel1_args, sel2_args;
|
ptr_buffer<expr> sel1_args, sel2_args;
|
||||||
unsigned num_args = select->get_num_args();
|
unsigned num_args = select->get_num_args();
|
||||||
|
|
||||||
|
if (expr2enode(select->get_arg(0))->get_root() == expr2enode(store)->get_root())
|
||||||
|
return false;
|
||||||
|
|
||||||
sel1_args.push_back(store);
|
sel1_args.push_back(store);
|
||||||
sel2_args.push_back(store->get_arg(0));
|
sel2_args.push_back(store->get_arg(0));
|
||||||
|
|
||||||
|
@ -191,6 +195,7 @@ namespace array {
|
||||||
expr_ref sel1(a.mk_select(sel1_args), m);
|
expr_ref sel1(a.mk_select(sel1_args), m);
|
||||||
expr_ref sel2(a.mk_select(sel2_args), m);
|
expr_ref sel2(a.mk_select(sel2_args), m);
|
||||||
expr_ref sel_eq_e(m.mk_eq(sel1, sel2), m);
|
expr_ref sel_eq_e(m.mk_eq(sel1, sel2), m);
|
||||||
|
|
||||||
euf::enode* s1 = e_internalize(sel1);
|
euf::enode* s1 = e_internalize(sel1);
|
||||||
euf::enode* s2 = e_internalize(sel2);
|
euf::enode* s2 = e_internalize(sel2);
|
||||||
TRACE("array",
|
TRACE("array",
|
||||||
|
@ -200,9 +205,13 @@ namespace array {
|
||||||
if (s1->get_root() == s2->get_root())
|
if (s1->get_root() == s2->get_root())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
sat::literal sel_eq = mk_literal(sel_eq_e);
|
sat::literal sel_eq = sat::null_literal;
|
||||||
if (s().value(sel_eq) == l_true)
|
auto init_sel_eq = [&]() {
|
||||||
return false;
|
if (sel_eq != sat::null_literal)
|
||||||
|
return true;
|
||||||
|
sel_eq = mk_literal(sel_eq_e);
|
||||||
|
return s().value(sel_eq) != l_true;
|
||||||
|
};
|
||||||
|
|
||||||
bool new_prop = false;
|
bool new_prop = false;
|
||||||
for (unsigned i = 1; i < num_args; i++) {
|
for (unsigned i = 1; i < num_args; i++) {
|
||||||
|
@ -213,11 +222,17 @@ namespace array {
|
||||||
if (r1 == r2)
|
if (r1 == r2)
|
||||||
continue;
|
continue;
|
||||||
if (m.are_distinct(r1->get_expr(), r2->get_expr())) {
|
if (m.are_distinct(r1->get_expr(), r2->get_expr())) {
|
||||||
|
if (init_sel_eq() && add_clause(sel_eq))
|
||||||
new_prop = true;
|
new_prop = true;
|
||||||
add_clause(sel_eq);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sat::literal idx_eq = eq_internalize(idx1, idx2);
|
sat::literal idx_eq = eq_internalize(idx1, idx2);
|
||||||
|
if (s().value(idx_eq) == l_true)
|
||||||
|
continue;
|
||||||
|
if (s().value(idx_eq) == l_undef)
|
||||||
|
new_prop = true;
|
||||||
|
if (!init_sel_eq())
|
||||||
|
break;
|
||||||
if (add_clause(idx_eq, sel_eq))
|
if (add_clause(idx_eq, sel_eq))
|
||||||
new_prop = true;
|
new_prop = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,6 +55,7 @@ namespace bv {
|
||||||
m_ackerman(*this),
|
m_ackerman(*this),
|
||||||
m_bb(m, get_config()),
|
m_bb(m, get_config()),
|
||||||
m_find(*this) {
|
m_find(*this) {
|
||||||
|
m_bb.set_flat(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void solver::fixed_var_eh(theory_var v1) {
|
void solver::fixed_var_eh(theory_var v1) {
|
||||||
|
|
|
@ -253,13 +253,14 @@ namespace euf {
|
||||||
if (!is_relevant(n))
|
if (!is_relevant(n))
|
||||||
continue;
|
continue;
|
||||||
bool tt = l_true == s().value(n->bool_var());
|
bool tt = l_true == s().value(n->bool_var());
|
||||||
if (tt && mdl.is_false(e)) {
|
if (tt && !mdl.is_false(e))
|
||||||
IF_VERBOSE(0, verbose_stream() << "Failed to validate " << bpp(n) << " " << mdl(e) << "\n");
|
continue;
|
||||||
|
if (!tt && !mdl.is_true(e))
|
||||||
|
continue;
|
||||||
|
IF_VERBOSE(0,
|
||||||
|
verbose_stream() << "Failed to validate " << n->bool_var() << " " << bpp(n) << " " << mdl(e) << "\n";
|
||||||
for (auto* arg : euf::enode_args(n))
|
for (auto* arg : euf::enode_args(n))
|
||||||
IF_VERBOSE(0, verbose_stream() << bpp(arg) << "\n" << mdl(arg->get_expr()) << "\n");
|
verbose_stream() << bpp(arg) << "\n" << mdl(arg->get_expr()) << "\n";);
|
||||||
}
|
|
||||||
if (!tt && mdl.is_true(e))
|
|
||||||
IF_VERBOSE(0, verbose_stream() << "Failed to validate " << bpp(n) << " " << mdl(e) << "\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue