diff --git a/src/kernel/inductive/inductive.cpp b/src/kernel/inductive/inductive.cpp index 1f8f3cf5d..44184094b 100644 --- a/src/kernel/inductive/inductive.cpp +++ b/src/kernel/inductive/inductive.cpp @@ -727,11 +727,6 @@ environment add_inductive(environment env, return add_inductive_fn(env, level_params, num_params, decls)(); } -environment add_inductive(environment const & env, name const & ind_name, level_param_names const & level_params, - unsigned num_params, expr const & type, list const & intro_rules) { - return add_inductive(env, level_params, num_params, list(inductive_decl(ind_name, type, intro_rules))); -} - optional inductive_normalizer_extension::operator()(expr const & e, extension_context & ctx) const { // Reduce terms \c e of the form // elim_k A C e p[A,b] (intro_k_i A b u) diff --git a/src/kernel/inductive/inductive.h b/src/kernel/inductive/inductive.h index e8f7e7142..dab2e60a8 100644 --- a/src/kernel/inductive/inductive.h +++ b/src/kernel/inductive/inductive.h @@ -40,13 +40,5 @@ environment add_inductive(environment env, level_param_names const & level_params, unsigned num_params, list const & decls); - -/** \brief Declare a single inductive datatype. */ -environment add_inductive(environment const & env, - name const & ind_name, // name of new inductive datatype - level_param_names const & level_params, // level parameters - unsigned num_params, // number of params - expr const & type, // type of the form: params -> indices -> Type - list const & intro_rules); // introduction rules } } diff --git a/src/library/kernel_bindings.cpp b/src/library/kernel_bindings.cpp index 9a9a26fb7..3c0f7aed0 100644 --- a/src/library/kernel_bindings.cpp +++ b/src/library/kernel_bindings.cpp @@ -1926,7 +1926,7 @@ static int add_inductivek(lua_State * L) { } if (decls.empty()) throw exception("invalid add_inductive, at least one inductive type must be defined"); - return push_environment(L, add_inductive(env, ls, num_params, to_list(decls.begin(), decls.end()))); + return push_environment(L, ::lean::add_inductive(env, ls, num_params, to_list(decls.begin(), decls.end()))); } static int add_inductive(lua_State * L) { if (is_name(L, 2) || lua_isstring(L, 2)) diff --git a/src/library/module.cpp b/src/library/module.cpp index 67cef1fe0..8dfc086f5 100644 --- a/src/library/module.cpp +++ b/src/library/module.cpp @@ -138,6 +138,34 @@ environment add(environment const & env, declaration const & d) { return add(new_env, g_decl, [=](serializer & s) { s << d; }); } +static std::string g_inductive("ind"); + +environment add_inductive(environment env, + level_param_names const & level_params, + unsigned num_params, + list const & decls) { + environment new_env = inductive::add_inductive(env, level_params, num_params, decls); + return add(new_env, g_inductive, [=](serializer & s) { + s << inductive_decls(level_params, num_params, decls); + }); +} + +environment add_inductive(environment const & env, name const & ind_name, level_param_names const & level_params, + unsigned num_params, expr const & type, list const & intro_rules) { + return add_inductive(env, level_params, num_params, list(inductive::inductive_decl(ind_name, type, intro_rules))); +} + +static void inductive_reader(deserializer & d, module_idx, shared_environment & senv, + std::function &, + std::function &) { + inductive_decls ds = read_inductive_decls(d); + senv.update([&](environment const & env) { + return inductive::add_inductive(env, std::get<0>(ds), std::get<1>(ds), std::get<2>(ds)); + }); +} + +static register_module_object_reader_fn g_reg_ind_reader(g_inductive, inductive_reader); + struct import_modules_fn { typedef std::tuple delayed_update; shared_environment m_senv; diff --git a/src/library/module.h b/src/library/module.h index 13f9fb552..80f71820c 100644 --- a/src/library/module.h +++ b/src/library/module.h @@ -8,6 +8,7 @@ Author: Leonardo de Moura #include #include #include "util/serializer.h" +#include "kernel/inductive/inductive.h" #include "library/shared_environment.h" #include "library/io_state.h" @@ -77,4 +78,18 @@ environment add(environment const & env, certified_declaration const & d); This method throws an exception if the trust_level <= LEAN_BELIEVER_TRUST_LEVEL */ environment add(environment const & env, declaration const & d); + +/** \brief Add the given inductive declaration to the environment, and mark it to be exported. */ +environment add_inductive(environment env, + level_param_names const & level_params, + unsigned num_params, + list const & decls); + +/** \brief Declare a single inductive datatype. */ +environment add_inductive(environment const & env, + name const & ind_name, // name of new inductive datatype + level_param_names const & level_params, // level parameters + unsigned num_params, // number of params + expr const & type, // type of the form: params -> indices -> Type + list const & intro_rules); // introduction rules }