feat(library/type_context): cache mk_subsingleton_instance
This commit is contained in:
parent
799317c43e
commit
f22ba4e641
2 changed files with 13 additions and 2 deletions
|
@ -1223,6 +1223,7 @@ expr type_context::infer(expr const & e) {
|
||||||
|
|
||||||
void type_context::clear_cache() {
|
void type_context::clear_cache() {
|
||||||
m_ci_cache.clear();
|
m_ci_cache.clear();
|
||||||
|
m_ss_cache.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \brief If the constant \c e is a class, return its name */
|
/** \brief If the constant \c e is a class, return its name */
|
||||||
|
@ -1729,16 +1730,23 @@ optional<expr> type_context::mk_class_instance(expr const & type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<expr> type_context::mk_subsingleton_instance(expr const & type) {
|
optional<expr> type_context::mk_subsingleton_instance(expr const & type) {
|
||||||
|
auto it = m_ss_cache.find(type);
|
||||||
|
if (it != m_ss_cache.end())
|
||||||
|
return it->second;
|
||||||
expr Type = whnf(infer(type));
|
expr Type = whnf(infer(type));
|
||||||
if (!is_sort(Type))
|
if (!is_sort(Type)) {
|
||||||
|
m_ss_cache.insert(mk_pair(type, none_expr()));
|
||||||
return none_expr();
|
return none_expr();
|
||||||
|
}
|
||||||
level lvl = sort_level(Type);
|
level lvl = sort_level(Type);
|
||||||
expr subsingleton;
|
expr subsingleton;
|
||||||
if (is_standard(m_env))
|
if (is_standard(m_env))
|
||||||
subsingleton = mk_app(mk_constant(get_subsingleton_name(), {lvl}), type);
|
subsingleton = mk_app(mk_constant(get_subsingleton_name(), {lvl}), type);
|
||||||
else
|
else
|
||||||
subsingleton = whnf(mk_app(mk_constant(get_is_trunc_is_hprop_name(), {lvl}), type));
|
subsingleton = whnf(mk_app(mk_constant(get_is_trunc_is_hprop_name(), {lvl}), type));
|
||||||
return mk_class_instance(subsingleton);
|
auto r = mk_class_instance(subsingleton);
|
||||||
|
m_ss_cache.insert(mk_pair(type, r));
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<expr> type_context::next_class_instance() {
|
optional<expr> type_context::next_class_instance() {
|
||||||
|
|
|
@ -280,6 +280,9 @@ class type_context {
|
||||||
bool m_ci_displayed_trace_header;
|
bool m_ci_displayed_trace_header;
|
||||||
optional<pos_info> m_ci_pos;
|
optional<pos_info> m_ci_pos;
|
||||||
|
|
||||||
|
/* subsingleton instance cache, we also cache failures */
|
||||||
|
expr_struct_map<optional<expr>> m_ss_cache;
|
||||||
|
|
||||||
// configuration options
|
// configuration options
|
||||||
unsigned m_ci_max_depth;
|
unsigned m_ci_max_depth;
|
||||||
bool m_ci_trans_instances;
|
bool m_ci_trans_instances;
|
||||||
|
|
Loading…
Reference in a new issue