mirror of
https://github.com/Z3Prover/z3
synced 2025-06-25 15:23:41 +00:00
solver::check_sat_cc : check_sat assuming cube and clause
Extends check_sat with an ability to assume a single clause in addition to assuming a cube of assumptions
This commit is contained in:
parent
4477f7d326
commit
26339119e4
6 changed files with 50 additions and 70 deletions
|
@ -190,26 +190,9 @@ namespace smt {
|
||||||
return m_context.check(num_assumptions, assumptions);
|
return m_context.check(num_assumptions, assumptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
using solver_na2as::check_sat;
|
|
||||||
|
|
||||||
lbool check_sat(expr_ref_vector const& cube, expr_ref_vector const& clause, model_ref* mdl, expr_ref_vector* core, proof_ref* pr) override {
|
lbool check_sat_cc_core(expr_ref_vector const& cube, expr_ref_vector const& clause) override {
|
||||||
lbool r = m_context.check(cube, clause);
|
return m_context.check(cube, clause);
|
||||||
switch (r) {
|
|
||||||
case l_false:
|
|
||||||
if (pr) *pr = get_proof();
|
|
||||||
if (core) {
|
|
||||||
ptr_vector<expr> _core;
|
|
||||||
get_unsat_core(_core);
|
|
||||||
core->append(_core.size(), _core.c_ptr());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case l_true:
|
|
||||||
if (mdl) get_model(*mdl);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct scoped_minimize_core {
|
struct scoped_minimize_core {
|
||||||
|
|
|
@ -202,27 +202,6 @@ void solver::assert_expr(expr* f, expr* t) {
|
||||||
assert_expr_core2(fml, a);
|
assert_expr_core2(fml, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
lbool solver::check_sat(expr_ref_vector const& cube, expr_ref_vector const& clause, model_ref* mdl, expr_ref_vector* core, proof_ref* pr) {
|
|
||||||
ast_manager& m = clause.get_manager();
|
|
||||||
scoped_push _push(*this);
|
|
||||||
expr_ref disj = mk_or(clause);
|
|
||||||
assert_expr(disj);
|
|
||||||
lbool r = check_sat(cube);
|
|
||||||
switch (r) {
|
|
||||||
case l_false:
|
|
||||||
if (core) get_unsat_core(*core);
|
|
||||||
if (pr) *pr = get_proof();
|
|
||||||
break;
|
|
||||||
case l_true:
|
|
||||||
if (mdl) get_model(*mdl);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void solver::collect_param_descrs(param_descrs & r) {
|
void solver::collect_param_descrs(param_descrs & r) {
|
||||||
r.insert("solver.enforce_model_conversion", CPK_BOOL, "(default: false) enforce model conversion when asserting formulas");
|
r.insert("solver.enforce_model_conversion", CPK_BOOL, "(default: false) enforce model conversion when asserting formulas");
|
||||||
}
|
}
|
||||||
|
|
|
@ -152,7 +152,10 @@ public:
|
||||||
The cube corresponds to auxiliary assumptions. The clause as an auxiliary disjunction that is also
|
The cube corresponds to auxiliary assumptions. The clause as an auxiliary disjunction that is also
|
||||||
assumed for the check.
|
assumed for the check.
|
||||||
*/
|
*/
|
||||||
virtual lbool check_sat(expr_ref_vector const& cube, expr_ref_vector const& clause, model_ref* mdl = nullptr, expr_ref_vector* core = nullptr, proof_ref* pr = nullptr);
|
virtual lbool check_sat_cc(expr_ref_vector const& cube, expr_ref_vector const& clause) {
|
||||||
|
if (clause.empty()) return check_sat(cube.size(), cube.c_ptr());
|
||||||
|
NOT_IMPLEMENTED_YET();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\brief Set a progress callback procedure that is invoked by this solver during check_sat.
|
\brief Set a progress callback procedure that is invoked by this solver during check_sat.
|
||||||
|
|
|
@ -67,6 +67,12 @@ lbool solver_na2as::check_sat(unsigned num_assumptions, expr * const * assumptio
|
||||||
return check_sat_core(m_assumptions.size(), m_assumptions.c_ptr());
|
return check_sat_core(m_assumptions.size(), m_assumptions.c_ptr());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lbool solver_na2as::check_sat_cc(const expr_ref_vector &assumptions, const expr_ref_vector &clause) {
|
||||||
|
if (clause.empty()) return check_sat(assumptions.size(), assumptions.c_ptr());
|
||||||
|
append_assumptions app(m_assumptions, assumptions.size(), assumptions.c_ptr());
|
||||||
|
return check_sat_cc_core(m_assumptions, clause);
|
||||||
|
}
|
||||||
|
|
||||||
lbool solver_na2as::get_consequences(expr_ref_vector const& asms, expr_ref_vector const& vars, expr_ref_vector& consequences) {
|
lbool solver_na2as::get_consequences(expr_ref_vector const& asms, expr_ref_vector const& vars, expr_ref_vector& consequences) {
|
||||||
append_assumptions app(m_assumptions, asms.size(), asms.c_ptr());
|
append_assumptions app(m_assumptions, asms.size(), asms.c_ptr());
|
||||||
return get_consequences_core(m_assumptions, vars, consequences);
|
return get_consequences_core(m_assumptions, vars, consequences);
|
||||||
|
|
|
@ -39,6 +39,7 @@ public:
|
||||||
|
|
||||||
// Subclasses of solver_na2as should redefine the following *_core methods instead of these ones.
|
// Subclasses of solver_na2as should redefine the following *_core methods instead of these ones.
|
||||||
lbool check_sat(unsigned num_assumptions, expr * const * assumptions) override;
|
lbool check_sat(unsigned num_assumptions, expr * const * assumptions) override;
|
||||||
|
lbool check_sat_cc(const expr_ref_vector &assumptions, const expr_ref_vector &clause) override;
|
||||||
void push() override;
|
void push() override;
|
||||||
void pop(unsigned n) override;
|
void pop(unsigned n) override;
|
||||||
unsigned get_scope_level() const override;
|
unsigned get_scope_level() const override;
|
||||||
|
@ -49,6 +50,7 @@ public:
|
||||||
lbool find_mutexes(expr_ref_vector const& vars, vector<expr_ref_vector>& mutexes) override;
|
lbool find_mutexes(expr_ref_vector const& vars, vector<expr_ref_vector>& mutexes) override;
|
||||||
protected:
|
protected:
|
||||||
virtual lbool check_sat_core(unsigned num_assumptions, expr * const * assumptions) = 0;
|
virtual lbool check_sat_core(unsigned num_assumptions, expr * const * assumptions) = 0;
|
||||||
|
virtual lbool check_sat_cc_core(const expr_ref_vector &assumptions, const expr_ref_vector &clause) {NOT_IMPLEMENTED_YET();}
|
||||||
virtual void push_core() = 0;
|
virtual void push_core() = 0;
|
||||||
virtual void pop_core(unsigned n) = 0;
|
virtual void pop_core(unsigned n) = 0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -107,31 +107,6 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
using solver_na2as::check_sat;
|
|
||||||
|
|
||||||
lbool check_sat(expr_ref_vector const& cube, expr_ref_vector const& clause, model_ref* mdl, expr_ref_vector* core, proof_ref* pr) override {
|
|
||||||
SASSERT(!m_pushed || get_scope_level() > 0);
|
|
||||||
m_proof.reset();
|
|
||||||
internalize_assertions();
|
|
||||||
expr_ref_vector cube1(cube);
|
|
||||||
cube1.push_back(m_pred);
|
|
||||||
lbool res = m_base->check_sat(cube1, clause, mdl, core, pr);
|
|
||||||
switch (res) {
|
|
||||||
case l_true:
|
|
||||||
m_pool.m_stats.m_num_sat_checks++;
|
|
||||||
break;
|
|
||||||
case l_undef:
|
|
||||||
m_pool.m_stats.m_num_undef_checks++;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
set_status(res);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NSB: seems we would add m_pred as an assumption?
|
|
||||||
lbool check_sat_core(unsigned num_assumptions, expr * const * assumptions) override {
|
lbool check_sat_core(unsigned num_assumptions, expr * const * assumptions) override {
|
||||||
SASSERT(!m_pushed || get_scope_level() > 0);
|
SASSERT(!m_pushed || get_scope_level() > 0);
|
||||||
m_proof.reset();
|
m_proof.reset();
|
||||||
|
@ -163,6 +138,38 @@ public:
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lbool check_sat_cc_core(const expr_ref_vector &cube,
|
||||||
|
const expr_ref_vector &clause) override {
|
||||||
|
SASSERT(!m_pushed || get_scope_level() > 0);
|
||||||
|
m_proof.reset();
|
||||||
|
scoped_watch _t_(m_pool.m_check_watch);
|
||||||
|
m_pool.m_stats.m_num_checks++;
|
||||||
|
|
||||||
|
stopwatch sw;
|
||||||
|
sw.start();
|
||||||
|
internalize_assertions();
|
||||||
|
lbool res = m_base->check_sat_cc(cube, clause);
|
||||||
|
sw.stop();
|
||||||
|
switch (res) {
|
||||||
|
case l_true:
|
||||||
|
m_pool.m_check_sat_watch.add(sw);
|
||||||
|
m_pool.m_stats.m_num_sat_checks++;
|
||||||
|
break;
|
||||||
|
case l_undef:
|
||||||
|
m_pool.m_check_undef_watch.add(sw);
|
||||||
|
m_pool.m_stats.m_num_undef_checks++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
set_status(res);
|
||||||
|
|
||||||
|
// if (false /*m_dump_benchmarks && sw.get_seconds() >= m_pool.fparams().m_dump_min_time*/) {
|
||||||
|
// dump_benchmark(num_assumptions, assumptions, res, sw);
|
||||||
|
// }
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
void push_core() override {
|
void push_core() override {
|
||||||
SASSERT(!m_pushed || get_scope_level() > 0);
|
SASSERT(!m_pushed || get_scope_level() > 0);
|
||||||
if (m_in_delayed_scope) {
|
if (m_in_delayed_scope) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue