diff --git a/src/frontends/lean/decl_util.cpp b/src/frontends/lean/decl_util.cpp index 808c45e383..b0e22d8b79 100644 --- a/src/frontends/lean/decl_util.cpp +++ b/src/frontends/lean/decl_util.cpp @@ -11,6 +11,7 @@ Author: Leonardo de Moura #include "library/locals.h" #include "library/placeholder.h" #include "library/tactic/elaborate.h" +#include "frontends/lean/util.h" #include "frontends/lean/decl_util.h" #include "frontends/lean/tokens.h" #include "frontends/lean/parser.h" @@ -233,4 +234,23 @@ void elaborate_params(elaborator & elab, buffer const & params, buffer const & lp_names, buffer const & var_params) { + if (!p.has_params()) return env; + buffer params; + buffer lps; + for (name const & u : lp_names) { + if (p.is_local_level_variable(u)) + break; + lps.push_back(u); + } + for (expr const & e : var_params) { + if (p.is_local_variable(e)) + break; + params.push_back(e); + } + if (lps.empty() && params.empty()) return env; + expr ref = mk_local_ref(c_real_name, param_names_to_levels(to_list(lps)), params); + return p.add_local_ref(env, c_name, ref); +} } diff --git a/src/frontends/lean/decl_util.h b/src/frontends/lean/decl_util.h index ad102bb1a6..6d55e720f3 100644 --- a/src/frontends/lean/decl_util.h +++ b/src/frontends/lean/decl_util.h @@ -59,4 +59,10 @@ void collect_implicit_locals(parser & p, buffer & lp_names, buffer & \post params.size() == new_params.size() */ void elaborate_params(elaborator & elab, buffer const & params, buffer & new_params); + +/** \brief Create an alias c_name --> (c_real_name.{level_params} params) + level_params and params are subsets of lp_names and var_params that were + declared using the parameter command. */ +environment add_local_ref(parser & p, environment const & env, name const & c_name, name const & c_real_name, + buffer const & lp_names, buffer const & var_params); } diff --git a/src/frontends/lean/definition_cmds.cpp b/src/frontends/lean/definition_cmds.cpp index 44a393f7a9..240ae34e97 100644 --- a/src/frontends/lean/definition_cmds.cpp +++ b/src/frontends/lean/definition_cmds.cpp @@ -280,9 +280,11 @@ static environment compile_decl(parser & p, environment const & env, def_cmd_kin } } -static environment declare_definition(parser & p, def_cmd_kind kind, buffer const & lp_names, name const & c_name, - expr const & type, expr const & val, bool is_private, bool is_protected, bool is_noncomputable, - decl_attributes attrs, pos_info const & pos) { +static pair +declare_definition(parser & p, def_cmd_kind kind, buffer const & lp_names, + name const & c_name, expr const & type, expr const & val, + bool is_private, bool is_protected, bool is_noncomputable, + decl_attributes attrs, pos_info const & pos) { auto env_n = mk_real_name(p.env(), c_name, is_private, pos); environment new_env = env_n.first; name c_real_name = env_n.second; @@ -309,7 +311,8 @@ static environment declare_definition(parser & p, def_cmd_kind kind, buffer