3
0
Fork 0
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:
Copilot 2025-10-23 17:30:17 +02:00 committed by GitHub
parent 69e0793f6c
commit bfe6670b73
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 81 additions and 1 deletions

View file

@ -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);
}