lean4-htt/src/api/inductive.cpp
Leonardo de Moura 572751c56e feat(frontends/lean): force user to use meta keyword on meta inductive/structure/class
Before this commit, we were inferring whether an
inductive/structure/class were meta or not. This was bad since the user
had no clue whether the type was trusted (non meta) or not.
Moreover, users could get confused by this behavior and assume the
kernel was allowing trusted code to rely on untrusted one.
2016-09-29 17:56:35 -07:00

155 lines
4.7 KiB
C++

/*
Copyright (c) 2015 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura
*/
#include "library/module.h"
#include "api/decl.h"
#include "api/inductive.h"
#include "api/string.h"
#include "api/exception.h"
using namespace lean; // NOLINT
using namespace lean::inductive; // NOLINT
lean_bool lean_inductive_decl_mk(lean_name n, lean_list_name ps, unsigned nparams, lean_expr t, lean_list_expr cs, lean_inductive_decl * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(n);
check_nonnull(ps);
check_nonnull(t);
check_nonnull(cs);
for (expr const & c : to_list_expr_ref(cs)) {
if (!is_local(c))
throw exception("invalid inductive type, constructor must be a local constant");
}
*r = of_inductive_decl(new inductive_decl(to_name_ref(n), to_list_name_ref(ps), nparams, to_expr_ref(t), to_list_expr_ref(cs)));
LEAN_CATCH;
}
void lean_inductive_decl_del(lean_inductive_decl t) {
delete to_inductive_decl(t);
}
lean_bool lean_get_recursor_name(lean_name n, lean_name * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(n);
*r = of_name(new name(get_elim_name(to_name_ref(n))));
LEAN_CATCH;
}
lean_bool lean_inductive_decl_get_name(lean_inductive_decl t, lean_name * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(t);
*r = of_name(new name(to_inductive_decl_ref(t).m_name));
LEAN_CATCH;
}
lean_bool lean_inductive_decl_get_type(lean_inductive_decl t, lean_expr * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(t);
*r = of_expr(new expr(to_inductive_decl_ref(t).m_type));
LEAN_CATCH;
}
lean_bool lean_inductive_decl_get_constructors(lean_inductive_decl t, lean_list_expr * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(t);
*r = of_list_expr(new list<expr>(to_inductive_decl_ref(t).m_intro_rules));
LEAN_CATCH;
}
lean_bool lean_inductive_decl_get_univ_params(lean_inductive_decl d, lean_list_name * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(d);
*r = of_list_name(new list<name>(to_inductive_decl_ref(d).m_level_params));
LEAN_CATCH;
}
lean_bool lean_inductive_decl_get_num_params(lean_inductive_decl d, unsigned * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(d);
*r = to_inductive_decl_ref(d).m_num_params;
LEAN_CATCH;
}
lean_bool lean_env_add_inductive(lean_env env, lean_inductive_decl d, lean_env * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(env);
check_nonnull(d);
bool is_trusted = true;
*r = of_env(new environment(module::add_inductive(to_env_ref(env), to_inductive_decl_ref(d), is_trusted)));
LEAN_CATCH;
}
lean_bool lean_env_is_inductive_type(lean_env env, lean_name n, lean_inductive_decl * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(env);
check_nonnull(n);
if (auto d = is_inductive_decl(to_env_ref(env), to_name_ref(n))) {
*r = of_inductive_decl(new inductive_decl(*d));
return lean_true;
} else {
return lean_false;
}
LEAN_CATCH;
}
lean_bool lean_env_is_constructor(lean_env env, lean_name n, lean_name * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(env);
check_nonnull(n);
if (auto d = is_intro_rule(to_env_ref(env), to_name_ref(n))) {
*r = of_name(new name(*d));
return lean_true;
} else {
return lean_false;
}
LEAN_CATCH;
}
lean_bool lean_env_is_recursor(lean_env env, lean_name n, lean_name * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(env);
check_nonnull(n);
if (auto d = is_elim_rule(to_env_ref(env), to_name_ref(n))) {
*r = of_name(new name(*d));
return lean_true;
} else {
return lean_false;
}
LEAN_CATCH;
}
lean_bool lean_env_get_inductive_type_num_indices(lean_env env, lean_name n, unsigned * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(env);
check_nonnull(n);
if (auto d = get_num_indices(to_env_ref(env), to_name_ref(n))) {
*r = *d;
return lean_true;
} else {
return lean_false;
}
LEAN_CATCH;
}
lean_bool lean_env_get_inductive_type_num_minor_premises(lean_env env, lean_name n, unsigned * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(env);
check_nonnull(n);
if (auto d = get_num_minor_premises(to_env_ref(env), to_name_ref(n))) {
*r = *d;
return lean_true;
} else {
return lean_false;
}
LEAN_CATCH;
}
lean_bool lean_env_get_inductive_type_has_dep_elim(lean_env env, lean_name n, lean_bool * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(env);
check_nonnull(n);
*r = has_dep_elim(to_env_ref(env), to_name_ref(n));
LEAN_CATCH;
}