mirror of
https://github.com/Z3Prover/z3
synced 2025-05-08 00:05:46 +00:00
fixes to #1155 and partial introduction of SMTLIB 2.6 datatype format
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
2b0106c199
commit
a0a8bc2a62
13 changed files with 452 additions and 156 deletions
|
@ -258,6 +258,7 @@ protected:
|
|||
array_util m_arutil;
|
||||
fpa_util m_futil;
|
||||
seq_util m_sutil;
|
||||
datatype_util m_dtutil;
|
||||
|
||||
datalog::dl_decl_util m_dlutil;
|
||||
|
||||
|
@ -279,7 +280,7 @@ protected:
|
|||
}
|
||||
|
||||
public:
|
||||
pp_env(cmd_context & o):m_owner(o), m_autil(o.m()), m_bvutil(o.m()), m_arutil(o.m()), m_futil(o.m()), m_sutil(o.m()), m_dlutil(o.m()) {}
|
||||
pp_env(cmd_context & o):m_owner(o), m_autil(o.m()), m_bvutil(o.m()), m_arutil(o.m()), m_futil(o.m()), m_sutil(o.m()), m_dtutil(o.m()), m_dlutil(o.m()) {}
|
||||
virtual ~pp_env() {}
|
||||
virtual ast_manager & get_manager() const { return m_owner.m(); }
|
||||
virtual arith_util & get_autil() { return m_autil; }
|
||||
|
@ -287,6 +288,7 @@ public:
|
|||
virtual array_util & get_arutil() { return m_arutil; }
|
||||
virtual fpa_util & get_futil() { return m_futil; }
|
||||
virtual seq_util & get_sutil() { return m_sutil; }
|
||||
virtual datatype_util & get_dtutil() { return m_dtutil; }
|
||||
|
||||
virtual datalog::dl_decl_util& get_dlutil() { return m_dlutil; }
|
||||
virtual bool uses(symbol const & s) const {
|
||||
|
@ -1218,6 +1220,7 @@ void cmd_context::push() {
|
|||
scope & s = m_scopes.back();
|
||||
s.m_func_decls_stack_lim = m_func_decls_stack.size();
|
||||
s.m_psort_decls_stack_lim = m_psort_decls_stack.size();
|
||||
s.m_psort_inst_stack_lim = m_psort_inst_stack.size();
|
||||
s.m_macros_stack_lim = m_macros_stack.size();
|
||||
s.m_aux_pdecls_lim = m_aux_pdecls.size();
|
||||
s.m_assertions_lim = m_assertions.size();
|
||||
|
@ -1232,7 +1235,7 @@ void cmd_context::push(unsigned n) {
|
|||
push();
|
||||
}
|
||||
|
||||
void cmd_context::restore_func_decls(unsigned old_sz) {
|
||||
void cmd_context::restore_func_decls(unsigned old_sz) {
|
||||
SASSERT(old_sz <= m_func_decls_stack.size());
|
||||
svector<sf_pair>::iterator it = m_func_decls_stack.begin() + old_sz;
|
||||
svector<sf_pair>::iterator end = m_func_decls_stack.end();
|
||||
|
@ -1243,6 +1246,14 @@ void cmd_context::restore_func_decls(unsigned old_sz) {
|
|||
m_func_decls_stack.resize(old_sz);
|
||||
}
|
||||
|
||||
void cmd_context::restore_psort_inst(unsigned old_sz) {
|
||||
for (unsigned i = old_sz; i < m_psort_inst_stack.size(); ++i) {
|
||||
pdecl * s = m_psort_inst_stack[i];
|
||||
s->reset_cache(*m_pmanager);
|
||||
}
|
||||
m_psort_inst_stack.resize(old_sz);
|
||||
}
|
||||
|
||||
void cmd_context::restore_psort_decls(unsigned old_sz) {
|
||||
SASSERT(old_sz <= m_psort_decls_stack.size());
|
||||
svector<symbol>::iterator it = m_psort_decls_stack.begin() + old_sz;
|
||||
|
@ -1250,9 +1261,7 @@ void cmd_context::restore_psort_decls(unsigned old_sz) {
|
|||
for (; it != end; ++it) {
|
||||
symbol const & s = *it;
|
||||
psort_decl * d = 0;
|
||||
if (!m_psort_decls.find(s, d)) {
|
||||
UNREACHABLE();
|
||||
}
|
||||
VERIFY(m_psort_decls.find(s, d));
|
||||
pm().dec_ref(d);
|
||||
m_psort_decls.erase(s);
|
||||
}
|
||||
|
@ -1266,9 +1275,7 @@ void cmd_context::restore_macros(unsigned old_sz) {
|
|||
for (; it != end; ++it) {
|
||||
symbol const & s = *it;
|
||||
macro _m;
|
||||
if (!m_macros.find(s, _m)) {
|
||||
UNREACHABLE();
|
||||
}
|
||||
VERIFY (m_macros.find(s, _m));
|
||||
m().dec_ref(_m.second);
|
||||
m_macros.erase(s);
|
||||
}
|
||||
|
@ -1331,7 +1338,9 @@ void cmd_context::pop(unsigned n) {
|
|||
restore_macros(s.m_macros_stack_lim);
|
||||
restore_aux_pdecls(s.m_aux_pdecls_lim);
|
||||
restore_assertions(s.m_assertions_lim);
|
||||
restore_psort_inst(s.m_psort_inst_stack_lim);
|
||||
m_scopes.shrink(new_lvl);
|
||||
|
||||
}
|
||||
|
||||
void cmd_context::check_sat(unsigned num_assumptions, expr * const * assumptions) {
|
||||
|
@ -1810,7 +1819,7 @@ cmd_context::dt_eh::dt_eh(cmd_context & owner):
|
|||
cmd_context::dt_eh::~dt_eh() {
|
||||
}
|
||||
|
||||
void cmd_context::dt_eh::operator()(sort * dt) {
|
||||
void cmd_context::dt_eh::operator()(sort * dt, pdecl* pd) {
|
||||
TRACE("new_dt_eh", tout << "new datatype: "; m_owner.pm().display(tout, dt); tout << "\n";);
|
||||
ptr_vector<func_decl> const * constructors = m_dt_util.get_datatype_constructors(dt);
|
||||
unsigned num_constructors = constructors->size();
|
||||
|
@ -1829,8 +1838,13 @@ void cmd_context::dt_eh::operator()(sort * dt) {
|
|||
TRACE("new_dt_eh", tout << "new accessor: " << a->get_name() << "\n";);
|
||||
}
|
||||
}
|
||||
if (m_owner.m_scopes.size() > 0) {
|
||||
m_owner.m_psort_inst_stack.push_back(pd);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
std::ostream & operator<<(std::ostream & out, cmd_context::status st) {
|
||||
switch (st) {
|
||||
case cmd_context::UNSAT: out << "unsat"; break;
|
||||
|
|
|
@ -190,6 +190,8 @@ protected:
|
|||
svector<sf_pair> m_func_decls_stack;
|
||||
svector<symbol> m_psort_decls_stack;
|
||||
svector<symbol> m_macros_stack;
|
||||
ptr_vector<pdecl> m_psort_inst_stack;
|
||||
|
||||
//
|
||||
ptr_vector<pdecl> m_aux_pdecls;
|
||||
ptr_vector<expr> m_assertions;
|
||||
|
@ -201,6 +203,7 @@ protected:
|
|||
unsigned m_psort_decls_stack_lim;
|
||||
unsigned m_macros_stack_lim;
|
||||
unsigned m_aux_pdecls_lim;
|
||||
unsigned m_psort_inst_stack_lim;
|
||||
// only m_assertions_lim is relevant when m_global_decls = true
|
||||
unsigned m_assertions_lim;
|
||||
};
|
||||
|
@ -220,7 +223,7 @@ protected:
|
|||
public:
|
||||
dt_eh(cmd_context & owner);
|
||||
virtual ~dt_eh();
|
||||
virtual void operator()(sort * dt);
|
||||
virtual void operator()(sort * dt, pdecl* pd);
|
||||
};
|
||||
|
||||
friend class dt_eh;
|
||||
|
@ -246,6 +249,7 @@ protected:
|
|||
void restore_macros(unsigned old_sz);
|
||||
void restore_aux_pdecls(unsigned old_sz);
|
||||
void restore_assertions(unsigned old_sz);
|
||||
void restore_psort_inst(unsigned old_sz);
|
||||
|
||||
void erase_func_decl_core(symbol const & s, func_decl * f);
|
||||
void erase_psort_decl_core(symbol const & s);
|
||||
|
|
|
@ -123,6 +123,10 @@ sort * psort::find(sort * const * s) const {
|
|||
}
|
||||
|
||||
void psort::finalize(pdecl_manager & m) {
|
||||
reset_cache(m);
|
||||
}
|
||||
|
||||
void psort::reset_cache(pdecl_manager& m) {
|
||||
m.del_inst_cache(m_inst_cache);
|
||||
m_inst_cache = 0;
|
||||
}
|
||||
|
@ -171,10 +175,11 @@ public:
|
|||
if (other->hcons_kind() != hcons_kind())
|
||||
return false;
|
||||
return get_num_params() == other->get_num_params() && m_idx == static_cast<psort_var const *>(other)->m_idx;
|
||||
}
|
||||
}
|
||||
virtual void display(std::ostream & out) const {
|
||||
out << "s_" << m_idx;
|
||||
}
|
||||
unsigned idx() const { return m_idx; }
|
||||
};
|
||||
|
||||
class psort_app : public psort {
|
||||
|
@ -268,6 +273,10 @@ psort_decl::psort_decl(unsigned id, unsigned num_params, pdecl_manager & m, symb
|
|||
}
|
||||
|
||||
void psort_decl::finalize(pdecl_manager & m) {
|
||||
reset_cache(m);
|
||||
}
|
||||
|
||||
void psort_decl::reset_cache(pdecl_manager& m) {
|
||||
m.del_inst_cache(m_inst_cache);
|
||||
m_inst_cache = 0;
|
||||
}
|
||||
|
@ -284,6 +293,27 @@ sort * psort_decl::find(sort * const * s) {
|
|||
return m_inst_cache->find(s);
|
||||
}
|
||||
|
||||
#if 0
|
||||
psort_dt_decl::psort_dt_decl(unsigned id, unsigned num_params, pdecl_manager& m, symbol const& n):
|
||||
psort_decl(id, num_params, m, n) {
|
||||
}
|
||||
|
||||
void psort_dt_decl::finalize(pdecl_manager& m) {
|
||||
psort_decl::finalize(m);
|
||||
}
|
||||
|
||||
|
||||
sort * psort_dt_decl::instantiate(pdecl_manager & m, unsigned n, sort * const * s) {
|
||||
UNREACHABLE();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void psort_dt_decl::display(std::ostream & out) const {
|
||||
out << get_name() << " " << get_num_params();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
psort_user_decl::psort_user_decl(unsigned id, unsigned num_params, pdecl_manager & m, symbol const & n, psort * p):
|
||||
psort_decl(id, num_params, m, n),
|
||||
m_def(p) {
|
||||
|
@ -389,13 +419,15 @@ paccessor_decl::paccessor_decl(unsigned id, unsigned num_params, pdecl_manager &
|
|||
pdecl(id, num_params),
|
||||
m_name(n),
|
||||
m_type(r) {
|
||||
if (m_type.kind() == PTR_PSORT)
|
||||
if (m_type.kind() == PTR_PSORT) {
|
||||
m.inc_ref(r.get_psort());
|
||||
}
|
||||
}
|
||||
|
||||
void paccessor_decl::finalize(pdecl_manager & m) {
|
||||
if (m_type.kind() == PTR_PSORT)
|
||||
m.lazy_dec_ref(m_type.get_psort());
|
||||
if (m_type.kind() == PTR_PSORT) {
|
||||
m.lazy_dec_ref(m_type.get_psort());
|
||||
}
|
||||
}
|
||||
|
||||
bool paccessor_decl::has_missing_refs(symbol & missing) const {
|
||||
|
@ -576,13 +608,13 @@ sort * pdatatype_decl::instantiate(pdecl_manager & m, unsigned n, sort * const *
|
|||
dts.m_buffer.push_back(instantiate_decl(m, s));
|
||||
datatype_decl * d_ptr = dts.m_buffer[0];
|
||||
sort_ref_vector sorts(m.m());
|
||||
bool is_ok = m.get_dt_plugin()->mk_datatypes(1, &d_ptr, sorts);
|
||||
bool is_ok = m.get_dt_plugin()->mk_datatypes(1, &d_ptr, m_num_params, s, sorts);
|
||||
TRACE("pdatatype_decl", tout << "instantiating " << m_name << " is_ok: " << is_ok << "\n";);
|
||||
if (is_ok) {
|
||||
r = sorts.get(0);
|
||||
cache(m, s, r);
|
||||
m.save_info(r, this, n, s);
|
||||
m.notify_new_dt(r);
|
||||
m.notify_new_dt(r, this);
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
@ -651,7 +683,7 @@ bool pdatatypes_decl::instantiate(pdecl_manager & m, sort * const * s) {
|
|||
dts.m_buffer.push_back((*it)->instantiate_decl(m, s));
|
||||
}
|
||||
sort_ref_vector sorts(m.m());
|
||||
bool is_ok = m.get_dt_plugin()->mk_datatypes(dts.m_buffer.size(), dts.m_buffer.c_ptr(), sorts);
|
||||
bool is_ok = m.get_dt_plugin()->mk_datatypes(dts.m_buffer.size(), dts.m_buffer.c_ptr(), m_num_params, s, sorts);
|
||||
if (!is_ok)
|
||||
return false;
|
||||
it = m_datatypes.begin();
|
||||
|
@ -659,7 +691,7 @@ bool pdatatypes_decl::instantiate(pdecl_manager & m, sort * const * s) {
|
|||
sort * new_dt = sorts.get(i);
|
||||
(*it)->cache(m, s, new_dt);
|
||||
m.save_info(new_dt, *it, m_num_params, s);
|
||||
m.notify_new_dt(new_dt);
|
||||
m.notify_new_dt(new_dt, *it);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -853,6 +885,11 @@ psort_decl * pdecl_manager::mk_psort_user_decl(unsigned num_params, symbol const
|
|||
return new (a().allocate(sizeof(psort_user_decl))) psort_user_decl(m_id_gen.mk(), num_params, *this, n, def);
|
||||
}
|
||||
|
||||
|
||||
//psort_decl * pdecl_manager::mk_psort_dt_decl(unsigned num_params, symbol const & n) {
|
||||
// return new (a().allocate(sizeof(psort_dt_decl))) psort_dt_decl(m_id_gen.mk(), num_params, *this, n);
|
||||
//}
|
||||
|
||||
psort_decl * pdecl_manager::mk_psort_builtin_decl(symbol const & n, family_id fid, decl_kind k) {
|
||||
return new (a().allocate(sizeof(psort_builtin_decl))) psort_builtin_decl(m_id_gen.mk(), *this, n, fid, k);
|
||||
}
|
||||
|
@ -862,6 +899,7 @@ sort * pdecl_manager::instantiate(psort * p, unsigned num, sort * const * args)
|
|||
return p->instantiate(*this, args);
|
||||
}
|
||||
|
||||
|
||||
void pdecl_manager::del_decl_core(pdecl * p) {
|
||||
TRACE("pdecl_manager",
|
||||
tout << "del_decl_core:\n";
|
||||
|
|
|
@ -46,6 +46,7 @@ public:
|
|||
unsigned get_ref_count() const { return m_ref_count; }
|
||||
unsigned hash() const { return m_id; }
|
||||
virtual void display(std::ostream & out) const {}
|
||||
virtual void reset_cache(pdecl_manager& m) {}
|
||||
};
|
||||
|
||||
class psort_inst_cache;
|
||||
|
@ -75,6 +76,7 @@ public:
|
|||
virtual char const * hcons_kind() const = 0;
|
||||
virtual unsigned hcons_hash() const = 0;
|
||||
virtual bool hcons_eq(psort const * other) const = 0;
|
||||
virtual void reset_cache(pdecl_manager& m);
|
||||
};
|
||||
|
||||
// for hash consing
|
||||
|
@ -102,6 +104,7 @@ public:
|
|||
// Only builtin declarations can have a variable number of parameters.
|
||||
bool has_var_params() const { return m_num_params == PSORT_DECL_VAR_PARAMS; }
|
||||
symbol const & get_name() const { return m_name; }
|
||||
virtual void reset_cache(pdecl_manager& m);
|
||||
};
|
||||
|
||||
class psort_user_decl : public psort_decl {
|
||||
|
@ -131,6 +134,20 @@ public:
|
|||
virtual void display(std::ostream & out) const;
|
||||
};
|
||||
|
||||
#if 0
|
||||
class psort_dt_decl : public psort_decl {
|
||||
protected:
|
||||
friend class pdecl_manager;
|
||||
psort_dt_decl(unsigned id, unsigned num_params, pdecl_manager & m, symbol const & n);
|
||||
virtual size_t obj_size() const { return sizeof(psort_dt_decl); }
|
||||
virtual void finalize(pdecl_manager & m);
|
||||
virtual ~psort_dt_decl() {}
|
||||
public:
|
||||
virtual sort * instantiate(pdecl_manager & m, unsigned n, sort * const * s);
|
||||
virtual void display(std::ostream & out) const;
|
||||
};
|
||||
#endif
|
||||
|
||||
class datatype_decl_plugin;
|
||||
class datatype_decl;
|
||||
class constructor_decl;
|
||||
|
@ -246,7 +263,7 @@ public:
|
|||
class new_datatype_eh {
|
||||
public:
|
||||
virtual ~new_datatype_eh() {}
|
||||
virtual void operator()(sort * dt) = 0;
|
||||
virtual void operator()(sort * dt, pdecl* pd) = 0;
|
||||
};
|
||||
|
||||
class pdecl_manager {
|
||||
|
@ -279,10 +296,11 @@ public:
|
|||
small_object_allocator & a() const { return m_allocator; }
|
||||
family_id get_datatype_fid() const { return m_datatype_fid; }
|
||||
void set_new_datatype_eh(new_datatype_eh * eh) { m_new_dt_eh = eh; }
|
||||
psort * mk_psort_cnst(sort * s);
|
||||
psort * mk_psort_cnst(sort * s);
|
||||
psort * mk_psort_var(unsigned num_params, unsigned vidx);
|
||||
psort * mk_psort_app(unsigned num_params, psort_decl * d, unsigned num_args, psort * const * args);
|
||||
psort * mk_psort_app(psort_decl * d);
|
||||
// psort_decl * mk_psort_dt_decl(unsigned num_params, symbol const & n);
|
||||
psort_decl * mk_psort_user_decl(unsigned num_params, symbol const & n, psort * def);
|
||||
psort_decl * mk_psort_builtin_decl(symbol const & n, family_id fid, decl_kind k);
|
||||
paccessor_decl * mk_paccessor_decl(unsigned num_params, symbol const & s, ptype const & p);
|
||||
|
@ -304,7 +322,7 @@ public:
|
|||
void dec_ref(unsigned num, T * const * ps) { lazy_dec_ref(num, ps); del_decls(); }
|
||||
psort_inst_cache * mk_inst_cache(unsigned num_params);
|
||||
void del_inst_cache(psort_inst_cache * c);
|
||||
void notify_new_dt(sort * dt) { if (m_new_dt_eh) (*m_new_dt_eh)(dt); }
|
||||
void notify_new_dt(sort * dt, pdecl* pd) { if (m_new_dt_eh) (*m_new_dt_eh)(dt, pd); }
|
||||
datatype_decl_plugin * get_dt_plugin() const;
|
||||
|
||||
void save_info(sort * s, psort_decl * d, unsigned num_args, sort * const * args);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue