mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 17:15:31 +00:00
n/a
This commit is contained in:
parent
2292a26a25
commit
e0effa3775
4 changed files with 44 additions and 17 deletions
|
@ -233,8 +233,8 @@ namespace intblast {
|
|||
}
|
||||
|
||||
m_core.reset();
|
||||
m_vars.reset();
|
||||
m_translate.reset();
|
||||
m_is_plugin = false;
|
||||
m_solver = mk_smt2_solver(m, s.params(), symbol::null);
|
||||
|
||||
expr_ref_vector es(m);
|
||||
|
@ -243,8 +243,9 @@ namespace intblast {
|
|||
|
||||
translate(es);
|
||||
|
||||
for (auto const& [src, vi] : m_vars) {
|
||||
auto const& [v, b] = vi;
|
||||
for (auto e : m_vars) {
|
||||
auto v = translated(e);
|
||||
auto b = rational::power_of_two(bv.get_bv_size(e));
|
||||
m_solver->assert_expr(a.mk_le(a.mk_int(0), v));
|
||||
m_solver->assert_expr(a.mk_lt(v, a.mk_int(b)));
|
||||
}
|
||||
|
@ -679,6 +680,7 @@ namespace intblast {
|
|||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OP_BOR: {
|
||||
// p | q := (p + q) - band(p, q)
|
||||
IF_VERBOSE(2, verbose_stream() << "bor " << mk_bounded_pp(e, m) << " " << bv.get_bv_size(e) << "\n");
|
||||
|
|
|
@ -46,14 +46,6 @@ namespace euf {
|
|||
namespace intblast {
|
||||
|
||||
class solver : public euf::th_euf_solver {
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
struct var_info {
|
||||
expr* dst;
|
||||
rational sz;
|
||||
};
|
||||
|
||||
>>>>>>> 4cadf6d9f (preparing intblaster as self-contained solver.)
|
||||
euf::solver& ctx;
|
||||
sat::solver& s;
|
||||
ast_manager& m;
|
||||
|
@ -62,7 +54,6 @@ namespace intblast {
|
|||
scoped_ptr<::solver> m_solver;
|
||||
obj_map<func_decl, func_decl*> m_new_funs;
|
||||
expr_ref_vector m_translate, m_args;
|
||||
ast_ref_vector m_pinned;
|
||||
sat::literal_vector m_core;
|
||||
ptr_vector<app> m_bv2int, m_int2bv;
|
||||
statistics m_stats;
|
||||
|
@ -103,14 +94,13 @@ namespace intblast {
|
|||
void add_value_plugin(euf::enode* n, model& mdl, expr_ref_vector& values);
|
||||
void add_value_solver(euf::enode* n, model& mdl, expr_ref_vector& values);
|
||||
|
||||
expr* translated(expr* e) { expr* r = m_translate.get(e->get_id(), nullptr); SASSERT(r); return r; }
|
||||
expr* translated(expr* e) const { expr* r = m_translate.get(e->get_id(), nullptr); SASSERT(r); return r; }
|
||||
void set_translated(expr* e, expr* r) { m_translate.setx(e->get_id(), r); }
|
||||
expr* arg(unsigned i) { return m_args.get(i); }
|
||||
|
||||
expr* mk_mod(expr* x);
|
||||
expr* mk_smod(expr* x);
|
||||
expr* bv_expr = nullptr;
|
||||
rational bv_size();
|
||||
expr* umod(expr* bv_expr, unsigned i);
|
||||
expr* smod(expr* bv_expr, unsigned i);
|
||||
rational bv_size(expr* bv_expr);
|
||||
|
||||
void translate_expr(expr* e);
|
||||
void translate_bv(app* e);
|
||||
|
@ -122,8 +112,15 @@ namespace intblast {
|
|||
void ensure_args(app* e);
|
||||
void internalize_bv(app* e);
|
||||
|
||||
unsigned m_vars_qhead = 0;
|
||||
ptr_vector<expr> m_vars;
|
||||
void add_bound_axioms();
|
||||
|
||||
euf::theory_var mk_var(euf::enode* n) override;
|
||||
|
||||
void add_value_plugin(euf::enode* n, model& mdl, expr_ref_vector& values);
|
||||
void add_value_solver(euf::enode* n, model& mdl, expr_ref_vector& values);
|
||||
|
||||
public:
|
||||
solver(euf::solver& ctx);
|
||||
|
||||
|
|
|
@ -77,6 +77,8 @@ namespace polysat {
|
|||
}
|
||||
|
||||
void umul_ovfl_constraint::propagate(core& c, lbool value, dependency const& dep) {
|
||||
if (value == l_undef)
|
||||
return;
|
||||
auto& C = c.cs();
|
||||
auto p1 = c.subst(p());
|
||||
auto q1 = c.subst(q());
|
||||
|
|
|
@ -256,6 +256,32 @@ namespace polysat {
|
|||
|
||||
void solver::add_polysat_clause(char const* name, core_vector cs, bool is_redundant) {
|
||||
sat::literal_vector lits;
|
||||
signed_constraint sc;
|
||||
unsigned constraint_count = 0;
|
||||
for (auto e : cs) {
|
||||
if (std::holds_alternative<signed_constraint>(e)) {
|
||||
sc = *std::get_if<signed_constraint>(&e);
|
||||
constraint_count++;
|
||||
}
|
||||
}
|
||||
if (constraint_count == 1) {
|
||||
auto lit = ctx.mk_literal(constraint2expr(sc));
|
||||
svector<euf::enode_pair> eqs;
|
||||
for (auto e : cs) {
|
||||
if (std::holds_alternative<dependency>(e)) {
|
||||
auto d = *std::get_if<dependency>(&e);
|
||||
if (d.is_literal())
|
||||
lits.push_back(d.literal());
|
||||
else if (d.is_eq()) {
|
||||
auto [v1, v2] = d.eq();
|
||||
eqs.push_back({ var2enode(v1), var2enode(v2) });
|
||||
}
|
||||
}
|
||||
}
|
||||
ctx.propagate(lit, euf::th_explain::propagate(*this, lits, eqs, lit, nullptr));
|
||||
return;
|
||||
}
|
||||
|
||||
for (auto e : cs) {
|
||||
if (std::holds_alternative<dependency>(e)) {
|
||||
auto d = *std::get_if<dependency>(&e);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue