diff options
| author | herbelin | 2000-05-18 08:01:53 +0000 |
|---|---|---|
| committer | herbelin | 2000-05-18 08:01:53 +0000 |
| commit | beac140c3970826bdfa104642301b9cee7530a97 (patch) | |
| tree | 7e6b854c99179e59351a80e012024d2ab0ef4dcc /kernel/typeops.ml | |
| parent | 37127f2d1e7be1abe8a07a93569507256fce1b1e (diff) | |
Restructuration des outils pour les inductifs.
- Les déclarations (mutual_inductive_packet et mutual_inductive_body),
utilisisées dans Environ vont dans Constant
- Instantiations du context local (mind_specif), instantiation des
paramètres globaux (inductive_family) et instantiation complète
(inductive_type, nouveau nom de inductive_summary) vont dans
Inductive qui est déplacé après réduction
- Certaines fonctions de Typeops et celle traitant des inductifs dans Reduction
sont regroupées dans Inductive
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@438 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'kernel/typeops.ml')
| -rw-r--r-- | kernel/typeops.ml | 184 |
1 files changed, 58 insertions, 126 deletions
diff --git a/kernel/typeops.ml b/kernel/typeops.ml index 4a89568dcb..6e453b60b8 100644 --- a/kernel/typeops.ml +++ b/kernel/typeops.ml @@ -8,11 +8,11 @@ open Univ open Generic open Term open Constant -open Inductive open Sign open Environ open Reduction -open Instantiate +open Inductive + open Type_errors let make_judge v tj = @@ -91,7 +91,7 @@ let instantiate_arity mis = { body = instantiate_constr ids arity.body args; typ = arity.typ } *) -let instantiate_arity = Instantiate.mis_typed_arity +let instantiate_arity = mis_typed_arity let type_of_inductive env sigma i = let mis = lookup_mind_specif i env in @@ -107,7 +107,7 @@ let instantiate_lc mis = let lc = mis.mis_mip.mind_lc in instantiate_constr (ids_of_sign hyps) lc (Array.to_list mis.mis_args) *) -let instantiate_lc = Instantiate.mis_lc +let instantiate_lc = mis_lc let type_of_constructor env sigma ((ind_sp,j),args as cstr) = let mind = inductive_of_constructor cstr in @@ -151,19 +151,11 @@ let type_mconstruct env sigma i mind = let mis = lookup_mind_specif mind env in mis_type_mconstruct i mis -let type_inst_construct env sigma i (mind,globargs) = - let mis = lookup_mind_specif mind env in +let type_inst_construct i (IndFamily (mis,globargs)) = let tc = mis_type_mconstruct i mis in - hnf_prod_applist env sigma "Typing.type_construct" tc globargs - -let type_of_existential env sigma c = - let (ev,args) = destEvar c in - let evi = Evd.map sigma ev in - let hyps = var_context evi.Evd.evar_env in - let id = id_of_string ("?" ^ string_of_int ev) in - (* TODO: check args *) - instantiate_constr (ids_of_sign hyps) evi.Evd.evar_concl (Array.to_list args) + prod_applist tc globargs +let type_of_existential env sigma c = Instantiate.existential_value sigma c (* Case. *) @@ -173,23 +165,6 @@ let rec mysort_of_arity env sigma c = | DOP2(Prod,_,DLAM(_,c2)) -> mysort_of_arity env sigma c2 | _ -> invalid_arg "mysort_of_arity" -let make_arity_dep env sigma k = - let rec mrec c m = match whd_betadeltaiota env sigma c with - | DOP0(Sort _) -> mkArrow m k - | DOP2(Prod,b,DLAM(n,c_0)) -> - prod_name env (n,b,mrec c_0 (applist(lift 1 m,[Rel 1]))) - | _ -> invalid_arg "make_arity_dep" - in - mrec - -let make_arity_nodep env sigma k = - let rec mrec c = match whd_betadeltaiota env sigma c with - | DOP0(Sort _) -> k - | DOP2(Prod,b,DLAM(x,c_0)) -> DOP2(Prod,b,DLAM(x,mrec c_0)) - | _ -> invalid_arg "make_arity_nodep" - in - mrec - let error_elim_expln env sigma kp ki = if is_info_sort env sigma kp && not (is_info_sort env sigma ki) then "non-informative objects may not construct informative ones." @@ -201,91 +176,52 @@ let error_elim_expln env sigma kp ki = exception Arity of (constr * constr * string) option -let is_correct_arity env sigma kelim (c,p) = - let rec srec ind (pt,t) = - try - (match whd_betadeltaiota env sigma pt, whd_betadeltaiota env sigma t with - | DOP2(Prod,a1,DLAM(_,a2)), DOP2(Prod,a1',DLAM(_,a2')) -> - if is_conv env sigma a1 a1' then - srec (applist(lift 1 ind,[Rel 1])) (a2,a2') - else - raise (Arity None) - | DOP2(Prod,a1,DLAM(_,a2)), ki -> - let k = whd_betadeltaiota env sigma a2 in - let ksort = (match k with DOP0(Sort s) -> s - | _ -> raise (Arity None)) in - if is_conv env sigma a1 ind then - if List.exists (base_sort_cmp CONV ksort) kelim then - (true,k) - else - raise (Arity (Some(k,ki,error_elim_expln env sigma k ki))) - else - raise (Arity None) - | k, DOP2(Prod,_,_) -> - raise (Arity None) - | k, ki -> - let ksort = (match k with DOP0(Sort s) -> s - | _ -> raise (Arity None)) in - if List.exists (base_sort_cmp CONV ksort) kelim then - false,k - else - raise (Arity (Some(k,ki,error_elim_expln env sigma k ki)))) - with Arity kinds -> - let listarity = - (List.map - (fun s -> make_arity_dep env sigma (DOP0(Sort s)) t ind) kelim) - @(List.map - (fun s -> make_arity_nodep env sigma (DOP0(Sort s)) t) kelim) - in - error_elim_arity CCI env ind listarity c p pt kinds - in - srec - -let find_case_dep_nparams env sigma (c,p) (mind,largs) typP = - let mis = lookup_mind_specif mind env in - let nparams = mis_nparams mis - and kelim = mis_kelim mis - and t = body_of_type (instantiate_arity mis) in - let (globargs,la) = list_chop nparams largs in - let glob_t = hnf_prod_applist env sigma "find_elim_boolean" t globargs in - let arity = applist(mkMutInd mind,globargs) in - let (dep,_) = is_correct_arity env sigma kelim (c,p) arity (typP,glob_t) in - dep +let is_correct_arity env sigma kelim (c,p) indf (pt,t) = + let rec srec (pt,t) = + match whd_betadeltaiota env sigma pt, whd_betadeltaiota env sigma t with + | DOP2(Prod,a1,DLAM(_,a2)), DOP2(Prod,a1',DLAM(_,a2')) -> + if is_conv env sigma a1 a1' then + srec (a2,a2') + else + raise (Arity None) + | DOP2(Prod,a1,DLAM(_,a2)), ki -> + let k = whd_betadeltaiota env sigma a2 in + let ksort = (match k with DOP0(Sort s) -> s + | _ -> raise (Arity None)) in + let ind = build_dependent_inductive indf in + if is_conv env sigma a1 ind then + if List.exists (base_sort_cmp CONV ksort) kelim then + (true,k) + else + raise (Arity (Some(k,ki,error_elim_expln env sigma k ki))) + else + raise (Arity None) + | k, DOP2(Prod,_,_) -> + raise (Arity None) + | k, ki -> + let ksort = (match k with DOP0(Sort s) -> s + | _ -> raise (Arity None)) in + if List.exists (base_sort_cmp CONV ksort) kelim then + false,k + else + raise (Arity (Some(k,ki,error_elim_expln env sigma k ki))) +in + try srec (pt,t) + with Arity kinds -> + let listarity = + (List.map (make_arity env sigma true indf) kelim) + @(List.map (make_arity env sigma false indf) kelim) + in + let ind = mis_inductive (fst (dest_ind_family indf)) in + error_elim_arity CCI env ind listarity c p pt kinds -let type_one_branch_dep env sigma (nparams,globargs,p) co t = - let rec typrec n c = - match whd_betadeltaiota env sigma c with - | DOP2(Prod,a1,DLAM(x,a2)) -> prod_name env (x,a1,typrec (n+1) a2) - | x -> let lAV = destAppL (ensure_appl x) in - let (_,vargs) = array_chop (nparams+1) lAV in - applist - (appvect ((lift n p),vargs), - [applist(co,((List.map (lift n) globargs)@(rel_list 0 n)))]) - in - typrec 0 (hnf_prod_applist env sigma "type_case" t globargs) - -let type_one_branch_nodep env sigma (nparams,globargs,p) t = - let rec typrec n c = - match whd_betadeltaiota env sigma c with - | DOP2(Prod,a1,DLAM(x,a2)) -> DOP2(Prod,a1,DLAM(x,typrec (n+1) a2)) - | x -> let lAV = destAppL(ensure_appl x) in - let (_,vargs) = array_chop (nparams+1) lAV in - appvect (lift n p,vargs) - in - typrec 0 (hnf_prod_applist env sigma "type_case" t globargs) -(* [p] is the predicate and [cs] a constructor summary *) -let mytype_one_branch dep env p cs = - if dep then - let n = cs.cs_nargs in - let ci = - applist - (mkMutConstruct cs.cs_cstr, - (List.map (lift n) cs.cs_params)@(rel_list 0 n)) in - it_prod_name env (applist (appvect (lift n p,cs.cs_concl_realargs), [ci])) - cs.cs_args - else - prod_it (appvect (lift cs.cs_nargs p,cs.cs_concl_realargs)) cs.cs_args +let find_case_dep_nparams env sigma (c,p) (IndFamily (mis,_) as indf) typP = + let kelim = mis_kelim mis in + let arsign,s = get_arity env sigma indf in + let glob_t = prod_it (mkSort s) arsign in + let (dep,_) = is_correct_arity env sigma kelim (c,p) indf (typP,glob_t) in + dep (* type_case_branches type un <p>Case c of ... end ct = type de c, si inductif il a la forme APP(mI,largs), sinon raise Induc @@ -294,21 +230,17 @@ let mytype_one_branch dep env p cs = attendus dans les branches du Case; lr est le type attendu du resultat *) -let type_case_branches env sigma indspec pt p c = - let dep = - find_case_dep_nparams env sigma (c,p) - (indspec.mind,indspec.params@indspec.realargs) pt in - let constructs = get_constructors env sigma indspec in - let lc = Array.map (mytype_one_branch dep env p) constructs in - let la = indspec.realargs in +let type_case_branches env sigma (IndType (indf,realargs)) pt p c = + let dep = find_case_dep_nparams env sigma (c,p) indf pt in + let constructs = get_constructors indf in + let lc = Array.map (build_branch_type env dep p) constructs in if dep then - (lc, beta_applist (p,(la@[c]))) + (lc, beta_applist (p,(realargs@[c]))) else - (lc, beta_applist (p,la)) + (lc, beta_applist (p,realargs)) let check_branches_message env sigma (c,ct) (explft,lft) = - let n = Array.length explft - and expn = Array.length lft in + let expn = Array.length explft and n = Array.length lft in if n<>expn then error_number_branches CCI env c ct expn; for i = 0 to n-1 do if not (is_conv_leq env sigma lft.(i) (explft.(i))) then |
