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:
parent
981c7d27ea
commit
df62e5e9e6
6 changed files with 98 additions and 22 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue