mirror of
https://github.com/Z3Prover/z3
synced 2026-02-06 17:22:13 +00:00
updated with immediate axioms
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
d0a7b19806
commit
b53e87dcba
4 changed files with 105 additions and 34 deletions
|
|
@ -140,6 +140,15 @@ void finite_set_axioms::in_singleton_axiom(expr *x, expr *a) {
|
|||
return;
|
||||
|
||||
expr_ref x_in_a(u.mk_in(x, a), m);
|
||||
|
||||
if (x == b) {
|
||||
// If x and b are syntactically identical, then (x in a) is always true
|
||||
expr_ref_vector clause(m);
|
||||
clause.push_back(x_in_a);
|
||||
m_add_clause(clause);
|
||||
return;
|
||||
}
|
||||
|
||||
expr_ref x_eq_b(m.mk_eq(x, b), m);
|
||||
|
||||
// (x in a) => (x == b)
|
||||
|
|
@ -271,3 +280,22 @@ void finite_set_axioms::size_singleton_axiom(expr *a) {
|
|||
clause.push_back(eq);
|
||||
m_add_clause(clause);
|
||||
}
|
||||
|
||||
void finite_set_axioms::subset_axiom(expr* a) {
|
||||
expr *b = nullptr, *c = nullptr;
|
||||
if (!u.is_subset(a, b, c))
|
||||
return;
|
||||
|
||||
expr_ref intersect_bc(u.mk_intersect(b, c), m);
|
||||
expr_ref eq(m.mk_eq(intersect_bc, b), m);
|
||||
|
||||
expr_ref_vector clause1(m);
|
||||
clause1.push_back(m.mk_not(a));
|
||||
clause1.push_back(eq);
|
||||
m_add_clause(clause1);
|
||||
|
||||
expr_ref_vector clause2(m);
|
||||
clause2.push_back(a);
|
||||
clause2.push_back(m.mk_not(eq));
|
||||
m_add_clause(clause2);
|
||||
}
|
||||
|
|
@ -61,6 +61,10 @@ public:
|
|||
// (x in a) <=> (x in b) and p(x)
|
||||
void in_select_axiom(expr *x, expr *a);
|
||||
|
||||
// a := set.subset(b, c)
|
||||
// (a) <=> (set.intersect(b, c) = b)
|
||||
void subset_axiom(expr *a);
|
||||
|
||||
// a := set.singleton(b)
|
||||
// set.size(a) = 1
|
||||
void size_singleton_axiom(expr *a);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue