3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-02-16 05:41:43 +00:00

fixes to finite domain arrays

- relevancy could be off and array solver doesn't compensate, #7544
- enforce equalities across store for small domain axioms #8065
This commit is contained in:
Nikolaj Bjorner 2025-12-26 12:04:57 -08:00
parent c12425c86f
commit e4cdbe0035
4 changed files with 61 additions and 67 deletions

View file

@ -407,10 +407,45 @@ namespace smt {
var_data * d = m_var_data[v];
if (d->m_prop_upward && instantiate_axiom2b_for(v))
r = FC_CONTINUE;
}
}
return r;
}
bool theory_array::has_unitary_domain(app *array_term) {
SASSERT(is_array_sort(array_term));
sort *s = array_term->get_sort();
unsigned dim = get_dimension(s);
parameter const *params = s->get_info()->get_parameters();
for (unsigned i = 0; i < dim; ++i) {
SASSERT(params[i].is_ast());
sort *d = to_sort(params[i].get_ast());
if (d->is_infinite() || d->is_very_big() || 1 != d->get_num_elements().size())
return false;
}
return true;
}
bool theory_array::has_large_domain(app *array_term, rational& sz) {
SASSERT(is_array_sort(array_term));
sort *s = array_term->get_sort();
unsigned dim = get_dimension(s);
parameter const *params = s->get_info()->get_parameters();
sz = rational(1);
for (unsigned i = 0; i < dim; ++i) {
SASSERT(params[i].is_ast());
sort *d = to_sort(params[i].get_ast());
if (d->is_infinite() || d->is_very_big()) {
return true;
}
sz *= rational(d->get_num_elements().size(), rational::ui64());
if (sz >= rational(1 << 14)) {
return true;
}
}
return false;
}
final_check_status theory_array::mk_interface_eqs_at_final_check() {
unsigned n = mk_interface_eqs();
m_stats.m_num_eq_splits += n;