mirror of
https://github.com/Z3Prover/z3
synced 2025-11-09 23:52:02 +00:00
Implement finite_set_decl_plugin with complete operator support and polymorphism infrastructure (#7961)
* Initial plan * Implement finite_sets_decl_plugin with all specified operations Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Add tests for finite_sets_decl_plugin Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Add set.singleton operator to finite_sets_decl_plugin Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Refactor finite_sets_decl_plugin to use polymorphic signatures and Array sorts Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Rename finite_sets to finite_set everywhere including file names Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Rename set.filter to set.select Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Refactor finite_set_decl_plugin to use polymorphism_util Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Move psig and match method to polymorphism_util Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Add MATCH macros and fix is_fully_interp return value Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Add is_finite_set helper and parameter count validation 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>
This commit is contained in:
parent
7356b5ff88
commit
df4052ec69
9 changed files with 572 additions and 0 deletions
|
|
@ -54,6 +54,7 @@ add_executable(test-z3
|
|||
expr_substitution.cpp
|
||||
ext_numeral.cpp
|
||||
f2n.cpp
|
||||
finite_set.cpp
|
||||
factor_rewriter.cpp
|
||||
finder.cpp
|
||||
fixed_bit_vector.cpp
|
||||
|
|
|
|||
133
src/test/finite_set.cpp
Normal file
133
src/test/finite_set.cpp
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
/*++
|
||||
Copyright (c) 2025 Microsoft Corporation
|
||||
|
||||
Module Name:
|
||||
|
||||
tst_finite_set.cpp
|
||||
|
||||
Abstract:
|
||||
|
||||
Test finite sets decl plugin
|
||||
|
||||
Author:
|
||||
|
||||
GitHub Copilot Agent 2025
|
||||
|
||||
Revision History:
|
||||
|
||||
--*/
|
||||
#include "ast/ast.h"
|
||||
#include "ast/finite_set_decl_plugin.h"
|
||||
#include "ast/reg_decl_plugins.h"
|
||||
#include "ast/arith_decl_plugin.h"
|
||||
#include "ast/array_decl_plugin.h"
|
||||
|
||||
static void tst_finite_set_basic() {
|
||||
ast_manager m;
|
||||
reg_decl_plugins(m);
|
||||
|
||||
finite_set_util fsets(m);
|
||||
arith_util arith(m);
|
||||
|
||||
// Test creating a finite set sort
|
||||
sort_ref int_sort(arith.mk_int(), m);
|
||||
parameter param(int_sort.get());
|
||||
sort_ref finite_set_int(m.mk_sort(fsets.get_family_id(), FINITE_SET_SORT, 1, ¶m), m);
|
||||
|
||||
ENSURE(fsets.is_finite_set(finite_set_int.get()));
|
||||
|
||||
// Test creating empty set
|
||||
app_ref empty_set(fsets.mk_empty(int_sort), m);
|
||||
ENSURE(fsets.is_empty(empty_set.get()));
|
||||
ENSURE(empty_set->get_sort() == finite_set_int.get());
|
||||
|
||||
// Test set.singleton
|
||||
expr_ref five(arith.mk_int(5), m);
|
||||
app_ref singleton_set(fsets.mk_singleton(five), m);
|
||||
ENSURE(fsets.is_singleton(singleton_set.get()));
|
||||
ENSURE(singleton_set->get_sort() == finite_set_int.get());
|
||||
|
||||
// Test set.range
|
||||
expr_ref zero(arith.mk_int(0), m);
|
||||
expr_ref ten(arith.mk_int(10), m);
|
||||
app_ref range_set(fsets.mk_range(zero, ten), m);
|
||||
ENSURE(fsets.is_range(range_set.get()));
|
||||
ENSURE(range_set->get_sort() == finite_set_int.get());
|
||||
|
||||
// Test set.union
|
||||
app_ref union_set(fsets.mk_union(empty_set, range_set), m);
|
||||
ENSURE(fsets.is_union(union_set.get()));
|
||||
ENSURE(union_set->get_sort() == finite_set_int.get());
|
||||
|
||||
// Test set.intersect
|
||||
app_ref intersect_set(fsets.mk_intersect(range_set, range_set), m);
|
||||
ENSURE(fsets.is_intersect(intersect_set.get()));
|
||||
ENSURE(intersect_set->get_sort() == finite_set_int.get());
|
||||
|
||||
// Test set.difference
|
||||
app_ref diff_set(fsets.mk_difference(range_set, empty_set), m);
|
||||
ENSURE(fsets.is_difference(diff_set.get()));
|
||||
ENSURE(diff_set->get_sort() == finite_set_int.get());
|
||||
|
||||
// Test set.in
|
||||
app_ref in_expr(fsets.mk_in(five, range_set), m);
|
||||
ENSURE(fsets.is_in(in_expr.get()));
|
||||
ENSURE(m.is_bool(in_expr->get_sort()));
|
||||
|
||||
// Test set.size
|
||||
app_ref size_expr(fsets.mk_size(range_set), m);
|
||||
ENSURE(fsets.is_size(size_expr.get()));
|
||||
ENSURE(arith.is_int(size_expr->get_sort()));
|
||||
|
||||
// Test set.subset
|
||||
app_ref subset_expr(fsets.mk_subset(empty_set, range_set), m);
|
||||
ENSURE(fsets.is_subset(subset_expr.get()));
|
||||
ENSURE(m.is_bool(subset_expr->get_sort()));
|
||||
}
|
||||
|
||||
static void tst_finite_set_map_select() {
|
||||
ast_manager m;
|
||||
reg_decl_plugins(m);
|
||||
|
||||
finite_set_util fsets(m);
|
||||
arith_util arith(m);
|
||||
array_util autil(m);
|
||||
|
||||
// Create Int and Bool sorts
|
||||
sort_ref int_sort(arith.mk_int(), m);
|
||||
sort_ref bool_sort(m.mk_bool_sort(), m);
|
||||
|
||||
// Create finite set sorts
|
||||
parameter int_param(int_sort.get());
|
||||
sort_ref finite_set_int(m.mk_sort(fsets.get_family_id(), FINITE_SET_SORT, 1, &int_param), m);
|
||||
|
||||
// Create Array (Int Int) sort for map
|
||||
sort_ref arr_int_int(autil.mk_array_sort(int_sort, int_sort), m);
|
||||
|
||||
// Create a const array (conceptually represents the function)
|
||||
app_ref arr_map(autil.mk_const_array(arr_int_int, arith.mk_int(42)), m);
|
||||
|
||||
// Create a set and test map
|
||||
expr_ref zero(arith.mk_int(0), m);
|
||||
expr_ref ten(arith.mk_int(10), m);
|
||||
app_ref range_set(fsets.mk_range(zero, ten), m);
|
||||
|
||||
app_ref mapped_set(fsets.mk_map(arr_map, range_set), m);
|
||||
ENSURE(fsets.is_map(mapped_set.get()));
|
||||
ENSURE(fsets.is_finite_set(mapped_set->get_sort()));
|
||||
|
||||
// Create Array (Int Bool) sort for select
|
||||
sort_ref arr_int_bool(autil.mk_array_sort(int_sort, bool_sort), m);
|
||||
|
||||
// Create a const array for select (conceptually represents predicate)
|
||||
app_ref arr_select(autil.mk_const_array(arr_int_bool, m.mk_true()), m);
|
||||
|
||||
app_ref selected_set(fsets.mk_select(arr_select, range_set), m);
|
||||
ENSURE(fsets.is_select(selected_set.get()));
|
||||
ENSURE(selected_set->get_sort() == finite_set_int.get());
|
||||
}
|
||||
|
||||
void tst_finite_set() {
|
||||
tst_finite_set_basic();
|
||||
tst_finite_set_map_select();
|
||||
}
|
||||
|
|
@ -282,4 +282,5 @@ int main(int argc, char ** argv) {
|
|||
TST(scoped_vector);
|
||||
TST(sls_seq_plugin);
|
||||
TST(ho_matcher);
|
||||
TST(finite_set);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue