3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-11-05 13:56:03 +00:00

Revert finite_set_decl_plugin changes and disable difference rule

Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2025-10-14 09:25:30 +00:00
parent 3e81681a99
commit 4ad33caf99
4 changed files with 9 additions and 23 deletions

View file

@ -139,10 +139,7 @@ func_decl * finite_set_decl_plugin::mk_func_decl(decl_kind k, unsigned num_param
m_manager->raise_exception("set.empty requires one sort parameter"); m_manager->raise_exception("set.empty requires one sort parameter");
return nullptr; return nullptr;
} }
sort* element_sort = to_sort(parameters[0].get_ast()); range = to_sort(parameters[0].get_ast());
// Create finite_set_sort from element_sort
parameter set_param(element_sort);
range = m_manager->mk_sort(m_family_id, FINITE_SET_SORT, 1, &set_param);
} }
return mk_empty(range); return mk_empty(range);
case OP_FINITE_SET_SINGLETON: case OP_FINITE_SET_SINGLETON:

View file

@ -63,22 +63,10 @@ br_status finite_set_rewriter::mk_intersect(unsigned num_args, expr * const * ar
br_status finite_set_rewriter::mk_difference(expr * arg1, expr * arg2, expr_ref & result) { br_status finite_set_rewriter::mk_difference(expr * arg1, expr * arg2, expr_ref & result) {
// set.difference(x, x) -> set.empty // set.difference(x, x) -> set.empty
if (arg1 == arg2) { // Note: This simplification is currently disabled due to issues with mk_empty
// Get the set sort // in finite_set_decl_plugin. The mk_empty utility function expects an element_sort
sort* set_sort = arg1->get_sort(); // but the plugin's mk_empty expects a finite_set_sort, causing conflicts.
SASSERT(m_util.is_finite_set(set_sort)); // TODO: Re-enable once finite_set_decl_plugin is fixed
// Create empty set with the same set sort
// We need to get the element sort from the parameters
if (set_sort->get_num_parameters() > 0) {
parameter const& param = set_sort->get_parameter(0);
if (param.is_ast() && is_sort(param.get_ast())) {
sort* elem_sort = to_sort(param.get_ast());
result = m_util.mk_empty(elem_sort);
return BR_DONE;
}
}
}
return BR_FAILED; return BR_FAILED;
} }

View file

@ -16,7 +16,7 @@ Sample rewrite rules:
set.subset(x,y) -> set.intersect(x,y) = x set.subset(x,y) -> set.intersect(x,y) = x
set.union(x, x) -> x set.union(x, x) -> x
set.intersect(x, x) -> x set.intersect(x, x) -> x
set.difference(x, x) -> set.empty set.difference(x, x) -> set.empty (currently disabled due to mk_empty issues)
Generally this module implements basic algebraic simplification rules for finite sets Generally this module implements basic algebraic simplification rules for finite sets
where the signature is defined in finite_set_decl_plugin.h. where the signature is defined in finite_set_decl_plugin.h.

View file

@ -82,11 +82,12 @@ static void test_difference_same() {
app_ref s1(fsets.mk_range(zero, ten), m); app_ref s1(fsets.mk_range(zero, ten), m);
// Test set.difference(s1, s1) -> empty // Test set.difference(s1, s1) -> empty
// Note: This simplification is currently disabled due to issues with mk_empty
expr_ref result(m); expr_ref result(m);
br_status st = rw.mk_difference(s1, s1, result); br_status st = rw.mk_difference(s1, s1, result);
ENSURE(st == BR_DONE); // Currently disabled, so should return BR_FAILED
ENSURE(fsets.is_empty(result)); ENSURE(st == BR_FAILED);
} }
static void test_subset_rewrite() { static void test_subset_rewrite() {