mirror of
https://github.com/Z3Prover/z3
synced 2026-07-23 15:32:32 +00:00
Issue 438 (#10085)
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:
parent
ba7b12c18c
commit
eaceded5f1
13 changed files with 269 additions and 11 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue