mirror of
https://github.com/Z3Prover/z3
synced 2025-06-18 20:03:38 +00:00
Fix more issues unintepreted sort tests.
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
943e142bfa
commit
0af4384882
2 changed files with 58 additions and 44 deletions
|
@ -165,6 +165,7 @@ void static_features::update_core(expr * e) {
|
|||
// even if a benchmark does not contain any theory interpreted function decls, we still have to install
|
||||
// the theory if the benchmark contains constants or function applications of an interpreted sort.
|
||||
sort * s = m_manager.get_sort(e);
|
||||
if (!m_manager.is_uninterp(s))
|
||||
mark_theory(s->get_family_id());
|
||||
|
||||
bool _is_gate = is_gate(e);
|
||||
|
@ -255,10 +256,12 @@ void static_features::update_core(expr * e) {
|
|||
m_num_simple_eqs++;
|
||||
}
|
||||
sort * s = m_manager.get_sort(to_app(e)->get_arg(0));
|
||||
if (!m_manager.is_uninterp(s)) {
|
||||
family_id fid = s->get_family_id();
|
||||
if (fid != null_family_id && fid != m_bfid)
|
||||
inc_theory_eqs(fid);
|
||||
}
|
||||
}
|
||||
if (!m_has_int && m_autil.is_int(e))
|
||||
m_has_int = true;
|
||||
if (!m_has_real && m_autil.is_real(e))
|
||||
|
@ -295,11 +298,13 @@ void static_features::update_core(expr * e) {
|
|||
if (to_app(e)->get_num_args() == 0) {
|
||||
m_num_uninterpreted_constants++;
|
||||
sort * s = m_manager.get_sort(e);
|
||||
if (!m_manager.is_uninterp(s)) {
|
||||
family_id fid = s->get_family_id();
|
||||
if (fid != null_family_id && fid != m_bfid)
|
||||
inc_theory_constants(fid);
|
||||
}
|
||||
}
|
||||
}
|
||||
func_decl * d = to_app(e)->get_decl();
|
||||
inc_num_apps(d);
|
||||
if (d->get_arity() > 0 && !is_marked(d)) {
|
||||
|
@ -312,6 +317,7 @@ void static_features::update_core(expr * e) {
|
|||
for (unsigned i = 0; i < num_args; i++) {
|
||||
expr * arg = to_app(e)->get_arg(i);
|
||||
sort * arg_s = m_manager.get_sort(arg);
|
||||
if (!m_manager.is_uninterp(arg_s)) {
|
||||
family_id fid_arg = arg_s->get_family_id();
|
||||
if (fid_arg != fid && fid_arg != null_family_id) {
|
||||
m_num_aliens++;
|
||||
|
@ -330,6 +336,7 @@ void static_features::update_core(expr * e) {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void static_features::process(expr * e, bool form_ctx, bool or_and_ctx, bool ite_ctx, unsigned stack_depth) {
|
||||
|
|
|
@ -526,33 +526,39 @@ bool proto_model::is_finite(sort * s) const {
|
|||
}
|
||||
|
||||
expr * proto_model::get_some_value(sort * s) {
|
||||
family_id fid = s->get_family_id();
|
||||
if (fid == null_family_id) {
|
||||
if (m_manager.is_uninterp(s)) {
|
||||
return m_user_sort_factory->get_some_value(s);
|
||||
}
|
||||
else {
|
||||
family_id fid = s->get_family_id();
|
||||
value_factory * f = get_factory(fid);
|
||||
if (f)
|
||||
return f->get_some_value(s);
|
||||
// there is no factory for the family id, then assume s is uninterpreted.
|
||||
return m_user_sort_factory->get_some_value(s);
|
||||
}
|
||||
}
|
||||
|
||||
bool proto_model::get_some_values(sort * s, expr_ref & v1, expr_ref & v2) {
|
||||
family_id fid = s->get_family_id();
|
||||
if (fid == null_family_id) {
|
||||
if (m_manager.is_uninterp(s)) {
|
||||
return m_user_sort_factory->get_some_values(s, v1, v2);
|
||||
}
|
||||
else {
|
||||
family_id fid = s->get_family_id();
|
||||
value_factory * f = get_factory(fid);
|
||||
if (f)
|
||||
return f->get_some_values(s, v1, v2);
|
||||
else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
expr * proto_model::get_fresh_value(sort * s) {
|
||||
family_id fid = s->get_family_id();
|
||||
if (fid == null_family_id)
|
||||
if (m_manager.is_uninterp(s)) {
|
||||
return m_user_sort_factory->get_fresh_value(s);
|
||||
}
|
||||
else {
|
||||
family_id fid = s->get_family_id();
|
||||
value_factory * f = get_factory(fid);
|
||||
if (f)
|
||||
return f->get_fresh_value(s);
|
||||
|
@ -560,15 +566,16 @@ expr * proto_model::get_fresh_value(sort * s) {
|
|||
// Use user_sort_factory if the theory has no support for model construnction.
|
||||
// This is needed when dummy theories are used for arithmetic or arrays.
|
||||
return m_user_sort_factory->get_fresh_value(s);
|
||||
}
|
||||
}
|
||||
|
||||
void proto_model::register_value(expr * n) {
|
||||
sort * s = m_manager.get_sort(n);
|
||||
family_id fid = s->get_family_id();
|
||||
if (fid == null_family_id) {
|
||||
if (m_manager.is_uninterp(s)) {
|
||||
m_user_sort_factory->register_value(n);
|
||||
}
|
||||
else {
|
||||
family_id fid = s->get_family_id();
|
||||
value_factory * f = get_factory(fid);
|
||||
if (f)
|
||||
f->register_value(n);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue