diff options
| author | barras | 2010-07-16 16:52:20 +0000 |
|---|---|---|
| committer | barras | 2010-07-16 16:52:20 +0000 |
| commit | fa50dd40b26000c0fe1083fc7c5e76d45ebe6261 (patch) | |
| tree | a6c1e615b7e8607bdf2900de5713b5dff2863ae7 /kernel/indtypes.ml | |
| parent | 1df36fc5bcfa52dde043be9ea6bceb2b111b58f2 (diff) | |
fixed (serious) bug #2353: non-recursive parameters of nested inductive types were seen as real constructor arguments...
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@13290 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'kernel/indtypes.ml')
| -rw-r--r-- | kernel/indtypes.ml | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/kernel/indtypes.ml b/kernel/indtypes.ml index c3d79ee4a6..6d14998fec 100644 --- a/kernel/indtypes.ml +++ b/kernel/indtypes.ml @@ -397,6 +397,15 @@ let ienv_push_inductive (env, n, ntypes, ra_env) (mi,lpar) = let newidx = n + auxntyp in (env', newidx, ntypes, ra_env') +let rec ienv_decompose_prod (env,_,_,_ as ienv) n c = + if n=0 then (ienv,c) else + let c' = whd_betadeltaiota env c in + match kind_of_term c' with + Prod(na,a,b) -> + let ienv' = ienv_push_var ienv (na,a,mk_norec) in + ienv_decompose_prod ienv' (n-1) b + | _ -> assert false + let array_min nmr a = if nmr = 0 then 0 else Array.fold_left (fun k (nmri,_) -> min k nmri) nmr a @@ -441,6 +450,7 @@ let check_positivity_one (env,_,ntypes,_ as ienv) hyps (_,i as ind) nargs lcname and check_positive_nested (env,n,ntypes,ra_env as ienv) nmr (mi, largs) = let (mib,mip) = lookup_mind_specif env mi in let auxnpar = mib.mind_nparams_rec in + let nonrecpar = mib.mind_nparams - auxnpar in let (lpar,auxlargs) = try list_chop auxnpar largs with Failure _ -> raise (IllFormedInd (LocalNonPos n)) in @@ -461,10 +471,12 @@ let check_positivity_one (env,_,ntypes,_ as ienv) hyps (_,i as ind) nargs lcname let lpar' = List.map (lift auxntyp) lpar in let irecargs_nmr = (* fails if the inductive type occurs non positively *) - (* when substituted *) + (* with recursive parameters substituted *) Array.map (function c -> let c' = hnf_prod_applist env' c lpar' in + (* skip non-recursive parameters *) + let (ienv',c') = ienv_decompose_prod ienv' nonrecpar c' in check_constructors ienv' false nmr c') auxlcvect in |
