3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-07-23 15:32:32 +00:00
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
This commit is contained in:
Nikolaj Bjorner 2026-07-12 13:35:57 -07:00 committed by GitHub
parent ba7b12c18c
commit eaceded5f1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 269 additions and 11 deletions

View file

@ -176,11 +176,11 @@ namespace bv {
case OP_BNEG: internalize_un(mk_neg); break;
case OP_BREDAND: internalize_un(mk_redand); break;
case OP_BREDOR: internalize_un(mk_redor); break;
case OP_BSDIV_I: internalize_bin(mk_sdiv); break;
case OP_BUDIV_I: internalize_bin(mk_udiv); break;
case OP_BUREM_I: internalize_bin(mk_urem); break;
case OP_BSREM_I: internalize_bin(mk_srem); break;
case OP_BSMOD_I: internalize_bin(mk_smod); break;
case OP_BSDIV_I: internalize_bin(mk_sdiv); assert_bv_divrem_bound_axiom(a); break;
case OP_BUDIV_I: internalize_bin(mk_udiv); assert_bv_divrem_bound_axiom(a); break;
case OP_BUREM_I: internalize_bin(mk_urem); assert_bv_divrem_bound_axiom(a); break;
case OP_BSREM_I: internalize_bin(mk_srem); assert_bv_divrem_bound_axiom(a); break;
case OP_BSMOD_I: internalize_bin(mk_smod); assert_bv_divrem_bound_axiom(a); break;
case OP_BSHL: internalize_bin(mk_shl); break;
case OP_BLSHR: internalize_bin(mk_lshr); break;
case OP_BASHR: internalize_bin(mk_ashr); break;
@ -544,6 +544,20 @@ namespace bv {
internalize_binary(a, bin);
}
// Add, on the fly, the magnitude bound axioms for division/remainder operators.
// Uses the shared bv_util::mk_bv_divrem_bound clause builder so the axiom matches the one
// produced by the bv-divrem-bounds simplifier. Only fires for a symbolic divisor.
void solver::assert_bv_divrem_bound_axiom(app* a) {
expr_ref_vector clause(m);
bv.mk_bv_divrem_bound(a, clause);
if (clause.empty())
return;
sat::literal_vector lits;
for (expr* e : clause)
lits.push_back(mk_literal(e));
add_clause(lits);
}
void solver::internalize_interp(app* n, std::function<expr* (expr*, expr*)>& ibin, std::function<expr* (expr*)>& iun) {
bv_rewriter_params p(s().params());
expr* arg1 = n->get_arg(0);

View file

@ -288,6 +288,7 @@ namespace bv {
void internalize_bit2bool(app* n);
void internalize_overflow(app* n);
void internalize_udiv_i(app* n);
void assert_bv_divrem_bound_axiom(app* n);
template<bool Signed, bool Reverse, bool Negated>
void internalize_le(app* n);
void assert_bv2int_axiom(app * n);