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

split into context and sub-solver, move length force predicates to context-solver

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2026-05-17 19:01:03 -07:00
parent 9d4feed0ae
commit 2a36b9a68e
9 changed files with 441 additions and 240 deletions

View file

@ -22,7 +22,7 @@ Abstract:
#include <iostream>
// Trivial solver that always returns sat and ignores all assertions.
class nseq_basic_dummy_solver : public seq::simple_solver {
class nseq_basic_dummy_solver : public seq::sub_solver_i {
public:
void push() override {}
void pop(unsigned) override {}
@ -40,7 +40,8 @@ static void test_nseq_instantiation() {
euf::egraph eg(m);
euf::sgraph sg(m, eg);
nseq_basic_dummy_solver solver;
seq::nielsen_graph ng(sg, solver);
seq::context_solver_i context_solver;
seq::nielsen_graph ng(sg, solver, context_solver);
SASSERT(ng.root() == nullptr);
SASSERT(ng.num_nodes() == 0);
std::cout << " ok\n";
@ -97,7 +98,8 @@ static void test_nseq_simplification() {
euf::egraph eg(m);
euf::sgraph sg(m, eg);
nseq_basic_dummy_solver solver;
seq::nielsen_graph ng(sg, solver);
seq::context_solver_i context_solver;
seq::nielsen_graph ng(sg, solver, context_solver);
// Add a trivial equality: empty = empty
euf::snode* empty1 = sg.mk_empty_seq(su.str.mk_string_sort());
@ -120,7 +122,8 @@ static void test_nseq_node_satisfied() {
euf::egraph eg(m);
euf::sgraph sg(m, eg);
nseq_basic_dummy_solver solver;
seq::nielsen_graph ng(sg, solver);
seq::context_solver_i context_solver;
seq::nielsen_graph ng(sg, solver, context_solver);
seq::nielsen_node *node = ng.mk_node();
// empty node has no constraints => satisfied
@ -149,7 +152,8 @@ static void test_nseq_symbol_clash() {
euf::egraph eg(m);
euf::sgraph sg(m, eg);
nseq_basic_dummy_solver solver;
seq::nielsen_graph ng(sg, solver);
seq::context_solver_i context_solver;
seq::nielsen_graph ng(sg, solver, context_solver);
euf::snode* a = sg.mk_char('a');
euf::snode* b = sg.mk_char('b');
@ -176,7 +180,8 @@ static void test_nseq_var_eq_self() {
euf::egraph eg(m);
euf::sgraph sg(m, eg);
nseq_basic_dummy_solver solver;
seq::nielsen_graph ng(sg, solver);
seq::context_solver_i context_solver;
seq::nielsen_graph ng(sg, solver, context_solver);
euf::snode* x = sg.mk_var(symbol("x"), sg.get_str_sort());
ng.add_str_eq(x, x);
@ -194,7 +199,8 @@ static void test_nseq_prefix_clash() {
euf::egraph eg(m);
euf::sgraph sg(m, eg);
nseq_basic_dummy_solver solver;
seq::nielsen_graph ng(sg, solver);
seq::context_solver_i context_solver;
seq::nielsen_graph ng(sg, solver, context_solver);
euf::snode* x = sg.mk_var(symbol("x"), sg.get_str_sort());
euf::snode* a = sg.mk_char('a');
@ -216,7 +222,8 @@ static void test_nseq_const_nielsen_solvable() {
euf::egraph eg(m);
euf::sgraph sg(m, eg);
nseq_basic_dummy_solver solver;
seq::nielsen_graph ng(sg, solver);
seq::context_solver_i context_solver;
seq::nielsen_graph ng(sg, solver, context_solver);
euf::snode* x = sg.mk_var(symbol("x"), sg.get_str_sort());
euf::snode* y = sg.mk_var(symbol("y"), sg.get_str_sort());
@ -239,8 +246,8 @@ static void test_nseq_length_mismatch() {
euf::egraph eg(m);
euf::sgraph sg(m, eg);
nseq_basic_dummy_solver solver;
seq::nielsen_graph ng(sg, solver);
seq::context_solver_i context_solver;
seq::nielsen_graph ng(sg, solver, context_solver);
euf::snode* a = sg.mk_char('a');
euf::snode* b = sg.mk_char('b');
euf::snode* ab = sg.mk_concat(a, b);

View file

@ -30,7 +30,7 @@ Abstract:
#include <chrono>
// Trivial solver that always returns sat and ignores all assertions.
class nseq_zipt_dummy_solver : public seq::simple_solver {
class nseq_zipt_dummy_solver : public seq::sub_solver_i {
public:
void push() override {}
void pop(unsigned) override {}
@ -43,7 +43,7 @@ public:
// Trivial simple_solver stub: optimistically assumes integer constraints
// are always feasible (returns l_true without actually checking).
// -----------------------------------------------------------------------
class zipt_dummy_simple_solver : public seq::simple_solver {
class zipt_dummy_simple_solver : public seq::sub_solver_i {
public:
void push() override {}
void pop(unsigned) override {}
@ -184,6 +184,7 @@ struct nseq_fixture {
euf::egraph eg;
euf::sgraph sg;
zipt_dummy_simple_solver dummy_solver;
seq::context_solver_i context_solver;
seq::nielsen_graph ng;
seq_util su;
str_builder sb;
@ -193,7 +194,7 @@ struct nseq_fixture {
static ast_manager& init(ast_manager& m) { reg_decl_plugins(m); return m; }
nseq_fixture()
: eg(init(m)), sg(m, eg), ng(sg, dummy_solver), su(m), sb(sg, su), rb(m, su, sg)
: eg(init(m)), sg(m, eg), dummy_solver(), context_solver(), ng(sg, dummy_solver, context_solver), su(m), sb(sg, su), rb(m, su, sg)
{}
euf::snode* S(const char* s) { return sb.parse(s); }

File diff suppressed because it is too large Load diff

View file

@ -38,7 +38,7 @@ Author:
// ---------------------------------------------------------------------------
// Minimal solver stub (no-op)
// ---------------------------------------------------------------------------
class parikh_test_solver : public seq::simple_solver {
class parikh_test_solver : public seq::sub_solver_i {
public:
void push() override {}
void pop(unsigned) override {}
@ -486,7 +486,8 @@ static void test_apply_to_node_adds_constraints() {
euf::sgraph sg(m, eg);
seq_util seq(m);
parikh_test_solver solver;
seq::nielsen_graph ng(sg, solver);
seq::context_solver_i context_solver;
seq::nielsen_graph ng(sg, solver, context_solver);
seq::seq_parikh parikh(sg);
euf::snode* x = sg.mk_var(symbol("x"), sg.get_str_sort());
@ -518,7 +519,8 @@ static void test_apply_to_node_stride_one_no_constraints() {
seq_util seq(m);
sort_ref str_sort(seq.str.mk_string_sort(), m);
parikh_test_solver solver;
seq::nielsen_graph ng(sg, solver);
seq::context_solver_i context_solver;
seq::nielsen_graph ng(sg, solver, context_solver);
seq::seq_parikh parikh(sg);
euf::snode* x = sg.mk_var(symbol("x"), sg.get_str_sort());