mirror of
https://github.com/Z3Prover/z3
synced 2026-06-05 08:30:50 +00:00
disable test in tptp, move to native lambdas
This commit is contained in:
parent
3e0a350411
commit
eaf7562a1d
24 changed files with 54 additions and 222 deletions
|
|
@ -69,7 +69,6 @@ namespace smt {
|
|||
m_fingerprints(m, get_region()),
|
||||
m_b_internalized_stack(m),
|
||||
m_e_internalized_stack(m),
|
||||
m_l_internalized_stack(m),
|
||||
m_final_check_idx(0),
|
||||
m_cg_table(m),
|
||||
m_conflict(null_b_justification),
|
||||
|
|
@ -81,7 +80,6 @@ namespace smt {
|
|||
m_unsat_core(m),
|
||||
m_mk_bool_var_trail(*this),
|
||||
m_mk_enode_trail(*this),
|
||||
m_mk_lambda_trail(*this),
|
||||
m_lemma_visitor(m) {
|
||||
|
||||
SASSERT(m_scope_lvl == 0);
|
||||
|
|
@ -4662,7 +4660,7 @@ namespace smt {
|
|||
return false;
|
||||
}
|
||||
case 1: {
|
||||
if (m_qmanager->is_shared(n) && !m.is_lambda_def(n->get_expr()) && !m_lambdas.contains(n))
|
||||
if (m_qmanager->is_shared(n) && !m_lambdas.contains(n))
|
||||
return true;
|
||||
|
||||
// the variable is shared if the equivalence class of n
|
||||
|
|
|
|||
|
|
@ -122,7 +122,6 @@ namespace smt {
|
|||
// enodes. Examples: boolean expression nested in an
|
||||
// uninterpreted function.
|
||||
expr_ref_vector m_e_internalized_stack; // stack of the expressions already internalized as enodes.
|
||||
quantifier_ref_vector m_l_internalized_stack;
|
||||
|
||||
ptr_vector<justification> m_justifications;
|
||||
|
||||
|
|
@ -870,16 +869,6 @@ namespace smt {
|
|||
mk_enode_trail m_mk_enode_trail;
|
||||
void undo_mk_enode();
|
||||
|
||||
friend class mk_lambda_trail;
|
||||
class mk_lambda_trail : public trail {
|
||||
context& ctx;
|
||||
public:
|
||||
mk_lambda_trail(context& ctx) :ctx(ctx) {}
|
||||
void undo() override { ctx.undo_mk_lambda(); }
|
||||
};
|
||||
mk_lambda_trail m_mk_lambda_trail;
|
||||
void undo_mk_lambda();
|
||||
|
||||
|
||||
void apply_sort_cnstr(app * term, enode * e);
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ namespace smt {
|
|||
/**
|
||||
\brief Initialize an enode in the given memory position.
|
||||
*/
|
||||
enode * enode::init(ast_manager & m, void * mem, app2enode_t const & app2enode, app * owner,
|
||||
enode * enode::init(ast_manager & m, void * mem, app2enode_t const & app2enode, expr * owner,
|
||||
unsigned generation, bool suppress_args, bool merge_tf, unsigned iscope_lvl,
|
||||
bool cgc_enabled, bool update_children_parent) {
|
||||
SASSERT(m.is_bool(owner) || !merge_tf);
|
||||
|
|
@ -42,7 +42,7 @@ namespace smt {
|
|||
n->m_interpreted = false;
|
||||
n->m_suppress_args = suppress_args;
|
||||
n->m_eq = m.is_eq(owner);
|
||||
n->m_commutative = n->get_num_args() == 2 && owner->get_decl()->is_commutative();
|
||||
n->m_commutative = n->get_num_args() == 2 && n->get_decl()->is_commutative();
|
||||
n->m_bool = m.is_bool(owner);
|
||||
n->m_merge_tf = merge_tf;
|
||||
n->m_cgc_enabled = cgc_enabled;
|
||||
|
|
@ -52,7 +52,7 @@ namespace smt {
|
|||
n->m_is_shared = 2;
|
||||
unsigned num_args = n->get_num_args();
|
||||
for (unsigned i = 0; i < num_args; ++i) {
|
||||
enode * arg = app2enode[owner->get_arg(i)->get_id()];
|
||||
enode * arg = app2enode[to_app(owner)->get_arg(i)->get_id()];
|
||||
n->m_args[i] = arg;
|
||||
arg->get_root()->m_is_shared = 2;
|
||||
SASSERT(n->get_arg(i) == arg);
|
||||
|
|
@ -64,11 +64,11 @@ namespace smt {
|
|||
return n;
|
||||
}
|
||||
|
||||
enode * enode::mk(ast_manager & m, region & r, app2enode_t const & app2enode, app * owner,
|
||||
enode * enode::mk(ast_manager & m, region & r, app2enode_t const & app2enode, expr * owner,
|
||||
unsigned generation, bool suppress_args, bool merge_tf, unsigned iscope_lvl,
|
||||
bool cgc_enabled, bool update_children_parent) {
|
||||
SASSERT(m.is_bool(owner) || !merge_tf);
|
||||
unsigned sz = get_enode_size(suppress_args ? 0 : owner->get_num_args());
|
||||
unsigned sz = get_enode_size(suppress_args || !::is_app(owner) ? 0 : to_app(owner)->get_num_args());
|
||||
void * mem = r.allocate(sz);
|
||||
return init(m, mem, app2enode, owner, generation, suppress_args, merge_tf, iscope_lvl, cgc_enabled, update_children_parent);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@ namespace smt {
|
|||
|
||||
friend class tmp_enode;
|
||||
|
||||
static enode * init(ast_manager & m, void * mem, app2enode_t const & app2enode, app * owner,
|
||||
static enode * init(ast_manager & m, void * mem, app2enode_t const & app2enode, expr * owner,
|
||||
unsigned generation, bool suppress_args, bool merge_tf, unsigned iscope_lvl,
|
||||
bool cgc_enabled, bool update_children_parent);
|
||||
public:
|
||||
|
|
@ -141,7 +141,7 @@ namespace smt {
|
|||
return sizeof(enode) + num_args * sizeof(enode*);
|
||||
}
|
||||
|
||||
static enode * mk(ast_manager & m, region & r, app2enode_t const & app2enode, app * owner,
|
||||
static enode * mk(ast_manager & m, region & r, app2enode_t const & app2enode, expr * owner,
|
||||
unsigned generation, bool suppress_args, bool merge_tf, unsigned iscope_lvl,
|
||||
bool cgc_enabled, bool update_children_parent);
|
||||
|
||||
|
|
|
|||
|
|
@ -597,16 +597,9 @@ namespace smt {
|
|||
SASSERT(is_lambda(q));
|
||||
if (e_internalized(q))
|
||||
return;
|
||||
app_ref lam_name(m.mk_fresh_const("lambda", q->get_sort()), m);
|
||||
m.add_lambda_def(lam_name->get_decl(), q);
|
||||
if (!e_internalized(lam_name))
|
||||
internalize_uninterpreted(lam_name);
|
||||
enode* lam_node = get_enode(lam_name);
|
||||
push_trail(insert_obj_map<enode, quantifier*>(m_lambdas, lam_node));
|
||||
m_lambdas.insert(lam_node, q);
|
||||
m_app2enode.setx(q->get_id(), lam_node, nullptr);
|
||||
m_l_internalized_stack.push_back(q);
|
||||
m_trail_stack.push_ptr(&m_mk_lambda_trail);
|
||||
mk_enode(q, true, /* do suppress args */
|
||||
false, /* it is a term, so it should not be merged with true/false */
|
||||
true);
|
||||
}
|
||||
|
||||
bool context::has_lambda() {
|
||||
|
|
@ -1008,7 +1001,7 @@ namespace smt {
|
|||
CTRACE(cached_generation, generation != m_generation,
|
||||
tout << "cached_generation: #" << n->get_id() << " " << generation << " " << m_generation << "\n";);
|
||||
}
|
||||
enode *e = enode::mk(m, get_region(), m_app2enode, to_app(n), generation, suppress_args, merge_tf, m_scope_lvl,
|
||||
enode *e = enode::mk(m, get_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 (m.is_unique_value(n))
|
||||
|
|
@ -1063,14 +1056,6 @@ namespace smt {
|
|||
return e;
|
||||
}
|
||||
|
||||
void context::undo_mk_lambda() {
|
||||
SASSERT(!m_l_internalized_stack.empty());
|
||||
m_stats.m_num_del_enode++;
|
||||
quantifier * n = m_l_internalized_stack.back();
|
||||
m_app2enode[n->get_id()] = nullptr;
|
||||
m_l_internalized_stack.pop_back();
|
||||
}
|
||||
|
||||
void context::undo_mk_enode() {
|
||||
SASSERT(!m_e_internalized_stack.empty());
|
||||
m_stats.m_num_del_enode++;
|
||||
|
|
@ -1078,7 +1063,6 @@ namespace smt {
|
|||
TRACE(undo_mk_enode, tout << "undo_enode: #" << n->get_id() << "\n" << mk_pp(n, m) << "\n";);
|
||||
TRACE(mk_var_bug, tout << "undo_mk_enode: " << n->get_id() << "\n";);
|
||||
unsigned n_id = n->get_id();
|
||||
SASSERT(is_app(n));
|
||||
enode * e = m_app2enode[n_id];
|
||||
m_app2enode[n_id] = nullptr;
|
||||
if (e->is_cgr() && !e->is_true_eq() && e->is_cgc_enabled()) {
|
||||
|
|
|
|||
|
|
@ -457,12 +457,6 @@ namespace smt {
|
|||
|
||||
TRACE(model_checker, tout << "MODEL_CHECKER INVOKED\n";
|
||||
tout << "model:\n"; model_pp(tout, *m_curr_model););
|
||||
|
||||
for (quantifier* q : *m_qm)
|
||||
if (m.is_lambda_q(q)) {
|
||||
md->add_lambda_defs();
|
||||
break;
|
||||
}
|
||||
|
||||
md->compress();
|
||||
|
||||
|
|
@ -519,7 +513,7 @@ namespace smt {
|
|||
if (!(m_qm->mbqi_enabled(q) &&
|
||||
m_context->is_relevant(q) &&
|
||||
m_context->get_assignment(q) == l_true &&
|
||||
(!m_context->get_fparams().m_ematching || !m.is_lambda_q(q)))) {
|
||||
(!m_context->get_fparams().m_ematching))) {
|
||||
if (!m_qm->mbqi_enabled(q))
|
||||
++num_failures;
|
||||
continue;
|
||||
|
|
|
|||
|
|
@ -291,8 +291,8 @@ namespace smt {
|
|||
}
|
||||
|
||||
void insert(expr* n, unsigned generation) {
|
||||
SASSERT(is_ground(n));
|
||||
get_root()->m_set->insert(n, generation);
|
||||
if (is_ground(n))
|
||||
get_root()->m_set->insert(n, generation);
|
||||
}
|
||||
|
||||
void display(std::ostream& out, ast_manager& m) const {
|
||||
|
|
@ -1690,7 +1690,7 @@ namespace smt {
|
|||
typedef ptr_vector<cond_macro>::const_iterator macro_iterator;
|
||||
|
||||
static quantifier_ref mk_flat(ast_manager& m, quantifier* q) {
|
||||
if (has_quantifiers(q->get_expr()) && !m.is_lambda_q(q)) {
|
||||
if (has_quantifiers(q->get_expr())) {
|
||||
proof_ref pr(m);
|
||||
expr_ref new_q(m);
|
||||
pull_quant pull(m);
|
||||
|
|
@ -2279,7 +2279,6 @@ namespace smt {
|
|||
void operator()(quantifier_info* d) {
|
||||
m_info = d;
|
||||
quantifier* q = d->get_flat_q();
|
||||
if (m.is_lambda_q(q)) return;
|
||||
expr* e = q->get_expr();
|
||||
reset_cache();
|
||||
if (!m.inc()) return;
|
||||
|
|
|
|||
|
|
@ -428,6 +428,8 @@ namespace smt {
|
|||
if (!m_context->is_relevant(t))
|
||||
continue;
|
||||
enode * n = m_context->get_enode(t);
|
||||
if (!n->is_app())
|
||||
continue;
|
||||
unsigned num_args = n->get_num_args();
|
||||
func_decl * f = n->get_decl();
|
||||
if (num_args == 0 && include_func_interp(f)) {
|
||||
|
|
|
|||
|
|
@ -68,12 +68,12 @@ namespace smt {
|
|||
m_var_data.push_back(alloc(var_data));
|
||||
var_data * d = m_var_data[r];
|
||||
TRACE(array, tout << mk_bounded_pp(n->get_expr(), m) << "\nis_array: " << is_array_sort(n) << ", is_select: " << is_select(n) <<
|
||||
", is_store: " << is_store(n) << ", is_lambda: " << is_lambda(n) << "\n";);
|
||||
", is_store: " << is_store(n) << ", is_lambda: " << is_lambda(n->get_expr()) << "\n";);
|
||||
d->m_is_array = is_array_sort(n);
|
||||
if (d->m_is_array)
|
||||
register_sort(n->get_expr()->get_sort());
|
||||
d->m_is_select = is_select(n);
|
||||
if (is_store(n) || is_lambda(n))
|
||||
if (is_store(n) || is_lambda(n->get_expr()))
|
||||
d->m_stores.push_back(n);
|
||||
ctx.attach_th_var(n, this, r);
|
||||
if (laziness() <= 1 && is_store(n))
|
||||
|
|
@ -95,7 +95,7 @@ namespace smt {
|
|||
|
||||
if (!m_params.m_array_delay_exp_axiom && d->m_prop_upward) {
|
||||
for (enode* store : d->m_parent_stores) {
|
||||
SASSERT(is_store(store) || is_lambda(store));
|
||||
SASSERT(is_store(store) || is_lambda(store->get_expr()));
|
||||
if (!m_params.m_array_cg || store->is_cgr()) {
|
||||
instantiate_axiom2b(s, store);
|
||||
}
|
||||
|
|
@ -106,7 +106,7 @@ namespace smt {
|
|||
void theory_array::add_parent_store(theory_var v, enode * s) {
|
||||
if (m_params.m_array_cg && !s->is_cgr())
|
||||
return;
|
||||
SASSERT(is_store(s) || is_lambda(s));
|
||||
SASSERT(is_store(s) || is_lambda(s->get_expr()));
|
||||
v = find(v);
|
||||
var_data * d = m_var_data[v];
|
||||
d->m_parent_stores.push_back(s);
|
||||
|
|
@ -177,7 +177,7 @@ namespace smt {
|
|||
void theory_array::add_store(theory_var v, enode * s) {
|
||||
if (m_params.m_array_cg && !s->is_cgr())
|
||||
return;
|
||||
SASSERT(is_store(s) || is_lambda(s));
|
||||
SASSERT(is_store(s) || is_lambda(s->get_expr()));
|
||||
v = find(v);
|
||||
var_data * d = m_var_data[v];
|
||||
unsigned lambda_equiv_class_size = get_lambda_equiv_size(v, d);
|
||||
|
|
@ -204,7 +204,7 @@ namespace smt {
|
|||
void theory_array::instantiate_axiom2a(enode * select, enode * store) {
|
||||
TRACE(array, tout << "axiom 2a: #" << select->get_owner_id() << " #" << store->get_owner_id() << "\n";);
|
||||
SASSERT(is_select(select));
|
||||
SASSERT(is_store(store) || is_lambda(store));
|
||||
SASSERT(is_store(store) || is_lambda(store->get_expr()));
|
||||
if (assert_store_axiom2(store, select))
|
||||
m_stats.m_num_axiom2a++;
|
||||
}
|
||||
|
|
@ -212,7 +212,7 @@ namespace smt {
|
|||
bool theory_array::instantiate_axiom2b(enode * select, enode * store) {
|
||||
TRACE(array_axiom2b, tout << "axiom 2b: #" << select->get_owner_id() << " #" << store->get_owner_id() << "\n";);
|
||||
SASSERT(is_select(select));
|
||||
SASSERT(is_store(store) || is_lambda(store));
|
||||
SASSERT(is_store(store) || is_lambda(store->get_expr()));
|
||||
if (assert_store_axiom2(store, select)) {
|
||||
m_stats.m_num_axiom2b++;
|
||||
return true;
|
||||
|
|
@ -298,11 +298,6 @@ namespace smt {
|
|||
|
||||
void theory_array::new_eq_eh(theory_var v1, theory_var v2) {
|
||||
m_find.merge(v1, v2);
|
||||
enode* n1 = get_enode(v1), *n2 = get_enode(v2);
|
||||
if (n1->get_decl()->is_lambda() ||
|
||||
n2->get_decl()->is_lambda()) {
|
||||
assert_congruent(n1, n2);
|
||||
}
|
||||
}
|
||||
|
||||
void theory_array::new_diseq_eh(theory_var v1, theory_var v2) {
|
||||
|
|
|
|||
|
|
@ -219,13 +219,14 @@ namespace smt {
|
|||
}
|
||||
|
||||
void theory_array_base::assert_lambda_axiom_core(enode* n, enode* select) {
|
||||
SASSERT(is_lambda(n));
|
||||
SASSERT(is_lambda(n->get_expr()));
|
||||
SASSERT(is_select(select));
|
||||
expr *e = n->get_expr();
|
||||
SASSERT(is_lambda(e));
|
||||
app *s = select->get_app();
|
||||
auto q = is_quantifier(e) ? to_quantifier(e) : m.is_lambda_def(e);
|
||||
auto q = to_quantifier(e);
|
||||
SASSERT(q);
|
||||
SASSERT(::is_lambda(q));
|
||||
|
||||
SASSERT(q->get_num_decls() == s->get_num_args() - 1);
|
||||
// do the same thing as in sat/smt/array_axioms:
|
||||
ptr_vector<expr> args(s->get_num_args(), s->get_args());
|
||||
|
|
@ -241,7 +242,7 @@ namespace smt {
|
|||
}
|
||||
|
||||
bool theory_array_base::assert_store_axiom2(enode * store, enode * select) {
|
||||
SASSERT(is_store(store) || is_lambda(store));
|
||||
SASSERT(is_store(store) || is_lambda(store->get_expr()));
|
||||
unsigned num_args = select->get_num_args();
|
||||
unsigned i = 1;
|
||||
for (; i < num_args; ++i)
|
||||
|
|
@ -397,8 +398,8 @@ namespace smt {
|
|||
literal n1_eq_n2 = mk_eq(e1, e2, true);
|
||||
ctx.mark_as_relevant(n1_eq_n2);
|
||||
expr_ref_vector args1(m), args2(m);
|
||||
args1.push_back(instantiate_lambda(e1));
|
||||
args2.push_back(instantiate_lambda(e2));
|
||||
args1.push_back(e1);
|
||||
args2.push_back(e2);
|
||||
svector<symbol> names;
|
||||
sort_ref_vector sorts(m);
|
||||
for (unsigned i = 0; i < dimension; ++i) {
|
||||
|
|
@ -422,17 +423,6 @@ namespace smt {
|
|||
assert_axiom(~n1_eq_n2, fa_eq);
|
||||
}
|
||||
|
||||
expr_ref theory_array_base::instantiate_lambda(expr* e) {
|
||||
quantifier * q = m.is_lambda_def(e);
|
||||
expr_ref f(e, m);
|
||||
if (q) {
|
||||
// the variables in q are maybe not consecutive.
|
||||
var_subst sub(m, false);
|
||||
f = sub(q, to_app(e)->get_num_args(), to_app(e)->get_args());
|
||||
}
|
||||
return f;
|
||||
}
|
||||
|
||||
bool theory_array_base::can_propagate() {
|
||||
return
|
||||
!m_axiom1_todo.empty() ||
|
||||
|
|
@ -443,7 +433,7 @@ namespace smt {
|
|||
}
|
||||
|
||||
void theory_array_base::propagate() {
|
||||
while (can_propagate()) {
|
||||
while (theory_array_base::can_propagate()) {
|
||||
for (unsigned i = 0; i < m_axiom1_todo.size(); ++i)
|
||||
assert_store_axiom1_core(m_axiom1_todo[i]);
|
||||
m_axiom1_todo.reset();
|
||||
|
|
|
|||
|
|
@ -46,9 +46,6 @@ namespace smt {
|
|||
bool is_choice(expr const* n) const { return is_app(n) && to_app(n)->is_app_of(get_id(), OP_CHOICE); }
|
||||
bool is_array_sort(sort const* s) const { return s->is_sort_of(get_id(), ARRAY_SORT); }
|
||||
bool is_array_sort(expr const* n) const { return is_array_sort(n->get_sort()); }
|
||||
bool is_lambda(expr *n) const {
|
||||
return m.is_lambda_def(n) || ::is_lambda(n);
|
||||
}
|
||||
|
||||
|
||||
bool is_store(enode const * n) const { return is_store(n->get_expr()); }
|
||||
|
|
@ -59,9 +56,6 @@ namespace smt {
|
|||
bool is_choice(enode const* n) const { return is_choice(n->get_expr()); }
|
||||
bool is_default(enode const* n) const { return is_default(n->get_expr()); }
|
||||
bool is_array_sort(enode const* n) const { return is_array_sort(n->get_sort()); }
|
||||
bool is_lambda(enode const *n) const {
|
||||
return is_lambda(n->get_expr());
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -248,7 +248,7 @@ namespace smt {
|
|||
instantiate_default_as_array_axiom(n);
|
||||
d->m_as_arrays.push_back(n);
|
||||
}
|
||||
else if (is_lambda(n)) {
|
||||
else if (is_lambda(n->get_expr())) {
|
||||
instantiate_default_lambda_def_axiom(n);
|
||||
d->m_lambdas.push_back(n);
|
||||
m_lambdas.push_back(n);
|
||||
|
|
@ -578,13 +578,12 @@ namespace smt {
|
|||
if (!ctx.add_fingerprint(this, m_default_lambda_fingerprint, 1, &arr))
|
||||
return false;
|
||||
m_stats.m_num_default_lambda_axiom++;
|
||||
expr* e = arr->get_expr();
|
||||
expr_ref def(mk_default(e), m);
|
||||
quantifier* lam = is_quantifier(e) ? to_quantifier(e) : m.is_lambda_def(e);
|
||||
TRACE(array, tout << mk_pp(lam, m) << "\n" << mk_pp(e, m) << "\n");
|
||||
quantifier *lam = to_quantifier(arr->get_expr());
|
||||
expr_ref def(mk_default(arr->get_expr()), m);
|
||||
TRACE(array, tout << mk_pp(lam, m) << "\n");
|
||||
expr_ref_vector args(m);
|
||||
var_subst subst(m, false);
|
||||
args.push_back(subst(lam, to_app(e)->get_num_args(), to_app(e)->get_args()));
|
||||
args.push_back(lam);
|
||||
for (unsigned i = 0; i < lam->get_num_decls(); ++i)
|
||||
args.push_back(mk_epsilon(lam->get_decl_sort(i)).first);
|
||||
expr_ref val(mk_select(args), m);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue