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:
parent
c12425c86f
commit
e4cdbe0035
4 changed files with 61 additions and 67 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue