mirror of
https://github.com/Z3Prover/z3
synced 2026-02-20 15:34:41 +00:00
Fix finite_set sort cardinality computation for finite base sorts (#7997)
* Initial plan * Implement cardinality computation for finite_set sorts - Modified mk_sort in finite_set_decl_plugin.cpp to compute 2^|s| for finite base sorts - If base sort size > 30, mark finite_set sort as very_big - Added comprehensive tests to verify sort size calculations - All tests pass successfully Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Update finite_set_decl_plugin.cpp * Fix unit tests for infinite base sorts Updated test to check is_infinite() instead of is_very_big() for FiniteSet(Int) since infinite element sorts now result in infinite FiniteSet sorts (not very_big). Also updated comment to clarify the behavior. Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> Co-authored-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
69e0793f6c
commit
bfe6670b73
2 changed files with 81 additions and 1 deletions
|
|
@ -85,7 +85,26 @@ sort * finite_set_decl_plugin::mk_sort(decl_kind k, unsigned num_parameters, par
|
|||
return nullptr;
|
||||
}
|
||||
sort * element_sort = to_sort(parameters[0].get_ast());
|
||||
sort_size sz = sort_size::mk_very_big();
|
||||
sort_size sz;
|
||||
|
||||
// Compute the size of the finite_set sort based on the element sort
|
||||
sort_size const& elem_sz = element_sort->get_num_elements();
|
||||
if (elem_sz.is_finite() && !elem_sz.is_very_big()) {
|
||||
uint64_t elem_size = elem_sz.size();
|
||||
// If elem_size > 30, the powerset would be > 2^30, so mark as very_big
|
||||
if (elem_size > 30) {
|
||||
sz = sort_size::mk_very_big();
|
||||
}
|
||||
else {
|
||||
// Compute 2^elem_size
|
||||
sz = sort_size(rational::power_of_two(static_cast<unsigned>(elem_size)));
|
||||
}
|
||||
}
|
||||
else {
|
||||
// If element sort is infinite or very_big, the finite_set has the same size
|
||||
sz = elem_sz;
|
||||
}
|
||||
|
||||
sort_info info(m_family_id, FINITE_SET_SORT, sz, num_parameters, parameters);
|
||||
return m_manager->mk_sort(symbol("FiniteSet"), info);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue