3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-10-17 21:10:26 +00:00

First try to generalize variable elimination

This commit is contained in:
Clemens Eisenhofer 2022-11-20 11:04:12 +01:00
parent adc9f7abe4
commit 98d572b48b
9 changed files with 218 additions and 31 deletions

View file

@ -21,7 +21,19 @@ namespace polysat {
class conflict;
class free_variable_elimination {
solver& s;
unsigned_vector m_has_validation_of_range; // TODO: Find a better name
unsigned_vector m_pv_constants;
unsigned_vector m_pv_power_constants;
unsigned_vector m_inverse_constants;
unsigned_vector m_rest_constants;
pdd get_odd(pdd p); // add lemma "2^pv(v) * v' = v"
optional<pdd> get_inverse(pdd v); // add lemma "v' * v'^-1 = 1 (where v' is the odd part of v)"
void add_dyadic_valuation(pvar v, unsigned k); // add lemma "pv(v) = k" ==> "pv_v = k"
std::pair<pdd, pdd> get_dyadic_valuation(pdd p, unsigned short lower, unsigned short upper); // lower bound inclusive; upper exclusive
std::pair<pdd, pdd> get_dyadic_valuation(pdd p);
void find_lemma(pvar v, conflict& core);
void find_lemma(pvar v, signed_constraint c, conflict& core);
pdd eval(pdd const& p, conflict& core, assignment_t& out_assignment);