mirror of
https://github.com/Z3Prover/z3
synced 2025-04-24 09:35:32 +00:00
testing utvpi
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
fbe4af6336
commit
21b0a4fcbb
7 changed files with 176 additions and 33 deletions
|
@ -597,7 +597,7 @@ namespace pdr {
|
|||
expr_ref fml = pm.mk_and(conj);
|
||||
th_rewriter rw(m);
|
||||
rw(fml);
|
||||
if (ctx.is_dl()) {
|
||||
if (ctx.is_dl() || ctx.is_utvpi()) {
|
||||
hoist_non_bool_if(fml);
|
||||
}
|
||||
TRACE("pdr", tout << mk_pp(fml, m) << "\n";);
|
||||
|
@ -1359,9 +1359,10 @@ namespace pdr {
|
|||
bool m_is_bool_arith;
|
||||
bool m_has_arith;
|
||||
bool m_is_dl;
|
||||
bool m_is_utvpi;
|
||||
public:
|
||||
classifier_proc(ast_manager& m, datalog::rule_set& rules):
|
||||
m(m), a(m), m_is_bool(true), m_is_bool_arith(true), m_has_arith(false), m_is_dl(false) {
|
||||
m(m), a(m), m_is_bool(true), m_is_bool_arith(true), m_has_arith(false), m_is_dl(false), m_is_utvpi(false) {
|
||||
classify(rules);
|
||||
}
|
||||
void operator()(expr* e) {
|
||||
|
@ -1407,6 +1408,7 @@ namespace pdr {
|
|||
|
||||
bool is_dl() const { return m_is_dl; }
|
||||
|
||||
bool is_utvpi() const { return m_is_utvpi; }
|
||||
|
||||
private:
|
||||
|
||||
|
@ -1427,6 +1429,7 @@ namespace pdr {
|
|||
mark.reset();
|
||||
|
||||
m_is_dl = false;
|
||||
m_is_utvpi = false;
|
||||
if (m_has_arith) {
|
||||
ptr_vector<expr> forms;
|
||||
for (it = rules.begin(); it != end; ++it) {
|
||||
|
@ -1438,6 +1441,11 @@ namespace pdr {
|
|||
}
|
||||
}
|
||||
m_is_dl = is_difference_logic(m, forms.size(), forms.c_ptr());
|
||||
#if 0
|
||||
if (!m_is_dl) {
|
||||
m_is_utvpi = is_utvpi_logic(m, forms.size(), forms.c_ptr());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1561,6 +1569,11 @@ namespace pdr {
|
|||
m_fparams.m_arith_mode = AS_DIFF_LOGIC;
|
||||
m_fparams.m_arith_expand_eqs = true;
|
||||
}
|
||||
else if (classify.is_utvpi()) {
|
||||
IF_VERBOSE(1, verbose_stream() << "UTVPI\n";);
|
||||
m_fparams.m_arith_mode = AS_UTVPI;
|
||||
m_fparams.m_arith_expand_eqs = true;
|
||||
}
|
||||
}
|
||||
if (!use_mc && m_params.use_inductive_generalizer()) {
|
||||
m_core_generalizers.push_back(alloc(core_bool_inductive_generalizer, *this, 0));
|
||||
|
|
|
@ -367,7 +367,7 @@ namespace pdr {
|
|||
expr_ref get_answer();
|
||||
|
||||
bool is_dl() const { return m_fparams.m_arith_mode == AS_DIFF_LOGIC; }
|
||||
|
||||
bool is_utvpi() const { return m_fparams.m_arith_mode == AS_UTVPI; }
|
||||
|
||||
void collect_statistics(statistics& st) const;
|
||||
void reset_statistics();
|
||||
|
|
|
@ -216,6 +216,9 @@ namespace pdr {
|
|||
}
|
||||
res = m.mk_not(res);
|
||||
th_rewriter rw(m);
|
||||
params_ref params;
|
||||
params.set_bool("gcd_rounding", true);
|
||||
rw.updt_params(params);
|
||||
proof_ref pr(m);
|
||||
expr_ref tmp(m);
|
||||
rw(res, tmp, pr);
|
||||
|
|
|
@ -383,26 +383,32 @@ namespace pdr {
|
|||
fl.get_lemmas(pr, bs, lemmas);
|
||||
safe.elim_proxies(lemmas);
|
||||
fl.simplify_lemmas(lemmas); // redundant?
|
||||
if (m_fparams.m_arith_mode == AS_DIFF_LOGIC &&
|
||||
!is_difference_logic(m, lemmas.size(), lemmas.c_ptr())) {
|
||||
IF_VERBOSE(1,
|
||||
verbose_stream() << "not diff\n";
|
||||
for (unsigned i = 0; i < lemmas.size(); ++i) {
|
||||
verbose_stream() << mk_pp(lemmas[i].get(), m) << "\n";
|
||||
});
|
||||
extract_subset_core(safe);
|
||||
return;
|
||||
|
||||
bool outside_of_logic =
|
||||
(m_fparams.m_arith_mode == AS_DIFF_LOGIC &&
|
||||
!is_difference_logic(m, lemmas.size(), lemmas.c_ptr())) ||
|
||||
(m_fparams.m_arith_mode == AS_UTVPI &&
|
||||
!is_utvpi_logic(m, lemmas.size(), lemmas.c_ptr()));
|
||||
|
||||
if (outside_of_logic) {
|
||||
IF_VERBOSE(1,
|
||||
verbose_stream() << "not diff\n";
|
||||
for (unsigned i = 0; i < lemmas.size(); ++i) {
|
||||
verbose_stream() << mk_pp(lemmas[i].get(), m) << "\n";
|
||||
});
|
||||
extract_subset_core(safe);
|
||||
}
|
||||
else {
|
||||
|
||||
IF_VERBOSE(2,
|
||||
verbose_stream() << "Lemmas\n";
|
||||
for (unsigned i = 0; i < lemmas.size(); ++i) {
|
||||
verbose_stream() << mk_pp(lemmas[i].get(), m) << "\n";
|
||||
});
|
||||
|
||||
m_core->reset();
|
||||
m_core->append(lemmas);
|
||||
}
|
||||
|
||||
|
||||
IF_VERBOSE(2,
|
||||
verbose_stream() << "Lemmas\n";
|
||||
for (unsigned i = 0; i < lemmas.size(); ++i) {
|
||||
verbose_stream() << mk_pp(lemmas[i].get(), m) << "\n";
|
||||
});
|
||||
|
||||
m_core->reset();
|
||||
m_core->append(lemmas);
|
||||
}
|
||||
|
||||
lbool prop_solver::check_assumptions(const expr_ref_vector & atoms) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue