3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-24 17:45:32 +00:00
This commit is contained in:
Jakob Rath 2023-02-07 09:57:32 +01:00
parent 984e98c88f
commit bf03886a87
3 changed files with 18 additions and 14 deletions

View file

@ -340,6 +340,18 @@ namespace polysat {
return ult(a + shift, b + shift);
}
/** Membership test t \in [lo; hi[ is equivalent to t - lo < hi - lo. */
signed_constraint constraint_manager::elem(pdd const& t, pdd const& lo, pdd const& hi) {
return ult(t - lo, hi - lo);
}
signed_constraint constraint_manager::elem(pdd const& t, interval const& i) {
if (i.is_full())
return eq(t.manager().zero());
else
return elem(t, i.lo(), i.hi());
}
/** unsigned quotient/remainder */
std::pair<pdd, pdd> constraint_manager::quot_rem(pdd const& a, pdd const& b) {
auto& m = a.manager();

View file

@ -117,6 +117,9 @@ namespace polysat {
signed_constraint smul_udfl(pdd const& p, pdd const& q);
signed_constraint bit(pdd const& p, unsigned i);
signed_constraint elem(pdd const& t, pdd const& lo, pdd const& hi);
signed_constraint elem(pdd const& t, interval const& i);
std::pair<pdd, pdd> quot_rem(pdd const& a, pdd const& b);
pdd bnot(pdd const& p);

View file

@ -945,14 +945,8 @@ namespace {
}
}
else if (!e->interval.is_full()) {
auto const& hi = e->interval.hi();
auto const& next_lo = n->interval.lo();
auto const& next_hi = n->interval.hi();
auto lhs = hi - next_lo;
auto rhs = next_hi - next_lo;
signed_constraint c = s.m_constraints.ult(lhs, rhs);
signed_constraint c = s.m_constraints.elem(e->interval.hi(), n->interval.symbolic());
out_c.push_back(c);
// verbose_stream() << "C: " << lhs << " < " << rhs << " -> " << lit_pp(s, c) << "\n";
}
if (e != e0) {
for (auto sc : e->side_cond) {
@ -1296,13 +1290,8 @@ namespace {
// verbose_stream() << e->interval << " " << e->side_cond << " " << e->src << ";\n";
if (!e->interval.is_full()) {
auto const& hi = e->interval.hi();
auto const& next_lo = n->interval.lo();
auto const& next_hi = n->interval.hi();
auto lhs = hi - next_lo;
auto rhs = next_hi - next_lo;
signed_constraint c = s.m_constraints.ult(lhs, rhs);
lemma.insert_try_eval(~c); // "try" because linking constraint may contain unassigned variables, see test_polysat::test_bench23_fi_lemma for an example.
signed_constraint c = s.m_constraints.elem(e->interval.hi(), n->interval.symbolic());
lemma.insert_try_eval(~c);
}
for (auto sc : e->side_cond)
lemma.insert_eval(~sc);