aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--kernel/declarations.ml2
-rw-r--r--kernel/declarations.mli1
-rw-r--r--kernel/indtypes.ml3
-rw-r--r--kernel/inductive.ml3
-rw-r--r--kernel/term.ml1
-rw-r--r--kernel/term.mli1
-rw-r--r--pretyping/inductiveops.ml1
7 files changed, 11 insertions, 1 deletions
diff --git a/kernel/declarations.ml b/kernel/declarations.ml
index 82864bbe4..9d2548b17 100644
--- a/kernel/declarations.ml
+++ b/kernel/declarations.ml
@@ -89,6 +89,7 @@ type one_inductive_body = {
mind_sort : sorts;
mind_kelim : sorts_family list;
mind_consnames : identifier array;
+ mind_consnrealargs : int array;
mind_nf_lc : types array; (* constrs and arity with pre-expanded ccl *)
mind_user_lc : types array;
mind_recargs : wf_paths;
@@ -122,6 +123,7 @@ let subst_const_body sub cb = {
let subst_mind_packet sub mbp =
{ mind_consnames = mbp.mind_consnames;
+ mind_consnrealargs = mbp.mind_consnrealargs;
mind_typename = mbp.mind_typename;
mind_nf_lc =
array_smartmap (type_app (subst_mps sub)) mbp.mind_nf_lc;
diff --git a/kernel/declarations.mli b/kernel/declarations.mli
index cdb394380..d4f840b14 100644
--- a/kernel/declarations.mli
+++ b/kernel/declarations.mli
@@ -76,6 +76,7 @@ type one_inductive_body = {
mind_sort : sorts;
mind_kelim : sorts_family list;
mind_consnames : identifier array;
+ mind_consnrealargs : int array; (* length of constructs, let-in included *)
mind_nf_lc : types array; (* constrs and arity with pre-expanded ccl *)
mind_user_lc : types array;
mind_recargs : wf_paths;
diff --git a/kernel/indtypes.ml b/kernel/indtypes.ml
index 5237b93db..83928b6cc 100644
--- a/kernel/indtypes.ml
+++ b/kernel/indtypes.ml
@@ -534,6 +534,8 @@ let build_inductive env env_ar params record finite inds nmr recargs cst =
let nf_lc =
array_map2 (fun (d,b) c -> it_mkProd_or_LetIn b d) splayed_lc lc in
let nf_lc = if nf_lc = lc then lc else nf_lc in
+ let consnrealargs =
+ Array.map (fun (d,b) -> List.length d - nparamargs) splayed_lc in
(* Elimination sorts *)
let isunit = isunit && ntypes = 1 && (not (is_recursive recargs.(0))) in
let kelim = allowed_sorts env issmall isunit ar_sort in
@@ -558,6 +560,7 @@ let build_inductive env env_ar params record finite inds nmr recargs cst =
mind_sort = ar_sort;
mind_kelim = kelim;
mind_consnames = Array.of_list cnames;
+ mind_consnrealargs = consnrealargs;
mind_user_lc = lc;
mind_nf_lc = nf_lc;
mind_recargs = recarg;
diff --git a/kernel/inductive.ml b/kernel/inductive.ml
index af237d1d1..06a3d5ecf 100644
--- a/kernel/inductive.ml
+++ b/kernel/inductive.ml
@@ -278,7 +278,8 @@ let check_case_info env indsp ci =
let (mib,mip) = lookup_mind_specif env indsp in
if
(indsp <> ci.ci_ind) or
- (mib.mind_nparams <> ci.ci_npar)
+ (mib.mind_nparams <> ci.ci_npar) or
+ (mip.mind_consnrealargs <> ci.ci_cstr_nargs)
then raise (TypeError(env,WrongCaseInfo(indsp,ci)))
(************************************************************************)
diff --git a/kernel/term.ml b/kernel/term.ml
index f2fe38479..f83e69fcf 100644
--- a/kernel/term.ml
+++ b/kernel/term.ml
@@ -33,6 +33,7 @@ type case_printing =
type case_info =
{ ci_ind : inductive;
ci_npar : int;
+ ci_cstr_nargs : int array; (* number of real args of each constructor *)
ci_pp_info : case_printing (* not interpreted by the kernel *)
}
diff --git a/kernel/term.mli b/kernel/term.mli
index 70388808a..c0c57959f 100644
--- a/kernel/term.mli
+++ b/kernel/term.mli
@@ -50,6 +50,7 @@ type case_printing =
type case_info =
{ ci_ind : inductive;
ci_npar : int;
+ ci_cstr_nargs : int array; (* number of real args of each constructor *)
ci_pp_info : case_printing (* not interpreted by the kernel *)
}
diff --git a/pretyping/inductiveops.ml b/pretyping/inductiveops.ml
index 813a6a269..f8f0e45bc 100644
--- a/pretyping/inductiveops.ml
+++ b/pretyping/inductiveops.ml
@@ -116,6 +116,7 @@ let make_case_info env ind style pats_source =
source = pats_source } in
{ ci_ind = ind;
ci_npar = mib.mind_nparams;
+ ci_cstr_nargs = mip.mind_consnrealargs;
ci_pp_info = print_info }
let make_default_case_info env style ind =