3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-05-22 18:09:37 +00:00

create sub-class for tracked eq and mem relations to separate from seq_nielsen

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2026-03-18 09:46:49 -07:00
parent e7431400b4
commit 8ac8eb4ae7
6 changed files with 65 additions and 52 deletions

View file

@ -27,6 +27,18 @@ namespace smt {
class enode;
struct tracked_str_eq : public seq::str_eq {
enode *m_l, *m_r;
tracked_str_eq(euf::snode *lhs, euf::snode *rhs, smt::enode *l, smt::enode *r, seq::dep_tracker const &dep)
: seq::str_eq(lhs, rhs, dep), m_l(l), m_r(r) {}
};
struct tracked_str_mem : public seq::str_mem {
sat::literal lit;
tracked_str_mem(euf::snode *str, euf::snode *regex, sat::literal lit, euf::snode *history, unsigned id, seq::dep_tracker const &dep)
: seq::str_mem(str, regex, history, id, dep), lit(lit) {}
};
// source info for a string disequality
struct diseq_source {
enode* m_n1;
@ -34,8 +46,8 @@ namespace smt {
};
class seq_state {
vector<seq::str_eq> m_str_eqs;
vector<seq::str_mem> m_str_mems;
vector<tracked_str_eq> m_str_eqs;
vector<tracked_str_mem> m_str_mems;
vector<diseq_source> m_diseqs;
unsigned_vector m_str_eq_lim;
unsigned_vector m_str_mem_lim;
@ -64,20 +76,20 @@ namespace smt {
void add_str_eq(euf::snode* lhs, euf::snode* rhs, enode* n1, enode* n2) {
seq::dep_tracker dep = nullptr;
m_str_eqs.push_back(seq::str_eq(lhs, rhs, n1, n2, dep));
m_str_eqs.push_back(tracked_str_eq(lhs, rhs, n1, n2, dep));
}
void add_str_mem(euf::snode* str, euf::snode* regex, sat::literal lit) {
seq::dep_tracker dep = nullptr;
m_str_mems.push_back(seq::str_mem(str, regex, lit, nullptr, m_next_mem_id++, dep));
m_str_mems.push_back(tracked_str_mem(str, regex, lit, nullptr, m_next_mem_id++, dep));
}
void add_diseq(enode* n1, enode* n2) {
m_diseqs.push_back({n1, n2});
}
vector<seq::str_eq> const& str_eqs() const { return m_str_eqs; }
vector<seq::str_mem> const& str_mems() const { return m_str_mems; }
vector<tracked_str_eq> const& str_eqs() const { return m_str_eqs; }
vector<tracked_str_mem> const& str_mems() const { return m_str_mems; }
vector<diseq_source> const& diseqs() const { return m_diseqs; }
diseq_source const& get_diseq(unsigned i) const { return m_diseqs[i]; }