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:
parent
4e8bd4425f
commit
899b1f8f7e
1 changed files with 23 additions and 5 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue