3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-11-10 16:12:03 +00:00

init smtmus

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2021-12-20 11:57:50 -08:00
parent 7a6070506d
commit 17aa9a5406
4 changed files with 174 additions and 1 deletions

View file

@ -6,6 +6,7 @@ z3_add_component(solver
mus.cpp
parallel_tactic.cpp
smt_logics.cpp
smtmus.cpp
solver.cpp
solver_na2as.cpp
solver_pool.cpp

127
src/solver/smtmus.cpp Normal file
View file

@ -0,0 +1,127 @@
/*++
Copyright (c) 2014 Microsoft Corporation
Module Name:
musrmr.cpp
Abstract:
MUS extraction with model rotation modulo arithmatic.
Author:
Jaroslav Bendik, Nikolaj Bjorner (nbjorner) 2021-12-20
--*/
#include "solver/solver.h"
#include "solver/smtmus.h"
#include "ast/ast_pp.h"
#include "ast/ast_util.h"
#include "model/model_evaluator.h"
#include "ast/arith_decl_plugin.h"
struct smtmus::imp {
typedef obj_hashtable<expr> expr_set;
solver& m_solver;
ast_manager& m;
expr_ref_vector m_lit2expr;
obj_map<expr, unsigned> m_expr2lit;
model_ref m_model;
expr_ref_vector m_soft;
vector<expr_ref_vector> m_soft_clauses;
obj_map<expr, expr_ref_vector*> m_lit2vars;
imp(solver& s):
m_solver(s), m(s.get_manager()), m_lit2expr(m), m_soft(m)
{}
~imp() {
for (auto& [k, v] : m_lit2vars)
dealloc(v);
}
unsigned add_soft(expr* lit) {
unsigned idx = m_lit2expr.size();
m_expr2lit.insert(lit, idx);
m_lit2expr.push_back(lit);
TRACE("mus", tout << idx << ": " << mk_pp(lit, m) << "\n" << m_lit2expr << "\n";);
return idx;
}
void init() {
// initialize soft_clauses based on control variables in mus, or if mus already is a clause.
}
lbool get_mus(expr_ref_vector& mus) {
m_model.reset();
mus.reset();
if (m_lit2expr.size() == 1) {
mus.push_back(m_lit2expr.back());
return l_true;
}
return l_undef;
}
// extract clauses corresponding to added soft constraints.
// extract integer, real variables from clauses
//
unsigned rotate(bool_vector& crits, unsigned i, model& mdl, bool top_level) {
unsigned rot = 0;
for (auto const& lit : m_soft_clauses[i]) {
auto const& vars = get_vars(lit);
for (expr* v : vars) {
expr_ref_vector flips = rotate_get_flips(lit, v, mdl, 1);
for (auto& flip : flips) {
NOT_IMPLEMENTED_YET();
}
}
}
}
// access and update lit2vars on demand.
expr_ref_vector const& get_vars(expr* lit) {
if (!m_lit2vars.contains(lit)) {
expr_ref_vector* vars = alloc(expr_ref_vector, m);
extract_vars(lit, *vars);
m_lit2vars.insert(lit, vars);
}
return *m_lit2vars[lit];
}
void extract_vars(expr* e, expr_ref_vector& vars) {
NOT_IMPLEMENTED_YET();
}
expr_ref_vector rotate_get_flips(expr* lit, expr* v, model& mdl, unsigned xx) {
NOT_IMPLEMENTED_YET();
return expr_ref_vector(m);
}
};
smtmus::smtmus(solver& s) {
m_imp = alloc(imp, s);
}
smtmus::~smtmus() {
dealloc(m_imp);
}
unsigned smtmus::add_soft(expr* lit) {
return m_imp->add_soft(lit);
}
lbool smtmus::get_mus(expr_ref_vector& mus) {
return m_imp->get_mus(mus);
}

46
src/solver/smtmus.h Normal file
View file

@ -0,0 +1,46 @@
/*++
Copyright (c) 2014 Microsoft Corporation
Module Name:
smtmus.h
Abstract:
MUS extraction with model rotation.
Author:
Jaroslav Bendik, Nikolaj Bjorner (nbjorner) 2021-12-20
Notes:
--*/
#pragma once
class smtmus {
struct imp;
imp * m_imp;
public:
smtmus(solver& s);
~smtmus();
/**
Add soft constraint.
*/
unsigned add_soft(expr* cls);
void add_soft(unsigned sz, expr* const* clss) {
for (unsigned i = 0; i < sz; ++i)
add_soft(clss[i]);
}
/**
Retrieve mus over soft constraints
*/
lbool get_mus(expr_ref_vector& mus);
};

View file

@ -24,7 +24,6 @@ Notes:
#include "tactic/tactic.h"
#include "solver/tactic2solver.h"
#include "solver/solver_na2as.h"
#include "solver/mus.h"
/**
\brief Simulates the incremental solver interface using a tactic.