3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-22 22:03:39 +00:00

Attempt bug fix

This commit is contained in:
Arie Gurfinkel 2017-12-18 13:04:19 -05:00
parent 981e521b18
commit 7b82ec1bee
2 changed files with 41 additions and 43 deletions

View file

@ -1178,7 +1178,7 @@ lemma::lemma (ast_manager &manager, expr * body, unsigned lvl) :
m_ref_count(0), m(manager), m_ref_count(0), m(manager),
m_body(body, m), m_cube(m), m_body(body, m), m_cube(m),
m_zks(m), m_bindings(m), m_lvl(lvl), m_zks(m), m_bindings(m), m_lvl(lvl),
m_pob(nullptr), m_new_pob(false) { m_pob(nullptr) {
SASSERT(m_body); SASSERT(m_body);
normalize(m_body, m_body); normalize(m_body, m_body);
} }
@ -1187,64 +1187,64 @@ lemma::lemma(pob_ref const &p) :
m_ref_count(0), m(p->get_ast_manager()), m_ref_count(0), m(p->get_ast_manager()),
m_body(m), m_cube(m), m_body(m), m_cube(m),
m_zks(m), m_bindings(m), m_lvl(p->level()), m_zks(m), m_bindings(m), m_lvl(p->level()),
m_pob(p), m_new_pob(m_pob) {SASSERT(m_pob); m_pob->get_skolems(m_zks);} m_pob(p) {
SASSERT(m_pob);
m_pob->get_skolems(m_zks);
add_binding(m_pob->get_binding());
}
lemma::lemma(pob_ref const &p, expr_ref_vector &cube, unsigned lvl) : lemma::lemma(pob_ref const &p, expr_ref_vector &cube, unsigned lvl) :
m_ref_count(0), m_ref_count(0),
m(p->get_ast_manager()), m(p->get_ast_manager()),
m_body(m), m_cube(m), m_body(m), m_cube(m),
m_zks(m), m_bindings(m), m_lvl(p->level()), m_zks(m), m_bindings(m), m_lvl(p->level()),
m_pob(p), m_new_pob(m_pob) m_pob(p)
{ {
if (m_pob) {m_pob->get_skolems(m_zks);} if (m_pob) {
m_pob->get_skolems(m_zks);
add_binding(m_pob->get_binding());
}
update_cube(p, cube); update_cube(p, cube);
set_level(lvl); set_level(lvl);
} }
void lemma::add_skolem(app *zk, app *b) {
SASSERT(m_bindings.size() == m_zks.size());
// extend bindings
m_bindings.push_back(b);
// extend skolems
m_zks.push_back(zk);
}
void lemma::mk_expr_core() { void lemma::mk_expr_core() {
if (m_body) return; if (m_body) return;
if (m_pob) { if (m_pob) {
mk_cube_core(); mk_cube_core();
}
// make a clause by negating the cube SASSERT(!m_cube.empty());
m_body = ::push_not(::mk_and(m_cube)); m_body = ::push_not(::mk_and(m_cube));
normalize(m_body, m_body); normalize(m_body, m_body);
if (!m_zks.empty() && has_zk_const(m_body)) { if (!m_zks.empty() && has_zk_const(m_body)) {
app_ref_vector zks(m); app_ref_vector zks(m);
zks.append(m_zks); zks.append(m_zks);
zks.reverse(); zks.reverse();
expr_abstract(m, 0, expr_abstract(m, 0,
zks.size(), (expr* const*)zks.c_ptr(), m_body, zks.size(), (expr* const*)zks.c_ptr(), m_body,
m_body); m_body);
ptr_buffer<sort> sorts; ptr_buffer<sort> sorts;
svector<symbol> names; svector<symbol> names;
for (unsigned i=0, sz=zks.size(); i < sz; ++i) { for (unsigned i=0, sz=zks.size(); i < sz; ++i) {
sorts.push_back(get_sort(zks.get(i))); sorts.push_back(get_sort(zks.get(i)));
names.push_back(zks.get(i)->get_decl()->get_name()); names.push_back(zks.get(i)->get_decl()->get_name());
}
m_body = m.mk_quantifier(true, zks.size(),
sorts.c_ptr(),
names.c_ptr(),
m_body, 15, symbol(m_body->get_id()));
if (m_new_pob) {
// XXX This assertion will fail when a lemma is
// XXX generalized with additional quantified variables
SASSERT(m_pob->get_binding().size() == m_zks.size());
add_binding(m_pob->get_binding());
}
} }
m_new_pob = false; m_body = m.mk_quantifier(true, zks.size(),
return; sorts.c_ptr(),
} names.c_ptr(),
else if (!m_cube.empty()) { m_body, 15, symbol(m_body->get_id()));
m_body = ::push_not(::mk_and(m_cube));
normalize(m_body, m_body);
return;
}
else {
UNREACHABLE();
} }
SASSERT(m_body); SASSERT(m_body);
} }

View file

@ -114,7 +114,6 @@ class lemma {
app_ref_vector m_bindings; app_ref_vector m_bindings;
unsigned m_lvl; unsigned m_lvl;
pob_ref m_pob; pob_ref m_pob;
bool m_new_pob;
void mk_expr_core(); void mk_expr_core();
void mk_cube_core(); void mk_cube_core();
@ -134,8 +133,7 @@ public:
pob_ref &get_pob() {return m_pob;} pob_ref &get_pob() {return m_pob;}
inline unsigned weakness(); inline unsigned weakness();
void add_skolems(app_ref_vector &zks) {m_zks.append(zks);} void add_skolem(app *zk, app* b);
void add_skolem(app *zk) {m_zks.push_back(zk);}
unsigned level () const {return m_lvl;} unsigned level () const {return m_lvl;}
void set_level (unsigned lvl) {m_lvl = lvl;} void set_level (unsigned lvl) {m_lvl = lvl;}