mirror of
https://github.com/Z3Prover/z3
synced 2025-04-29 11:55:51 +00:00
parent
5154295202
commit
81084b8232
6 changed files with 186 additions and 69 deletions
|
@ -218,11 +218,39 @@ namespace array {
|
|||
void pop_core(unsigned n) override;
|
||||
|
||||
// models
|
||||
// I need a set of select enodes where select(A,i) = select(B,j) if i->get_root() == j->get_root()
|
||||
struct sel_khasher {
|
||||
unsigned operator()(euf::enode const * n) const { return 0; }
|
||||
};
|
||||
|
||||
struct sel_chasher {
|
||||
unsigned operator()(euf::enode const * n, unsigned idx) const {
|
||||
return n->get_arg(idx+1)->get_root()->hash();
|
||||
}
|
||||
};
|
||||
|
||||
struct sel_hash {
|
||||
unsigned operator()(euf::enode * n) const;
|
||||
};
|
||||
|
||||
struct sel_eq {
|
||||
bool operator()(euf::enode * n1, euf::enode * n2) const;
|
||||
};
|
||||
|
||||
typedef ptr_hashtable<euf::enode, sel_hash, sel_eq> select_set;
|
||||
euf::enode_vector m_defaults; // temporary field for model construction
|
||||
ptr_vector<expr> m_else_values; //
|
||||
svector<int> m_parents; // temporary field for model construction
|
||||
obj_map<euf::enode, select_set*> m_selects; // mapping from array -> relevant selects
|
||||
ptr_vector<euf::enode> m_selects_domain;
|
||||
ptr_vector<select_set> m_selects_range;
|
||||
|
||||
bool must_have_different_model_values(theory_var v1, theory_var v2);
|
||||
select_set* get_select_set(euf::enode* n);
|
||||
void collect_defaults();
|
||||
void collect_selects(); // mapping from array -> relevant selects
|
||||
void propagate_select_to_store_parents(euf::enode* r, euf::enode* sel, euf::enode_pair_vector& todo);
|
||||
|
||||
void mg_merge(theory_var u, theory_var v);
|
||||
theory_var mg_find(theory_var n);
|
||||
void set_default(theory_var v, euf::enode* n);
|
||||
|
@ -254,6 +282,7 @@ namespace array {
|
|||
void new_diseq_eh(euf::th_eq const& eq) override;
|
||||
bool unit_propagate() override;
|
||||
void init_model() override;
|
||||
void finalize_model(model& mdl) override;
|
||||
bool include_func_interp(func_decl* f) const override { return a.is_ext(f); }
|
||||
void add_value(euf::enode* n, model& mdl, expr_ref_vector& values) override;
|
||||
bool add_dep(euf::enode* n, top_sort<euf::enode>& dep) override;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue