/* Store parameter info for fn in \c pinfos and return the dependencies of the resulting type (if compute_resulting_deps == true). */ static list<unsigned> get_core(type_context & ctx, expr const & fn, buffer<param_info> & pinfos, unsigned max_args, bool compute_resulting_deps) { expr type = ctx.relaxed_try_to_pi(ctx.infer(fn)); type_context::tmp_locals locals(ctx); unsigned i = 0; while (is_pi(type)) { if (i == max_args) break; expr local = locals.push_local_from_binding(type); expr local_type = ctx.infer(local); expr new_type = ctx.relaxed_try_to_pi(instantiate(binding_body(type), local)); bool is_prop = ctx.is_prop(local_type); bool is_dep = !closed(binding_body(type)); pinfos.emplace_back(binding_info(type).is_implicit(), binding_info(type).is_inst_implicit(), is_prop, is_dep, collect_deps(local_type, locals.as_buffer())); type = new_type; i++; } if (compute_resulting_deps) return collect_deps(type, locals.as_buffer()); else return list<unsigned>(); }
/* Store parameter info for fn in \c pinfos and return the dependencies of the resulting type (if compute_resulting_deps == true). */ list<unsigned> fun_info_manager::get_core(expr const & fn, buffer<param_info> & pinfos, unsigned max_args, bool compute_resulting_deps) { expr type = m_ctx.relaxed_try_to_pi(m_ctx.infer(fn)); buffer<expr> locals; unsigned i = 0; while (is_pi(type)) { if (i == max_args) break; expr local = m_ctx.mk_tmp_local_from_binding(type); expr local_type = m_ctx.infer(local); expr new_type = m_ctx.relaxed_try_to_pi(instantiate(binding_body(type), local)); bool spec = false; bool is_prop = m_ctx.is_prop(local_type); bool is_sub = is_prop; bool is_dep = !closed(binding_body(type)); if (!is_sub) { // TODO(Leo): check if the following line is a performance bottleneck. is_sub = static_cast<bool>(m_ctx.mk_subsingleton_instance(local_type)); } pinfos.emplace_back(spec, binding_info(type).is_implicit(), binding_info(type).is_inst_implicit(), is_prop, is_sub, is_dep, collect_deps(local_type, locals)); locals.push_back(local); type = new_type; i++; } if (compute_resulting_deps) return collect_deps(type, locals); else return list<unsigned>(); }
/* If type of d is a proposition or return a type, we don't need to compile it. We can just generate (fun args, neutral_expr) This procedure returns true if type of d is a proposition or return a type, and store the dummy code above in */ bool compile_irrelevant(declaration const & d, buffer<procedure> & procs) { type_context ctx(m_env, transparency_mode::All); expr type = d.get_type(); type_context::tmp_locals locals(ctx); while (true) { type = ctx.relaxed_whnf(type); if (!is_pi(type)) break; expr local = locals.push_local_from_binding(type); type = instantiate(binding_body(type), local); } if (ctx.is_prop(type) || is_sort(type)) { expr r = locals.mk_lambda(mk_neutral_expr()); procs.emplace_back(d.get_name(), optional<pos_info>(), r); return true; } else { return false; } }
/* Store subsingleton parameter info for fn in \c ssinfos */ static void get_ss_core(type_context & ctx, expr const & fn, buffer<ss_param_info> & ssinfos, unsigned max_args) { expr type = ctx.relaxed_try_to_pi(ctx.infer(fn)); type_context::tmp_locals locals(ctx); unsigned i = 0; while (is_pi(type)) { if (i == max_args) break; expr local = locals.push_local_from_binding(type); expr local_type = ctx.infer(local); expr new_type = ctx.relaxed_try_to_pi(instantiate(binding_body(type), local)); bool spec = false; bool is_prop = ctx.is_prop(local_type); bool is_sub = is_prop; if (!is_sub) { // TODO(Leo): check if the following line is a performance bottleneck. is_sub = static_cast<bool>(ctx.mk_subsingleton_instance(local_type)); } ssinfos.emplace_back(spec, is_sub); type = new_type; i++; } }