mirror of
https://github.com/Z3Prover/z3
synced 2025-08-08 04:01:22 +00:00
fixes for #2513
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
de69b01e92
commit
a337a51374
28 changed files with 486 additions and 144 deletions
|
@ -50,6 +50,7 @@ namespace smt {
|
|||
typedef union_find<theory_seq> th_union_find;
|
||||
|
||||
class seq_value_proc;
|
||||
struct validate_model_proc;
|
||||
|
||||
// cache to track evaluations under equalities
|
||||
class eval_cache {
|
||||
|
@ -97,7 +98,9 @@ namespace smt {
|
|||
|
||||
// Table of current disequalities
|
||||
class exclusion_table {
|
||||
public:
|
||||
typedef obj_pair_hashtable<expr, expr> table_t;
|
||||
protected:
|
||||
ast_manager& m;
|
||||
table_t m_table;
|
||||
expr_ref_vector m_lhs, m_rhs;
|
||||
|
@ -111,6 +114,8 @@ namespace smt {
|
|||
void push_scope() { m_limit.push_back(m_lhs.size()); }
|
||||
void pop_scope(unsigned num_scopes);
|
||||
void display(std::ostream& out) const;
|
||||
table_t::iterator begin() const { return m_table.begin(); }
|
||||
table_t::iterator end() const { return m_table.end(); }
|
||||
};
|
||||
|
||||
// Asserted or derived equality with dependencies
|
||||
|
@ -260,6 +265,20 @@ namespace smt {
|
|||
}
|
||||
};
|
||||
|
||||
class replay_unit_literal : public apply {
|
||||
bool m_sign;
|
||||
expr_ref m_e;
|
||||
public:
|
||||
replay_unit_literal(ast_manager& m, expr* e, bool sign) : m_e(e, m), m_sign(sign) {}
|
||||
~replay_unit_literal() override {}
|
||||
void operator()(theory_seq& th) override {
|
||||
literal lit = th.mk_literal(m_e);
|
||||
if (m_sign) lit.neg();
|
||||
th.add_axiom(lit);
|
||||
m_e.reset();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class replay_is_axiom : public apply {
|
||||
expr_ref m_e;
|
||||
|
@ -290,6 +309,7 @@ namespace smt {
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
struct s_in_re {
|
||||
literal m_lit;
|
||||
expr* m_s;
|
||||
|
@ -404,6 +424,7 @@ namespace smt {
|
|||
void init_model(model_generator & mg) override;
|
||||
void finalize_model(model_generator & mg) override;
|
||||
void init_search_eh() override;
|
||||
void validate_model(model& mdl) override;
|
||||
|
||||
void init_model(expr_ref_vector const& es);
|
||||
app* get_ite_value(expr* a);
|
||||
|
@ -411,8 +432,8 @@ namespace smt {
|
|||
|
||||
void len_offset(expr* e, rational val);
|
||||
void prop_arith_to_len_offset();
|
||||
int find_fst_non_empty_idx(expr_ref_vector const& x) const;
|
||||
expr* find_fst_non_empty_var(expr_ref_vector const& x) const;
|
||||
int find_fst_non_empty_idx(expr_ref_vector const& x);
|
||||
expr* find_fst_non_empty_var(expr_ref_vector const& x);
|
||||
void find_max_eq_len(expr_ref_vector const& ls, expr_ref_vector const& rs);
|
||||
bool has_len_offset(expr_ref_vector const& ls, expr_ref_vector const& rs, int & diff);
|
||||
bool find_better_rep(expr_ref_vector const& ls, expr_ref_vector const& rs, unsigned idx, dependency*& deps, expr_ref_vector & res);
|
||||
|
@ -462,6 +483,7 @@ namespace smt {
|
|||
bool solve_eqs(unsigned start);
|
||||
bool solve_eq(expr_ref_vector const& l, expr_ref_vector const& r, dependency* dep, unsigned idx);
|
||||
bool simplify_eq(expr_ref_vector& l, expr_ref_vector& r, dependency* dep);
|
||||
bool lift_ite(expr_ref_vector const& l, expr_ref_vector const& r, dependency* dep);
|
||||
bool solve_unit_eq(expr* l, expr* r, dependency* dep);
|
||||
bool solve_unit_eq(expr_ref_vector const& l, expr_ref_vector const& r, dependency* dep);
|
||||
bool solve_nth_eq(expr_ref_vector const& ls, expr_ref_vector const& rs, dependency* dep);
|
||||
|
@ -566,7 +588,7 @@ namespace smt {
|
|||
|
||||
|
||||
bool has_length(expr *e) const { return m_has_length.contains(e); }
|
||||
void add_length(expr* e);
|
||||
void add_length(expr* e, expr* l);
|
||||
void enforce_length(expr* n);
|
||||
bool enforce_length(expr_ref_vector const& es, vector<rational>& len);
|
||||
void enforce_length_coherence(enode* n1, enode* n2);
|
||||
|
@ -580,6 +602,7 @@ namespace smt {
|
|||
void add_at_axiom(expr* n);
|
||||
void add_lt_axiom(expr* n);
|
||||
void add_le_axiom(expr* n);
|
||||
void add_unit_axiom(expr* n);
|
||||
void add_nth_axiom(expr* n);
|
||||
void add_in_re_axiom(expr* n);
|
||||
void add_itos_axiom(expr* n);
|
||||
|
@ -599,7 +622,7 @@ namespace smt {
|
|||
void tightest_prefix(expr* s, expr* x);
|
||||
expr_ref mk_sub(expr* a, expr* b);
|
||||
expr_ref mk_add(expr* a, expr* b);
|
||||
expr_ref mk_len(expr* s) const { return expr_ref(m_util.str.mk_length(s), m); }
|
||||
expr_ref mk_len(expr* s);
|
||||
enode* ensure_enode(expr* a);
|
||||
enode* get_root(expr* a) { return ensure_enode(a)->get_root(); }
|
||||
dependency* mk_join(dependency* deps, literal lit);
|
||||
|
@ -611,7 +634,7 @@ namespace smt {
|
|||
bool lower_bound(expr* s, rational& lo) const;
|
||||
bool lower_bound2(expr* s, rational& lo);
|
||||
bool upper_bound(expr* s, rational& hi) const;
|
||||
bool get_length(expr* s, rational& val) const;
|
||||
bool get_length(expr* s, rational& val);
|
||||
|
||||
void mk_decompose(expr* e, expr_ref& head, expr_ref& tail);
|
||||
expr_ref coalesce_chars(expr* const& str);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue