3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-07-19 10:52:02 +00:00

fiddle with univariate

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2022-12-17 20:02:46 -08:00
parent 4e8bd4425f
commit 899b1f8f7e

View file

@ -53,6 +53,7 @@ namespace polysat {
bv = alloc(bv_util, m); bv = alloc(bv_util, m);
params_ref p; params_ref p;
p.set_bool("bv.polysat", false); p.set_bool("bv.polysat", false);
// p.set_bool("smt", true);
s = mk_solver(m, p, false, true, true, symbol::null); s = mk_solver(m, p, false, true, true, symbol::null);
x_decl = m.mk_const_decl("x", bv->mk_sort(bit_width)); x_decl = m.mk_const_decl("x", bv->mk_sort(bit_width));
x = m.mk_const(x_decl); x = m.mk_const(x_decl);
@ -94,6 +95,13 @@ namespace polysat {
return bv->mk_numeral(r, bit_width); return bv->mk_numeral(r, bit_width);
} }
bool is_zero(univariate const& p) const {
for (auto n : p)
if (n != 0)
return false;
return true;
}
#if 0 #if 0
// [d,c,b,a] --> ((a*x + b)*x + c)*x + d // [d,c,b,a] --> ((a*x + b)*x + c)*x + d
expr* mk_poly(univariate const& p) const { expr* mk_poly(univariate const& p) const {
@ -128,16 +136,18 @@ namespace polysat {
return mk_numeral(rational::zero()); return mk_numeral(rational::zero());
} }
else { else {
expr* e = mk_numeral(p[0]); expr* e = p[0] != 0 ? mk_numeral(p[0]) : nullptr;
expr* xpow = x; expr_ref xpow = x;
for (unsigned i = 1; i < p.size(); ++i) { for (unsigned i = 1; i < p.size(); ++i) {
if (!p[i].is_zero()) { if (!p[i].is_zero()) {
expr* t = mk_poly_term(p[i], xpow); expr* t = mk_poly_term(p[i], xpow);
e = bv->mk_bv_add(e, t); e = e ? bv->mk_bv_add(e, t) : t;
} }
if (i + 1 < p.size()) if (i + 1 < p.size())
xpow = bv->mk_bv_mul(xpow, x); xpow = bv->mk_bv_mul(xpow, x);
} }
if (!e)
e = mk_numeral(p[0]);
return e; return e;
} }
} }
@ -159,6 +169,9 @@ namespace polysat {
} }
void add_ule(univariate const& lhs, univariate const& rhs, bool sign, dep_t dep) override { void add_ule(univariate const& lhs, univariate const& rhs, bool sign, dep_t dep) override {
if (is_zero(rhs))
add(m.mk_eq(mk_poly(lhs), mk_poly(rhs)), sign, dep);
else
add(bv->mk_ule(mk_poly(lhs), mk_poly(rhs)), sign, dep); add(bv->mk_ule(mk_poly(lhs), mk_poly(rhs)), sign, dep);
} }
@ -203,6 +216,9 @@ namespace polysat {
} }
void add_ule_const(rational const& val, bool sign, dep_t dep) override { void add_ule_const(rational const& val, bool sign, dep_t dep) override {
if (val == 0)
add(m.mk_eq(x, mk_numeral(val)), sign, dep);
else
add(bv->mk_ule(x, mk_numeral(val)), sign, dep); add(bv->mk_ule(x, mk_numeral(val)), sign, dep);
} }
@ -226,6 +242,7 @@ namespace polysat {
unsigned dep = to_app(a)->get_decl()->get_name().get_num(); unsigned dep = to_app(a)->get_decl()->get_name().get_num();
deps.push_back(dep); deps.push_back(dep);
} }
IF_VERBOSE(10, verbose_stream() << "core " << deps << "\n");
SASSERT(deps.size() > 0); SASSERT(deps.size() > 0);
} }
@ -320,6 +337,7 @@ namespace polysat {
break; break;
} }
pop(1); pop(1);
IF_VERBOSE(10, verbose_stream() << "viable " << out1 << " " << out2 << "\n");
return ok; return ok;
} }