mirror of
https://github.com/Z3Prover/z3
synced 2025-11-04 21:39:13 +00:00
Re-enable difference rule using set_sort directly
Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>
This commit is contained in:
parent
4ad33caf99
commit
8da94d2ca3
3 changed files with 12 additions and 8 deletions
|
|
@ -63,10 +63,15 @@ 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
|
||||||
// Note: This simplification is currently disabled due to issues with mk_empty
|
if (arg1 == arg2) {
|
||||||
// in finite_set_decl_plugin. The mk_empty utility function expects an element_sort
|
// Get the set sort directly from the argument
|
||||||
// but the plugin's mk_empty expects a finite_set_sort, causing conflicts.
|
sort* set_sort = arg1->get_sort();
|
||||||
// TODO: Re-enable once finite_set_decl_plugin is fixed
|
SASSERT(m_util.is_finite_set(set_sort));
|
||||||
|
|
||||||
|
// Call mk_empty with set_sort directly as suggested
|
||||||
|
result = m_util.mk_empty(set_sort);
|
||||||
|
return BR_DONE;
|
||||||
|
}
|
||||||
|
|
||||||
return BR_FAILED;
|
return BR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 (currently disabled due to mk_empty issues)
|
set.difference(x, x) -> set.empty
|
||||||
|
|
||||||
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.
|
||||||
|
|
|
||||||
|
|
@ -82,12 +82,11 @@ 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);
|
||||||
|
|
||||||
// Currently disabled, so should return BR_FAILED
|
ENSURE(st == BR_DONE);
|
||||||
ENSURE(st == BR_FAILED);
|
ENSURE(fsets.is_empty(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_subset_rewrite() {
|
static void test_subset_rewrite() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue