virtual expr visit_app(expr const & e) override { expr const & fn = get_app_fn(e); if (!is_constant(fn)) return default_visit_app(e); name const & n = const_name(fn); if (is_vm_builtin_function(n)) return default_visit_app(e); if (is_cases_on_recursor(env(), n) || is_nonrecursive_recursor(n)) return visit_cases_on_app(e); unsigned nargs = get_app_num_args(e); declaration d = env().get(n); if (!d.is_definition() || d.is_theorem()) return default_visit_app(e); expr v = d.get_value(); unsigned arity = 0; while (is_lambda(v)) { arity++; v = binding_body(v); } if (arity > nargs) { // not fully applied return default_visit_app(e); } if (is_inline(env(), n) || is_simple_application(v)) { if (auto r = unfold_term(env(), e)) return visit(*r); } /* TODO(Leo): this is not safe here. Reason: we may put recursors have have been eliminated in previous steps. We need to move this code to a different place, or make sure that we can recursors will be eliminated later if (auto r = ctx().reduce_projection(e)) { return visit(*r); } */ return default_visit_app(e); }
bool is_const_app(expr const & e, name const & n, unsigned nargs) { expr const & f = get_app_fn(e); return is_constant(f) && const_name(f) == n && get_app_num_args(e) == nargs; }