test(tests/shared/env): add inductive types test

This commit is contained in:
Leonardo de Moura 2015-08-24 13:53:37 -07:00
parent bdd8fae14d
commit 1299e6ab24
3 changed files with 193 additions and 1 deletions

View file

@ -29,6 +29,27 @@ void lean_inductive_type_del(lean_inductive_type t) {
delete to_inductive_type(t); delete to_inductive_type(t);
} }
lean_bool lean_inductive_type_get_name(lean_inductive_type t, lean_name * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(t);
*r = of_name(new name(inductive_decl_name(to_inductive_type_ref(t))));
LEAN_CATCH;
}
lean_bool lean_inductive_type_get_type(lean_inductive_type t, lean_expr * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(t);
*r = of_expr(new expr(inductive_decl_type(to_inductive_type_ref(t))));
LEAN_CATCH;
}
lean_bool lean_inductive_type_get_constructors(lean_inductive_type t, lean_list_expr * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(t);
*r = of_list_expr(new list<expr>(inductive_decl_intros(to_inductive_type_ref(t))));
LEAN_CATCH;
}
lean_bool lean_list_inductive_type_mk_nil(lean_list_inductive_type * r, lean_exception * ex) { lean_bool lean_list_inductive_type_mk_nil(lean_list_inductive_type * r, lean_exception * ex) {
LEAN_TRY; LEAN_TRY;
*r = of_list_inductive_type(new list<inductive_decl>()); *r = of_list_inductive_type(new list<inductive_decl>());
@ -91,6 +112,27 @@ void lean_inductive_decl_del(lean_inductive_decl d) {
delete to_inductive_decl(d); delete to_inductive_decl(d);
} }
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>(std::get<0>(to_inductive_decl_ref(d))));
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 = std::get<1>(to_inductive_decl_ref(d));
LEAN_CATCH;
}
lean_bool lean_inductive_decl_get_types(lean_inductive_decl d, lean_list_inductive_type * r, lean_exception * ex) {
LEAN_TRY;
check_nonnull(d);
*r = of_list_inductive_type(new list<inductive_decl>(std::get<2>(to_inductive_decl_ref(d))));
LEAN_CATCH;
}
lean_bool lean_env_add_inductive(lean_env env, lean_inductive_decl d, lean_env * r, lean_exception * ex) { lean_bool lean_env_add_inductive(lean_env env, lean_inductive_decl d, lean_env * r, lean_exception * ex) {
LEAN_TRY; LEAN_TRY;
check_nonnull(env); check_nonnull(env);

View file

@ -31,6 +31,13 @@ lean_bool lean_inductive_type_mk(lean_name n, lean_expr t, lean_list_expr cs, le
/** \brief Dispose/delete the given inductive type */ /** \brief Dispose/delete the given inductive type */
void lean_inductive_type_del(lean_inductive_type t); void lean_inductive_type_del(lean_inductive_type t);
/** \brief Store in \c r the name of the given inductive type. */
lean_bool lean_inductive_type_get_name(lean_inductive_type t, lean_name * r, lean_exception * ex);
/** \brief Store in \c r the type of the given inductive type. */
lean_bool lean_inductive_type_get_type(lean_inductive_type t, lean_expr * r, lean_exception * ex);
/** \brief Store in \c r the list of constructors of the given inductive type. */
lean_bool lean_inductive_type_get_constructors(lean_inductive_type t, lean_list_expr * r, lean_exception * ex);
/** \brief Create the empty list of inductive_types */ /** \brief Create the empty list of inductive_types */
lean_bool lean_list_inductive_type_mk_nil(lean_list_inductive_type * r, lean_exception * ex); lean_bool lean_list_inductive_type_mk_nil(lean_list_inductive_type * r, lean_exception * ex);
/** \brief Create the list <tt>h :: t</tt> */ /** \brief Create the list <tt>h :: t</tt> */
@ -55,6 +62,13 @@ lean_bool lean_inductive_decl_mk(lean_list_name ps, unsigned n, lean_list_induct
/** \brief Delete/dispose the given inductive declaration */ /** \brief Delete/dispose the given inductive declaration */
void lean_inductive_decl_del(lean_inductive_decl d); void lean_inductive_decl_del(lean_inductive_decl d);
/** \brief Store in \c r the list of universe parameter names of the given inductive declaration. */
lean_bool lean_inductive_decl_get_univ_params(lean_inductive_decl d, lean_list_name * r, lean_exception * ex);
/** \brief Store in \c r the number of parameters of the given inductive declaration. */
lean_bool lean_inductive_decl_get_num_params(lean_inductive_decl d, unsigned * r, lean_exception * ex);
/** \brief Store in \c r the list of inductive types in the given inductive declaration. */
lean_bool lean_inductive_decl_get_types(lean_inductive_decl d, lean_list_inductive_type * r, lean_exception * ex);
/** \brief Add the inductive declaration \c d to the given environment */ /** \brief Add the inductive declaration \c d to the given environment */
lean_bool lean_env_add_inductive(lean_env env, lean_inductive_decl d, lean_env * r, lean_exception * ex); lean_bool lean_env_add_inductive(lean_env env, lean_inductive_decl d, lean_env * r, lean_exception * ex);

View file

@ -89,7 +89,6 @@ lean_expr mk_const(char const * n, lean_univ u) {
return r; return r;
} }
lean_expr mk_pi(char const * n, lean_expr d, lean_expr c) { lean_expr mk_pi(char const * n, lean_expr d, lean_expr c) {
lean_exception ex; lean_exception ex;
lean_name name = mk_name(n); lean_name name = mk_name(n);
@ -108,6 +107,15 @@ lean_expr mk_lambda(char const * n, lean_expr d, lean_expr c) {
return r; return r;
} }
lean_expr mk_local(char const * n, lean_expr t) {
lean_exception ex;
lean_name _n = mk_name(n);
lean_expr r;
check(lean_expr_mk_local(_n, t, &r, &ex));
lean_name_del(_n);
return r;
}
lean_decl mk_def(char const * n, lean_list_name p, lean_expr t, lean_expr v) { lean_decl mk_def(char const * n, lean_list_name p, lean_expr t, lean_expr v) {
lean_exception ex; lean_exception ex;
lean_name name = mk_name(n); lean_name name = mk_name(n);
@ -329,10 +337,138 @@ void test_import() {
lean_string_del(s); lean_string_del(s);
} }
lean_univ mk_one() {
lean_exception ex;
lean_univ zero, one;
check(lean_univ_mk_zero(&zero, &ex));
check(lean_univ_mk_succ(zero, &one, &ex));
lean_univ_del(zero);
return one;
}
lean_univ mk_max(lean_univ u1, lean_univ u2) {
lean_exception ex;
lean_univ r;
check(lean_univ_mk_max(u1, u2, &r, &ex));
return r;
}
lean_expr mk_app(lean_expr f, lean_expr a) {
lean_exception ex;
lean_expr r;
check(lean_expr_mk_app(f, a, &r, &ex));
return r;
}
void test_inductive() {
// declare list type
lean_exception ex = 0;
lean_env env = mk_env();
lean_name l_name = mk_name("l");
lean_univ l = mk_uparam("l");
lean_univ one = mk_one();
lean_univ m1l = mk_max(one, l);
lean_expr Typel = mk_sort(l);
lean_expr Typem1l = mk_sort(m1l);
lean_expr list_type = mk_pi("A", Typel, Typem1l);
lean_name list_name = mk_name("list");
lean_expr list = mk_const("list", l);
lean_expr v0 = mk_var(0);
// nil : Pi (A : Type.{l}), list.{l} A
lean_expr list_v0 = mk_app(list, v0);
lean_expr nil_type = mk_pi("A", Typel, list_v0);
lean_expr nil = mk_local("nil", nil_type);
// cons : Pi (A : Type.{l}), A -> list.{l} A -> list.{l} A
lean_expr v1 = mk_var(1);
lean_expr v2 = mk_var(2);
lean_expr list_v2 = mk_app(list, v2);
lean_expr list_v1 = mk_app(list, v1);
lean_expr cons_type1 = mk_pi("tail", list_v1, list_v2);
lean_expr cons_type2 = mk_pi("head", v0, cons_type1);
lean_expr cons_type = mk_pi("A", Typel, cons_type2);
lean_expr cons = mk_local("cons", cons_type);
//
lean_list_expr cs1, cs2, list_cs;
lean_inductive_type list_ind_type;
lean_list_inductive_type li1, list_ind_types;
lean_list_name ls1, ls;
lean_inductive_decl list_decl;
lean_env new_env;
check(lean_list_name_mk_nil(&ls1, &ex));
check(lean_list_name_mk_cons(l_name, ls1, &ls, &ex));
check(lean_list_expr_mk_nil(&cs1, &ex));
check(lean_list_expr_mk_cons(nil, cs1, &cs2, &ex));
check(lean_list_expr_mk_cons(cons, cs2, &list_cs, &ex));
check(lean_inductive_type_mk(list_name, list_type, list_cs, &list_ind_type, &ex));
check(lean_list_inductive_type_mk_nil(&li1, &ex));
check(lean_list_inductive_type_mk_cons(list_ind_type, li1, &list_ind_types, &ex));
check(lean_inductive_decl_mk(ls, 1, list_ind_types, &list_decl, &ex));
check(lean_env_add_inductive(env, list_decl, &new_env, &ex));
{
unsigned n;
lean_inductive_decl d;
lean_name cons_name = mk_name("cons");
lean_name r_name;
lean_list_inductive_type types;
check(lean_env_get_inductive_type_num_indices(new_env, list_name, &n, &ex) && n == 0);
check(lean_env_get_inductive_type_num_minor_premises(new_env, list_name, &n, &ex) && n == 2);
check(!lean_env_is_inductive_type(env, list_name, &d, &ex));
check(lean_env_is_inductive_type(new_env, list_name, &d, &ex));
check(lean_inductive_decl_get_num_params(d, &n, &ex) && n == 1);
check(lean_inductive_decl_get_types(d, &types, &ex));
check(lean_list_inductive_type_is_cons(types));
check(lean_env_is_constructor(new_env, cons_name, &r_name, &ex) && lean_name_eq(list_name, r_name));
lean_inductive_decl_del(d);
lean_name_del(cons_name);
lean_name_del(r_name);
}
lean_env_del(env);
lean_name_del(list_name);
lean_name_del(l_name);
lean_univ_del(l);
lean_univ_del(one);
lean_univ_del(m1l);
lean_expr_del(Typel);
lean_expr_del(Typem1l);
lean_expr_del(list_type);
lean_expr_del(list);
lean_expr_del(v0);
lean_expr_del(list_v0);
lean_expr_del(nil_type);
lean_expr_del(nil);
lean_expr_del(v1);
lean_expr_del(v2);
lean_expr_del(list_v2);
lean_expr_del(list_v1);
lean_expr_del(cons_type1);
lean_expr_del(cons_type2);
lean_expr_del(cons_type);
lean_expr_del(cons);
lean_list_expr_del(cs1);
lean_list_expr_del(cs2);
lean_list_expr_del(list_cs);
lean_inductive_type_del(list_ind_type);
lean_list_inductive_type_del(li1);
lean_list_inductive_type_del(list_ind_types);
lean_list_name_del(ls1);
lean_list_name_del(ls);
lean_inductive_decl_del(list_decl);
lean_env_del(new_env);
}
int main() { int main() {
test_add_univ(); test_add_univ();
test_id(); test_id();
test_path(); test_path();
test_import(); test_import();
test_inductive();
return 0; return 0;
} }