mirror of
https://github.com/Z3Prover/z3
synced 2025-04-08 10:25:18 +00:00
#6104 also in the new core
This commit is contained in:
parent
de41cfd277
commit
f82ca197d2
|
@ -434,6 +434,7 @@ namespace bv {
|
|||
SASSERT(bv.is_int2bv(n));
|
||||
euf::enode* e = expr2enode(n);
|
||||
mk_bits(e->get_th_var(get_id()));
|
||||
get_var(e->get_arg(0));
|
||||
assert_int2bv_axiom(n);
|
||||
}
|
||||
|
||||
|
|
|
@ -208,7 +208,33 @@ namespace bv {
|
|||
if (is_bv(eq.v1())) {
|
||||
m_find.merge(eq.v1(), eq.v2());
|
||||
VERIFY(eq.is_eq());
|
||||
return;
|
||||
}
|
||||
euf::enode* n1 = var2enode(eq.v1());
|
||||
euf::enode* int2bv = nullptr;
|
||||
for (euf::enode* sib : euf::enode_class(n1)) {
|
||||
if (bv.is_bv2int(sib->get_expr())) {
|
||||
int2bv = sib;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!int2bv)
|
||||
return;
|
||||
|
||||
for (euf::enode* p : euf::enode_parents(n1->get_root())) {
|
||||
if (bv.is_int2bv(p->get_expr())) {
|
||||
euf::enode* int2bv_arg = int2bv->get_arg(0);
|
||||
if (p->get_root() != int2bv_arg->get_root()) {
|
||||
euf::enode_pair_vector eqs;
|
||||
eqs.push_back({ n1, p->get_arg(0) });
|
||||
eqs.push_back({ n1, int2bv });
|
||||
ctx.propagate(p, int2bv_arg, euf::th_explain::propagate(*this, eqs, p, int2bv_arg));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void solver::new_diseq_eh(euf::th_eq const& ne) {
|
||||
|
|
|
@ -270,6 +270,10 @@ namespace euf {
|
|||
return mk(th, lits.size(), lits.data(), eqs.size(), eqs.data(), sat::null_literal, x, y, pma);
|
||||
}
|
||||
|
||||
th_explain* th_explain::propagate(th_euf_solver& th, enode_pair_vector const& eqs, euf::enode* x, euf::enode* y, sat::proof_hint const* pma) {
|
||||
return mk(th, 0, nullptr, eqs.size(), eqs.data(), sat::null_literal, x, y, pma);
|
||||
}
|
||||
|
||||
th_explain* th_explain::propagate(th_euf_solver& th, sat::literal lit, euf::enode* x, euf::enode* y) {
|
||||
return mk(th, 1, &lit, 0, nullptr, sat::null_literal, x, y);
|
||||
}
|
||||
|
|
|
@ -241,6 +241,7 @@ namespace euf {
|
|||
static th_explain* conflict(th_euf_solver& th, sat::literal lit, euf::enode* x, euf::enode* y);
|
||||
static th_explain* conflict(th_euf_solver& th, euf::enode* x, euf::enode* y);
|
||||
static th_explain* propagate(th_euf_solver& th, sat::literal lit, euf::enode* x, euf::enode* y);
|
||||
static th_explain* propagate(th_euf_solver& th, enode_pair_vector const& eqs, euf::enode* x, euf::enode* y, sat::proof_hint const* pma = nullptr);
|
||||
static th_explain* propagate(th_euf_solver& th, sat::literal_vector const& lits, enode_pair_vector const& eqs, sat::literal consequent, sat::proof_hint const* pma = nullptr);
|
||||
static th_explain* propagate(th_euf_solver& th, sat::literal_vector const& lits, enode_pair_vector const& eqs, euf::enode* x, euf::enode* y, sat::proof_hint const* pma = nullptr);
|
||||
|
||||
|
|
Loading…
Reference in a new issue