Skip to main content
The finite sets theory provides reasoning about finite sets with explicit cardinality tracking, unlike the array-based set encoding. This theory is useful for combinatorial problems and set algebra with bounded domains.

Finite Set Sort

Create a finite set sort over an element type:
C API: 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:
C API: Z3_mk_finite_set_empty(c, set_sort) (api_finite_set.cpp:59)

Singleton Set

Create a set with one element:
C API: Z3_mk_finite_set_singleton(c, elem) (api_finite_set.cpp:69)

Set from Range

Create a set containing all integers in a range:
C API: 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:
C API: Z3_mk_finite_set_union(c, s1, s2) (api_finite_set.cpp:80)

Intersection

Get common elements:
C API: Z3_mk_finite_set_intersect(c, s1, s2) (api_finite_set.cpp:92)

Difference

Remove elements of one set from another:
C API: Z3_mk_finite_set_difference(c, s1, s2) (api_finite_set.cpp:104)

Set Predicates

Membership

Test if an element is in a set:
C API: Z3_mk_finite_set_member(c, elem, set) (api_finite_set.cpp:116)

Subset

Test if one set is contained in another:
C API: Z3_mk_finite_set_subset(c, s1, s2) (api_finite_set.cpp:139)

Cardinality

Set Size

Get the number of elements in a set:
C API: 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:
C API: Z3_mk_finite_set_map(c, f, set) (api_finite_set.cpp:151)

Filter

Select elements satisfying a predicate:
C API: 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

  1. Explicit Cardinality: Size is a first-class concept
  2. Bounded Domains: Better for finite universe problems
  3. Combinatorial Reasoning: Natural encoding for counting problems
  4. 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

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