mirror of
https://github.com/Z3Prover/z3
synced 2025-04-15 13:28:47 +00:00
fixes in nex expressions
Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
parent
f9beef19ce
commit
f8a45d2fb3
|
@ -124,6 +124,7 @@ public:
|
||||||
TRACE("nla_cn", tout << "no common factor\n"; );
|
TRACE("nla_cn", tout << "no common factor\n"; );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
TRACE("nla_cn", tout << "common factor f=" << *f << "\n";);
|
||||||
|
|
||||||
nex* c_over_f = m_nex_creator.mk_div(*c, f);
|
nex* c_over_f = m_nex_creator.mk_div(*c, f);
|
||||||
c_over_f = m_nex_creator.simplify(c_over_f);
|
c_over_f = m_nex_creator.simplify(c_over_f);
|
||||||
|
|
|
@ -558,7 +558,8 @@ nex * nex_creator::mk_div_by_mul(const nex* a, const nex_mul* b) {
|
||||||
if (a->is_sum()) {
|
if (a->is_sum()) {
|
||||||
return mk_div_sum_by_mul(to_sum(a), b);
|
return mk_div_sum_by_mul(to_sum(a), b);
|
||||||
}
|
}
|
||||||
if (a->is_var() || (a->is_mul() && to_mul(a)->size() == 1)) {
|
|
||||||
|
if (a->is_var()) {
|
||||||
SASSERT(b->get_degree() == 1 && !b->has_a_coeff() && get_vars_of_expr(a) == get_vars_of_expr(b));
|
SASSERT(b->get_degree() == 1 && !b->has_a_coeff() && get_vars_of_expr(a) == get_vars_of_expr(b));
|
||||||
return mk_scalar(rational(1));
|
return mk_scalar(rational(1));
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,6 +74,60 @@ void test_cn_on_expr(nex_sum *t, cross_nested& cn) {
|
||||||
cn.run(t);
|
cn.run(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned find_power_of_var(lpvar j, const nex* e) {
|
||||||
|
if (e->is_scalar())
|
||||||
|
return 0;
|
||||||
|
if (e->is_var()) {
|
||||||
|
return to_var(e)->var() == j? 1: 0;
|
||||||
|
}
|
||||||
|
if (e->is_sum()) {
|
||||||
|
unsigned r = 0;
|
||||||
|
for (auto ee : *to_sum(e)) {
|
||||||
|
r = std::max(r, find_power_of_var(j, ee));
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
if (e->is_mul()) {
|
||||||
|
unsigned r = 0;
|
||||||
|
for (auto p : *to_mul(e)) {
|
||||||
|
r += find_power_of_var(j, p.e()) * p.pow();
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool mul_has_var_in_power(lpvar j, unsigned k, const nex_mul* e) {
|
||||||
|
for (auto c : *e) {
|
||||||
|
unsigned p = find_power_of_var(j, c.e())*c.pow();
|
||||||
|
if (p >= k)
|
||||||
|
return true;
|
||||||
|
k -= p;
|
||||||
|
}
|
||||||
|
SASSERT(k);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool has_var_in_power(lpvar j, unsigned k, const nex* e) {
|
||||||
|
TRACE("nla_cn", tout << "j = " << nex_creator::ch(j) << ", e = " << *e << ", k = " << k << "\n";);
|
||||||
|
if (k == 0)
|
||||||
|
return true;
|
||||||
|
if (e->is_scalar())
|
||||||
|
return false;
|
||||||
|
if (e->is_var()) {
|
||||||
|
return k == 1 && to_var(e)->var() == j;
|
||||||
|
}
|
||||||
|
if (e->is_sum()) {
|
||||||
|
for (auto ee : *to_sum(e)) {
|
||||||
|
if (has_var_in_power(j, k, ee))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (e->is_mul()) {
|
||||||
|
return mul_has_var_in_power(j, k, to_mul(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void test_simplify() {
|
void test_simplify() {
|
||||||
cross_nested cn(
|
cross_nested cn(
|
||||||
|
@ -144,7 +198,64 @@ void test_simplify() {
|
||||||
TRACE("nla_test", tout << "simplified sum e = " << *pr << "\n";);
|
TRACE("nla_test", tout << "simplified sum e = " << *pr << "\n";);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_cn_shorter() {
|
||||||
|
cross_nested cn(
|
||||||
|
[](const nex* n) {
|
||||||
|
TRACE("nla_test", tout <<"cn form = " << *n << "\n";
|
||||||
|
SASSERT(has_var_in_power(4, // stands for e
|
||||||
|
2, n));
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
} ,
|
||||||
|
[](unsigned) { return false; },
|
||||||
|
[]{ return 1; });
|
||||||
|
enable_trace("nla_test");
|
||||||
|
// enable_trace("nla_cn");
|
||||||
|
// enable_trace("nla_cn_details");
|
||||||
|
// enable_trace("nla_test_details");
|
||||||
|
auto & cr = cn.get_nex_creator();
|
||||||
|
cr.active_vars_weights().resize(20);
|
||||||
|
for (unsigned j = 0; j < cr.active_vars_weights().size(); j++)
|
||||||
|
cr.active_vars_weights()[j] = static_cast<var_weight>(1);
|
||||||
|
|
||||||
|
nex_var* a = cr.mk_var(0);
|
||||||
|
nex_var* b = cr.mk_var(1);
|
||||||
|
nex_var* c = cr.mk_var(2);
|
||||||
|
nex_var* d = cr.mk_var(3);
|
||||||
|
nex_var* e = cr.mk_var(4);
|
||||||
|
nex_var* g = cr.mk_var(6);
|
||||||
|
|
||||||
|
nex* min_1 = cr.mk_scalar(rational(-1));
|
||||||
|
// test_cn_on_expr(min_1*c*e + min_1*b*d + min_1*a*b + a*c);
|
||||||
|
nex* bcd = cr.mk_mul(b, c, d);
|
||||||
|
nex_mul* bcg = cr.mk_mul(b, c, g);
|
||||||
|
bcg->add_child(min_1);
|
||||||
|
nex_sum* t = cr.mk_sum(bcd, bcg);
|
||||||
|
nex* abcd = cr.mk_mul(a, b, c, d);
|
||||||
|
nex* aaccd = cr.mk_mul(a, a, c, c, d);
|
||||||
|
nex* add = cr.mk_mul(a, d, d);
|
||||||
|
nex* eae = cr.mk_mul(e, a, e);
|
||||||
|
nex* eac = cr.mk_mul(e, a, c);
|
||||||
|
nex* ed = cr.mk_mul(e, d);
|
||||||
|
nex* _6aad = cr.mk_mul(cr.mk_scalar(rational(6)), a, a, d);
|
||||||
|
#ifdef Z3DEBUG
|
||||||
|
nex * clone = cr.clone(cr.mk_sum(_6aad, abcd, eae, eac));
|
||||||
|
clone = cr.simplify(clone);
|
||||||
|
SASSERT(cr.is_simplified(clone));
|
||||||
|
TRACE("nla_test", tout << "clone = " << *clone << "\n";);
|
||||||
|
#endif
|
||||||
|
// test_cn_on_expr(cr.mk_sum(aad, abcd, aaccd, add, eae, eac, ed), cn);
|
||||||
|
test_cn_on_expr(to_sum(clone), cn);
|
||||||
|
// TRACE("nla_test", tout << "done\n";);
|
||||||
|
// test_cn_on_expr(a*b*d + a*b*c + c*b*d + a*c*d);
|
||||||
|
// TRACE("nla_test", tout << "done\n";);
|
||||||
|
// test_cn_on_expr(a*b*b*d*d + a*b*b*c*d + c*b*b*d);
|
||||||
|
// TRACE("nla_test", tout << "done\n";);
|
||||||
|
// test_cn_on_expr(a*b*d + a*b*c + c*b*d);
|
||||||
|
}
|
||||||
|
|
||||||
void test_cn() {
|
void test_cn() {
|
||||||
|
test_cn_shorter();
|
||||||
cross_nested cn(
|
cross_nested cn(
|
||||||
[](const nex* n) {
|
[](const nex* n) {
|
||||||
TRACE("nla_test", tout <<"cn form = " << *n << "\n";);
|
TRACE("nla_test", tout <<"cn form = " << *n << "\n";);
|
||||||
|
|
Loading…
Reference in a new issue