mirror of
https://github.com/Z3Prover/z3
synced 2025-11-06 06:16:02 +00:00
Refactor finite_set_value_factory for value handling
This commit is contained in:
parent
ab642f4c89
commit
48a8269a8d
1 changed files with 14 additions and 29 deletions
|
|
@ -15,7 +15,7 @@ Abstract:
|
||||||
|
|
||||||
finite_set_value_factory::finite_set_value_factory(ast_manager & m, family_id fid, model_core & md):
|
finite_set_value_factory::finite_set_value_factory(ast_manager & m, family_id fid, model_core & md):
|
||||||
struct_factory(m, fid, md),
|
struct_factory(m, fid, md),
|
||||||
m_util(m) {
|
u(m) {
|
||||||
}
|
}
|
||||||
|
|
||||||
expr * finite_set_value_factory::get_some_value(sort * s) {
|
expr * finite_set_value_factory::get_some_value(sort * s) {
|
||||||
|
|
@ -24,41 +24,26 @@ expr * finite_set_value_factory::get_some_value(sort * s) {
|
||||||
SASSERT(u.is_finite_set(s));
|
SASSERT(u.is_finite_set(s));
|
||||||
if (m_sort2value_set.find(s, set) && !set->empty())
|
if (m_sort2value_set.find(s, set) && !set->empty())
|
||||||
return *(set->begin());
|
return *(set->begin());
|
||||||
|
return u.mk_empty(s);
|
||||||
// For sets, return an empty set
|
|
||||||
if (m_util.is_array(s)) {
|
|
||||||
expr * empty = m_util.mk_empty_set(s);
|
|
||||||
register_value(empty);
|
|
||||||
return empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
expr * finite_set_value_factory::get_fresh_value(sort * s) {
|
expr * finite_set_value_factory::get_fresh_value(sort * s) {
|
||||||
|
sort* elem_sort = nullptr;
|
||||||
|
VERIFY(u.is_finite_set(s, elem_sort));
|
||||||
// Get a fresh value for a finite set sort
|
// Get a fresh value for a finite set sort
|
||||||
value_set * set = get_value_set(s);
|
value_set * set = get_value_set(s);
|
||||||
|
|
||||||
// If no values have been generated yet, use get_some_value
|
// If no values have been generated yet, use get_some_value
|
||||||
if (set->empty())
|
if (set->empty()) {
|
||||||
return get_some_value(s);
|
auto r = u.mk_empty(s);
|
||||||
|
set->insert(r);
|
||||||
// For sets represented as arrays
|
return r;
|
||||||
if (m_util.is_array(s)) {
|
}
|
||||||
// Get the element sort (domain of the array)
|
auto e = md.get_fresh_value(elem_sort);
|
||||||
sort * elem_sort = get_array_domain(s, 0);
|
if (e) {
|
||||||
|
auto r = u.mk_singleton(e);
|
||||||
// Try to get a fresh value from the element domain
|
set->insert(r);
|
||||||
expr * fresh_elem = m_model.get_fresh_value(elem_sort);
|
return r;
|
||||||
if (fresh_elem != nullptr) {
|
|
||||||
// Create a singleton set with the fresh element
|
|
||||||
// Start with an empty set and add the element
|
|
||||||
expr * empty = m_util.mk_empty_set(s);
|
|
||||||
expr * args[3] = { empty, fresh_elem, m_manager.mk_true() };
|
|
||||||
expr * singleton = m_util.mk_store(3, args);
|
|
||||||
register_value(singleton);
|
|
||||||
return singleton;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// For finite domains, we may not be able to generate fresh values
|
// For finite domains, we may not be able to generate fresh values
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue