diff --git a/src/library/type_context.cpp b/src/library/type_context.cpp index 236f1e9c2d..1da8c6ff38 100644 --- a/src/library/type_context.cpp +++ b/src/library/type_context.cpp @@ -599,9 +599,24 @@ expr type_context::relaxed_whnf(expr const & e) { return whnf(e); } +optional type_context::is_stuck_projection(expr const & e) { + expr const & f = get_app_fn(e); + if (!is_constant(f)) return none_expr(); // it is not projection app + projection_info const * info = m_cache->m_proj_info.find(const_name(f)); + if (!info) return none_expr(); // it is not projection app + buffer args; + get_app_args(e, args); + if (args.size() <= info->m_nparams) return none_expr(); // partially applied projection + unsigned mkidx = info->m_nparams; + expr mk = args[mkidx]; + return is_stuck(mk); +} + optional type_context::is_stuck(expr const & e) { if (is_meta(e)) { return some_expr(e); + } else if (auto r = is_stuck_projection(e)) { + return r; } else { return env().norm_ext().is_stuck(e, *this); } diff --git a/src/library/type_context.h b/src/library/type_context.h index 9b5d300edc..05966ffdde 100644 --- a/src/library/type_context.h +++ b/src/library/type_context.h @@ -250,6 +250,7 @@ public: virtual expr relaxed_whnf(expr const & e) override; virtual bool relaxed_is_def_eq(expr const & e1, expr const & e2) override; + optional is_stuck_projection(expr const & e); virtual optional is_stuck(expr const &) override; virtual expr push_local(name const & pp_name, expr const & type, binder_info const & bi = binder_info()) override;