mirror of
https://github.com/Z3Prover/z3
synced 2026-02-18 22:54:21 +00:00
merge
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
commit
ec1a04bbb5
145 changed files with 1703 additions and 1141 deletions
|
|
@ -226,6 +226,7 @@ namespace smt {
|
|||
ebindings[i] = bindings[i]->get_expr();
|
||||
expr_ref instance = m_subst();
|
||||
|
||||
|
||||
TRACE("qi_queue", tout << "new instance:\n" << mk_pp(instance, m) << "\n";);
|
||||
TRACE("qi_queue_instance", tout << "new instance:\n" << mk_pp(instance, m) << "\n";);
|
||||
expr_ref s_instance(m);
|
||||
|
|
@ -244,6 +245,15 @@ namespace smt {
|
|||
|
||||
return;
|
||||
}
|
||||
#if 0
|
||||
std::cout << "instantiate\n";
|
||||
enode_vector _bindings(num_bindings, bindings);
|
||||
for (auto * b : _bindings)
|
||||
std::cout << enode_pp(b, m_context) << " ";
|
||||
std::cout << "\n";
|
||||
std::cout << mk_pp(q, m) << "\n";
|
||||
#endif
|
||||
|
||||
TRACE("qi_queue", tout << "simplified instance:\n" << s_instance << "\n";);
|
||||
stat->inc_num_instances();
|
||||
if (stat->get_num_instances() % m_params.m_qi_profile_freq == 0) {
|
||||
|
|
|
|||
|
|
@ -73,6 +73,7 @@ namespace smt {
|
|||
void add_indexof_axiom(expr* n) { m_ax.indexof_axiom(n); }
|
||||
void add_last_indexof_axiom(expr* n) { m_ax.last_indexof_axiom(n); }
|
||||
void add_replace_axiom(expr* n) { m_ax.replace_axiom(n); }
|
||||
void add_replace_all_axiom(expr* n) { m_ax.replace_all_axiom(n); }
|
||||
void add_at_axiom(expr* n) { m_ax.at_axiom(n); }
|
||||
void add_nth_axiom(expr* n) { m_ax.nth_axiom(n); }
|
||||
void add_itos_axiom(expr* n) { m_ax.itos_axiom(n); }
|
||||
|
|
|
|||
|
|
@ -158,7 +158,6 @@ namespace smt {
|
|||
|
||||
void mark_as_interpreted() {
|
||||
SASSERT(!m_interpreted);
|
||||
SASSERT(m_owner->get_num_args() == 0);
|
||||
SASSERT(m_class_size == 1);
|
||||
m_interpreted = true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -974,7 +974,7 @@ namespace smt {
|
|||
}
|
||||
enode * e = enode::mk(m, m_region, m_app2enode, n, generation, suppress_args, merge_tf, m_scope_lvl, cgc_enabled, true);
|
||||
TRACE("mk_enode_detail", tout << "e.get_num_args() = " << e->get_num_args() << "\n";);
|
||||
if (n->get_num_args() == 0 && m.is_unique_value(n))
|
||||
if (m.is_unique_value(n))
|
||||
e->mark_as_interpreted();
|
||||
TRACE("mk_var_bug", tout << "mk_enode: " << id << "\n";);
|
||||
TRACE("generation", tout << "mk_enode: " << id << " " << generation << "\n";);
|
||||
|
|
|
|||
|
|
@ -307,13 +307,13 @@ namespace smt {
|
|||
|
||||
/**
|
||||
\brief Return a reference to smt::context.
|
||||
This is a temporary hack to support user theories.
|
||||
TODO: remove this hack.
|
||||
We need to revamp user theories too.
|
||||
This breaks abstractions.
|
||||
|
||||
It is currently used by the opt-solver
|
||||
to access optimization services from arithmetic solvers
|
||||
and to ensure that the solver has registered PB theory solver.
|
||||
|
||||
This method breaks the abstraction barrier.
|
||||
|
||||
\warning We should not use this method
|
||||
\warning This method should not be used in new code.
|
||||
*/
|
||||
context & get_context();
|
||||
};
|
||||
|
|
|
|||
|
|
@ -134,11 +134,11 @@ namespace smt {
|
|||
obj_map<expr, relevancy_ehs *> m_relevant_ehs;
|
||||
obj_map<expr, relevancy_ehs *> m_watches[2];
|
||||
struct eh_trail {
|
||||
enum kind { POS_WATCH, NEG_WATCH, HANDLER };
|
||||
enum class kind { POS_WATCH, NEG_WATCH, HANDLER };
|
||||
kind m_kind;
|
||||
expr * m_node;
|
||||
eh_trail(expr * n):m_kind(HANDLER), m_node(n) {}
|
||||
eh_trail(expr * n, bool val):m_kind(val ? POS_WATCH : NEG_WATCH), m_node(n) {}
|
||||
eh_trail(expr * n):m_kind(kind::HANDLER), m_node(n) {}
|
||||
eh_trail(expr * n, bool val):m_kind(val ? kind::POS_WATCH : kind::NEG_WATCH), m_node(n) {}
|
||||
kind get_kind() const { return m_kind; }
|
||||
expr * get_node() const { return m_node; }
|
||||
};
|
||||
|
|
@ -292,9 +292,9 @@ namespace smt {
|
|||
expr * n = t.get_node();
|
||||
relevancy_ehs * ehs;
|
||||
switch (t.get_kind()) {
|
||||
case eh_trail::POS_WATCH: ehs = get_watches(n, true); SASSERT(ehs); set_watches(n, true, ehs->tail()); break;
|
||||
case eh_trail::NEG_WATCH: ehs = get_watches(n, false); SASSERT(ehs); set_watches(n, false, ehs->tail()); break;
|
||||
case eh_trail::HANDLER: ehs = get_handlers(n); SASSERT(ehs); set_handlers(n, ehs->tail()); break;
|
||||
case eh_trail::kind::POS_WATCH: ehs = get_watches(n, true); SASSERT(ehs); set_watches(n, true, ehs->tail()); break;
|
||||
case eh_trail::kind::NEG_WATCH: ehs = get_watches(n, false); SASSERT(ehs); set_watches(n, false, ehs->tail()); break;
|
||||
case eh_trail::kind::HANDLER: ehs = get_handlers(n); SASSERT(ehs); set_handlers(n, ehs->tail()); break;
|
||||
default: UNREACHABLE(); break;
|
||||
}
|
||||
m.dec_ref(n);
|
||||
|
|
@ -378,9 +378,7 @@ namespace smt {
|
|||
break;
|
||||
case l_true: {
|
||||
expr * true_arg = nullptr;
|
||||
unsigned num_args = n->get_num_args();
|
||||
for (unsigned i = 0; i < num_args; i++) {
|
||||
expr * arg = n->get_arg(i);
|
||||
for (expr* arg : *n) {
|
||||
if (m_context.find_assignment(arg) == l_true) {
|
||||
if (is_relevant_core(arg))
|
||||
return;
|
||||
|
|
@ -402,9 +400,7 @@ namespace smt {
|
|||
switch (val) {
|
||||
case l_false: {
|
||||
expr * false_arg = nullptr;
|
||||
unsigned num_args = n->get_num_args();
|
||||
for (unsigned i = 0; i < num_args; i++) {
|
||||
expr * arg = n->get_arg(i);
|
||||
for (expr* arg : *n) {
|
||||
if (m_context.find_assignment(arg) == l_false) {
|
||||
if (is_relevant_core(arg))
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ namespace {
|
|||
smt_params m_smt_params_save;
|
||||
|
||||
void push_params() override {
|
||||
m_params_save = params_ref();
|
||||
m_params_save.reset();
|
||||
m_params_save.copy(solver::get_params());
|
||||
m_smt_params_save = m_smt_params;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -127,7 +127,8 @@ public:
|
|||
|
||||
scoped_init_ctx(smt_tactic & o, ast_manager & m):m_owner(o) {
|
||||
m_params = o.fparams();
|
||||
m_params_ref = o.params();
|
||||
m_params_ref.reset();
|
||||
m_params_ref.append(o.params());
|
||||
smt::kernel * new_ctx = alloc(smt::kernel, m, m_params, m_params_ref);
|
||||
TRACE("smt_tactic", tout << "logic: " << o.m_logic << "\n";);
|
||||
new_ctx->set_logic(o.m_logic);
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ struct unit_subsumption_tactic : public tactic {
|
|||
}
|
||||
|
||||
void updt_params(params_ref const& p) override {
|
||||
m_params = p;
|
||||
m_params.append(p);
|
||||
// m_context.updt_params(p); does not exist.
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2646,6 +2646,9 @@ void theory_seq::deque_axiom(expr* n) {
|
|||
else if (m_util.str.is_replace(n)) {
|
||||
m_ax.add_replace_axiom(n);
|
||||
}
|
||||
else if (m_util.str.is_replace_all(n)) {
|
||||
m_ax.add_replace_all_axiom(n);
|
||||
}
|
||||
else if (m_util.str.is_extract(n)) {
|
||||
m_ax.add_extract_axiom(n);
|
||||
}
|
||||
|
|
@ -3190,6 +3193,7 @@ void theory_seq::relevant_eh(app* n) {
|
|||
m_util.str.is_to_code(n) ||
|
||||
m_util.str.is_unit(n) ||
|
||||
m_util.str.is_length(n) ||
|
||||
/* m_util.str.is_replace_all(n) || uncomment to enable axiomatization */
|
||||
m_util.str.is_le(n)) {
|
||||
enque_axiom(n);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue