fix(library/class_instance_resolution): initialization bug and ignore universe metavariables not instantiated by unifier
This commit is contained in:
parent
6a36bffe4b
commit
98943f7832
1 changed files with 20 additions and 8 deletions
|
@ -98,12 +98,12 @@ struct cienv {
|
||||||
optional<pos_info> m_pos;
|
optional<pos_info> m_pos;
|
||||||
ci_type_inference_ptr m_tc_ptr;
|
ci_type_inference_ptr m_tc_ptr;
|
||||||
expr_struct_map<expr> m_cache;
|
expr_struct_map<expr> m_cache;
|
||||||
name_generator m_ngen;
|
|
||||||
name_predicate m_not_reducible_pred;
|
name_predicate m_not_reducible_pred;
|
||||||
|
|
||||||
list<expr> m_ctx;
|
list<expr> m_ctx;
|
||||||
buffer<pair<name, expr>> m_local_instances;
|
buffer<pair<name, expr>> m_local_instances;
|
||||||
|
|
||||||
|
unsigned m_next_local_idx;
|
||||||
unsigned m_next_uvar_idx;
|
unsigned m_next_uvar_idx;
|
||||||
unsigned m_next_mvar_idx;
|
unsigned m_next_mvar_idx;
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ struct cienv {
|
||||||
bool m_trace_instances;
|
bool m_trace_instances;
|
||||||
|
|
||||||
cienv(bool multiple_instances = false):
|
cienv(bool multiple_instances = false):
|
||||||
m_ngen(*g_prefix2),
|
m_next_local_idx(0),
|
||||||
m_next_uvar_idx(0),
|
m_next_uvar_idx(0),
|
||||||
m_next_mvar_idx(0),
|
m_next_mvar_idx(0),
|
||||||
m_multiple_instances(multiple_instances) {}
|
m_multiple_instances(multiple_instances) {}
|
||||||
|
@ -216,12 +216,17 @@ struct cienv {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
name mk_fresh_name() {
|
expr mk_local(expr const & type) {
|
||||||
return m_ngen.next();
|
unsigned idx = m_next_local_idx;
|
||||||
|
m_next_local_idx++;
|
||||||
|
return lean::mk_local(name(*g_prefix2, idx), type);
|
||||||
}
|
}
|
||||||
|
|
||||||
expr mk_local(expr const & type) {
|
bool is_internal_local(expr const & e) {
|
||||||
return lean::mk_local(mk_fresh_name(), type);
|
if (!is_local(e))
|
||||||
|
return false;
|
||||||
|
name const & n = mlocal_name(e);
|
||||||
|
return !n.is_atomic() && n.get_prefix() == *g_prefix2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \brief If the constant \c e is a class, return its name */
|
/** \brief If the constant \c e is a class, return its name */
|
||||||
|
@ -443,6 +448,12 @@ struct cienv {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (is_meta(l1) || is_meta(l2)) {
|
||||||
|
// The unifier may invoke this module before universe metavariables in the class
|
||||||
|
// have been instantiated. So, we just ignore and assume they will be solved by
|
||||||
|
// the unifier.
|
||||||
|
return true; // we ignore
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -644,7 +655,7 @@ struct cienv {
|
||||||
expr const & m = get_app_args(ma, args);
|
expr const & m = get_app_args(ma, args);
|
||||||
buffer<expr> locals;
|
buffer<expr> locals;
|
||||||
for (expr const & arg : args) {
|
for (expr const & arg : args) {
|
||||||
if (!is_local(arg))
|
if (!is_internal_local(arg))
|
||||||
break; // is not local
|
break; // is not local
|
||||||
if (std::any_of(locals.begin(), locals.end(), [&](expr const & local) {
|
if (std::any_of(locals.begin(), locals.end(), [&](expr const & local) {
|
||||||
return mlocal_name(local) == mlocal_name(arg); }))
|
return mlocal_name(local) == mlocal_name(arg); }))
|
||||||
|
@ -661,7 +672,7 @@ struct cienv {
|
||||||
for_each(new_v, [&](expr const & e, unsigned) {
|
for_each(new_v, [&](expr const & e, unsigned) {
|
||||||
if (!ok)
|
if (!ok)
|
||||||
return false; // stop search
|
return false; // stop search
|
||||||
if (is_local(e)) {
|
if (is_internal_local(e)) {
|
||||||
if (std::all_of(locals.begin(), locals.end(), [&](expr const & a) {
|
if (std::all_of(locals.begin(), locals.end(), [&](expr const & a) {
|
||||||
return mlocal_name(a) != mlocal_name(e); })) {
|
return mlocal_name(a) != mlocal_name(e); })) {
|
||||||
ok = false; // failed 1
|
ok = false; // failed 1
|
||||||
|
@ -1039,6 +1050,7 @@ struct cienv {
|
||||||
m_main_mvar = mk_mvar(type);
|
m_main_mvar = mk_mvar(type);
|
||||||
m_state.m_stack = cons(m_main_mvar, m_state.m_stack);
|
m_state.m_stack = cons(m_main_mvar, m_state.m_stack);
|
||||||
m_displayed_trace_header = false;
|
m_displayed_trace_header = false;
|
||||||
|
m_choices.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<expr> ensure_no_meta(optional<expr> r) {
|
optional<expr> ensure_no_meta(optional<expr> r) {
|
||||||
|
|
Loading…
Reference in a new issue