mirror of
https://github.com/Z3Prover/z3
synced 2026-07-19 05:25:48 +00:00
Implement check_mod_congruence in nla_divisions: for two mod-atoms sharing a (possibly symbolic) divisor y, emit the model-guided tautology div(x,y) - div(s,y) = delta => mod(x,y) - mod(s,y) = (x - s) - delta*y. This discharges linear congruences over a symbolic modulus that the nonlinear core did not otherwise isolate. Thread the div(x,y) variable through add_divisibility (nla_core/nla_solver/nla_divisions) and register it in theory_lra for symbolic-divisor mod terms. Solves FStar.BitVector-1 (0.7s) and FStar.Matrix-1 (1.6s), previously 300s timeouts; all 92 unit tests pass. Copilot-Session: 726c4e71-03ff-45f6-8322-5253254e1d7e --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
43 lines
1.2 KiB
C++
43 lines
1.2 KiB
C++
/*++
|
|
Copyright (c) 2017 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
nla_divisions.h
|
|
|
|
Author:
|
|
Lev Nachmanson (levnach)
|
|
Nikolaj Bjorner (nbjorner)
|
|
|
|
Description:
|
|
Check division constraints.
|
|
|
|
--*/
|
|
|
|
#include "math/lp/nla_types.h"
|
|
|
|
namespace nla {
|
|
|
|
class core;
|
|
|
|
class divisions {
|
|
core& m_core;
|
|
vector<std::tuple<lpvar, lpvar, lpvar, lpvar>> m_idivisions;
|
|
vector<std::tuple<lpvar, lpvar, lpvar, lpvar>> m_rdivisions;
|
|
vector<std::tuple<lpvar, lpvar, lpvar, lpvar>> m_bounded_divisions;
|
|
// divisibility facts (r, x, y, d) meaning r = mod(x, y) and d = div(x, y)
|
|
vector<std::tuple<lpvar, lpvar, lpvar, lpvar>> m_divisibility;
|
|
|
|
public:
|
|
divisions(core& c):m_core(c) {}
|
|
void add_idivision(lpvar q, lpvar x, lpvar y, lpvar r);
|
|
void add_rdivision(lpvar q, lpvar x, lpvar y, lpvar r);
|
|
void add_bounded_division(lpvar q, lpvar x, lpvar y, lpvar r);
|
|
void add_divisibility(lpvar r, lpvar x, lpvar y, lpvar d);
|
|
void check();
|
|
void check_bounded_divisions();
|
|
void check_mod_mult();
|
|
void check_linear_divisibility();
|
|
void check_mod_congruence();
|
|
};
|
|
}
|