Finite Set Sort
Create a finite set sort over an element type:Z3_mk_finite_set_sort(c, elem_sort) creates finite set sort (api_finite_set.cpp:27)
Check Sort
Verify if a sort is a finite set: C API:Z3_is_finite_set_sort(c, s) (api_finite_set.cpp:38)
Get Element Sort
Retrieve the element sort of a finite set: C API:Z3_get_finite_set_sort_basis(c, s) (api_finite_set.cpp:46)
Set Construction
Empty Set
Create an empty set:Z3_mk_finite_set_empty(c, set_sort) (api_finite_set.cpp:59)
Singleton Set
Create a set with one element:Z3_mk_finite_set_singleton(c, elem) (api_finite_set.cpp:69)
Set from Range
Create a set containing all integers in a range:Z3_mk_finite_set_range(c, low, high) creates set containing low through high (api_finite_set.cpp:175)
Set Operations
Union
Combine two sets:Z3_mk_finite_set_union(c, s1, s2) (api_finite_set.cpp:80)
Intersection
Get common elements:Z3_mk_finite_set_intersect(c, s1, s2) (api_finite_set.cpp:92)
Difference
Remove elements of one set from another:Z3_mk_finite_set_difference(c, s1, s2) (api_finite_set.cpp:104)
Set Predicates
Membership
Test if an element is in a set:Z3_mk_finite_set_member(c, elem, set) (api_finite_set.cpp:116)
Subset
Test if one set is contained in another:Z3_mk_finite_set_subset(c, s1, s2) (api_finite_set.cpp:139)
Cardinality
Set Size
Get the number of elements in a set:Z3_mk_finite_set_size(c, set) returns integer representing cardinality (api_finite_set.cpp:128)
Cardinality Constraints
Reason about set sizes:Higher-Order Operations
Map
Apply a function to all elements:Z3_mk_finite_set_map(c, f, set) (api_finite_set.cpp:151)
Filter
Select elements satisfying a predicate:Z3_mk_finite_set_filter(c, f, set) (api_finite_set.cpp:163)
Complete Examples
Example 1: Set Cover Problem
Example 2: Partition Problem
Example 3: Graph Coloring
Example 4: Combinatorial Constraints
Example 5: Cardinality-Based Reasoning
Example 6: Bounded Quantification
Advantages Over Array-Based Sets
- Explicit Cardinality: Size is a first-class concept
- Bounded Domains: Better for finite universe problems
- Combinatorial Reasoning: Natural encoding for counting problems
- Performance: Can be more efficient for cardinality-heavy constraints
Limitations
- Only for finite sets (unbounded sets use array theory)
- May not be available in all Z3 bindings (C API most complete)
- Element type must have decidable equality
Use Cases
- Combinatorial Optimization: Set cover, partition, packing problems
- Resource Allocation: Assign items to bins with capacity constraints
- Graph Algorithms: Coloring, independent sets, cliques
- Database Queries: Set operations with cardinality constraints
- Type Systems: Intersection types, type sets
Comparison with Array-Based Sets
| Feature | Finite Sets | Array-Based Sets |
|---|---|---|
| Cardinality | Direct | Via axioms |
| Domain | Finite | Potentially infinite |
| Operations | Set-theoretic | Array select/store |
| Use Case | Combinatorics | General sets |
Implementation Notes
- Finite sets compile to constraints on cardinality
- Uses specialized decision procedures for set algebra
- Cardinality bounds help prune search space
- May use BDD-based representations internally
API Summary
C API Functions (api_finite_set.cpp):- Sort:
Z3_mk_finite_set_sort,Z3_is_finite_set_sort,Z3_get_finite_set_sort_basis - Construction:
Z3_mk_finite_set_empty,Z3_mk_finite_set_singleton,Z3_mk_finite_set_range - Operations:
Z3_mk_finite_set_union,Z3_mk_finite_set_intersect,Z3_mk_finite_set_difference - Predicates:
Z3_mk_finite_set_member,Z3_mk_finite_set_subset - Cardinality:
Z3_mk_finite_set_size - Higher-order:
Z3_mk_finite_set_map,Z3_mk_finite_set_filter
References
- Implementation:
src/api/api_finite_set.cpp - Theory plugin: Finite sets theory
- Related: Array theory for infinite sets
