3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-23 09:05:31 +00:00
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2020-03-31 16:47:40 -07:00
parent 7945d42e5e
commit 35c59e3ca0
2 changed files with 42 additions and 9 deletions

View file

@ -2048,7 +2048,40 @@ namespace sat {
return lit;
}
ba_solver::constraint* ba_solver::add_xr(literal_vector const& lits, bool learned) {
ba_solver::constraint* ba_solver::add_xr(literal_vector const& _lits, bool learned) {
struct parity {
bool sign; bool lit;
parity(): sign(false), lit(false) {}
// {false, false}, p => {false, true}
// {false, false}, !p => {true, true}
// {false, true}, p => {true, false}
// {false, true}, !p => {true, false}
void add(literal l) {
lit = !lit;
sign = sign != l.sign();
}
};
literal_vector lits;
u_map<parity> var2parity;
for (literal lit : _lits) {
var2parity.insert_if_not_there2(lit.var(), parity())->get_data().m_value.add(lit);
}
bool polarity = false;
for (auto const& kv : var2parity) {
bool lit = kv.m_value.lit;
bool sign = kv.m_value.sign;
if (lit)
lits.push_back(literal(kv.m_key, sign));
else
polarity = polarity ^ sign;
}
if (lits.empty()) {
throw default_exception("empty xor is TBD");
}
if (polarity) {
lits[0].neg();
}
void * mem = m_allocator.allocate(xr::get_obj_size(lits.size()));
xr* x = new (mem) xr(next_id(), lits);
x->set_learned(learned);