3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-06-15 05:15:41 +00:00

replace seq::le by generic expr_ref

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2026-05-16 23:10:44 -07:00
parent e72c082818
commit b75acc5c14
8 changed files with 184 additions and 201 deletions

View file

@ -45,7 +45,7 @@ NSB review:
namespace seq {
void deps_to_lits(dep_tracker deps, svector<enode_pair> &eqs, svector<sat::literal> &lits, vector<le>& les) {
void deps_to_lits(dep_tracker deps, svector<enode_pair> &eqs, svector<sat::literal> &lits, vector<expr_ref>& es) {
vector<dep_source> vs;
dep_manager::s_linearize(deps, vs);
for (dep_source const &d : vs) {
@ -54,7 +54,7 @@ namespace seq {
else if (std::holds_alternative<sat::literal>(d))
lits.push_back(std::get<sat::literal>(d));
else
les.push_back(std::get<le>(d));
es.push_back(std::get<expr_ref>(d));
}
}
@ -552,13 +552,12 @@ namespace seq {
void nielsen_graph::add_le_dependency(dep_tracker& dep, nielsen_node* n, expr* lhs, expr* rhs) {
SASSERT(lhs);
SASSERT(rhs);
expr_ref lhs_ref(lhs, m);
expr_ref rhs_ref(rhs, m);
expr_ref le(a.mk_le(lhs, rhs), m);
// just assume it to be correct
dep_tracker d = m_dep_mgr.mk_leaf(le{ lhs_ref, rhs_ref });
dep_tracker d = m_dep_mgr.mk_leaf(le);
// Just add the constraint - we do not have to recompute it
// [also it is on the set of side-conditions if we assert a satisfied node]
n->add_constraint(constraint(a.mk_le(lhs_ref, rhs_ref), d, m));
n->add_constraint(constraint(le, d, m));
dep = m_dep_mgr.mk_join(dep, d);
}
@ -4261,7 +4260,7 @@ namespace seq {
// NSB review: this is one of several methods exposed for testing
void nielsen_graph::test_aux_explain_conflict(svector<enode_pair>& eqs,
svector<sat::literal>& mem_literals,
vector<le>& les) const {
vector<expr_ref>& es) const {
SASSERT(m_root);
auto deps = collect_conflict_deps();
vector<dep_source> vs;
@ -4271,8 +4270,8 @@ namespace seq {
eqs.push_back(std::get<enode_pair>(d));
else if (std::holds_alternative<sat::literal>(d))
mem_literals.push_back(std::get<sat::literal>(d));
else if (std::holds_alternative<le>(d))
les.push_back(std::get<le>(d));
else if (std::holds_alternative<expr_ref>(d))
es.push_back(std::get<expr_ref>(d));
}
}

View file

@ -315,16 +315,8 @@ namespace seq {
using enode_pair = std::pair<smt::enode *, smt::enode *>;
// arithmetic implication dependency: lhs <= rhs
struct le {
expr_ref lhs;
expr_ref rhs;
bool operator==(le const &other) const {
return lhs == other.lhs && rhs == other.rhs;
}
};
using dep_source = std::variant<sat::literal, enode_pair, le>;
using dep_source = std::variant<sat::literal, enode_pair, expr_ref>;
// Arena-based dependency manager: builds an immutable tree of dep_source
@ -366,7 +358,7 @@ namespace seq {
void deps_to_lits(dep_tracker deps,
svector<enode_pair>& eqs,
svector<sat::literal>& lits,
vector<le>& les);
vector<expr_ref>& es);
// string equality constraint: lhs = rhs
// mirrors ZIPT's StrEq (both sides are regex-free snode trees)
@ -1003,7 +995,7 @@ namespace seq {
// Must be called after solve() returns unsat.
void test_aux_explain_conflict(svector<enode_pair> &eqs,
svector<sat::literal> &mem_literals,
vector<le>& les) const;
vector<expr_ref>& es) const;
// accumulated search statistics