mirror of
https://github.com/Z3Prover/z3
synced 2026-06-01 06:37:49 +00:00
first end-pass. Atomic
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
13f9fec339
commit
5aa3713d19
15 changed files with 6160 additions and 209 deletions
|
|
@ -35,42 +35,99 @@ namespace smt {
|
|||
seq_util m_seq;
|
||||
arith_util m_autil;
|
||||
seq_rewriter m_rewriter;
|
||||
arith_value m_arith_value;
|
||||
euf::egraph m_egraph; // private egraph (not shared with smt context)
|
||||
euf::sgraph m_sgraph; // private sgraph
|
||||
seq::nielsen_graph m_nielsen;
|
||||
nseq_state m_state;
|
||||
nseq_regex m_regex; // regex membership pre-processing
|
||||
nseq_model m_model; // model construction helper
|
||||
|
||||
// propagation queue
|
||||
struct prop_item {
|
||||
enum kind_t { eq_prop, diseq_prop, pos_mem_prop, neg_mem_prop } m_kind;
|
||||
unsigned m_idx;
|
||||
};
|
||||
svector<prop_item> m_prop_queue;
|
||||
unsigned m_prop_qhead = 0;
|
||||
unsigned_vector m_prop_lim; // saved queue sizes for push/pop
|
||||
|
||||
// statistics
|
||||
unsigned m_num_conflicts = 0;
|
||||
unsigned m_num_nodes_explored = 0;
|
||||
unsigned m_num_depth_increases = 0;
|
||||
unsigned m_num_final_checks = 0;
|
||||
unsigned m_num_length_axioms = 0;
|
||||
|
||||
// map from context enode to private sgraph snode
|
||||
obj_map<expr, euf::snode*> m_expr2snode;
|
||||
|
||||
// mapping from nielsen mem index to state mem index
|
||||
// (populated during populate_nielsen_graph, used in deps_to_lits)
|
||||
unsigned_vector m_nielsen_to_state_mem;
|
||||
|
||||
// higher-order terms (seq.map, seq.mapi, seq.foldl, seq.foldli)
|
||||
ptr_vector<app> m_ho_terms;
|
||||
unsigned_vector m_ho_lim; // push/pop limits for m_ho_terms
|
||||
unsigned m_num_ho_unfolds = 0;
|
||||
|
||||
// unhandled boolean string predicates (prefixof, suffixof, contains, etc.)
|
||||
unsigned m_num_unhandled_bool = 0;
|
||||
unsigned_vector m_unhandled_bool_lim;
|
||||
|
||||
bool has_unhandled_preds() const { return m_num_unhandled_bool > 0; }
|
||||
|
||||
// required virtual methods
|
||||
bool internalize_atom(app* a, bool gate_ctx) override;
|
||||
bool internalize_term(app* term) override;
|
||||
theory_var mk_var(enode* n) override;
|
||||
void new_eq_eh(theory_var v1, theory_var v2) override;
|
||||
void new_diseq_eh(theory_var v1, theory_var v2) override;
|
||||
theory* mk_fresh(context* ctx) override;
|
||||
void display(std::ostream& out) const override;
|
||||
|
||||
// optional overrides
|
||||
bool can_propagate() override { return false; }
|
||||
void propagate() override {}
|
||||
bool can_propagate() override;
|
||||
void propagate() override;
|
||||
void init() override;
|
||||
void assign_eh(bool_var v, bool is_true) override;
|
||||
final_check_status final_check_eh(unsigned) override;
|
||||
void push_scope_eh() override;
|
||||
void pop_scope_eh(unsigned num_scopes) override;
|
||||
void init_model(model_generator& mg) override;
|
||||
model_value_proc* mk_value(enode* n, model_generator& mg) override;
|
||||
void finalize_model(model_generator& mg) override;
|
||||
void validate_model(proto_model& mdl) override;
|
||||
void collect_statistics(::statistics& st) const override;
|
||||
|
||||
char const* get_name() const override { return "nseq"; }
|
||||
|
||||
// private helpers
|
||||
void populate_nielsen_graph();
|
||||
void explain_nielsen_conflict();
|
||||
void deps_to_lits(seq::dep_tracker const& deps, enode_pair_vector& eqs, literal_vector& lits);
|
||||
void add_conflict_clause(seq::dep_tracker const& deps);
|
||||
void set_conflict(enode_pair_vector const& eqs, literal_vector const& lits);
|
||||
euf::snode* get_snode(expr* e);
|
||||
|
||||
// propagation dispatch helpers
|
||||
void propagate_eq(unsigned idx);
|
||||
void propagate_diseq(unsigned idx);
|
||||
void propagate_pos_mem(unsigned idx);
|
||||
void propagate_neg_mem(unsigned idx);
|
||||
void ensure_length_var(expr* e);
|
||||
|
||||
// higher-order term unfolding
|
||||
bool unfold_ho_terms();
|
||||
|
||||
// arithmetic value queries for length reasoning
|
||||
bool get_num_value(expr* e, rational& val) const;
|
||||
bool lower_bound(expr* e, rational& lo) const;
|
||||
bool upper_bound(expr* e, rational& hi) const;
|
||||
bool get_length(expr* e, rational& val);
|
||||
void add_length_axiom(literal lit);
|
||||
bool propagate_length_lemma(literal lit, seq::length_constraint const& lc);
|
||||
bool assert_nonneg_for_all_vars();
|
||||
bool assert_length_constraints();
|
||||
|
||||
public:
|
||||
theory_nseq(context& ctx);
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue