3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-20 18:20:22 +00:00

add card operator to bapa

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2019-04-20 13:24:07 -07:00
parent aafb16e8ed
commit 7e2afca2c6
7 changed files with 70 additions and 20 deletions

View file

@ -204,7 +204,7 @@ namespace smt {
return l_true;
}
lbool ensure_disjoint(app* sz1, app* sz2) {
bool ensure_disjoint(app* sz1, app* sz2) {
sz_info& i1 = *m_sizeof[sz1];
sz_info& i2 = *m_sizeof[sz2];
SASSERT(i1.m_is_leaf);
@ -214,16 +214,16 @@ namespace smt {
enode* r1 = get_root(s);
enode* r2 = get_root(t);
if (r1 == r2) {
return l_true;
return true;
}
if (!ctx().is_diseq(r1, r2) && ctx().assume_eq(r1, r2)) {
return l_false;
return false;
}
if (do_intersect(i1.m_selects, i2.m_selects)) {
add_disjoint(sz1, sz2);
return l_false;
return false;
}
return l_true;
return true;
}
bool do_intersect(obj_map<enode, expr*> const& s, obj_map<enode, expr*> const& t) const {
@ -436,6 +436,15 @@ namespace smt {
reset();
}
void internalize_term(app* term) {
if (th.is_set_has_size(term)) {
internalize_size(term);
}
else if (th.is_set_card(term)) {
internalize_card(term);
}
}
/**
* Size(S, n) => n >= 0, default(S) = false
*/
@ -458,6 +467,17 @@ namespace smt {
ctx().push_trail(remove_sz(m_sizeof, term));
}
/**
\brief whenever there is a cardinality function, it includes an axiom
that entails the set is finite.
*/
void internalize_card(app* term) {
SASSERT(ctx().e_internalized(term));
app_ref has_size(m_autil.mk_has_size(term->get_arg(0), term), m);
literal lit = mk_literal(has_size);
ctx().assign(lit, nullptr);
}
final_check_status final_check() {
lbool r = ensure_functional();
if (r == l_true) update_indices();
@ -494,7 +514,7 @@ namespace smt {
theory_array_bapa::~theory_array_bapa() { dealloc(m_imp); }
void theory_array_bapa::internalize_size(app* term) { m_imp->internalize_size(term); }
void theory_array_bapa::internalize_term(app* term) { m_imp->internalize_term(term); }
final_check_status theory_array_bapa::final_check() { return m_imp->final_check(); }

View file

@ -32,7 +32,7 @@ namespace smt {
public:
theory_array_bapa(theory_array_full& th);
~theory_array_bapa();
void internalize_size(app* term);
void internalize_term(app* term);
final_check_status final_check();
void init_model();
};

View file

@ -43,6 +43,7 @@ namespace smt {
bool is_array_sort(sort const* s) const { return s->is_sort_of(get_id(), ARRAY_SORT); }
bool is_array_sort(app const* n) const { return is_array_sort(get_manager().get_sort(n)); }
bool is_set_has_size(app const* n) const { return n->is_app_of(get_id(), OP_SET_HAS_SIZE); }
bool is_set_card(app const* n) const { return n->is_app_of(get_id(), OP_SET_CARD); }
bool is_store(enode const * n) const { return is_store(n->get_owner()); }
bool is_map(enode const* n) const { return is_map(n->get_owner()); }
@ -52,6 +53,7 @@ namespace smt {
bool is_default(enode const* n) const { return is_default(n->get_owner()); }
bool is_array_sort(enode const* n) const { return is_array_sort(n->get_owner()); }
bool is_set_has_size(enode const* n) const { return is_set_has_size(n->get_owner()); }
bool is_set_carde(enode const* n) const { return is_set_card(n->get_owner()); }
app * mk_select(unsigned num_args, expr * const * args);

View file

@ -250,7 +250,7 @@ namespace smt {
return theory_array::internalize_term(n);
}
if (!is_const(n) && !is_default(n) && !is_map(n) && !is_as_array(n) && !is_set_has_size(n)) {
if (!is_const(n) && !is_default(n) && !is_map(n) && !is_as_array(n) && !is_set_has_size(n) && !is_set_card(n)) {
if (!is_array_ext(n))
found_unsupported_op(n);
return false;
@ -274,11 +274,11 @@ namespace smt {
mk_var(arg0);
}
}
else if (is_set_has_size(n)) {
else if (is_set_has_size(n) || is_set_card(n)) {
if (!m_bapa) {
m_bapa = alloc(theory_array_bapa, *this);
}
m_bapa->internalize_size(n);
m_bapa->internalize_term(n);
}
enode* node = ctx.get_enode(n);