3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-02-20 07:24:40 +00:00

add assume-eqs and extensionality

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2025-10-17 09:37:11 +02:00
parent 981c7d27ea
commit df62e5e9e6
6 changed files with 98 additions and 22 deletions

View file

@ -70,6 +70,8 @@ void finite_set_decl_plugin::init() {
m_sigs[OP_FINITE_SET_MAP] = alloc(polymorphism::psig, m, "set.map", 2, 2, arrABsetA, setB);
m_sigs[OP_FINITE_SET_SELECT] = alloc(polymorphism::psig, m, "set.select", 1, 2, arrABoolsetA, setA);
m_sigs[OP_FINITE_SET_RANGE] = alloc(polymorphism::psig, m, "set.range", 0, 2, intintT, setInt);
m_sigs[OP_FINITE_SET_DIFF] = alloc(polymorphism::psig, m, "set.diff", 1, 2, setAsetA, A);
// m_sigs[OP_FINITE_SET_MAP_INVERSE] = alloc(polymorphism::psig, m, "set.map_inverse", 2, 3, arrABsetBsetA, A);
}
sort * finite_set_decl_plugin::mk_sort(decl_kind k, unsigned num_parameters, parameter const * parameters) {
@ -152,6 +154,7 @@ func_decl * finite_set_decl_plugin::mk_func_decl(decl_kind k, unsigned num_param
case OP_FINITE_SET_MAP:
case OP_FINITE_SET_SELECT:
case OP_FINITE_SET_RANGE:
case OP_FINITE_SET_DIFF:
return mk_finite_set_op(k, arity, domain, range);
default:
return nullptr;

View file

@ -23,6 +23,7 @@ Operators:
set.map : (S -> T) (FiniteSet S) -> (FiniteSet T)
set.select : (S -> Bool) (FiniteSet S) -> (FiniteSet S)
set.range : Int Int -> (FiniteSet Int)
set.diff : (FiniteSet S) (FiniteSet S) -> S
--*/
#pragma once
@ -46,6 +47,8 @@ enum finite_set_op_kind {
OP_FINITE_SET_MAP,
OP_FINITE_SET_SELECT,
OP_FINITE_SET_RANGE,
OP_FINITE_SET_DIFF,
OP_FINITE_SET_MAP_INVERSE,
LAST_FINITE_SET_OP
};

View file

@ -298,4 +298,19 @@ void finite_set_axioms::subset_axiom(expr* a) {
clause2.push_back(a);
clause2.push_back(m.mk_not(eq));
m_add_clause(clause2);
}
void finite_set_axioms::extensionality_axiom(expr *a, expr* b) {
// a != b => set.in (set.diff(a, b) a) != set.in (set.diff(a, b) b)
expr_ref diff_ab(u.mk_difference(a, b), m);
expr_ref a_eq_b(m.mk_eq(a, b), m);
expr_ref diff_in_a(u.mk_in(diff_ab, a), m);
expr_ref diff_in_b(u.mk_in(diff_ab, b), m);
// (a != b) => (x in diff_ab != x in diff_ba)
expr_ref_vector clause(m);
clause.push_back(a_eq_b);
clause.push_back(m.mk_not(m.mk_iff(diff_in_a, diff_in_b)));
m_add_clause(clause);
}

View file

@ -69,4 +69,7 @@ public:
// set.size(a) = 1
void size_singleton_axiom(expr *a);
// a != b => set.in (set.diff(a, b) a) != set.in (set.diff(a, b) b)
void extensionality_axiom(expr *a, expr *b);
};