mirror of
https://github.com/Z3Prover/z3
synced 2025-04-22 16:45:31 +00:00
Merge branch 'master' of https://github.com/Z3Prover/z3
This commit is contained in:
commit
2fceac04d4
50 changed files with 449 additions and 148 deletions
|
@ -17,4 +17,7 @@ z3_add_component(ackermannization
|
|||
PYG_FILES
|
||||
ackermannization_params.pyg
|
||||
ackermannize_bv_tactic_params.pyg
|
||||
TACTIC_HEADERS
|
||||
ackermannize_bv_tactic.h
|
||||
ackr_bound_probe.h
|
||||
)
|
||||
|
|
|
@ -7,7 +7,7 @@ set(generated_files
|
|||
# Sanity check
|
||||
foreach (gen_file ${generated_files})
|
||||
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${gen_file}")
|
||||
message(FATAL_ERROR "\"${CMAKE_CURRENT_SOURCE_DIR}/${gen_files}\""
|
||||
message(FATAL_ERROR "\"${CMAKE_CURRENT_SOURCE_DIR}/${gen_file}\""
|
||||
${z3_polluted_tree_msg})
|
||||
endif()
|
||||
endforeach()
|
||||
|
|
|
@ -25,6 +25,12 @@ import java.util.Map;
|
|||
|
||||
/**
|
||||
* The main interaction with Z3 happens via the Context.
|
||||
* For applications that spawn an unbounded number of contexts,
|
||||
* the proper use is within a try-with-resources
|
||||
* scope so that the Context object gets garbage collected in
|
||||
* a predictable way. Contexts maintain all data-structures
|
||||
* related to terms and formulas that are created relative
|
||||
* to them.
|
||||
**/
|
||||
public class Context implements AutoCloseable {
|
||||
private final long m_ctx;
|
||||
|
|
|
@ -667,6 +667,8 @@ public:
|
|||
expr * get_arg(unsigned idx) const { SASSERT(idx < m_num_args); return m_args[idx]; }
|
||||
expr * const * get_args() const { return m_args; }
|
||||
unsigned get_size() const { return get_obj_size(get_num_args()); }
|
||||
expr * const * begin() const { return m_args; }
|
||||
expr * const * end() const { return m_args + m_num_args; }
|
||||
|
||||
unsigned get_depth() const { return flags()->m_depth; }
|
||||
bool is_ground() const { return flags()->m_ground; }
|
||||
|
|
|
@ -8,4 +8,6 @@ z3_add_component(normal_forms
|
|||
rewriter
|
||||
PYG_FILES
|
||||
nnf_params.pyg
|
||||
EXTRA_REGISTER_MODULE_HEADERS
|
||||
nnf.h
|
||||
)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# for other components then we should refactor this code into
|
||||
# z3_add_component()
|
||||
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/database.h")
|
||||
message(FATAL_ERROR "The generated file \"database.h\""
|
||||
message(FATAL_ERROR "The generated file \"${CMAKE_CURRENT_SOURCE_DIR}/database.h\""
|
||||
${z3_polluted_tree_msg})
|
||||
endif()
|
||||
|
||||
|
|
|
@ -18,4 +18,6 @@ z3_add_component(cmd_context
|
|||
interp
|
||||
rewriter
|
||||
solver
|
||||
EXTRA_REGISTER_MODULE_HEADERS
|
||||
context_params.h
|
||||
)
|
||||
|
|
|
@ -1360,7 +1360,6 @@ void cmd_context::check_sat(unsigned num_assumptions, expr * const * assumptions
|
|||
throw ex;
|
||||
}
|
||||
catch (z3_exception & ex) {
|
||||
get_opt()->display_assignment(regular_stream());
|
||||
throw cmd_exception(ex.msg());
|
||||
}
|
||||
if (m_processing_pareto && r != l_true) {
|
||||
|
@ -1398,7 +1397,7 @@ void cmd_context::check_sat(unsigned num_assumptions, expr * const * assumptions
|
|||
}
|
||||
validate_check_sat_result(r);
|
||||
if (was_opt && r != l_false && !m_processing_pareto) {
|
||||
get_opt()->display_assignment(regular_stream());
|
||||
// get_opt()->display_assignment(regular_stream());
|
||||
}
|
||||
|
||||
if (r == l_true && m_params.m_dump_models) {
|
||||
|
|
|
@ -11,5 +11,7 @@ z3_add_component(polynomial
|
|||
util
|
||||
PYG_FILES
|
||||
algebraic_params.pyg
|
||||
EXTRA_REGISTER_MODULE_HEADERS
|
||||
polynomial.h
|
||||
)
|
||||
|
||||
|
|
|
@ -5,4 +5,6 @@ z3_add_component(subpaving_tactic
|
|||
COMPONENT_DEPENDENCIES
|
||||
core_tactics
|
||||
subpaving
|
||||
TACTIC_HEADERS
|
||||
subpaving_tactic.h
|
||||
)
|
||||
|
|
|
@ -125,7 +125,6 @@ struct evaluator_cfg : public default_rewriter_cfg {
|
|||
expr * val = m_model.get_const_interp(f);
|
||||
if (val != 0) {
|
||||
result = val;
|
||||
expand_value(result);
|
||||
return BR_DONE;
|
||||
}
|
||||
|
||||
|
@ -202,8 +201,8 @@ struct evaluator_cfg : public default_rewriter_cfg {
|
|||
void expand_value(expr_ref& val) {
|
||||
vector<expr_ref_vector> stores;
|
||||
expr_ref else_case(m());
|
||||
bool args_are_unique;
|
||||
if (m_ar.is_array(val) && extract_array_func_interp(val, stores, else_case, args_are_unique)) {
|
||||
bool _unused;
|
||||
if (m_ar.is_array(val) && extract_array_func_interp(val, stores, else_case, _unused)) {
|
||||
sort* srt = m().get_sort(val);
|
||||
val = m_ar.mk_const_array(srt, else_case);
|
||||
for (unsigned i = stores.size(); i > 0; ) {
|
||||
|
@ -213,7 +212,7 @@ struct evaluator_cfg : public default_rewriter_cfg {
|
|||
args.append(stores[i].size(), stores[i].c_ptr());
|
||||
val = m_ar.mk_store(args.size(), args.c_ptr());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool get_macro(func_decl * f, expr * & def, quantifier * & q, proof * & def_pr) {
|
||||
|
@ -274,7 +273,6 @@ struct evaluator_cfg : public default_rewriter_cfg {
|
|||
return BR_FAILED;
|
||||
}
|
||||
|
||||
// disabled until made more efficient
|
||||
vector<expr_ref_vector> stores1, stores2;
|
||||
bool args_are_unique1, args_are_unique2;
|
||||
expr_ref else1(m()), else2(m());
|
||||
|
@ -291,13 +289,13 @@ struct evaluator_cfg : public default_rewriter_cfg {
|
|||
else {
|
||||
conj.push_back(m().mk_eq(else1, else2));
|
||||
}
|
||||
args1.push_back(a);
|
||||
args2.push_back(b);
|
||||
if (args_are_unique1 && args_are_unique2 && !stores1.empty()) {
|
||||
return mk_array_eq(stores1, else1, stores2, else2, conj, result);
|
||||
return mk_array_eq_core(stores1, else1, stores2, else2, conj, result);
|
||||
}
|
||||
|
||||
// TBD: this is too inefficient.
|
||||
args1.push_back(a);
|
||||
args2.push_back(b);
|
||||
stores1.append(stores2);
|
||||
for (unsigned i = 0; i < stores1.size(); ++i) {
|
||||
args1.resize(1); args1.append(stores1[i].size() - 1, stores1[i].c_ptr());
|
||||
|
@ -338,20 +336,22 @@ struct evaluator_cfg : public default_rewriter_cfg {
|
|||
|
||||
typedef hashtable<expr*const*, args_hash, args_eq> args_table;
|
||||
|
||||
br_status mk_array_eq(vector<expr_ref_vector> const& stores1, expr* else1,
|
||||
vector<expr_ref_vector> const& stores2, expr* else2,
|
||||
expr_ref_vector& conj, expr_ref& result) {
|
||||
br_status mk_array_eq_core(vector<expr_ref_vector> const& stores1, expr* else1,
|
||||
vector<expr_ref_vector> const& stores2, expr* else2,
|
||||
expr_ref_vector& conj, expr_ref& result) {
|
||||
unsigned arity = stores1[0].size()-1; // TBD: fix arity.
|
||||
args_hash ah(arity);
|
||||
args_eq ae(arity);
|
||||
args_table table1(DEFAULT_HASHTABLE_INITIAL_CAPACITY, ah, ae);
|
||||
args_table table2(DEFAULT_HASHTABLE_INITIAL_CAPACITY, ah, ae);
|
||||
|
||||
for (unsigned i = 0; i < stores1.size(); ++i) {
|
||||
table1.insert(stores1[i].c_ptr());
|
||||
}
|
||||
for (unsigned i = stores2.size(); i > 0; ) {
|
||||
// stores with smaller index take precedence
|
||||
for (unsigned i = stores1.size(); i > 0; ) {
|
||||
--i;
|
||||
table1.insert(stores1[i].c_ptr());
|
||||
}
|
||||
|
||||
for (unsigned i = 0, sz = stores2.size(); i < sz; ++i) {
|
||||
if (table2.contains(stores2[i].c_ptr())) {
|
||||
// first insertion takes precedence.
|
||||
continue;
|
||||
|
@ -361,7 +361,7 @@ struct evaluator_cfg : public default_rewriter_cfg {
|
|||
expr* val = stores2[i][arity];
|
||||
if (table1.find(stores2[i].c_ptr(), args)) {
|
||||
switch (compare(args[arity], val)) {
|
||||
case l_true: table1.remove(stores2[i].c_ptr()); break;
|
||||
case l_true: table1.remove(args); break;
|
||||
case l_false: result = m().mk_false(); return BR_DONE;
|
||||
default: conj.push_back(m().mk_eq(val, args[arity])); break;
|
||||
}
|
||||
|
@ -389,10 +389,10 @@ struct evaluator_cfg : public default_rewriter_cfg {
|
|||
lbool compare(expr* a, expr* b) {
|
||||
if (m().are_equal(a, b)) return l_true;
|
||||
if (m().are_distinct(a, b)) return l_false;
|
||||
return l_undef;
|
||||
return l_undef;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool args_are_values(expr_ref_vector const& store, bool& are_unique) {
|
||||
bool are_values = true;
|
||||
for (unsigned j = 0; are_values && j + 1 < store.size(); ++j) {
|
||||
|
@ -402,7 +402,7 @@ struct evaluator_cfg : public default_rewriter_cfg {
|
|||
SASSERT(!are_unique || are_values);
|
||||
return are_values;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool extract_array_func_interp(expr* a, vector<expr_ref_vector>& stores, expr_ref& else_case, bool& are_unique) {
|
||||
SASSERT(m_ar.is_array(a));
|
||||
|
@ -417,14 +417,14 @@ struct evaluator_cfg : public default_rewriter_cfg {
|
|||
stores.push_back(store);
|
||||
a = to_app(a)->get_arg(0);
|
||||
}
|
||||
|
||||
|
||||
if (m_ar.is_const(a)) {
|
||||
else_case = to_app(a)->get_arg(0);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
if (!m_ar.is_as_array(a)) {
|
||||
TRACE("model_evaluator", tout << "no translation: " << mk_pp(a, m()) << "\n";);
|
||||
TRACE("model_evaluator", tout << "no translation: " << mk_pp(a, m()) << "\n";);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -432,6 +432,7 @@ struct evaluator_cfg : public default_rewriter_cfg {
|
|||
func_interp* g = m_model.get_func_interp(f);
|
||||
unsigned sz = g->num_entries();
|
||||
unsigned arity = f->get_arity();
|
||||
unsigned base_sz = stores.size();
|
||||
for (unsigned i = 0; i < sz; ++i) {
|
||||
expr_ref_vector store(m());
|
||||
func_entry const* fe = g->get_entry(i);
|
||||
|
@ -444,7 +445,7 @@ struct evaluator_cfg : public default_rewriter_cfg {
|
|||
}
|
||||
}
|
||||
stores.push_back(store);
|
||||
}
|
||||
}
|
||||
else_case = g->get_else();
|
||||
if (!else_case) {
|
||||
TRACE("model_evaluator", tout << "no else case " << mk_pp(a, m()) << "\n";
|
||||
|
@ -456,7 +457,7 @@ struct evaluator_cfg : public default_rewriter_cfg {
|
|||
TRACE("model_evaluator", tout << "non-ground else case " << mk_pp(a, m()) << "\n" << else_case << "\n";);
|
||||
return false;
|
||||
}
|
||||
for (unsigned i = stores.size(); are_values && i > 0; ) {
|
||||
for (unsigned i = stores.size(); are_values && i > base_sz; ) {
|
||||
--i;
|
||||
if (m().are_equal(else_case, stores[i].back())) {
|
||||
for (unsigned j = i + 1; j < stores.size(); ++j) {
|
||||
|
@ -487,6 +488,10 @@ struct model_evaluator::imp : public rewriter_tpl<evaluator_cfg> {
|
|||
m_cfg(md.get_manager(), md, p) {
|
||||
set_cancel_check(false);
|
||||
}
|
||||
|
||||
void expand_value (expr_ref &val) {
|
||||
m_cfg.expand_value (val);
|
||||
}
|
||||
};
|
||||
|
||||
model_evaluator::model_evaluator(model_core & md, params_ref const & p) {
|
||||
|
@ -524,7 +529,7 @@ unsigned model_evaluator::get_num_steps() const {
|
|||
void model_evaluator::cleanup(params_ref const & p) {
|
||||
model_core & md = m_imp->cfg().m_model;
|
||||
dealloc(m_imp);
|
||||
m_imp = alloc(imp, md, p);
|
||||
m_imp = alloc(imp, md, p);
|
||||
}
|
||||
|
||||
void model_evaluator::reset(params_ref const & p) {
|
||||
|
@ -535,14 +540,12 @@ void model_evaluator::reset(params_ref const & p) {
|
|||
void model_evaluator::operator()(expr * t, expr_ref & result) {
|
||||
TRACE("model_evaluator", tout << mk_ismt2_pp(t, m()) << "\n";);
|
||||
m_imp->operator()(t, result);
|
||||
m_imp->expand_value(result);
|
||||
}
|
||||
|
||||
expr_ref model_evaluator::operator()(expr * t) {
|
||||
TRACE("model_evaluator", tout << mk_ismt2_pp(t, m()) << "\n";);
|
||||
expr_ref result(m());
|
||||
m_imp->operator()(t, result);
|
||||
this->operator()(t, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -13,4 +13,6 @@ z3_add_component(fp
|
|||
pdr
|
||||
rel
|
||||
tab
|
||||
TACTIC_HEADERS
|
||||
horn_tactic.h
|
||||
)
|
||||
|
|
|
@ -426,7 +426,7 @@ namespace datalog {
|
|||
new_negs.push_back(false);
|
||||
|
||||
rule * new_rule = m_context.get_rule_manager().mk(new_head, new_tail.size(), new_tail.c_ptr(),
|
||||
new_negs.c_ptr());
|
||||
new_negs.c_ptr(), r->name());
|
||||
m_result_rules.push_back(new_rule);
|
||||
|
||||
//TODO: allow for a rule to have multiple parent objects
|
||||
|
|
|
@ -726,7 +726,7 @@ namespace datalog {
|
|||
}
|
||||
|
||||
rule * new_rule = m_context.get_rule_manager().mk(orig_r->get_head(), tail.size(), tail.c_ptr(),
|
||||
negs.c_ptr());
|
||||
negs.c_ptr(), orig_r->name());
|
||||
|
||||
new_rule->set_accounting_parent_object(m_context, orig_r);
|
||||
m_context.get_rule_manager().mk_rule_rewrite_proof(*orig_r, *new_rule);
|
||||
|
|
|
@ -142,7 +142,8 @@ namespace datalog {
|
|||
m(ctx.get_manager()),
|
||||
m_ctx(ctx),
|
||||
a(m),
|
||||
m_refs(m) {
|
||||
m_refs(m),
|
||||
m_mc(NULL){
|
||||
}
|
||||
|
||||
mk_quantifier_abstraction::~mk_quantifier_abstraction() {
|
||||
|
|
|
@ -789,7 +789,7 @@ namespace datalog {
|
|||
tail.push_back(to_app(e));
|
||||
}
|
||||
|
||||
new_rule = rm.mk(head.get(), tail.size(), tail.c_ptr(), (const bool*) 0);
|
||||
new_rule = rm.mk(head.get(), tail.size(), tail.c_ptr(), (const bool*) 0, r.name());
|
||||
|
||||
rm.fix_unbound_vars(new_rule, false);
|
||||
|
||||
|
|
|
@ -173,7 +173,7 @@ namespace datalog {
|
|||
return l_false;
|
||||
}
|
||||
else {
|
||||
rule_ref new_rule(m_context.get_rule_manager().mk(r, chead), m_context.get_rule_manager());
|
||||
rule_ref new_rule(m_context.get_rule_manager().mk(r, chead, r->name()), m_context.get_rule_manager());
|
||||
new_rule->set_accounting_parent_object(m_context, r);
|
||||
|
||||
m_head_occurrence_ctr.dec(m_rules.get(rule_index)->get_decl());
|
||||
|
|
|
@ -7,4 +7,7 @@ z3_add_component(nlsat_tactic
|
|||
arith_tactics
|
||||
nlsat
|
||||
sat_tactic
|
||||
TACTIC_HEADERS
|
||||
nlsat_tactic.h
|
||||
qfnra_nlsat_tactic.h
|
||||
)
|
||||
|
|
|
@ -143,12 +143,35 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
class get_objectives_cmd : public cmd {
|
||||
opt::context* m_opt;
|
||||
public:
|
||||
get_objectives_cmd(opt::context* opt):
|
||||
cmd("get-objectives"),
|
||||
m_opt(opt)
|
||||
{}
|
||||
|
||||
virtual void reset(cmd_context & ctx) { }
|
||||
virtual char const * get_usage() const { return "(get-objectives)"; }
|
||||
virtual char const * get_descr(cmd_context & ctx) const { return "retrieve the objective values (after optimization)"; }
|
||||
virtual unsigned get_arity() const { return 0; }
|
||||
virtual void prepare(cmd_context & ctx) {}
|
||||
|
||||
|
||||
virtual void failure_cleanup(cmd_context & ctx) {
|
||||
reset(ctx);
|
||||
}
|
||||
|
||||
virtual void execute(cmd_context & ctx) {
|
||||
get_opt(ctx, m_opt).display_assignment(ctx.regular_stream());
|
||||
}
|
||||
};
|
||||
|
||||
void install_opt_cmds(cmd_context & ctx, opt::context* opt) {
|
||||
ctx.insert(alloc(assert_soft_cmd, opt));
|
||||
ctx.insert(alloc(min_maximize_cmd, true, opt));
|
||||
ctx.insert(alloc(min_maximize_cmd, false, opt));
|
||||
ctx.insert(alloc(get_objectives_cmd, opt));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1313,17 +1313,18 @@ namespace opt {
|
|||
rational r = n.get_rational();
|
||||
rational eps = n.get_infinitesimal();
|
||||
expr_ref_vector args(m);
|
||||
bool is_int = eps.is_zero() && r.is_int();
|
||||
if (!inf.is_zero()) {
|
||||
expr* oo = m.mk_const(symbol("oo"), m_arith.mk_int());
|
||||
expr* oo = m.mk_const(symbol("oo"), is_int ? m_arith.mk_int() : m_arith.mk_real());
|
||||
if (inf.is_one()) {
|
||||
args.push_back(oo);
|
||||
}
|
||||
else {
|
||||
args.push_back(m_arith.mk_mul(m_arith.mk_numeral(inf, inf.is_int()), oo));
|
||||
args.push_back(m_arith.mk_mul(m_arith.mk_numeral(inf, is_int), oo));
|
||||
}
|
||||
}
|
||||
if (!r.is_zero()) {
|
||||
args.push_back(m_arith.mk_numeral(r, r.is_int()));
|
||||
args.push_back(m_arith.mk_numeral(r, is_int));
|
||||
}
|
||||
if (!eps.is_zero()) {
|
||||
expr* ep = m.mk_const(symbol("epsilon"), m_arith.mk_real());
|
||||
|
@ -1331,7 +1332,7 @@ namespace opt {
|
|||
args.push_back(ep);
|
||||
}
|
||||
else {
|
||||
args.push_back(m_arith.mk_mul(m_arith.mk_numeral(eps, eps.is_int()), ep));
|
||||
args.push_back(m_arith.mk_mul(m_arith.mk_numeral(eps, is_int), ep));
|
||||
}
|
||||
}
|
||||
switch(args.size()) {
|
||||
|
|
|
@ -23,6 +23,13 @@ z3_add_component(qe
|
|||
nlsat_tactic
|
||||
nlsat
|
||||
sat
|
||||
smt
|
||||
tactic
|
||||
smt
|
||||
tactic
|
||||
TACTIC_HEADERS
|
||||
nlqsat.h
|
||||
qe_lite.h
|
||||
qe_sat_tactic.h
|
||||
qe_tactic.h
|
||||
qsat.h
|
||||
vsubst_tactic.h
|
||||
)
|
||||
|
|
|
@ -6,4 +6,6 @@ z3_add_component(sat_tactic
|
|||
COMPONENT_DEPENDENCIES
|
||||
sat
|
||||
tactic
|
||||
TACTIC_HEADERS
|
||||
sat_tactic.h
|
||||
)
|
||||
|
|
|
@ -4332,10 +4332,9 @@ namespace smt {
|
|||
);
|
||||
failure fl = get_last_search_failure();
|
||||
if (fl == MEMOUT || fl == CANCELED || fl == TIMEOUT || fl == NUM_CONFLICTS || fl == RESOURCE_LIMIT) {
|
||||
return;
|
||||
TRACE("get_model", tout << "last search failure: " << fl << "\n";);
|
||||
}
|
||||
|
||||
if (m_fparams.m_model || m_fparams.m_model_on_final_check || m_qmanager->model_based()) {
|
||||
else if (m_fparams.m_model || m_fparams.m_model_on_final_check || m_qmanager->model_based()) {
|
||||
m_model_generator->reset();
|
||||
m_proto_model = m_model_generator->mk_model();
|
||||
m_qmanager->adjust_model(m_proto_model.get());
|
||||
|
@ -4346,6 +4345,9 @@ namespace smt {
|
|||
if (m_fparams.m_model_compact)
|
||||
m_proto_model->compress();
|
||||
TRACE("mbqi_bug", tout << "after cleanup:\n"; model_pp(tout, *m_proto_model););
|
||||
}
|
||||
else {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,4 +5,8 @@ z3_add_component(smt_tactic
|
|||
unit_subsumption_tactic.cpp
|
||||
COMPONENT_DEPENDENCIES
|
||||
smt
|
||||
TACTIC_HEADERS
|
||||
ctx_solver_simplify_tactic.h
|
||||
smt_tactic.h
|
||||
unit_subsumption_tactic.h
|
||||
)
|
||||
|
|
|
@ -253,7 +253,7 @@ public:
|
|||
if (m_ctx->canceled()) {
|
||||
throw tactic_exception(Z3_CANCELED_MSG);
|
||||
}
|
||||
if (m_fail_if_inconclusive) {
|
||||
if (m_fail_if_inconclusive && !m_candidate_models) {
|
||||
std::stringstream strm;
|
||||
strm << "smt tactic failed to show goal to be sat/unsat " << m_ctx->last_failure_as_string();
|
||||
throw tactic_exception(strm.str().c_str());
|
||||
|
|
|
@ -2386,16 +2386,16 @@ namespace smt {
|
|||
|
||||
app_ref mk_obj(theory_var v) {
|
||||
lean::var_index vi = m_theory_var2var_index[v];
|
||||
bool is_int = a.is_int(get_enode(v)->get_owner());
|
||||
if (m_solver->is_term(vi)) {
|
||||
expr_ref_vector args(m);
|
||||
const lean::lar_term& term = m_solver->get_term(vi);
|
||||
for (auto & ti : term.m_coeffs) {
|
||||
theory_var w = m_var_index2theory_var[ti.first];
|
||||
expr* o = get_enode(w)->get_owner();
|
||||
args.push_back(a.mk_mul(a.mk_numeral(ti.second, a.is_int(o)), o));
|
||||
args.push_back(a.mk_mul(a.mk_numeral(ti.second, is_int), o));
|
||||
}
|
||||
rational r = term.m_v;
|
||||
args.push_back(a.mk_numeral(r, r.is_int()));
|
||||
args.push_back(a.mk_numeral(term.m_v, is_int));
|
||||
return app_ref(a.mk_add(args.size(), args.c_ptr()), m);
|
||||
}
|
||||
else {
|
||||
|
@ -2408,11 +2408,12 @@ namespace smt {
|
|||
rational r = val.get_rational();
|
||||
bool is_strict = val.get_infinitesimal().is_pos();
|
||||
app_ref b(m);
|
||||
bool is_int = a.is_int(get_enode(v)->get_owner());
|
||||
if (is_strict) {
|
||||
b = a.mk_le(mk_obj(v), a.mk_numeral(r, r.is_int()));
|
||||
b = a.mk_le(mk_obj(v), a.mk_numeral(r, is_int));
|
||||
}
|
||||
else {
|
||||
b = a.mk_ge(mk_obj(v), a.mk_numeral(r, r.is_int()));
|
||||
b = a.mk_ge(mk_obj(v), a.mk_numeral(r, is_int));
|
||||
}
|
||||
if (!ctx().b_internalized(b)) {
|
||||
fm.insert(b->get_decl());
|
||||
|
|
|
@ -18,4 +18,8 @@ z3_add_component(tactic
|
|||
COMPONENT_DEPENDENCIES
|
||||
ast
|
||||
model
|
||||
TACTIC_HEADERS
|
||||
probe.h
|
||||
sine_filter.h
|
||||
tactic.h
|
||||
)
|
||||
|
|
|
@ -4,4 +4,6 @@ z3_add_component(aig_tactic
|
|||
aig_tactic.cpp
|
||||
COMPONENT_DEPENDENCIES
|
||||
tactic
|
||||
TACTIC_HEADERS
|
||||
aig_tactic.h
|
||||
)
|
||||
|
|
|
@ -28,4 +28,23 @@ z3_add_component(arith_tactics
|
|||
COMPONENT_DEPENDENCIES
|
||||
core_tactics
|
||||
sat
|
||||
TACTIC_HEADERS
|
||||
add_bounds_tactic.h
|
||||
card2bv_tactic.h
|
||||
degree_shift_tactic.h
|
||||
diff_neq_tactic.h
|
||||
elim01_tactic.h
|
||||
eq2bv_tactic.h
|
||||
factor_tactic.h
|
||||
fix_dl_var_tactic.h
|
||||
fm_tactic.h
|
||||
lia2pb_tactic.h
|
||||
lia2card_tactic.h
|
||||
nla2bv_tactic.h
|
||||
normalize_bounds_tactic.h
|
||||
pb2bv_tactic.h
|
||||
probe_arith.h
|
||||
propagate_ineqs_tactic.h
|
||||
purify_arith_tactic.h
|
||||
recover_01_tactic.h
|
||||
)
|
||||
|
|
|
@ -15,4 +15,14 @@ z3_add_component(bv_tactics
|
|||
bit_blaster
|
||||
core_tactics
|
||||
tactic
|
||||
TACTIC_HEADERS
|
||||
bit_blaster_tactic.h
|
||||
bv1_blaster_tactic.h
|
||||
bv_bound_chk_tactic.h
|
||||
bv_bounds_tactic.h
|
||||
bv_size_reduction_tactic.h
|
||||
bvarray2uf_tactic.h
|
||||
dt2bv_tactic.h
|
||||
elim_small_bv_tactic.h
|
||||
max_bv_sharing_tactic.h
|
||||
)
|
||||
|
|
|
@ -30,6 +30,7 @@ Revision History:
|
|||
#include "var_subst.h"
|
||||
#include "ast_util.h"
|
||||
#include "enum2bv_rewriter.h"
|
||||
#include "ast_pp.h"
|
||||
|
||||
|
||||
class dt2bv_tactic : public tactic {
|
||||
|
@ -53,30 +54,32 @@ class dt2bv_tactic : public tactic {
|
|||
|
||||
void operator()(app* a) {
|
||||
if (m.is_eq(a)) {
|
||||
return;
|
||||
// no-op
|
||||
}
|
||||
if (m.is_distinct(a)) {
|
||||
return;
|
||||
else if (m.is_distinct(a)) {
|
||||
// no-op
|
||||
}
|
||||
if (m_t.m_dt.is_recognizer(a->get_decl()) &&
|
||||
else if (m_t.m_dt.is_recognizer(a->get_decl()) &&
|
||||
m_t.is_fd(a->get_arg(0))) {
|
||||
m_t.m_fd_sorts.insert(get_sort(a->get_arg(0)));
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_t.is_fd(a) && a->get_num_args() > 0) {
|
||||
else if (m_t.is_fd(a) && a->get_num_args() > 0) {
|
||||
m_t.m_non_fd_sorts.insert(get_sort(a));
|
||||
args_cannot_be_fd(a);
|
||||
}
|
||||
else if (m_t.is_fd(a)) {
|
||||
m_t.m_fd_sorts.insert(get_sort(a));
|
||||
}
|
||||
else {
|
||||
unsigned sz = a->get_num_args();
|
||||
for (unsigned i = 0; i < sz; ++i) {
|
||||
if (m_t.is_fd(a->get_arg(i))) {
|
||||
m_t.m_non_fd_sorts.insert(get_sort(a->get_arg(i)));
|
||||
}
|
||||
}
|
||||
args_cannot_be_fd(a);
|
||||
}
|
||||
}
|
||||
|
||||
void args_cannot_be_fd(app* a) {
|
||||
for (expr* arg : *a) {
|
||||
if (m_t.is_fd(arg)) {
|
||||
m_t.m_non_fd_sorts.insert(get_sort(arg));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ z3_add_component(core_tactics
|
|||
blast_term_ite_tactic.cpp
|
||||
cofactor_elim_term_ite.cpp
|
||||
cofactor_term_ite_tactic.cpp
|
||||
collect_statistics_tactic.cpp
|
||||
collect_statistics_tactic.cpp
|
||||
ctx_simplify_tactic.cpp
|
||||
der_tactic.cpp
|
||||
distribute_forall_tactic.cpp
|
||||
|
@ -23,5 +23,24 @@ z3_add_component(core_tactics
|
|||
COMPONENT_DEPENDENCIES
|
||||
normal_forms
|
||||
tactic
|
||||
TACTIC_HEADERS
|
||||
blast_term_ite_tactic.h
|
||||
cofactor_term_ite_tactic.h
|
||||
collect_statistics_tactic.h
|
||||
ctx_simplify_tactic.h
|
||||
der_tactic.h
|
||||
distribute_forall_tactic.h
|
||||
elim_term_ite_tactic.h
|
||||
elim_uncnstr_tactic.h
|
||||
nnf_tactic.h
|
||||
occf_tactic.h
|
||||
pb_preprocess_tactic.h
|
||||
propagate_values_tactic.h
|
||||
reduce_args_tactic.h
|
||||
simplify_tactic.h
|
||||
solve_eqs_tactic.h
|
||||
split_clause_tactic.h
|
||||
symmetry_reduce_tactic.h
|
||||
tseitin_cnf_tactic.h
|
||||
)
|
||||
|
||||
|
|
|
@ -11,4 +11,7 @@ z3_add_component(fpa_tactics
|
|||
sat_tactic
|
||||
smtlogic_tactics
|
||||
smt_tactic
|
||||
TACTIC_HEADERS
|
||||
fpa2bv_tactic.h
|
||||
qffp_tactic.h
|
||||
)
|
||||
|
|
|
@ -4,4 +4,6 @@ z3_add_component(nlsat_smt_tactic
|
|||
COMPONENT_DEPENDENCIES
|
||||
nlsat_tactic
|
||||
smt_tactic
|
||||
TACTIC_HEADERS
|
||||
nl_purify_tactic.h
|
||||
)
|
||||
|
|
|
@ -16,4 +16,6 @@ z3_add_component(portfolio
|
|||
smtlogic_tactics
|
||||
subpaving_tactic
|
||||
ufbv_tactic
|
||||
TACTIC_HEADERS
|
||||
default_tactic.h
|
||||
)
|
||||
|
|
|
@ -10,4 +10,6 @@ z3_add_component(sls_tactic
|
|||
tactic
|
||||
PYG_FILES
|
||||
sls_params.pyg
|
||||
TACTIC_HEADERS
|
||||
sls_tactic.h
|
||||
)
|
||||
|
|
|
@ -28,4 +28,18 @@ z3_add_component(smtlogic_tactics
|
|||
smt_tactic
|
||||
PYG_FILES
|
||||
qfufbv_tactic_params.pyg
|
||||
TACTIC_HEADERS
|
||||
nra_tactic.h
|
||||
qfaufbv_tactic.h
|
||||
qfauflia_tactic.h
|
||||
qfbv_tactic.h
|
||||
qfidl_tactic.h
|
||||
qflia_tactic.h
|
||||
qflra_tactic.h
|
||||
qfnia_tactic.h
|
||||
qfnra_tactic.h
|
||||
qfuf_tactic.h
|
||||
qfufbv_tactic.h
|
||||
qfufnra_tactic.h
|
||||
quant_tactics.h
|
||||
)
|
||||
|
|
|
@ -11,4 +11,9 @@ z3_add_component(ufbv_tactic
|
|||
normal_forms
|
||||
rewriter
|
||||
smt_tactic
|
||||
TACTIC_HEADERS
|
||||
macro_finder_tactic.h
|
||||
quasi_macros_tactic.h
|
||||
ufbv_rewriter_tactic.h
|
||||
ufbv_tactic.h
|
||||
)
|
||||
|
|
|
@ -59,4 +59,13 @@ z3_add_component(util
|
|||
util.cpp
|
||||
warning.cpp
|
||||
z3_exception.cpp
|
||||
EXTRA_REGISTER_MODULE_HEADERS
|
||||
env_params.h
|
||||
MEMORY_INIT_FINALIZER_HEADERS
|
||||
debug.h
|
||||
gparams.h
|
||||
prime_generator.h
|
||||
rational.h
|
||||
symbol.h
|
||||
trace.h
|
||||
)
|
||||
|
|
|
@ -11,6 +11,7 @@ template void lean::dense_matrix<double, double>::apply_from_left(vector<double>
|
|||
template lean::dense_matrix<double, double>::dense_matrix(lean::matrix<double, double> const*);
|
||||
template lean::dense_matrix<double, double>::dense_matrix(unsigned int, unsigned int);
|
||||
template lean::dense_matrix<double, double>& lean::dense_matrix<double, double>::operator=(lean::dense_matrix<double, double> const&);
|
||||
template lean::dense_matrix<lean::mpq, lean::mpq>::dense_matrix(unsigned int, unsigned int);
|
||||
template lean::dense_matrix<lean::mpq, lean::numeric_pair<lean::mpq> >::dense_matrix(lean::matrix<lean::mpq, lean::numeric_pair<lean::mpq> > const*);
|
||||
template void lean::dense_matrix<lean::mpq, lean::numeric_pair<lean::mpq> >::apply_from_left(vector<lean::mpq>&);
|
||||
template lean::dense_matrix<lean::mpq, lean::mpq> lean::operator*<lean::mpq, lean::mpq>(lean::matrix<lean::mpq, lean::mpq>&, lean::matrix<lean::mpq, lean::mpq>&);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue