mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 09:05:31 +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
|
||||
|
|
|
@ -80,6 +80,7 @@ class pb_util {
|
|||
ast_manager & m;
|
||||
family_id m_fid;
|
||||
vector<rational> m_coeffs;
|
||||
vector<parameter> m_params;
|
||||
rational m_k;
|
||||
void normalize(unsigned num_args, rational const* coeffs, rational const& k);
|
||||
public:
|
||||
|
|
|
@ -277,6 +277,22 @@ br_status pb_rewriter::mk_app_core(func_decl * f, unsigned num_args, expr * cons
|
|||
tout << tmp << "\n";
|
||||
tout << result << "\n";
|
||||
);
|
||||
|
||||
#if 0
|
||||
static unsigned num_changes = 0;
|
||||
static unsigned num_calls = 0;
|
||||
static unsigned inc = 1;
|
||||
{
|
||||
expr_ref tmp(m);
|
||||
tmp = m.mk_app(f, num_args, args);
|
||||
num_calls++;
|
||||
if (tmp != result) ++num_changes;
|
||||
if (num_calls > inc) {
|
||||
std::cout << num_calls << " " << num_changes << "\n";
|
||||
inc *= 2;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
TRACE("pb_validate",
|
||||
validate_rewrite(f, num_args, args, result););
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue