mirror of
https://github.com/Z3Prover/z3
synced 2025-07-18 02:16:40 +00:00
add consequence finding to inc-sat-solver
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
d8ea3023fc
commit
aec59e4ff7
10 changed files with 283 additions and 41 deletions
|
@ -101,35 +101,47 @@ void pb_decl_plugin::get_op_names(svector<builtin_name> & op_names, symbol const
|
|||
}
|
||||
|
||||
void pb_util::normalize(unsigned num_args, rational const* coeffs, rational const& k) {
|
||||
rational d(1);
|
||||
for (unsigned i = 0; i < num_args; ++i) {
|
||||
d = lcm(d, denominator(coeffs[i]));
|
||||
}
|
||||
m_coeffs.reset();
|
||||
for (unsigned i = 0; i < num_args; ++i) {
|
||||
m_coeffs.push_back(d*coeffs[i]);
|
||||
bool all_ones = true;
|
||||
for (unsigned i = 0; i < num_args && all_ones; ++i) {
|
||||
all_ones = denominator(coeffs[i]).is_one();
|
||||
}
|
||||
if (all_ones) {
|
||||
for (unsigned i = 0; i < num_args; ++i) {
|
||||
m_coeffs.push_back(coeffs[i]);
|
||||
}
|
||||
m_k = k;
|
||||
}
|
||||
else {
|
||||
rational d(1);
|
||||
for (unsigned i = 0; i < num_args; ++i) {
|
||||
d = lcm(d, denominator(coeffs[i]));
|
||||
}
|
||||
for (unsigned i = 0; i < num_args; ++i) {
|
||||
m_coeffs.push_back(d*coeffs[i]);
|
||||
}
|
||||
m_k = d*k;
|
||||
}
|
||||
m_k = d*k;
|
||||
}
|
||||
|
||||
app * pb_util::mk_le(unsigned num_args, rational const * coeffs, expr * const * args, rational const& k) {
|
||||
normalize(num_args, coeffs, k);
|
||||
vector<parameter> params;
|
||||
params.push_back(parameter(floor(m_k)));
|
||||
m_params.reset();
|
||||
m_params.push_back(parameter(floor(m_k)));
|
||||
for (unsigned i = 0; i < num_args; ++i) {
|
||||
params.push_back(parameter(m_coeffs[i]));
|
||||
m_params.push_back(parameter(m_coeffs[i]));
|
||||
}
|
||||
return m.mk_app(m_fid, OP_PB_LE, params.size(), params.c_ptr(), num_args, args, m.mk_bool_sort());
|
||||
return m.mk_app(m_fid, OP_PB_LE, m_params.size(), m_params.c_ptr(), num_args, args, m.mk_bool_sort());
|
||||
}
|
||||
|
||||
app * pb_util::mk_ge(unsigned num_args, rational const * coeffs, expr * const * args, rational const& k) {
|
||||
normalize(num_args, coeffs, k);
|
||||
vector<parameter> params;
|
||||
params.push_back(parameter(ceil(m_k)));
|
||||
m_params.reset();
|
||||
m_params.push_back(parameter(ceil(m_k)));
|
||||
for (unsigned i = 0; i < num_args; ++i) {
|
||||
params.push_back(parameter(m_coeffs[i]));
|
||||
m_params.push_back(parameter(m_coeffs[i]));
|
||||
}
|
||||
return m.mk_app(m_fid, OP_PB_GE, params.size(), params.c_ptr(), num_args, args, m.mk_bool_sort());
|
||||
return m.mk_app(m_fid, OP_PB_GE, m_params.size(), m_params.c_ptr(), num_args, args, m.mk_bool_sort());
|
||||
}
|
||||
|
||||
app * pb_util::mk_eq(unsigned num_args, rational const * coeffs, expr * const * args, rational const& k) {
|
||||
|
@ -137,12 +149,12 @@ app * pb_util::mk_eq(unsigned num_args, rational const * coeffs, expr * const *
|
|||
if (!m_k.is_int()) {
|
||||
return m.mk_false();
|
||||
}
|
||||
vector<parameter> params;
|
||||
params.push_back(parameter(m_k));
|
||||
m_params.reset();
|
||||
m_params.push_back(parameter(m_k));
|
||||
for (unsigned i = 0; i < num_args; ++i) {
|
||||
params.push_back(parameter(m_coeffs[i]));
|
||||
m_params.push_back(parameter(m_coeffs[i]));
|
||||
}
|
||||
return m.mk_app(m_fid, OP_PB_EQ, params.size(), params.c_ptr(), num_args, args, m.mk_bool_sort());
|
||||
return m.mk_app(m_fid, OP_PB_EQ, m_params.size(), m_params.c_ptr(), num_args, args, m.mk_bool_sort());
|
||||
}
|
||||
|
||||
// ax + by < k
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue