void fun_info_manager::trace_if_unsupported(expr const & fn, buffer<expr> const & args, unsigned prefix_sz, fun_info const & result) { if (!is_fun_info_trace_enabled()) return; fun_info info = get(fn, args.size()); buffer<param_info> pinfos; to_buffer(info.get_params_info(), pinfos); /* Check if all remaining arguments are nondependent or dependent (but all forward dependencies are propositions or subsingletons) */ unsigned i = prefix_sz; for (; i < pinfos.size(); i++) { param_info const & pinfo = pinfos[i]; if (!pinfo.is_dep()) continue; /* nondependent argument */ if (has_nonprop_nonsubsingleton_fwd_dep(i, pinfos)) break; /* failed i-th argument has a forward dependent that is not a prop nor a subsingleton */ } if (i == pinfos.size()) return; // It is *cheap* case /* Expensive case */ /* We generate a trace message IF it would be possible to compute more precise information. That is, there is an argument that is a proposition and/or subsingleton, but the corresponding pinfo is not a marked a prop/subsingleton. */ i = 0; for (param_info const & pinfo : result.get_params_info()) { if (pinfo.is_prop() || pinfo.is_subsingleton()) continue; expr arg_type = m_ctx.infer(args[i]); if (m_ctx.is_prop(arg_type) || m_ctx.mk_subsingleton_instance(arg_type)) { lean_trace_fun_info( tout() << "approximating function information for '" << fn << "', this may affect the effectiveness of the simplifier and congruence closure modules, " << "more precise information can be efficiently computed if all parameters are moved to the beginning of the function\n";); return; }
/* structure fun_info := (params : list param_info) (result_deps : list nat) -- parameters the result type depends on */ vm_obj to_obj(fun_info const & info) { return mk_vm_constructor(0, to_obj(info.get_params_info()), to_obj(info.get_result_deps())); }