mirror of
https://github.com/Z3Prover/z3
synced 2025-04-28 11:25:51 +00:00
mbp (#4741)
* adding dt-solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * dt Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * move mbp to self-contained module Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * files Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * Create CMakeLists.txt * dt Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * rename to bool_var2expr to indicate type class * mbp * na * add projection * na * na * na * na * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * deps Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * testing arith/q * na * newline for model printing Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
e5cc613bf1
commit
72d407a49f
51 changed files with 903 additions and 618 deletions
|
@ -26,6 +26,7 @@ Notes:
|
|||
#include "sat/smt/sat_th.h"
|
||||
#include "solver/solver.h"
|
||||
#include "model/model_macro_solver.h"
|
||||
#include "qe/mbp/mbp_plugin.h"
|
||||
|
||||
namespace euf {
|
||||
class solver;
|
||||
|
@ -38,9 +39,13 @@ namespace q {
|
|||
typedef obj_hashtable<func_decl> func_decl_set;
|
||||
|
||||
class projection_function {
|
||||
protected:
|
||||
ast_manager& m;
|
||||
public:
|
||||
projection_function(ast_manager& m) : m(m) {}
|
||||
virtual ~projection_function() {}
|
||||
virtual expr* mk_lt(expr* a, expr* b) = 0;
|
||||
expr* mk_le(expr* a, expr* b) { return m.mk_not(mk_lt(b, a)); }
|
||||
virtual bool operator()(expr* a, expr* b) const = 0;
|
||||
};
|
||||
|
||||
|
@ -65,10 +70,10 @@ namespace q {
|
|||
struct eq { bool operator()(indexed_decl const& a, indexed_decl const& b) const { return a.idx == b.idx && a.f == b.f; } };
|
||||
};
|
||||
|
||||
class model_fixer : public quantifier2macro_infos {
|
||||
euf::solver& ctx;
|
||||
solver& m_qs;
|
||||
ast_manager& m;
|
||||
class model_fixer : public quantifier2macro_infos, public mbp::euf_inverter {
|
||||
euf::solver& ctx;
|
||||
solver& m_qs;
|
||||
ast_manager& m;
|
||||
obj_map<quantifier, quantifier_macro_info*> m_q2info;
|
||||
func_decl_dependencies m_dependencies;
|
||||
obj_map<sort, projection_function*> m_projections;
|
||||
|
@ -81,6 +86,12 @@ namespace q {
|
|||
void collect_partial_functions(ptr_vector<quantifier> const& qs, func_decl_set& fns);
|
||||
projection_function* get_projection(sort* srt);
|
||||
|
||||
projection_meta_data* get_projection_data(func_decl* f, unsigned idx) const {
|
||||
projection_meta_data* r = nullptr;
|
||||
m_projection_data.find(indexed_decl(f, idx), r);
|
||||
return r;
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
model_fixer(euf::solver& ctx, solver& qs);
|
||||
|
@ -89,19 +100,15 @@ namespace q {
|
|||
/**
|
||||
* Update model in order to best satisfy quantifiers.
|
||||
* For the array property fragment, update the model
|
||||
* such that the range of functions behaves monotonically
|
||||
* such that the range of functions behaves monotonically
|
||||
* based on regions over the inputs.
|
||||
*/
|
||||
void operator()(model& mdl);
|
||||
|
||||
quantifier_macro_info* operator()(quantifier* q) override;
|
||||
|
||||
projection_meta_data* operator()(func_decl* f, unsigned idx) const {
|
||||
projection_meta_data* r = nullptr;
|
||||
m_projection_data.find(indexed_decl(f, idx), r);
|
||||
return r;
|
||||
}
|
||||
|
||||
expr* invert_app(app* t, expr* value) override;
|
||||
expr* invert_arg(app* t, unsigned i, expr* value) override;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue