mirror of
https://github.com/Z3Prover/z3
synced 2025-04-24 01:25:31 +00:00
enable unsat core extraction in nlsat_tactic
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
84172302a2
commit
305e080239
9 changed files with 46 additions and 20 deletions
|
@ -1283,7 +1283,7 @@ namespace nlsat {
|
|||
if (r == l_false) {
|
||||
// collect used literals from m_lemma_assumptions
|
||||
vector<assumption, false> deps;
|
||||
m_asm.linearize(m_lemma_assumptions.get(), deps);
|
||||
get_core(deps);
|
||||
for (unsigned i = 0; i < deps.size(); ++i) {
|
||||
literal const* lp = (literal const*)(deps[i]);
|
||||
if (ptr <= lp && lp < ptr + sz) {
|
||||
|
@ -1299,6 +1299,10 @@ namespace nlsat {
|
|||
return r;
|
||||
}
|
||||
|
||||
void get_core(vector<assumption, false>& deps) {
|
||||
m_asm.linearize(m_lemma_assumptions.get(), deps);
|
||||
}
|
||||
|
||||
void collect(literal_vector const& assumptions, clause_vector& clauses) {
|
||||
unsigned n = clauses.size();
|
||||
unsigned j = 0;
|
||||
|
@ -2712,6 +2716,10 @@ namespace nlsat {
|
|||
return m_imp->check(assumptions);
|
||||
}
|
||||
|
||||
void solver::get_core(vector<assumption, false>& assumptions) {
|
||||
return m_imp->get_core(assumptions);
|
||||
}
|
||||
|
||||
void solver::reset() {
|
||||
m_imp->reset();
|
||||
}
|
||||
|
|
|
@ -195,6 +195,14 @@ namespace nlsat {
|
|||
|
||||
lbool value(literal l) const;
|
||||
|
||||
// -----------------------
|
||||
//
|
||||
// Core
|
||||
//
|
||||
// -----------------------
|
||||
|
||||
void get_core(vector<assumption, false>& deps);
|
||||
|
||||
// -----------------------
|
||||
//
|
||||
// Misc
|
||||
|
|
|
@ -147,6 +147,7 @@ class nlsat_tactic : public tactic {
|
|||
TRACE("nlsat", g->display(tout););
|
||||
expr2var a2b(m);
|
||||
expr2var t2x(m);
|
||||
|
||||
m_g2nl(*g, m_params, m_solver, a2b, t2x);
|
||||
|
||||
m_display_var.m_var2expr.reset();
|
||||
|
@ -172,9 +173,19 @@ class nlsat_tactic : public tactic {
|
|||
}
|
||||
}
|
||||
else {
|
||||
// TODO: extract unsat core
|
||||
g->assert_expr(m.mk_false(), 0, 0);
|
||||
expr_dependency* lcore = 0;
|
||||
if (g->unsat_core_enabled()) {
|
||||
vector<nlsat::assumption, false> assumptions;
|
||||
m_solver.get_core(assumptions);
|
||||
for (unsigned i = 0; i < assumptions.size(); ++i) {
|
||||
expr_dependency* d = static_cast<expr_dependency*>(assumptions[i]);
|
||||
lcore = m.mk_join(lcore, d);
|
||||
}
|
||||
}
|
||||
g->assert_expr(m.mk_false(), 0, lcore);
|
||||
core = lcore;
|
||||
}
|
||||
|
||||
g->inc_depth();
|
||||
result.push_back(g.get());
|
||||
TRACE("nlsat", g->display(tout););
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue