feat(kernel/type_checker): expose is_opaque
This commit is contained in:
parent
8747f12118
commit
d4236e40b4
4 changed files with 26 additions and 3 deletions
|
@ -91,6 +91,7 @@ struct dummy_converter : public converter {
|
||||||
return mk_pair(true, constraint_seq());
|
return mk_pair(true, constraint_seq());
|
||||||
}
|
}
|
||||||
virtual optional<module_idx> get_module_idx() const { return optional<module_idx>(); }
|
virtual optional<module_idx> get_module_idx() const { return optional<module_idx>(); }
|
||||||
|
virtual bool is_opaque(declaration const &) const { return false; }
|
||||||
};
|
};
|
||||||
|
|
||||||
std::unique_ptr<converter> mk_dummy_converter() {
|
std::unique_ptr<converter> mk_dummy_converter() {
|
||||||
|
@ -222,15 +223,19 @@ struct default_converter : public converter {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_opaque(declaration const & d) const {
|
bool is_opaque_core(declaration const & d) const {
|
||||||
return ::lean::is_opaque(d, m_extra_pred, m_module_idx);
|
return ::lean::is_opaque(d, m_extra_pred, m_module_idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool is_opaque(declaration const & d) const {
|
||||||
|
return is_opaque_core(d);
|
||||||
|
}
|
||||||
|
|
||||||
/** \brief Expand \c e if it is non-opaque constant with weight >= w */
|
/** \brief Expand \c e if it is non-opaque constant with weight >= w */
|
||||||
expr unfold_name_core(expr e, unsigned w) {
|
expr unfold_name_core(expr e, unsigned w) {
|
||||||
if (is_constant(e)) {
|
if (is_constant(e)) {
|
||||||
if (auto d = m_env.find(const_name(e))) {
|
if (auto d = m_env.find(const_name(e))) {
|
||||||
if (d->is_definition() && !is_opaque(*d) && d->get_weight() >= w)
|
if (d->is_definition() && !is_opaque_core(*d) && d->get_weight() >= w)
|
||||||
return unfold_name_core(instantiate_value_univ_params(*d, const_levels(e)), w);
|
return unfold_name_core(instantiate_value_univ_params(*d, const_levels(e)), w);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -515,7 +520,7 @@ struct default_converter : public converter {
|
||||||
// If they are, then t_n and s_n must be definitionally equal, and we can
|
// If they are, then t_n and s_n must be definitionally equal, and we can
|
||||||
// skip the delta-reduction step.
|
// skip the delta-reduction step.
|
||||||
// If the flag use_conv_opt() is not true, then we skip this optimization
|
// If the flag use_conv_opt() is not true, then we skip this optimization
|
||||||
if (!is_opaque(*d_t) && d_t->use_conv_opt() &&
|
if (!is_opaque_core(*d_t) && d_t->use_conv_opt() &&
|
||||||
is_def_eq_args(t_n, s_n, c, jst, cs))
|
is_def_eq_args(t_n, s_n, c, jst, cs))
|
||||||
return to_bcs(true, cs);
|
return to_bcs(true, cs);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ public:
|
||||||
virtual pair<expr, constraint_seq> whnf(expr const & e, type_checker & c) = 0;
|
virtual pair<expr, constraint_seq> whnf(expr const & e, type_checker & c) = 0;
|
||||||
virtual pair<bool, constraint_seq> is_def_eq(expr const & t, expr const & s, type_checker & c, delayed_justification & j) = 0;
|
virtual pair<bool, constraint_seq> is_def_eq(expr const & t, expr const & s, type_checker & c, delayed_justification & j) = 0;
|
||||||
virtual optional<module_idx> get_module_idx() const = 0;
|
virtual optional<module_idx> get_module_idx() const = 0;
|
||||||
|
virtual bool is_opaque(declaration const & d) const = 0;
|
||||||
pair<bool, constraint_seq> is_def_eq(expr const & t, expr const & s, type_checker & c);
|
pair<bool, constraint_seq> is_def_eq(expr const & t, expr const & s, type_checker & c);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -407,6 +407,18 @@ pair<expr, constraint_seq> type_checker::whnf(expr const & t) {
|
||||||
return m_conv->whnf(t, *this);
|
return m_conv->whnf(t, *this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool type_checker::is_opaque(declaration const & d) const {
|
||||||
|
return m_conv->is_opaque(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool type_checker::is_opaque(expr const & c) const {
|
||||||
|
lean_assert(is_constant(c));
|
||||||
|
if (auto d = m_env.find(const_name(c)))
|
||||||
|
return is_opaque(*d);
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
type_checker::type_checker(environment const & env, name_generator const & g, std::unique_ptr<converter> && conv, bool memoize):
|
type_checker::type_checker(environment const & env, name_generator const & g, std::unique_ptr<converter> && conv, bool memoize):
|
||||||
m_env(env), m_gen(g), m_conv(std::move(conv)), m_tc_ctx(*this),
|
m_env(env), m_gen(g), m_conv(std::move(conv)), m_tc_ctx(*this),
|
||||||
m_memoize(memoize), m_params(nullptr) {
|
m_memoize(memoize), m_params(nullptr) {
|
||||||
|
|
|
@ -199,6 +199,11 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<expr> expand_macro(expr const & m);
|
optional<expr> expand_macro(expr const & m);
|
||||||
|
|
||||||
|
/** \brief Return true iff \c d is opaque with respect to this type checker. */
|
||||||
|
bool is_opaque(declaration const & d) const;
|
||||||
|
/** \brief Return true iff the constant \c c is opaque with respect to this type checker. */
|
||||||
|
bool is_opaque(expr const & c) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::shared_ptr<type_checker> type_checker_ref;
|
typedef std::shared_ptr<type_checker> type_checker_ref;
|
||||||
|
|
Loading…
Add table
Reference in a new issue