3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-19 12:23:38 +00:00

extract also units from search state

This commit is contained in:
Nikolaj Bjorner 2022-02-07 06:15:49 +02:00
parent d4ea67a6e7
commit 3f3d058567
7 changed files with 36 additions and 1 deletions

View file

@ -4613,6 +4613,22 @@ namespace smt {
return result; return result;
} }
void context::get_units(expr_ref_vector& result) {
expr_mark visited;
for (expr* fml : result)
visited.mark(fml);
for (literal lit : m_assigned_literals) {
if (get_assign_level(lit) > m_base_lvl)
break;
expr_ref e(m);
literal2expr(lit, e);
if (visited.is_marked(e))
continue;
result.push_back(std::move(e));
}
}
failure context::get_last_search_failure() const { failure context::get_last_search_failure() const {
return m_last_search_failure; return m_last_search_failure;
} }

View file

@ -1691,6 +1691,8 @@ namespace smt {
void get_assertions(ptr_vector<expr> & result) { m_asserted_formulas.get_assertions(result); } void get_assertions(ptr_vector<expr> & result) { m_asserted_formulas.get_assertions(result); }
void get_units(expr_ref_vector& result);
/* /*
* user-propagator * user-propagator
*/ */

View file

@ -178,6 +178,10 @@ namespace smt {
m_imp->m_kernel.get_assignments(result); m_imp->m_kernel.get_assignments(result);
} }
void kernel::get_units(expr_ref_vector & result) {
m_imp->m_kernel.get_units(result);
}
void kernel::get_relevant_labels(expr * cnstr, buffer<symbol> & result) { void kernel::get_relevant_labels(expr * cnstr, buffer<symbol> & result) {
m_imp->m_kernel.get_relevant_labels(cnstr, result); m_imp->m_kernel.get_relevant_labels(cnstr, result);
} }

View file

@ -203,6 +203,12 @@ namespace smt {
*/ */
void get_assignments(expr_ref_vector & result); void get_assignments(expr_ref_vector & result);
/**
\brief Return units assigned by the kernel.
*/
void get_units(expr_ref_vector& result);
/** /**
\brief Return the set of relevant labels in the last check command. \brief Return the set of relevant labels in the last check command.
*/ */

View file

@ -318,6 +318,10 @@ namespace {
return m_context.get_formula(idx); return m_context.get_formula(idx);
} }
void get_units_core(expr_ref_vector& units) override {
m_context.get_units(units);
}
expr_ref_vector cube(expr_ref_vector& vars, unsigned cutoff) override { expr_ref_vector cube(expr_ref_vector& vars, unsigned cutoff) override {
ast_manager& m = get_manager(); ast_manager& m = get_manager();
if (!m_cuber) { if (!m_cuber) {

View file

@ -242,6 +242,7 @@ expr_ref_vector solver::get_units() {
ast_manager& m = get_manager(); ast_manager& m = get_manager();
expr_ref_vector fmls(m), result(m), tmp(m); expr_ref_vector fmls(m), result(m), tmp(m);
get_assertions(fmls); get_assertions(fmls);
get_units_core(fmls);
obj_map<expr, bool> units; obj_map<expr, bool> units;
for (expr* f : fmls) { for (expr* f : fmls) {
if (m.is_not(f, f) && is_literal(m, f)) { if (m.is_not(f, f) && is_literal(m, f)) {

View file

@ -261,6 +261,8 @@ public:
*/ */
expr_ref_vector get_units(); expr_ref_vector get_units();
virtual void get_units_core(expr_ref_vector& units) {}
expr_ref_vector get_non_units(); expr_ref_vector get_non_units();
virtual expr_ref_vector get_trail() = 0; // { return expr_ref_vector(get_manager()); } virtual expr_ref_vector get_trail() = 0; // { return expr_ref_vector(get_manager()); }