diff --git a/src/library/local_context.cpp b/src/library/local_context.cpp index 82bdb26ed7..7ef7c13785 100644 --- a/src/library/local_context.cpp +++ b/src/library/local_context.cpp @@ -107,6 +107,14 @@ void local_context::for_each_after(local_decl const & d, std::function set(m_transparency_mode, transparency_mode::ALL); + return whnf(e); +} + +bool type_context::relaxed_is_def_eq(expr const & e1, expr const & e2) { + flet set(m_transparency_mode, transparency_mode::ALL); + return is_def_eq(e1, e2); +} + +name type_context::get_local_pp_name(expr const & e) const { + lean_assert(is_local(e)); + if (is_local_decl_ref(e)) + return m_lctx.get_local_decl(e)->get_name(); + else + return local_pp_name(e); +} + +expr type_context::push_local(name const & pp_name, expr const & type, binder_info const & bi) { + return m_lctx.mk_local_decl(pp_name, type, bi); +} + +void type_context::pop_local() { + return m_lctx.pop_local_decl(); +} } diff --git a/src/library/type_context.h b/src/library/type_context.h index 65680f79a9..cd6abec13e 100644 --- a/src/library/type_context.h +++ b/src/library/type_context.h @@ -139,6 +139,9 @@ class type_context : public abstract_type_context { tmp_trail m_tmp_trail; /* Stack of backtracking point (aka scope) */ scopes m_scopes; + + virtual bool on_is_def_eq_failure(expr const &, expr const &); + public: type_context(metavar_context & mctx, local_context const & lctx, type_context_cache & cache, transparency_mode m = transparency_mode::REDUCIBLE); @@ -146,19 +149,26 @@ public: transparency_mode m = transparency_mode::REDUCIBLE); virtual ~type_context(); - virtual environment const & env() const; - virtual expr whnf(expr const & e); - virtual expr infer(expr const & e); - virtual expr check(expr const & e); - virtual bool is_def_eq(expr const & e1, expr const & e2); + virtual environment const & env() const override { return m_cache->m_env; } - virtual expr relaxed_whnf(expr const & e); - virtual bool relaxed_is_def_eq(expr const & e1, expr const & e2); + virtual expr whnf(expr const & e) override; + virtual expr infer(expr const & e) override; + virtual expr check(expr const & e) override; + virtual bool is_def_eq(expr const & e1, expr const & e2) override; - virtual optional is_stuck(expr const &); - virtual name get_local_pp_name(expr const & e) const; + virtual expr relaxed_whnf(expr const & e) override; + virtual bool relaxed_is_def_eq(expr const & e1, expr const & e2) override; - virtual bool on_is_def_eq_failure(expr const &, expr const &); + virtual optional is_stuck(expr const &) override; + virtual name get_local_pp_name(expr const & e) const override; + + virtual expr push_local(name const & pp_name, expr const & type, binder_info const & bi = binder_info()) override; + virtual void pop_local() override; + virtual expr abstract_locals(expr const & e, unsigned num_locals, expr const * locals) override; + + expr push_let(name const & ppn, expr const & type, expr const & value) { + return m_lctx.mk_local_decl(ppn, type, value); + } bool is_prop(expr const & e); diff --git a/src/util/rb_map.h b/src/util/rb_map.h index 146e5b3626..418b580991 100644 --- a/src/util/rb_map.h +++ b/src/util/rb_map.h @@ -44,6 +44,9 @@ public: return r; } + T min() const { lean_assert(!empty()); return m_map.min()->second; } + T max() const { lean_assert(!empty()); return m_map.max()->second; } + class ref { rb_map & m_map; K const & m_key;