mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 09:05:31 +00:00
support for smtlib2.6 datatype parsing
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
5492d0e135
commit
5d17e28667
29 changed files with 374 additions and 206 deletions
|
@ -65,7 +65,7 @@ namespace datalog {
|
|||
else if (m_dt.is_accessor(n)) {
|
||||
sort* s = m.get_sort(n->get_arg(0));
|
||||
SASSERT(m_dt.is_datatype(s));
|
||||
if (m_dt.get_datatype_constructors(s).size() > 1) {
|
||||
if (m_dt.get_datatype_constructors(s)->size() > 1) {
|
||||
m_found = true;
|
||||
m_func = n->get_decl();
|
||||
}
|
||||
|
|
|
@ -191,7 +191,7 @@ void rule_properties::operator()(app* n) {
|
|||
else if (m_dt.is_accessor(n)) {
|
||||
sort* s = m.get_sort(n->get_arg(0));
|
||||
SASSERT(m_dt.is_datatype(s));
|
||||
if (m_dt.get_datatype_constructors(s).size() > 1) {
|
||||
if (m_dt.get_datatype_constructors(s)->size() > 1) {
|
||||
m_uninterp_funs.insert(n->get_decl(), m_rule);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -808,7 +808,7 @@ namespace datalog {
|
|||
datatype_util dtu(m);
|
||||
ptr_vector<sort> sorts;
|
||||
func_decl* p = r.get_decl();
|
||||
ptr_vector<func_decl> const& succs = dtu.get_datatype_constructors(m.get_sort(path));
|
||||
ptr_vector<func_decl> const& succs = *dtu.get_datatype_constructors(m.get_sort(path));
|
||||
// populate substitution of bound variables.
|
||||
r.get_vars(m, sorts);
|
||||
sub.reset();
|
||||
|
@ -871,8 +871,8 @@ namespace datalog {
|
|||
path_var = m.mk_var(0, m_path_sort);
|
||||
trace_var = m.mk_var(1, pred_sort);
|
||||
// sort* sorts[2] = { pred_sort, m_path_sort };
|
||||
ptr_vector<func_decl> const& cnstrs = dtu.get_datatype_constructors(pred_sort);
|
||||
ptr_vector<func_decl> const& succs = dtu.get_datatype_constructors(m_path_sort);
|
||||
ptr_vector<func_decl> const& cnstrs = *dtu.get_datatype_constructors(pred_sort);
|
||||
ptr_vector<func_decl> const& succs = *dtu.get_datatype_constructors(m_path_sort);
|
||||
SASSERT(cnstrs.size() == rls.size());
|
||||
pred = m.mk_app(mk_predicate(p), trace_var.get(), path_var.get());
|
||||
for (unsigned i = 0; i < rls.size(); ++i) {
|
||||
|
@ -970,7 +970,7 @@ namespace datalog {
|
|||
_name << pred->get_name() << "_" << q->get_name() << j;
|
||||
symbol name(_name.str().c_str());
|
||||
type_ref tr(idx);
|
||||
accs.push_back(mk_accessor_decl(name, tr));
|
||||
accs.push_back(mk_accessor_decl(m, name, tr));
|
||||
}
|
||||
std::stringstream _name;
|
||||
_name << pred->get_name() << "_" << i;
|
||||
|
@ -979,7 +979,7 @@ namespace datalog {
|
|||
symbol is_name(_name.str().c_str());
|
||||
cnstrs.push_back(mk_constructor_decl(name, is_name, accs.size(), accs.c_ptr()));
|
||||
}
|
||||
dts.push_back(mk_datatype_decl(dtu, pred->get_name(), cnstrs.size(), cnstrs.c_ptr()));
|
||||
dts.push_back(mk_datatype_decl(dtu, pred->get_name(), 0, nullptr, cnstrs.size(), cnstrs.c_ptr()));
|
||||
}
|
||||
|
||||
|
||||
|
@ -1024,10 +1024,10 @@ namespace datalog {
|
|||
_name2 << "get_succ#" << i;
|
||||
ptr_vector<accessor_decl> accs;
|
||||
type_ref tr(0);
|
||||
accs.push_back(mk_accessor_decl(name, tr));
|
||||
accs.push_back(mk_accessor_decl(m, name, tr));
|
||||
cnstrs.push_back(mk_constructor_decl(name, is_name, accs.size(), accs.c_ptr()));
|
||||
}
|
||||
dts.push_back(mk_datatype_decl(dtu, symbol("Path"), cnstrs.size(), cnstrs.c_ptr()));
|
||||
dts.push_back(mk_datatype_decl(dtu, symbol("Path"), 0, nullptr, cnstrs.size(), cnstrs.c_ptr()));
|
||||
VERIFY (dtp->mk_datatypes(dts.size(), dts.c_ptr(), 0, 0, new_sorts));
|
||||
m_path_sort = new_sorts[0].get();
|
||||
}
|
||||
|
@ -1039,8 +1039,8 @@ namespace datalog {
|
|||
sort* trace_sort = m.get_sort(trace);
|
||||
func_decl* p = m_sort2pred.find(trace_sort);
|
||||
datalog::rule_vector const& rules = b.m_rules.get_predicate_rules(p);
|
||||
ptr_vector<func_decl> const& cnstrs = dtu.get_datatype_constructors(trace_sort);
|
||||
ptr_vector<func_decl> const& succs = dtu.get_datatype_constructors(m_path_sort);
|
||||
ptr_vector<func_decl> const& cnstrs = *dtu.get_datatype_constructors(trace_sort);
|
||||
ptr_vector<func_decl> const& succs = *dtu.get_datatype_constructors(m_path_sort);
|
||||
for (unsigned i = 0; i < cnstrs.size(); ++i) {
|
||||
if (trace->get_decl() == cnstrs[i]) {
|
||||
svector<std::pair<unsigned, unsigned> > positions;
|
||||
|
|
|
@ -135,7 +135,7 @@ namespace pdr {
|
|||
func_decl* f = to_app(val)->get_decl();
|
||||
func_decl* r = dt.get_constructor_recognizer(f);
|
||||
conjs[i] = m.mk_app(r, c);
|
||||
ptr_vector<func_decl> const& acc = dt.get_constructor_accessors(f);
|
||||
ptr_vector<func_decl> const& acc = *dt.get_constructor_accessors(f);
|
||||
for (unsigned j = 0; j < acc.size(); ++j) {
|
||||
conjs.push_back(m.mk_eq(apply_accessor(acc, j, f, c), to_app(val)->get_arg(j)));
|
||||
}
|
||||
|
|
|
@ -711,7 +711,7 @@ void expand_literals(ast_manager &m, expr_ref_vector& conjs)
|
|||
func_decl* f = to_app(val)->get_decl();
|
||||
func_decl* r = dt.get_constructor_recognizer(f);
|
||||
conjs[i] = m.mk_app(r, c);
|
||||
ptr_vector<func_decl> const& acc = dt.get_constructor_accessors(f);
|
||||
ptr_vector<func_decl> const& acc = *dt.get_constructor_accessors(f);
|
||||
for (unsigned j = 0; j < acc.size(); ++j) {
|
||||
conjs.push_back(m.mk_eq(apply_accessor(m, acc, j, f, c), to_app(val)->get_arg(j)));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue