3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-19 17:50:23 +00:00

add recfun to API

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2018-10-27 11:41:18 -05:00
parent c5cbf985ca
commit 51a0022450
11 changed files with 191 additions and 42 deletions

View file

@ -312,8 +312,8 @@ namespace recfun {
* Main manager for defined functions
*/
util::util(ast_manager & m, family_id id)
: m_manager(m), m_fid(id), m_th_rw(m),
util::util(ast_manager & m)
: m_manager(m), m_fid(m.get_family_id("recfun")), m_th_rw(m),
m_plugin(dynamic_cast<decl::plugin*>(m.get_plugin(m_fid))) {
}
@ -385,15 +385,15 @@ namespace recfun {
SASSERT(m_manager);
SASSERT(m_family_id != null_family_id);
if (!m_util.get()) {
m_util = alloc(util, *m_manager, m_family_id);
m_util = alloc(util, *m_manager);
}
return *(m_util.get());
}
promise_def plugin::mk_def(symbol const& name, unsigned n, sort *const * params, sort * range) {
SASSERT(! m_defs.contains(name));
def* d = u().decl_fun(name, n, params, range);
m_defs.insert(name, d);
SASSERT(! m_defs.contains(d->get_decl()));
m_defs.insert(d->get_decl(), d);
return promise_def(&u(), d);
}
@ -410,8 +410,8 @@ namespace recfun {
def* plugin::mk_def(symbol const& name, unsigned n, sort ** params, sort * range,
unsigned n_vars, var ** vars, expr * rhs) {
SASSERT(! m_defs.contains(name));
promise_def d = mk_def(name, n, params, range);
SASSERT(! m_defs.contains(d.get_def()->get_decl()));
set_definition(d, n_vars, vars, rhs);
return d.get_def();
}

View file

@ -140,7 +140,7 @@ namespace recfun {
namespace decl {
class plugin : public decl_plugin {
typedef map<symbol, def*, symbol_hash_proc, symbol_eq_proc> def_map;
typedef obj_map<func_decl, def*> def_map;
typedef obj_map<func_decl, case_def*> case_def_map;
mutable scoped_ptr<util> m_util;
@ -173,14 +173,14 @@ namespace recfun {
def* mk_def(symbol const& name, unsigned n, sort ** params, sort * range, unsigned n_vars, var ** vars, expr * rhs);
bool has_def(const symbol& s) const { return m_defs.contains(s); }
bool has_def(func_decl* f) const { return m_defs.contains(f); }
bool has_defs() const;
def const& get_def(const symbol& s) const { return *(m_defs[s]); }
promise_def get_promise_def(const symbol &s) const { return promise_def(&u(), m_defs[s]); }
def& get_def(symbol const& s) { return *(m_defs[s]); }
def const& get_def(func_decl* f) const { return *(m_defs[f]); }
promise_def get_promise_def(func_decl* f) const { return promise_def(&u(), m_defs[f]); }
def& get_def(func_decl* f) { return *(m_defs[f]); }
bool has_case_def(func_decl* f) const { return m_case_defs.contains(f); }
case_def& get_case_def(func_decl* f) { SASSERT(has_case_def(f)); return *(m_case_defs[f]); }
bool is_declared(symbol const& s) const { return m_defs.contains(s); }
//bool is_declared(symbol const& s) const { return m_defs.contains(s); }
};
}
@ -197,7 +197,7 @@ namespace recfun {
void set_definition(promise_def & d, unsigned n_vars, var * const * vars, expr * rhs);
public:
util(ast_manager &m, family_id);
util(ast_manager &m);
~util();
ast_manager & m() { return m_manager; }
@ -213,9 +213,10 @@ namespace recfun {
//<! add a function declaration
def * decl_fun(symbol const & s, unsigned n_args, sort *const * args, sort * range);
def& get_def(symbol const & s) {
SASSERT(m_plugin->has_def(s));
return m_plugin->get_def(s);
def& get_def(func_decl* f) {
SASSERT(m_plugin->has_def(f));
return m_plugin->get_def(f);
}
case_def& get_case_def(expr* e) {
@ -232,6 +233,8 @@ namespace recfun {
}
app_ref mk_depth_limit_pred(unsigned d);
decl::plugin& get_plugin() { return *m_plugin; }
};
}