/* Copyright (c) 2014 Microsoft Corporation. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Author: Leonardo de Moura */ #include "kernel/find_fn.h" #include "kernel/inductive/inductive.h" namespace lean { bool is_recursive_datatype(environment const & env, name const & n) { optional decls = inductive::is_inductive_decl(env, n); if (!decls) return false; for (inductive::inductive_decl const & decl : std::get<2>(*decls)) { for (inductive::intro_rule const & intro : inductive::inductive_decl_intros(decl)) { expr type = inductive::intro_rule_type(intro); while (is_pi(type)) { if (find(binding_domain(type), [&](expr const & e, unsigned) { return is_constant(e) && const_name(e) == n; })) return true; type = binding_body(type); } } } return false; } }