diff options
| author | filliatr | 1999-10-18 13:51:32 +0000 |
|---|---|---|
| committer | filliatr | 1999-10-18 13:51:32 +0000 |
| commit | 154f0fc69c79383cc75795554eb7e0256c8299d8 (patch) | |
| tree | d39ed1dbe4d0c555a8373592162eee3043583a1a /kernel | |
| parent | 22e4ceb13d18c8b941f6a27cc83f547dd90104b8 (diff) | |
- déplacement (encore une fois !) des variables existentielles : elles sont
toujours dans le noyau (en ce sens que Reduction et Typeops les
connaissent) mais dans un argument supplémentaire A COTE de l'environnement
(de type unsafe_env)
- Indtypes et Typing n'utilisent strictement que Evd.empty
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@106 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/closure.ml | 17 | ||||
| -rw-r--r-- | kernel/closure.mli | 5 | ||||
| -rw-r--r-- | kernel/environ.ml | 4 | ||||
| -rw-r--r-- | kernel/environ.mli | 2 | ||||
| -rw-r--r-- | kernel/evd.ml | 15 | ||||
| -rw-r--r-- | kernel/evd.mli | 32 | ||||
| -rw-r--r-- | kernel/indtypes.ml | 21 | ||||
| -rw-r--r-- | kernel/instantiate.ml | 10 | ||||
| -rw-r--r-- | kernel/instantiate.mli | 5 | ||||
| -rw-r--r-- | kernel/reduction.ml | 319 | ||||
| -rw-r--r-- | kernel/reduction.mli | 169 | ||||
| -rw-r--r-- | kernel/typeops.ml | 221 | ||||
| -rw-r--r-- | kernel/typeops.mli | 35 | ||||
| -rw-r--r-- | kernel/typing.ml | 57 |
14 files changed, 479 insertions, 433 deletions
diff --git a/kernel/closure.ml b/kernel/closure.ml index a7ee12c3e4..f6c27a8be6 100644 --- a/kernel/closure.ml +++ b/kernel/closure.ml @@ -10,7 +10,7 @@ open Inductive open Environ open Instantiate open Univ - +open Evd let stats = ref false let share = ref true @@ -136,6 +136,7 @@ type ('a, 'b) infos = { i_flags : flags; i_repr : ('a, 'b) infos -> constr -> 'a; i_env : unsafe_env; + i_evc : 'b evar_map; i_tab : (constr, 'a) Hashtbl.t } let const_value_cache info c = @@ -149,8 +150,12 @@ let const_value_cache info c = Some v | None -> None -let infos_under { i_flags = flg; i_repr = rfun; i_env = env; i_tab = tab } = - { i_flags = flags_under flg; i_repr = rfun; i_env = env; i_tab = tab } +let infos_under infos = + { i_flags = flags_under infos.i_flags; + i_repr = infos.i_repr; + i_env = infos.i_env; + i_evc = infos.i_evc; + i_tab = infos.i_tab } (**** Call by value reduction ****) @@ -464,10 +469,11 @@ and cbv_norm_value info = function (* reduction under binders *) type 'a cbv_infos = (cbv_value, 'a) infos (* constant bodies are normalized at the first expansion *) -let create_cbv_infos flgs env = +let create_cbv_infos flgs env sigma = { i_flags = flgs; i_repr = (fun old_info c -> cbv_stack_term old_info TOP ESID c); i_env = env; + i_evc = sigma; i_tab = Hashtbl.create 17 } @@ -847,10 +853,11 @@ let search_frozen_cst info op vars = (* cache of constants: the body is computed only when needed. *) type 'a clos_infos = (fconstr, 'a) infos -let create_clos_infos flgs env = +let create_clos_infos flgs env sigma = { i_flags = flgs; i_repr = (fun old_info c -> inject c); i_env = env; + i_evc = sigma; i_tab = Hashtbl.create 17 } let clos_infos_env infos = infos.i_env diff --git a/kernel/closure.mli b/kernel/closure.mli index ea7defa201..b928851ecb 100644 --- a/kernel/closure.mli +++ b/kernel/closure.mli @@ -6,6 +6,7 @@ open Pp open Names open Generic open Term +open Evd open Environ (*i*) @@ -82,7 +83,7 @@ val fixp_reducible : (* normalization of a constr: the two functions to know... *) type 'a cbv_infos -val create_cbv_infos : flags -> unsafe_env -> 'a cbv_infos +val create_cbv_infos : flags -> unsafe_env -> 'a evar_map -> 'a cbv_infos val cbv_norm : 'a cbv_infos -> constr -> constr (* recursive functions... *) @@ -158,7 +159,7 @@ type case_status = (* Constant cache *) type 'a clos_infos -val create_clos_infos : flags -> unsafe_env -> 'a clos_infos +val create_clos_infos : flags -> unsafe_env -> 'a evar_map -> 'a clos_infos val clos_infos_env : 'a clos_infos -> unsafe_env (* Reduction function *) diff --git a/kernel/environ.ml b/kernel/environ.ml index e431c1b374..004ef8e536 100644 --- a/kernel/environ.ml +++ b/kernel/environ.ml @@ -9,7 +9,6 @@ open Sign open Univ open Generic open Term -open Evd open Constant open Inductive open Abstraction @@ -30,7 +29,6 @@ type globals = { type unsafe_env = { env_context : context; env_globals : globals; - env_evar_map : evar_map; env_universes : universes } let empty_env = { @@ -41,12 +39,10 @@ let empty_env = { env_abstractions = Spmap.empty; env_locals = []; env_imports = [] }; - env_evar_map = mt_evd; env_universes = initial_universes } let universes env = env.env_universes let context env = env.env_context -let evar_map env = env.env_evar_map let metamap env = failwith "Environ.metamap: TODO: unifier metas et VE" (* Construction functions. *) diff --git a/kernel/environ.mli b/kernel/environ.mli index 684758d1e2..61fb4b64a6 100644 --- a/kernel/environ.mli +++ b/kernel/environ.mli @@ -23,8 +23,6 @@ val empty_env : unsafe_env val universes : unsafe_env -> universes val context : unsafe_env -> context -val evar_map : unsafe_env -> evar_map -val metamap : unsafe_env -> (int * constr) list val push_var : identifier * typed_type -> unsafe_env -> unsafe_env val push_rel : name * typed_type -> unsafe_env -> unsafe_env diff --git a/kernel/evd.ml b/kernel/evd.ml index 9295d35872..270ad1f2e4 100644 --- a/kernel/evd.ml +++ b/kernel/evd.ml @@ -18,14 +18,15 @@ type evar_body = | Evar_empty | Evar_defined of constr -type evar_info = { +type 'a evar_info = { evar_concl : constr; evar_hyps : typed_type signature; - evar_body : evar_body } + evar_body : evar_body; + evar_info : 'a } -type evar_map = evar_info Intmap.t +type 'a evar_map = 'a evar_info Intmap.t -let mt_evd = Intmap.empty +let empty = Intmap.empty let to_list evc = Intmap.fold (fun ev x acc -> (ev,x)::acc) evc [] let dom evc = Intmap.fold (fun ev _ acc -> ev::acc) evc [] @@ -41,7 +42,8 @@ let define evd ev body = let newinfo = { evar_concl = oldinfo.evar_concl; evar_hyps = oldinfo.evar_hyps; - evar_body = Evar_defined body } + evar_body = Evar_defined body; + evar_info = oldinfo.evar_info } in match oldinfo.evar_body with | Evar_empty -> Intmap.add ev newinfo evd @@ -61,3 +63,6 @@ let is_evar sigma ev = in_dom sigma ev let is_defined sigma ev = let info = map sigma ev in not (info.evar_body = Evar_empty) + +let metamap sigma = failwith "metamap : NOT YET IMPLEMENTED" + diff --git a/kernel/evd.mli b/kernel/evd.mli index 89cefcab11..80e767fa85 100644 --- a/kernel/evd.mli +++ b/kernel/evd.mli @@ -21,28 +21,30 @@ type evar_body = | Evar_empty | Evar_defined of constr -type evar_info = { +type 'a evar_info = { evar_concl : constr; evar_hyps : typed_type signature; - evar_body : evar_body } + evar_body : evar_body; + evar_info : 'a } -type evar_map +type 'a evar_map -val add : evar_map -> evar -> evar_info -> evar_map +val empty : 'a evar_map -val dom : evar_map -> evar list -val map : evar_map -> evar -> evar_info -val rmv : evar_map -> evar -> evar_map -val remap : evar_map -> evar -> evar_info -> evar_map -val in_dom : evar_map -> evar -> bool -val to_list : evar_map -> (evar * evar_info) list +val add : 'a evar_map -> evar -> 'a evar_info -> 'a evar_map -val mt_evd : evar_map +val dom : 'a evar_map -> evar list +val map : 'a evar_map -> evar -> 'a evar_info +val rmv : 'a evar_map -> evar -> 'a evar_map +val remap : 'a evar_map -> evar -> 'a evar_info -> 'a evar_map +val in_dom : 'a evar_map -> evar -> bool +val to_list : 'a evar_map -> (evar * 'a evar_info) list -val define : evar_map -> evar -> constr -> evar_map +val define : 'a evar_map -> evar -> constr -> 'a evar_map -val non_instantiated : evar_map -> (evar * evar_info) list -val is_evar : evar_map -> evar -> bool +val non_instantiated : 'a evar_map -> (evar * 'a evar_info) list +val is_evar : 'a evar_map -> evar -> bool -val is_defined : evar_map -> evar -> bool +val is_defined : 'a evar_map -> evar -> bool +val metamap : 'a evar_map -> (int * constr) list diff --git a/kernel/indtypes.ml b/kernel/indtypes.ml index b6a7c0a3e4..db5458211d 100644 --- a/kernel/indtypes.ml +++ b/kernel/indtypes.ml @@ -10,15 +10,20 @@ open Environ open Instantiate open Reduction +(* In the following, each time an [evar_map] is required, then [Evd.empty] + is given, since inductive types are typed in an environment without + existentials. *) + let mind_check_arities env mie = let check_arity id c = - if not (is_arity env c) then raise (InductiveError (NotAnArity id)) + if not (is_arity env Evd.empty c) then + raise (InductiveError (NotAnArity id)) in List.iter (fun (id,ar,_,_) -> check_arity id ar) mie.mind_entry_inds let sort_of_arity env c = let rec sort_of ar = - match whd_betadeltaiota env ar with + match whd_betadeltaiota env Evd.empty ar with | DOP0 (Sort s) -> s | DOP2 (Prod, _, DLAM (_, c)) -> sort_of c | _ -> error "not an arity" @@ -47,7 +52,7 @@ let check_correct_par env nparams ntypes n l largs = if Array.length largs < nparams then raise (InductiveError (NotEnoughArgs l)); let (lpar,largs') = array_chop nparams largs in for k = 0 to nparams - 1 do - if not ((Rel (n-k-1))= whd_betadeltaiotaeta env lpar.(k)) then + if not ((Rel (n-k-1))= whd_betadeltaiotaeta env Evd.empty lpar.(k)) then raise (InductiveError (NonPar (k+1,l))) done; if not (array_for_all (noccur_bet n ntypes) largs') then @@ -62,14 +67,14 @@ let abstract_mind_lc env ntyps npars lc = list_tabulate (function i -> lambda_implicit_lift npars (Rel (i+1))) ntyps in - Array.map (compose (nf_beta env) (substl make_abs)) lC + Array.map (compose (nf_beta env Evd.empty) (substl make_abs)) lC let decomp_par n c = snd (decompose_prod_n n c) let listrec_mconstr env ntypes nparams i indlc = (* check the inductive types occur positively in C *) let rec check_pos n c = - match whd_betadeltaiota env c with + match whd_betadeltaiota env Evd.empty c with | DOP2(Prod,b,DLAM(na,d)) -> if not (noccur_bet n ntypes b) then raise (InductiveError (NonPos n)); check_pos (n+1) d @@ -117,7 +122,7 @@ let listrec_mconstr env ntypes nparams i indlc = (* when substituted *) Array.map (function c -> - let c' = hnf_prod_appvect env "is_imbr_pos" c + let c' = hnf_prod_appvect env Evd.empty "is_imbr_pos" c (Array.map (lift auxntyp) lpar) in check_construct false newidx c') auxlcvect @@ -139,7 +144,7 @@ let listrec_mconstr env ntypes nparams i indlc = not sure if they make sense in a form of constructor. This is why I chose to duplicated the code. Eduardo 13/7/99. *) and check_param_pos n c = - match whd_betadeltaiota env c with + match whd_betadeltaiota env Evd.empty c with (* The extra case *) | DOP2(Lambda,b,DLAM(na,d)) -> if noccur_bet n ntypes b @@ -179,7 +184,7 @@ let listrec_mconstr env ntypes nparams i indlc = and check_construct check = let rec check_constr_rec lrec n c = - match whd_betadeltaiota env c with + match whd_betadeltaiota env Evd.empty c with | DOP2(Prod,b,DLAM(na,d)) -> let recarg = (check_pos n b) in check_constr_rec (recarg::lrec) (n+1) d diff --git a/kernel/instantiate.ml b/kernel/instantiate.ml index 09265c988f..acc48bcb05 100644 --- a/kernel/instantiate.ml +++ b/kernel/instantiate.ml @@ -68,18 +68,18 @@ let mis_lc env mis = let name_of_existential n = id_of_string ("?" ^ string_of_int n) -let existential_type env c = +let existential_type sigma c = let (n,args) = destEvar c in - let info = Evd.map (evar_map env) n in + let info = Evd.map sigma n in let hyps = info.evar_hyps in instantiate_constr (ids_of_sign hyps) info.evar_concl (Array.to_list args) -let existential_value env c = +let existential_value sigma c = let (n,args) = destEvar c in - let info = Evd.map (evar_map env) n in + let info = Evd.map sigma n in let hyps = info.evar_hyps in match info.evar_body with - | Evar_defined c -> + | Evar_defined c -> instantiate_constr (ids_of_sign hyps) c (Array.to_list args) | Evar_empty -> anomaly "a defined existential with no body" diff --git a/kernel/instantiate.mli b/kernel/instantiate.mli index 8ea57f0887..27bd8191ec 100644 --- a/kernel/instantiate.mli +++ b/kernel/instantiate.mli @@ -5,6 +5,7 @@ open Names open Term open Inductive +open Evd open Environ (*i*) @@ -18,8 +19,8 @@ val instantiate_type : val constant_value : unsafe_env -> constr -> constr val constant_type : unsafe_env -> constr -> typed_type -val existential_value : unsafe_env -> constr -> constr -val existential_type : unsafe_env -> constr -> constr +val existential_value : 'a evar_map -> constr -> constr +val existential_type : 'a evar_map -> constr -> constr val const_abst_opt_value : unsafe_env -> constr -> constr option diff --git a/kernel/reduction.ml b/kernel/reduction.ml index e3b2d9f09f..ac32e2eabd 100644 --- a/kernel/reduction.ml +++ b/kernel/reduction.ml @@ -7,6 +7,7 @@ open Names open Generic open Term open Univ +open Evd open Constant open Inductive open Environ @@ -17,29 +18,30 @@ exception Redelimination exception Induc exception Elimconst -type reduction_function = unsafe_env -> constr -> constr -type stack_reduction_function = - unsafe_env -> constr -> constr list -> constr * constr list +type 'a reduction_function = unsafe_env -> 'a evar_map -> constr -> constr + +type 'a stack_reduction_function = + unsafe_env -> 'a evar_map -> constr -> constr list -> constr * constr list (*************************************) (*** Reduction Functions Operators ***) (*************************************) -let rec under_casts f env = function - | DOP2(Cast,c,t) -> DOP2(Cast,under_casts f env c, t) - | c -> f env c +let rec under_casts f env sigma = function + | DOP2(Cast,c,t) -> DOP2(Cast,under_casts f env sigma c, t) + | c -> f env sigma c -let rec whd_stack env x stack = +let rec whd_stack env sigma x stack = match x with - | DOPN(AppL,cl) -> whd_stack env cl.(0) (array_app_tl cl stack) - | DOP2(Cast,c,_) -> whd_stack env c stack + | DOPN(AppL,cl) -> whd_stack env sigma cl.(0) (array_app_tl cl stack) + | DOP2(Cast,c,_) -> whd_stack env sigma c stack | _ -> (x,stack) -let stack_reduction_of_reduction red_fun env x stack = - let t = red_fun env (applistc x stack) in - whd_stack env t [] +let stack_reduction_of_reduction red_fun env sigma x stack = + let t = red_fun env sigma (applistc x stack) in + whd_stack env sigma t [] -let strong whdfun env = +let strong whdfun env sigma = let rec strongrec = function | DOP0 _ as t -> t (* Cas ad hoc *) @@ -54,10 +56,10 @@ let strong whdfun env = in strongrec -let rec strong_prodspine redfun env c = - match redfun env c with +let rec strong_prodspine redfun env sigma c = + match redfun env sigma c with | DOP2(Prod,a,DLAM(na,b)) -> - DOP2(Prod,a,DLAM(na,strong_prodspine redfun env b)) + DOP2(Prod,a,DLAM(na,strong_prodspine redfun env sigma b)) | x -> x @@ -67,8 +69,8 @@ let rec strong_prodspine redfun env c = (* call by value reduction functions *) -let cbv_norm_flags flags env t = - cbv_norm (create_cbv_infos flags env) t +let cbv_norm_flags flags env sigma t = + cbv_norm (create_cbv_infos flags env sigma) t let cbv_beta env = cbv_norm_flags beta env let cbv_betaiota env = cbv_norm_flags betaiota env @@ -78,8 +80,8 @@ let compute = cbv_betadeltaiota (* lazy reduction functions. The infos must be created for each term *) -let clos_norm_flags flgs env t = - norm_val (create_clos_infos flgs env) (inject t) +let clos_norm_flags flgs env sigma t = + norm_val (create_clos_infos flgs env sigma) (inject t) let nf_beta env = clos_norm_flags beta env let nf_betaiota env = clos_norm_flags betaiota env @@ -88,12 +90,12 @@ let nf_betadeltaiota env = clos_norm_flags betadeltaiota env (* lazy weak head reduction functions *) (* Pb: whd_val parcourt tout le terme, meme si aucune reduction n'a lieu *) -let whd_flags flgs env t = - whd_val (create_clos_infos flgs env) (inject t) +let whd_flags flgs env sigma t = + whd_val (create_clos_infos flgs env sigma) (inject t) (* Red reduction tactic: reduction to a product *) -let red_product env c = +let red_product env sigma c = let rec redrec x = match x with | DOPN(AppL,cl) -> @@ -104,7 +106,7 @@ let red_product env c = | DOP2(Prod,a,DLAM(x,b)) -> DOP2(Prod, a, DLAM(x, redrec b)) | _ -> error "Term not reducible" in - nf_betaiota env (redrec c) + nf_betaiota env sigma (redrec c) (* Substitute only a list of locations locs, the empty list is interpreted @@ -266,39 +268,39 @@ let rec substlin env name n ol c = | _ -> (n,ol,c) -let unfold env name = +let unfold env sigma name = let flag = (UNIFORM,{ r_beta = true; r_delta = (fun op -> op=(Const name) or op=(Abst name)); r_iota = true }) in - clos_norm_flags flag env + clos_norm_flags flag env sigma (* unfoldoccs : (readable_constraints -> (int list * section_path) -> constr -> constr) * Unfolds the constant name in a term c following a list of occurrences occl. * at the occurrences of occ_list. If occ_list is empty, unfold all occurences. * Performs a betaiota reduction after unfolding. *) -let unfoldoccs env (occl,name) c = +let unfoldoccs env sigma (occl,name) c = match occl with - | [] -> unfold env name c + | [] -> unfold env sigma name c | l -> match substlin env name 1 (Sort.list (<) l) c with - | (_,[],uc) -> nf_betaiota env uc + | (_,[],uc) -> nf_betaiota env sigma uc | (1,_,_) -> error ((string_of_path name)^" does not occur") | _ -> error ("bad occurrence numbers of "^(string_of_path name)) (* Unfold reduction tactic: *) -let unfoldn loccname env c = - List.fold_left (fun c occname -> unfoldoccs env occname c) c loccname +let unfoldn loccname env sigma c = + List.fold_left (fun c occname -> unfoldoccs env sigma occname c) c loccname (* Re-folding constants tactics: refold com in term c *) -let fold_one_com com env c = - let rcom = red_product env com in +let fold_one_com com env sigma c = + let rcom = red_product env sigma com in subst1 com (subst_term rcom c) -let fold_commands cl env c = - List.fold_right (fun com -> fold_one_com com env) (List.rev cl) c +let fold_commands cl env sigma c = + List.fold_right (fun com -> fold_one_com com env sigma) (List.rev cl) c (* Pattern *) @@ -316,7 +318,7 @@ let abstract_scheme env (locc,a,ta) t = DOP2(Lambda, ta, DLAM(na,subst_term_occ locc a t)) -let pattern_occs loccs_trm_typ env c = +let pattern_occs loccs_trm_typ env sigma c = let abstr_trm = List.fold_right (abstract_scheme env) loccs_trm_typ c in applist(abstr_trm, List.map (fun (_,t,_) -> t) loccs_trm_typ) @@ -337,7 +339,7 @@ let rec stacklam recfun env t stack = let beta_applist (c,l) = stacklam (fun c l -> applist(c,l)) [] c l -let whd_beta_stack env = +let whd_beta_stack env sigma = let rec whrec x stack = match x with | DOP2(Lambda,c1,DLAM(name,c2)) -> (match stack with @@ -350,12 +352,12 @@ let whd_beta_stack env = in whrec -let whd_beta env x = applist (whd_beta_stack env x []) +let whd_beta env sigma x = applist (whd_beta_stack env sigma x []) (* 2. Delta Reduction *) -let whd_const_stack namelist env = +let whd_const_stack namelist env sigma = let rec whrec x l = match x with | DOPN(Const sp,_) as c -> @@ -382,9 +384,10 @@ let whd_const_stack namelist env = in whrec -let whd_const namelist env c = applist(whd_const_stack namelist env c []) +let whd_const namelist env sigma c = + applist(whd_const_stack namelist env sigma c []) -let whd_delta_stack env = +let whd_delta_stack env sigma = let rec whrec x l = match x with | DOPN(Const _,_) as c -> @@ -403,10 +406,10 @@ let whd_delta_stack env = in whrec -let whd_delta env c = applist(whd_delta_stack env c []) +let whd_delta env sigma c = applist(whd_delta_stack env sigma c []) -let whd_betadelta_stack env = +let whd_betadelta_stack env sigma = let rec whrec x l = match x with | DOPN(Const _,_) -> @@ -429,10 +432,10 @@ let whd_betadelta_stack env = in whrec -let whd_betadelta env c = applist(whd_betadelta_stack env c []) +let whd_betadelta env sigma c = applist(whd_betadelta_stack env sigma c []) -let whd_betadeltat_stack env = +let whd_betadeltat_stack env sigma = let rec whrec x l = match x with | DOPN(Const _,_) -> @@ -455,9 +458,9 @@ let whd_betadeltat_stack env = in whrec -let whd_betadeltat env c = applist(whd_betadeltat_stack env c []) +let whd_betadeltat env sigma c = applist(whd_betadeltat_stack env sigma c []) -let whd_betadeltaeta_stack env = +let whd_betadeltaeta_stack env sigma = let rec whrec x stack = match x with | DOPN(Const _,_) -> @@ -493,7 +496,8 @@ let whd_betadeltaeta_stack env = in whrec -let whd_betadeltaeta env x = applist(whd_betadeltaeta_stack env x []) +let whd_betadeltaeta env sigma x = + applist(whd_betadeltaeta_stack env sigma x []) (* 3. Iota reduction *) @@ -572,7 +576,7 @@ let reduce_fix whfun fix stack = -------------------- qui coute cher dans whd_betadeltaiota *) -let whd_betaiota_stack env = +let whd_betaiota_stack env sigma = let rec whrec x stack = match x with | DOP2(Cast,c,_) -> whrec c stack @@ -597,10 +601,10 @@ let whd_betaiota_stack env = in whrec -let whd_betaiota env x = applist (whd_betaiota_stack env x []) +let whd_betaiota env sigma x = applist (whd_betaiota_stack env sigma x []) -let whd_betadeltatiota_stack env = +let whd_betadeltatiota_stack env sigma = let rec whrec x stack = match x with | DOPN(Const _,_) -> @@ -634,9 +638,10 @@ let whd_betadeltatiota_stack env = in whrec -let whd_betadeltatiota env x = applist(whd_betadeltatiota_stack env x []) +let whd_betadeltatiota env sigma x = + applist(whd_betadeltatiota_stack env sigma x []) -let whd_betadeltaiota_stack env = +let whd_betadeltaiota_stack env sigma = let rec bdi_rec x stack = match x with | DOPN(Const _,_) -> @@ -670,10 +675,11 @@ let whd_betadeltaiota_stack env = in bdi_rec -let whd_betadeltaiota env x = applist(whd_betadeltaiota_stack env x []) +let whd_betadeltaiota env sigma x = + applist(whd_betadeltaiota_stack env sigma x []) -let whd_betadeltaiotaeta_stack env = +let whd_betadeltaiotaeta_stack env sigma = let rec whrec x stack = match x with | DOPN(Const _,_) -> @@ -723,7 +729,8 @@ let whd_betadeltaiotaeta_stack env = in whrec -let whd_betadeltaiotaeta env x = applist(whd_betadeltaiotaeta_stack env x []) +let whd_betadeltaiotaeta env sigma x = + applist(whd_betadeltaiotaeta_stack env sigma x []) (********************************************************************) (* Conversion *) @@ -739,7 +746,8 @@ let pb_equal = function | CONV_LEQ -> CONV | CONV -> CONV -type conversion_function = unsafe_env -> constr -> constr -> constraints +type 'a conversion_function = + unsafe_env -> 'a evar_map -> constr -> constr -> constraints (* Conversion utility functions *) @@ -905,43 +913,43 @@ and eqappr cv_pb infos appr1 appr2 = | _ -> (fun _ -> raise NotConvertible) -let fconv cv_pb env t1 t2 = - let t1 = strong (fun _ -> strip_outer_cast) env t1 - and t2 = strong (fun _ -> strip_outer_cast) env t2 in +let fconv cv_pb env sigma t1 t2 = + let t1 = strong (fun _ -> strip_outer_cast) env sigma t1 + and t2 = strong (fun _ -> strip_outer_cast) env sigma t2 in if eq_constr t1 t2 then Constraint.empty else - let infos = create_clos_infos hnf_flags env in + let infos = create_clos_infos hnf_flags env sigma in ccnv cv_pb infos ELID ELID (inject t1) (inject t2) Constraint.empty let conv env = fconv CONV env let conv_leq env = fconv CONV_LEQ env -let conv_forall2 f env v1 v2 = +let conv_forall2 f env sigma v1 v2 = array_fold_left2 - (fun c x y -> let c' = f env x y in Constraint.union c c') + (fun c x y -> let c' = f env sigma x y in Constraint.union c c') Constraint.empty v1 v2 -let conv_forall2_i f env v1 v2 = +let conv_forall2_i f env sigma v1 v2 = array_fold_left2_i - (fun i c x y -> let c' = f i env x y in Constraint.union c c') + (fun i c x y -> let c' = f i env sigma x y in Constraint.union c c') Constraint.empty v1 v2 -let test_conversion f env x y = - try let _ = f env x y in true with NotConvertible -> false +let test_conversion f env sigma x y = + try let _ = f env sigma x y in true with NotConvertible -> false -let is_conv env = test_conversion conv env -let is_conv_leq env = test_conversion conv_leq env +let is_conv env sigma = test_conversion conv env sigma +let is_conv_leq env sigma = test_conversion conv_leq env sigma (********************************************************************) (* Special-Purpose Reduction *) (********************************************************************) -let whd_meta env = function - | DOP0(Meta p) as u -> (try List.assoc p (metamap env) with Not_found -> u) +let whd_meta env sigma = function + | DOP0(Meta p) as u -> (try List.assoc p (metamap sigma) with Not_found -> u) | x -> x (* Try to replace all metas. Does not replace metas in the metas' values @@ -960,8 +968,8 @@ let plain_instance s c = if s = [] then c else irec c (* Pourquoi ne fait-on pas nf_betaiota si s=[] ? *) -let instance s env c = - if s = [] then c else nf_betaiota env (plain_instance s c) +let instance s env sigma c = + if s = [] then c else nf_betaiota env sigma (plain_instance s c) (* pseudo-reduction rule: @@ -970,46 +978,52 @@ let instance s env c = * if this does not work, then we use the string S as part of our * error message. *) -let hnf_prod_app env s t n = - match whd_betadeltaiota env t with +let hnf_prod_app env sigma s t n = + match whd_betadeltaiota env sigma t with | DOP2(Prod,_,b) -> sAPP b n | _ -> errorlabstrm s [< 'sTR"Needed a product, but didn't find one in " ; 'sTR s ; 'fNL >] -let hnf_prod_appvect env s t nL = Array.fold_left (hnf_prod_app env s) t nL -let hnf_prod_applist env s t nL = List.fold_left (hnf_prod_app env s) t nL +let hnf_prod_appvect env sigma s t nl = + Array.fold_left (hnf_prod_app env sigma s) t nl + +let hnf_prod_applist env sigma s t nl = + List.fold_left (hnf_prod_app env sigma s) t nl -let hnf_lam_app env s t n = - match whd_betadeltaiota env t with +let hnf_lam_app env sigma s t n = + match whd_betadeltaiota env sigma t with | DOP2(Lambda,_,b) -> sAPP b n | _ -> errorlabstrm s [< 'sTR"Needed a product, but didn't find one in " ; 'sTR s ; 'fNL >] -let hnf_lam_appvect env s t nL = Array.fold_left (hnf_lam_app env s) t nL -let hnf_lam_applist env s t nL = List.fold_left (hnf_lam_app env s) t nL +let hnf_lam_appvect env sigma s t nl = + Array.fold_left (hnf_lam_app env sigma s) t nl -let splay_prod env = +let hnf_lam_applist env sigma s t nl = + List.fold_left (hnf_lam_app env sigma s) t nl + +let splay_prod env sigma = let rec decrec m c = - match whd_betadeltaiota env c with - | DOP2(Prod,a,DLAM(n,c_0)) -> decrec ((n,a)::m) c_0 + match whd_betadeltaiota env sigma c with + | DOP2(Prod,a,DLAM(n,c_0)) -> decrec ((n,a)::m) c_0 | t -> m,t in decrec [] -let decomp_prod env = +let decomp_prod env sigma = let rec decrec m c = - match whd_betadeltaiota env c with + match whd_betadeltaiota env sigma c with | DOP0(Sort _) as x -> m,x - | DOP2(Prod,a,DLAM(n,c_0)) -> decrec (m+1) c_0 - | _ -> error "decomp_prod: Not a product" + | DOP2(Prod,a,DLAM(n,c_0)) -> decrec (m+1) c_0 + | _ -> error "decomp_prod: Not a product" in decrec 0 -let decomp_n_prod env n = +let decomp_n_prod env sigma n = let rec decrec m ln c = if m = 0 then (ln,c) else - match whd_betadeltaiota env c with + match whd_betadeltaiota env sigma c with | DOP2(Prod,a,DLAM(n,c_0)) -> decrec (m-1) ((n,a)::ln) c_0 | _ -> error "decomp_n_prod: Not enough products" in @@ -1102,9 +1116,9 @@ an equivalent of Fix(f|t)[xi<-ai] as with bj=aj if j<>ik and bj=(Rel c) and Bic=Aic[xn..xic-1 <- an..aic-1] *) -let compute_consteval env c = +let compute_consteval env sigma c = let rec srec n labs c = - match whd_betadeltaeta_stack env c [] with + match whd_betadeltaeta_stack env sigma c [] with | (DOP2(Lambda,t,DLAM(_,g)),[]) -> srec (n+1) (t::labs) g | (DOPN(Fix((nv,i)),bodies),l) -> if List.length l > n then @@ -1134,25 +1148,25 @@ let compute_consteval env c = (* One step of approximation *) -let rec apprec env c stack = - let (t,stack) = whd_betaiota_stack env c stack in +let rec apprec env sigma c stack = + let (t,stack) = whd_betaiota_stack env sigma c stack in match t with | DOPN(MutCase _,_) -> let (ci,p,d,lf) = destCase t in - let (cr,crargs) = whd_betadeltaiota_stack env d [] in + let (cr,crargs) = whd_betadeltaiota_stack env sigma d [] in let rslt = mkMutCaseA ci p (applist(cr,crargs)) lf in if reducible_mind_case cr then - apprec env rslt stack + apprec env sigma rslt stack else (t,stack) | DOPN(Fix _,_) -> let (reduced,(fix,stack)) = - reduce_fix (whd_betadeltaiota_stack env) t stack + reduce_fix (whd_betadeltaiota_stack env sigma) t stack in - if reduced then apprec env fix stack else (fix,stack) + if reduced then apprec env sigma fix stack else (fix,stack) | _ -> (t,stack) -let hnf env c = apprec env c [] +let hnf env sigma c = apprec env sigma c [] (* A reduction function like whd_betaiota but which keeps casts * and does not reduce redexes containing meta-variables. @@ -1160,7 +1174,7 @@ let hnf env c = apprec env c [] * Used in Programs. * Added by JCF, 29/1/98. *) -let whd_programs_stack env = +let whd_programs_stack env sigma = let rec whrec x stack = match x with | DOPN(AppL,cl) -> @@ -1191,45 +1205,45 @@ let whd_programs_stack env = in whrec -let whd_programs env x = applist (whd_programs_stack env x []) +let whd_programs env sigma x = applist (whd_programs_stack env sigma x []) -let find_mrectype env c = - let (t,l) = whd_betadeltaiota_stack env c [] in +let find_mrectype env sigma c = + let (t,l) = whd_betadeltaiota_stack env sigma c [] in match t with | DOPN(MutInd (sp,i),_) -> (t,l) | _ -> raise Induc -let find_minductype env c = - let (t,l) = whd_betadeltaiota_stack env c [] in +let find_minductype env sigma c = + let (t,l) = whd_betadeltaiota_stack env sigma c [] in match t with | DOPN(MutInd (sp,i),_) when mind_type_finite (lookup_mind sp env) i -> (t,l) | _ -> raise Induc -let find_mcoinductype env c = - let (t,l) = whd_betadeltaiota_stack env c [] in +let find_mcoinductype env sigma c = + let (t,l) = whd_betadeltaiota_stack env sigma c [] in match t with | DOPN(MutInd (sp,i),_) when not (mind_type_finite (lookup_mind sp env) i) -> (t,l) | _ -> raise Induc -let minductype_spec env c = +let minductype_spec env sigma c = try - let (x,l) = find_minductype env c in + let (x,l) = find_minductype env sigma c in if l<>[] then anomaly "minductype_spec: Not a recursive type 1" else x with Induc -> anomaly "minductype_spec: Not a recursive type 2" -let mrectype_spec env c = +let mrectype_spec env sigma c = try - let (x,l) = find_mrectype env c in + let (x,l) = find_mrectype env sigma c in if l<>[] then anomaly "mrectype_spec: Not a recursive type 1" else x with Induc -> anomaly "mrectype_spec: Not a recursive type 2" -let check_mrectype_spec env c = +let check_mrectype_spec env sigma c = try - let (x,l) = find_mrectype env c in + let (x,l) = find_mrectype env sigma c in if l<>[] then error "check_mrectype: Not a recursive type 1" else x with Induc -> error "check_mrectype: Not a recursive type 2" @@ -1237,9 +1251,9 @@ let check_mrectype_spec env c = exception IsType -let is_arity env = +let is_arity env sigma = let rec srec c = - match whd_betadeltaiota env c with + match whd_betadeltaiota env sigma c with | DOP0(Sort _) -> true | DOP2(Prod,_,DLAM(_,c')) -> srec c' | DOP2(Lambda,_,DLAM(_,c')) -> srec c' @@ -1247,9 +1261,9 @@ let is_arity env = in srec -let info_arity env = +let info_arity env sigma = let rec srec c = - match whd_betadeltaiota env c with + match whd_betadeltaiota env sigma c with | DOP0(Sort(Prop Null)) -> false | DOP0(Sort(Prop Pos)) -> true | DOP2(Prod,_,DLAM(_,c')) -> srec c' @@ -1258,15 +1272,15 @@ let info_arity env = in srec -let is_logic_arity env c = - try (not (info_arity env c)) with IsType -> false +let is_logic_arity env sigma c = + try (not (info_arity env sigma c)) with IsType -> false -let is_info_arity env c = - try (info_arity env c) with IsType -> true +let is_info_arity env sigma c = + try (info_arity env sigma c) with IsType -> true -let is_type_arity env = +let is_type_arity env sigma = let rec srec c = - match whd_betadeltaiota env c with + match whd_betadeltaiota env sigma c with | DOP0(Sort(Type _)) -> true | DOP2(Prod,_,DLAM(_,c')) -> srec c' | DOP2(Lambda,_,DLAM(_,c')) -> srec c' @@ -1274,21 +1288,21 @@ let is_type_arity env = in srec -let is_info_type env t = +let is_info_type env sigma t = let s = t.typ in (s = Prop Pos) || (s <> Prop Null && - try info_arity env t.body with IsType -> true) + try info_arity env sigma t.body with IsType -> true) -let is_info_cast_type env c = +let is_info_cast_type env sigma c = match c with | DOP2(Cast,c,t) -> - (try info_arity env t - with IsType -> try info_arity env c with IsType -> true) - | _ -> try info_arity env c with IsType -> true + (try info_arity env sigma t + with IsType -> try info_arity env sigma c with IsType -> true) + | _ -> try info_arity env sigma c with IsType -> true -let contents_of_cast_type env c = - if is_info_cast_type env c then Pos else Null +let contents_of_cast_type env sigma c = + if is_info_cast_type env sigma c then Pos else Null let is_info_sort = is_info_arity @@ -1320,64 +1334,61 @@ let add_free_rels_until depth m acc = (* calcule la liste des arguments implicites *) -let poly_args env t = - let rec aux n t = match (whd_betadeltaiota env t) with +let poly_args env sigma t = + let rec aux n t = match (whd_betadeltaiota env sigma t) with | DOP2(Prod,a,DLAM(_,b)) -> add_free_rels_until n a (aux (n+1) b) | DOP2(Cast,t',_) -> aux n t' | _ -> [] in - match (strip_outer_cast (whd_betadeltaiota env t)) with + match (strip_outer_cast (whd_betadeltaiota env sigma t)) with | DOP2(Prod,a,DLAM(_,b)) -> aux 1 b | _ -> [] (* Expanding existential variables (trad.ml, progmach.ml) *) (* 1- whd_ise fails if an existential is undefined *) -let rec whd_ise env = function +let rec whd_ise env sigma = function | DOPN(Evar sp,_) as k -> - let evm = evar_map env in - if Evd.in_dom evm sp then - if Evd.is_defined evm sp then - whd_ise env (constant_value env k) + if Evd.in_dom sigma sp then + if Evd.is_defined sigma sp then + whd_ise env sigma (existential_value sigma k) else errorlabstrm "whd_ise" [< 'sTR"There is an unknown subterm I cannot solve" >] else k - | DOP2(Cast,c,_) -> whd_ise env c - | DOP0(Sort(Type(_))) -> DOP0(Sort(Type(dummy_univ))) + | DOP2(Cast,c,_) -> whd_ise env sigma c + | DOP0(Sort(Type _)) -> DOP0(Sort(Type dummy_univ)) | c -> c (* 2- undefined existentials are left unchanged *) -let rec whd_ise1 env = function +let rec whd_ise1 env sigma = function | (DOPN(Evar sp,_) as k) -> - let evm = evar_map env in - if Evd.in_dom evm sp & Evd.is_defined evm sp then - whd_ise1 env (existential_value env k) + if Evd.in_dom sigma sp & Evd.is_defined sigma sp then + whd_ise1 env sigma (existential_value sigma k) else k - | DOP2(Cast,c,_) -> whd_ise1 env c + | DOP2(Cast,c,_) -> whd_ise1 env sigma c | DOP0(Sort(Type _)) -> DOP0(Sort(Type dummy_univ)) | c -> c -let nf_ise1 env = strong (whd_ise1 env) env +let nf_ise1 env sigma = strong (whd_ise1 env sigma) env sigma (* Same as whd_ise1, but replaces the remaining ISEVAR by Metavariables * Similarly we have is_fmachine1_metas and is_resolve1_metas *) -let rec whd_ise1_metas env = function +let rec whd_ise1_metas env sigma = function | (DOPN(Evar n,_) as k) -> - let evm = evar_map env in - if Evd.in_dom evm n then - if Evd.is_defined evm n then - whd_ise1_metas env (existential_value env k) + if Evd.in_dom sigma n then + if Evd.is_defined sigma n then + whd_ise1_metas env sigma (existential_value sigma k) else let m = DOP0(Meta (new_meta())) in - DOP2(Cast,m,existential_type env k) + DOP2(Cast,m,existential_type sigma k) else k - | DOP2(Cast,c,_) -> whd_ise1_metas env c + | DOP2(Cast,c,_) -> whd_ise1_metas env sigma c | c -> c diff --git a/kernel/reduction.mli b/kernel/reduction.mli index 771899fad8..421aa9aaf2 100644 --- a/kernel/reduction.mli +++ b/kernel/reduction.mli @@ -6,6 +6,7 @@ open Names open Generic open Term open Univ +open Evd open Environ open Closure (*i*) @@ -16,97 +17,99 @@ exception Redelimination exception Induc exception Elimconst -type reduction_function = unsafe_env -> constr -> constr +type 'a reduction_function = unsafe_env -> 'a evar_map -> constr -> constr -type stack_reduction_function = - unsafe_env -> constr -> constr list -> constr * constr list +type 'a stack_reduction_function = + unsafe_env -> 'a evar_map -> constr -> constr list -> constr * constr list -val whd_stack : stack_reduction_function +val whd_stack : 'a stack_reduction_function (*s Reduction Function Operators *) -val under_casts : reduction_function -> reduction_function -val strong : reduction_function -> reduction_function -val strong_prodspine : reduction_function -> reduction_function +val under_casts : 'a reduction_function -> 'a reduction_function +val strong : 'a reduction_function -> 'a reduction_function +val strong_prodspine : 'a reduction_function -> 'a reduction_function val stack_reduction_of_reduction : - reduction_function -> stack_reduction_function + 'a reduction_function -> 'a stack_reduction_function (*s Generic Optimized Reduction Functions using Closures *) (* 1. lazy strategy *) -val clos_norm_flags : Closure.flags -> reduction_function +val clos_norm_flags : Closure.flags -> 'a reduction_function (* Same as [(strong whd_beta[delta][iota])], but much faster on big terms *) -val nf_beta : reduction_function -val nf_betaiota : reduction_function -val nf_betadeltaiota : reduction_function +val nf_beta : 'a reduction_function +val nf_betaiota : 'a reduction_function +val nf_betadeltaiota : 'a reduction_function (* 2. call by value strategy *) -val cbv_norm_flags : flags -> reduction_function -val cbv_beta : reduction_function -val cbv_betaiota : reduction_function -val cbv_betadeltaiota : reduction_function +val cbv_norm_flags : flags -> 'a reduction_function +val cbv_beta : 'a reduction_function +val cbv_betaiota : 'a reduction_function +val cbv_betadeltaiota : 'a reduction_function (* 3. lazy strategy, weak head reduction *) -val whd_beta : reduction_function -val whd_betaiota : reduction_function -val whd_betadeltaiota : reduction_function +val whd_beta : 'a reduction_function +val whd_betaiota : 'a reduction_function +val whd_betadeltaiota : 'a reduction_function -val whd_beta_stack : stack_reduction_function -val whd_betaiota_stack : stack_reduction_function -val whd_betadeltaiota_stack : stack_reduction_function +val whd_beta_stack : 'a stack_reduction_function +val whd_betaiota_stack : 'a stack_reduction_function +val whd_betadeltaiota_stack : 'a stack_reduction_function (*s Head normal forms *) -val whd_const_stack : section_path list -> stack_reduction_function -val whd_const : section_path list -> reduction_function -val whd_delta_stack : stack_reduction_function -val whd_delta : reduction_function -val whd_betadelta_stack : stack_reduction_function -val whd_betadelta : reduction_function -val whd_betadeltat_stack : stack_reduction_function -val whd_betadeltat : reduction_function -val whd_betadeltatiota_stack : stack_reduction_function -val whd_betadeltatiota : reduction_function -val whd_betadeltaiotaeta_stack : stack_reduction_function -val whd_betadeltaiotaeta : reduction_function +val whd_const_stack : section_path list -> 'a stack_reduction_function +val whd_const : section_path list -> 'a reduction_function +val whd_delta_stack : 'a stack_reduction_function +val whd_delta : 'a reduction_function +val whd_betadelta_stack : 'a stack_reduction_function +val whd_betadelta : 'a reduction_function +val whd_betadeltat_stack : 'a stack_reduction_function +val whd_betadeltat : 'a reduction_function +val whd_betadeltatiota_stack : 'a stack_reduction_function +val whd_betadeltatiota : 'a reduction_function +val whd_betadeltaiotaeta_stack : 'a stack_reduction_function +val whd_betadeltaiotaeta : 'a reduction_function val beta_applist : (constr * constr list) -> constr -val hnf_prod_app : unsafe_env -> string -> constr -> constr -> constr +val hnf_prod_app : + unsafe_env -> 'a evar_map -> string -> constr -> constr -> constr val hnf_prod_appvect : - unsafe_env -> string -> constr -> constr array -> constr + unsafe_env -> 'a evar_map -> string -> constr -> constr array -> constr val hnf_prod_applist : - unsafe_env -> string -> constr -> constr list -> constr + unsafe_env -> 'a evar_map -> string -> constr -> constr list -> constr val hnf_lam_app : - unsafe_env -> string -> constr -> constr -> constr + unsafe_env -> 'a evar_map -> string -> constr -> constr -> constr val hnf_lam_appvect : - unsafe_env -> string -> constr -> constr array -> constr + unsafe_env -> 'a evar_map -> string -> constr -> constr array -> constr val hnf_lam_applist : - unsafe_env -> string -> constr -> constr list -> constr -val splay_prod : unsafe_env -> constr -> (name * constr) list * constr -val decomp_prod : unsafe_env -> constr -> int * constr + unsafe_env -> 'a evar_map -> string -> constr -> constr list -> constr +val splay_prod : + unsafe_env -> 'a evar_map -> constr -> (name * constr) list * constr +val decomp_prod : unsafe_env -> 'a evar_map -> constr -> int * constr val decomp_n_prod : - unsafe_env -> int -> constr -> ((name * constr) list) * constr + unsafe_env -> 'a evar_map -> int -> constr -> ((name * constr) list) * constr -val is_arity : unsafe_env -> constr -> bool -val is_info_arity : unsafe_env -> constr -> bool -val is_info_sort : unsafe_env -> constr -> bool -val is_logic_arity : unsafe_env -> constr -> bool -val is_type_arity : unsafe_env -> constr -> bool -val is_info_type : unsafe_env -> typed_type -> bool -val is_info_cast_type : unsafe_env -> constr -> bool -val contents_of_cast_type : unsafe_env -> constr -> contents -val poly_args : unsafe_env -> constr -> int list +val is_arity : unsafe_env -> 'a evar_map -> constr -> bool +val is_info_arity : unsafe_env -> 'a evar_map -> constr -> bool +val is_info_sort : unsafe_env -> 'a evar_map -> constr -> bool +val is_logic_arity : unsafe_env -> 'a evar_map -> constr -> bool +val is_type_arity : unsafe_env -> 'a evar_map -> constr -> bool +val is_info_type : unsafe_env -> 'a evar_map -> typed_type -> bool +val is_info_cast_type : unsafe_env -> 'a evar_map -> constr -> bool +val contents_of_cast_type : unsafe_env -> 'a evar_map -> constr -> contents +val poly_args : unsafe_env -> 'a evar_map -> constr -> int list -val whd_programs : reduction_function +val whd_programs : 'a reduction_function val unfoldn : - (int list * section_path) list -> reduction_function -val fold_one_com : constr -> reduction_function -val fold_commands : constr list -> reduction_function + (int list * section_path) list -> 'a reduction_function +val fold_one_com : constr -> 'a reduction_function +val fold_commands : constr list -> 'a reduction_function val subst_term_occ : int list -> constr -> constr -> constr -val pattern_occs : (int list * constr * constr) list -> reduction_function -val compute : reduction_function +val pattern_occs : (int list * constr * constr) list -> 'a reduction_function +val compute : 'a reduction_function (*s Conversion Functions (uses closures, lazy strategy) *) @@ -131,51 +134,55 @@ val convert_or : conversion_test -> conversion_test -> conversion_test val convert_forall2 : ('a -> 'b -> conversion_test) -> 'a array -> 'b array -> conversion_test -type conversion_function = unsafe_env -> constr -> constr -> constraints +type 'a conversion_function = + unsafe_env -> 'a evar_map -> constr -> constr -> constraints -val fconv : conv_pb -> conversion_function +val fconv : conv_pb -> 'a conversion_function (* [fconv] has 2 instances: [conv = fconv CONV] i.e. conversion test, and [conv_leq = fconv CONV_LEQ] i.e. cumulativity test. *) -val conv : conversion_function -val conv_leq : conversion_function +val conv : 'a conversion_function +val conv_leq : 'a conversion_function val conv_forall2 : - conversion_function -> unsafe_env -> constr array + 'a conversion_function -> unsafe_env -> 'a evar_map -> constr array -> constr array -> constraints val conv_forall2_i : - (int -> conversion_function) -> unsafe_env + (int -> 'a conversion_function) -> unsafe_env -> 'a evar_map -> constr array -> constr array -> constraints -val is_conv : unsafe_env -> constr -> constr -> bool -val is_conv_leq : unsafe_env -> constr -> constr -> bool +val is_conv : unsafe_env -> 'a evar_map -> constr -> constr -> bool +val is_conv_leq : unsafe_env -> 'a evar_map -> constr -> constr -> bool (*s Special-Purpose Reduction Functions *) -val whd_meta : reduction_function +val whd_meta : 'a reduction_function val plain_instance : (int * constr) list -> constr -> constr -val instance : (int * constr) list -> reduction_function +val instance : (int * constr) list -> 'a reduction_function -val whd_ise : reduction_function -val whd_ise1 : reduction_function -val nf_ise1 : reduction_function -val whd_ise1_metas : reduction_function +val whd_ise : 'a reduction_function +val whd_ise1 : 'a reduction_function +val nf_ise1 : 'a reduction_function +val whd_ise1_metas : 'a reduction_function (*s Obsolete Reduction Functions *) -val hnf : unsafe_env -> constr -> constr * constr list -val apprec : stack_reduction_function -val red_product : reduction_function -val find_mrectype : unsafe_env -> constr -> constr * constr list -val find_minductype : unsafe_env -> constr -> constr * constr list -val find_mcoinductype : unsafe_env -> constr -> constr * constr list -val check_mrectype_spec : unsafe_env -> constr -> constr -val minductype_spec : unsafe_env -> constr -> constr -val mrectype_spec : unsafe_env -> constr -> constr +val hnf : unsafe_env -> 'a evar_map -> constr -> constr * constr list +val apprec : 'a stack_reduction_function +val red_product : 'a reduction_function +val find_mrectype : + unsafe_env -> 'a evar_map -> constr -> constr * constr list +val find_minductype : + unsafe_env -> 'a evar_map -> constr -> constr * constr list +val find_mcoinductype : + unsafe_env -> 'a evar_map -> constr -> constr * constr list +val check_mrectype_spec : unsafe_env -> 'a evar_map -> constr -> constr +val minductype_spec : unsafe_env -> 'a evar_map -> constr -> constr +val mrectype_spec : unsafe_env -> 'a evar_map -> constr -> constr (* Special function, which keep the key casts under Fix and MutCase. *) val strip_all_casts : constr -> constr diff --git a/kernel/typeops.ml b/kernel/typeops.ml index 405b139bac..010dde8e27 100644 --- a/kernel/typeops.ml +++ b/kernel/typeops.ml @@ -26,13 +26,13 @@ let j_val = j_val_only let j_val_cast j = mkCast j.uj_val j.uj_type -let typed_type_of_judgment env j = - match whd_betadeltaiota env j.uj_kind with +let typed_type_of_judgment env sigma j = + match whd_betadeltaiota env sigma j.uj_kind with | DOP0(Sort s) -> { body = j.uj_type; typ = s } | _ -> error_not_type CCI env j.uj_type -let assumption_of_judgment env j = - match whd_betadeltaiota env j.uj_type with +let assumption_of_judgment env sigma j = + match whd_betadeltaiota env sigma j.uj_type with | DOP0(Sort s) -> { body = j.uj_val; typ = s } | _ -> error_assumption CCI env j.uj_val @@ -51,7 +51,7 @@ let relative env n = (* Checks if a context of variable is included in another one. *) -let hyps_inclusion env (idl1,tyl1) (idl2,tyl2) = +let hyps_inclusion env sigma (idl1,tyl1) (idl2,tyl2) = let rec aux = function | ([], [], _, _) -> true | (_, _, [], []) -> false @@ -60,7 +60,7 @@ let hyps_inclusion env (idl1,tyl1) (idl2,tyl2) = | ([], []) -> false | ((id2::idl2), (ty2::tyl2)) -> if id1 = id2 then - (is_conv env (body_of_type ty1) (body_of_type ty2)) + (is_conv env sigma (body_of_type ty1) (body_of_type ty2)) & aux (idl1,tyl1,idl2,tyl2) else search (idl2,tyl2) @@ -74,25 +74,25 @@ let hyps_inclusion env (idl1,tyl1) (idl2,tyl2) = (* Checks if the given context of variables [hyps] is included in the current context of [env]. *) -let construct_reference id env hyps = +let construct_reference id env sigma hyps = let hyps' = get_globals (context env) in - if hyps_inclusion env hyps hyps' then + if hyps_inclusion env sigma hyps hyps' then Array.of_list (List.map (fun id -> VAR id) (ids_of_sign hyps)) else error_reference_variables CCI env id -let check_hyps id env hyps = +let check_hyps id env sigma hyps = let hyps' = get_globals (context env) in - if not (hyps_inclusion env hyps hyps') then + if not (hyps_inclusion env sigma hyps hyps') then error_reference_variables CCI env id (* Instantiation of terms on real arguments. *) -let type_of_constant env c = +let type_of_constant env sigma c = let (sp,args) = destConst c in let cb = lookup_constant sp env in let hyps = cb.const_hyps in - check_hyps (basename sp) env hyps; + check_hyps (basename sp) env sigma hyps; instantiate_type (ids_of_sign hyps) cb.const_type (Array.to_list args) (* Inductive types. *) @@ -104,10 +104,10 @@ let instantiate_arity mis = { body = instantiate_constr ids arity.body args; typ = arity.typ } -let type_of_inductive env i = +let type_of_inductive env sigma i = let mis = lookup_mind_specif i env in let hyps = mis.mis_mib.mind_hyps in - check_hyps (basename mis.mis_sp) env hyps; + check_hyps (basename mis.mis_sp) env sigma hyps; instantiate_arity mis (* Constructors. *) @@ -117,12 +117,12 @@ 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 type_of_constructor env c = +let type_of_constructor env sigma c = let (sp,i,j,args) = destMutConstruct c in let mind = DOPN (MutInd (sp,i), args) in - let recmind = check_mrectype_spec env mind in + let recmind = check_mrectype_spec env sigma mind in let mis = lookup_mind_specif recmind env in - check_hyps (basename mis.mis_sp) env (mis.mis_mib.mind_hyps); + check_hyps (basename mis.mis_sp) env sigma (mis.mis_mib.mind_hyps); let specif = instantiate_lc mis in let make_ik k = DOPN (MutInd (mis.mis_sp,k), mis.mis_args) in if j > mis_nconstr mis then @@ -145,21 +145,21 @@ let mis_type_mconstructs mis = (Array.init nconstr make_ck, sAPPVList specif (list_tabulate make_ik ntypes)) -let type_mconstructs env mind = - let redmind = check_mrectype_spec env mind in +let type_mconstructs env sigma mind = + let redmind = check_mrectype_spec env sigma mind in let mis = lookup_mind_specif redmind env in mis_type_mconstructs mis (* Case. *) -let rec sort_of_arity env c = - match whd_betadeltaiota env c with +let rec sort_of_arity env sigma c = + match whd_betadeltaiota env sigma c with | DOP0(Sort( _)) as c' -> c' - | DOP2(Prod,_,DLAM(_,c2)) -> sort_of_arity env c2 + | DOP2(Prod,_,DLAM(_,c2)) -> sort_of_arity env sigma c2 | _ -> invalid_arg "sort_of_arity" -let make_arity_dep env k = - let rec mrec c m = match whd_betadeltaiota env c with +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]))) @@ -167,16 +167,16 @@ let make_arity_dep env k = in mrec -let make_arity_nodep env k = - let rec mrec c = match whd_betadeltaiota env c with +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 kp ki = - if is_info_sort env kp && not (is_info_sort env ki) then +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." else match (kp,ki) with @@ -186,24 +186,24 @@ let error_elim_expln env kp ki = exception Arity of (constr * constr * string) option -let is_correct_arity env kelim (c,p) = +let is_correct_arity env sigma kelim (c,p) = let rec srec ind (pt,t) = try - (match whd_betadeltaiota env pt, whd_betadeltaiota env t with + (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 a1 a1' then + 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 a2 in + 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 a1 ind then + 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 k ki))) + raise (Arity (Some(k,ki,error_elim_expln env sigma k ki))) else raise (Arity None) | k, DOP2(Prod,_,_) -> @@ -214,11 +214,13 @@ let is_correct_arity env kelim (c,p) = if List.exists (base_sort_cmp CONV ksort) kelim then false,k else - raise (Arity (Some(k,ki,error_elim_expln env k ki)))) + 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 (DOP0(Sort s)) t ind) kelim) - @(List.map (fun s -> make_arity_nodep env (DOP0(Sort s)) t) kelim) + (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 @@ -226,20 +228,20 @@ let cast_instantiate_arity mis = let tty = instantiate_arity mis in DOP2 (Cast, tty.body, DOP0 (Sort tty.typ)) -let find_case_dep_nparams env (c,p) (mind,largs) typP = +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 = cast_instantiate_arity mis in let (globargs,la) = list_chop nparams largs in - let glob_t = hnf_prod_applist env "find_elim_boolean" t globargs in + let glob_t = hnf_prod_applist env sigma "find_elim_boolean" t globargs in let arity = applist(mind,globargs) in - let (dep,_) = is_correct_arity env kelim (c,p) arity (typP,glob_t) in + let (dep,_) = is_correct_arity env sigma kelim (c,p) arity (typP,glob_t) in (dep, (nparams, globargs,la)) -let type_one_branch_dep (env,nparams,globargs,p) co t = +let type_one_branch_dep env sigma (nparams,globargs,p) co t = let rec typrec n c = - match whd_betadeltaiota env c with + 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 @@ -247,17 +249,17 @@ let type_one_branch_dep (env,nparams,globargs,p) co t = (appvect ((lift n p),vargs), [applist(co,((List.map (lift n) globargs)@(rel_list 0 n)))]) in - typrec 0 (hnf_prod_applist env "type_case" t globargs) + typrec 0 (hnf_prod_applist env sigma "type_case" t globargs) -let type_one_branch_nodep (env,nparams,globargs,p) t = +let type_one_branch_nodep env sigma (nparams,globargs,p) t = let rec typrec n c = - match whd_betadeltaiota env c with + 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 "type_case" t globargs) + typrec 0 (hnf_prod_applist env sigma "type_case" t globargs) (* 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 @@ -266,45 +268,45 @@ let type_one_branch_nodep (env,nparams,globargs,p) t = attendus dans les branches du Case; lr est le type attendu du resultat *) -let type_case_branches env ct pt p c = +let type_case_branches env sigma ct pt p c = try - let ((mI,largs) as indt) = find_mrectype env ct in + let ((mI,largs) as indt) = find_mrectype env sigma ct in let (dep,(nparams,globargs,la)) = - find_case_dep_nparams env (c,p) indt pt + find_case_dep_nparams env sigma (c,p) indt pt in - let (lconstruct,ltypconstr) = type_mconstructs env mI in + let (lconstruct,ltypconstr) = type_mconstructs env sigma mI in if dep then (mI, - array_map2 (type_one_branch_dep (env,nparams,globargs,p)) + array_map2 (type_one_branch_dep env sigma (nparams,globargs,p)) lconstruct ltypconstr, beta_applist (p,(la@[c]))) else (mI, - Array.map (type_one_branch_nodep (env,nparams,globargs,p)) + Array.map (type_one_branch_nodep env sigma (nparams,globargs,p)) ltypconstr, beta_applist (p,la)) with Induc -> error_case_not_inductive CCI env c ct -let check_branches_message env (c,ct) (explft,lft) = +let check_branches_message env sigma (c,ct) (explft,lft) = let n = Array.length explft and expn = Array.length lft in let rec check_conv i = if not (i = n) then - if not (is_conv_leq env lft.(i) (explft.(i))) then - error_ill_formed_branch CCI env c i (nf_betaiota env lft.(i)) - (nf_betaiota env explft.(i)) + if not (is_conv_leq env sigma lft.(i) (explft.(i))) then + error_ill_formed_branch CCI env c i (nf_betaiota env sigma lft.(i)) + (nf_betaiota env sigma explft.(i)) else check_conv (i+1) in if n<>expn then error_number_branches CCI env c ct expn else check_conv 0 -let type_of_case env pj cj lfj = +let type_of_case env sigma pj cj lfj = let lft = Array.map (fun j -> j.uj_type) lfj in let (mind,bty,rslty) = - type_case_branches env cj.uj_type pj.uj_type pj.uj_val cj.uj_val in - let kind = sort_of_arity env pj.uj_type in - check_branches_message env (cj.uj_val,cj.uj_type) (bty,lft); + type_case_branches env sigma cj.uj_type pj.uj_type pj.uj_val cj.uj_val in + let kind = sort_of_arity env sigma pj.uj_type in + check_branches_message env sigma (cj.uj_val,cj.uj_type) (bty,lft); { uj_val = mkMutCaseA (ci_of_mind mind) (j_val pj) (j_val cj) (Array.map j_val lfj); uj_type = rslty; @@ -345,8 +347,8 @@ let sort_of_product domsort rangsort g = (* Product rule (Type_i,Type_i,Type_i) *) | Type u1 -> let (u12,cst) = sup u1 u2 g in Type u12, cst) -let abs_rel env name var j = - let rngtyp = whd_betadeltaiota env j.uj_kind in +let abs_rel env sigma name var j = + let rngtyp = whd_betadeltaiota env sigma j.uj_kind in let cvar = incast_type var in let (s,cst) = sort_of_product var.typ (destSort rngtyp) (universes env) in { uj_val = mkLambda name cvar (j_val j); @@ -356,9 +358,9 @@ let abs_rel env name var j = (* Type of a product. *) -let gen_rel env name var j = - let jtyp = whd_betadeltaiota env j.uj_type in - let jkind = whd_betadeltaiota env j.uj_kind in +let gen_rel env sigma name var j = + let jtyp = whd_betadeltaiota env sigma j.uj_type in + let jkind = whd_betadeltaiota env sigma j.uj_kind in let j = { uj_val = j.uj_val; uj_type = jtyp; uj_kind = jkind } in if isprop jkind then error "Proof objects can only be abstracted" @@ -377,17 +379,17 @@ let gen_rel env name var j = (* Type of a cast. *) -let cast_rel env cj tj = - if is_conv_leq env cj.uj_type tj.uj_val then +let cast_rel env sigma cj tj = + if is_conv_leq env sigma cj.uj_type tj.uj_val then { uj_val = j_val_only cj; uj_type = tj.uj_val; - uj_kind = whd_betadeltaiota env tj.uj_type } + uj_kind = whd_betadeltaiota env sigma tj.uj_type } else error_actual_type CCI env cj.uj_val cj.uj_type tj.uj_val (* Type of an application. *) -let apply_rel_list env nocheck argjl funj = +let apply_rel_list env sigma nocheck argjl funj = let rec apply_rec typ cst = function | [] -> { uj_val = applist (j_val_only funj, List.map j_val_only argjl); @@ -395,13 +397,13 @@ let apply_rel_list env nocheck argjl funj = uj_kind = funj.uj_kind }, cst | hj::restjl -> - match whd_betadeltaiota env typ with + match whd_betadeltaiota env sigma typ with | DOP2(Prod,c1,DLAM(_,c2)) -> if nocheck then apply_rec (subst1 hj.uj_val c2) cst restjl else (try - let c = conv_leq env hj.uj_type c1 in + let c = conv_leq env sigma hj.uj_type c1 in let cst' = Constraint.union cst c in apply_rec (subst1 hj.uj_val c2) cst' restjl with NotConvertible -> @@ -421,7 +423,7 @@ let apply_rel_list env nocheck argjl funj = which may contain the CoFix variables. These occurrences of CoFix variables are not considered *) -let noccur_with_meta sigma n m term = +let noccur_with_meta lc n m term = let rec occur_rec n = function | Rel p -> if n<=p & p<n+m then raise Occur | VAR _ -> () @@ -429,7 +431,7 @@ let noccur_with_meta sigma n m term = (match strip_outer_cast cl.(0) with | DOP0 (Meta _) -> () | _ -> Array.iter (occur_rec n) cl) - | DOPN(Const sp, cl) when Spset.mem sp sigma -> () + | DOPN(Const sp, cl) when Spset.mem sp lc -> () | DOPN(op,cl) -> Array.iter (occur_rec n) cl | DOPL(_,cl) -> List.iter (occur_rec n) cl | DOP0(_) -> () @@ -489,14 +491,14 @@ let check_term env mind_recvec f = in crec -let is_inst_var env k c = - match whd_betadeltaiota_stack env c [] with +let is_inst_var env sigma k c = + match whd_betadeltaiota_stack env sigma c [] with | (Rel n,_) -> n=k | _ -> false -let is_subterm_specif env lcx mind_recvec = +let is_subterm_specif env sigma lcx mind_recvec = let rec crec n lst c = - match whd_betadeltaiota_stack env c [] with + match whd_betadeltaiota_stack env sigma c [] with | ((Rel k),_) -> find_sorted_assoc k lst | (DOPN(MutCase _,_) as x,_) -> let ( _,_,c,br) = destCase x in @@ -505,7 +507,7 @@ let is_subterm_specif env lcx mind_recvec = else let lcv = (try - if is_inst_var env n c then lcx else (crec n lst c) + if is_inst_var env sigma n c then lcx else (crec n lst c) with Not_found -> (Array.create (Array.length br) [])) in assert (Array.length br = Array.length lcv); @@ -552,16 +554,16 @@ let is_subterm_specif env lcx mind_recvec = in crec -let is_subterm env lcx mind_recvec n lst c = +let is_subterm env sigma lcx mind_recvec n lst c = try - let _ = is_subterm_specif env lcx mind_recvec n lst c in true + let _ = is_subterm_specif env sigma lcx mind_recvec n lst c in true with Not_found -> false (* Auxiliary function: it checks a condition f depending on a deBrujin index for a certain number of abstractions *) -let rec check_subterm_rec_meta env sigma vectn k def = +let rec check_subterm_rec_meta env sigma lc vectn k def = (k < 0) or (let nfi = Array.length vectn in (* check fi does not appear in the k+1 first abstractions, @@ -569,14 +571,14 @@ let rec check_subterm_rec_meta env sigma vectn k def = let rec check_occur n def = (match strip_outer_cast def with | DOP2(Lambda,a,DLAM(_,b)) -> - if noccur_with_meta sigma n nfi a then + if noccur_with_meta lc n nfi a then if n = k+1 then (a,b) else check_occur (n+1) b else error "Bad occurrence of recursive call" | _ -> error "Not enough abstractions in the definition") in let (c,d) = check_occur 1 def in let (mI, largs) = - (try find_minductype env c + (try find_minductype env sigma c with Induc -> error "Recursive definition on a non inductive type") in let (sp,tyi,_) = destMutInd mI in let mind_recvec = mis_recargs (lookup_mind_specif mI env) in @@ -587,9 +589,9 @@ let rec check_subterm_rec_meta env sigma vectn k def = *) let rec check_rec_call n lst t = (* n gives the index of the recursive variable *) - (noccur_with_meta sigma (n+k+1) nfi t) or + (noccur_with_meta lc (n+k+1) nfi t) or (* no recursive call in the term *) - (match whd_betadeltaiota_stack env t [] with + (match whd_betadeltaiota_stack env sigma t [] with | (Rel p,l) -> if n+k+1 <= p & p < n+k+nfi+1 then (* recursive call *) @@ -598,7 +600,7 @@ let rec check_subterm_rec_meta env sigma vectn k def = if List.length l > np then (match list_chop np l with (la,(z::lrest)) -> - if (is_subterm env lcx mind_recvec n lst z) + if (is_subterm env sigma lcx mind_recvec n lst z) then List.for_all (check_rec_call n lst) (la@lrest) else error "Recursive call applied to an illegal term" | _ -> assert false) @@ -608,10 +610,10 @@ let rec check_subterm_rec_meta env sigma vectn k def = let (ci,p,c_0,lrest) = destCase mc in let lc = (try - if is_inst_var env n c_0 then + if is_inst_var env sigma n c_0 then lcx else - is_subterm_specif env lcx mind_recvec n lst c_0 + is_subterm_specif env sigma lcx mind_recvec n lst c_0 with Not_found -> Array.create (Array.length lrest) []) in @@ -646,8 +648,10 @@ let rec check_subterm_rec_meta env sigma vectn k def = else let theDecrArg = List.nth l decrArg in let recArgsDecrArg = - try (is_subterm_specif env lcx mind_recvec n lst theDecrArg) - with Not_found -> Array.create 0 [] + try + is_subterm_specif env sigma lcx mind_recvec n lst theDecrArg + with Not_found -> + Array.create 0 [] in if (Array.length recArgsDecrArg)=0 then array_for_all (check_rec_call n lst) la @@ -698,7 +702,7 @@ nvect is [|n1;..;nk|] which gives for each recursive definition the inductive-decreasing index the function checks the convertibility of ti with Ai *) -let check_fix env sigma = function +let check_fix env sigma lc = function | DOPN(Fix(nvect,j),vargs) -> let nbfix = let nv = Array.length vargs in if nv < 2 then error "Ill-formed recursive definition" else nv-1 in @@ -714,7 +718,7 @@ let check_fix env sigma = function let check_type i = try let _ = - check_subterm_rec_meta env sigma nvect nvect.(i) vdefs.(i) in + check_subterm_rec_meta env sigma lc nvect nvect.(i) vdefs.(i) in () with UserError (s,str) -> error_ill_formed_rec_body CCI env str lna i vdefs @@ -728,12 +732,12 @@ let check_fix env sigma = function let mind_nparams env i = let mis = lookup_mind_specif i env in mis.mis_mib.mind_nparams -let check_guard_rec_meta env sigma nbfix def deftype = +let check_guard_rec_meta env sigma lc nbfix def deftype = let rec codomain_is_coind c = - match whd_betadeltaiota env (strip_outer_cast c) with + match whd_betadeltaiota env sigma (strip_outer_cast c) with | DOP2(Prod,a,DLAM(_,b)) -> codomain_is_coind b | b -> - (try find_mcoinductype env b + (try find_mcoinductype env sigma b with | Induc -> error "The codomain is not a coinductive type" | _ -> error "Type of Cofix function not as expected") @@ -743,17 +747,17 @@ let check_guard_rec_meta env sigma nbfix def deftype = let lvlra = (mis_recargs (lookup_mind_specif mI env)) in let vlra = lvlra.(tyi) in let rec check_rec_call alreadygrd n vlra t = - if noccur_with_meta sigma n nbfix t then + if noccur_with_meta lc n nbfix t then true else - match whd_betadeltaiota_stack env t [] with + match whd_betadeltaiota_stack env sigma t [] with | (DOP0 (Meta _), l) -> true | (Rel p,l) -> if n <= p && p < n+nbfix then (* recursive call *) if alreadygrd then - if List.for_all (noccur_with_meta sigma n nbfix) l then + if List.for_all (noccur_with_meta lc n nbfix) l then true else error "Nested recursive occurrences" @@ -792,14 +796,14 @@ let check_guard_rec_meta env sigma nbfix def deftype = (process_args_of_constr lr lrar) | _::lrar -> - if (noccur_with_meta sigma n nbfix t) + if (noccur_with_meta lc n nbfix t) then (process_args_of_constr lr lrar) else error "Recursive call inside a non-recursive argument of constructor") in (process_args_of_constr realargs lra) | (DOP2(Lambda,a,DLAM(_,b)),[]) -> - if (noccur_with_meta sigma n nbfix a) then + if (noccur_with_meta lc n nbfix a) then check_rec_call alreadygrd (n+1) vlra b else error "Recursive call in the type of an abstraction" @@ -817,7 +821,7 @@ let check_guard_rec_meta env sigma nbfix def deftype = let (lna,vdefs) = decomp_DLAMV_name la ldef in let vlna = Array.of_list lna in - if (array_for_all (noccur_with_meta sigma n nbfix) varit) then + if (array_for_all (noccur_with_meta lc n nbfix) varit) then (array_for_all (check_rec_call alreadygrd (n+1) vlra) vdefs) && (List.for_all (check_rec_call alreadygrd (n+1) vlra) l) @@ -826,9 +830,9 @@ let check_guard_rec_meta env sigma nbfix def deftype = | (DOPN(MutCase _,_) as mc,l) -> let (_,p,c,vrest) = destCase mc in - if (noccur_with_meta sigma n nbfix p) then - if (noccur_with_meta sigma n nbfix c) then - if (List.for_all (noccur_with_meta sigma n nbfix) l) then + if (noccur_with_meta lc n nbfix p) then + if (noccur_with_meta lc n nbfix c) then + if (List.for_all (noccur_with_meta lc n nbfix) l) then (array_for_all (check_rec_call alreadygrd n vlra) vrest) else error "Recursive call in the argument of a function defined by cases" @@ -845,7 +849,7 @@ let check_guard_rec_meta env sigma nbfix def deftype = (* The function which checks that the whole block of definitions satisfies the guarded condition *) -let check_cofix env sigma f = +let check_cofix env sigma lc f = match f with | DOPN(CoFix(j),vargs) -> let nbfix = let nv = Array.length vargs in @@ -862,7 +866,7 @@ let check_cofix env sigma f = let check_type i = try let _ = - check_guard_rec_meta env sigma nbfix vdefs.(i) varit.(i) in + check_guard_rec_meta env sigma lc nbfix vdefs.(i) varit.(i) in () with UserError (s,str) -> error_ill_formed_rec_body CCI env str lna i vdefs @@ -876,7 +880,7 @@ let check_cofix env sigma f = exception IllBranch of int -let type_fixpoint env lna lar vdefj = +let type_fixpoint env sigma lna lar vdefj = let lt = Array.length vdefj in assert (Array.length lar = lt); try @@ -884,6 +888,7 @@ let type_fixpoint env lna lar vdefj = (fun i e def ar -> try conv_leq e def (lift lt ar) with NotConvertible -> raise (IllBranch i)) - env (Array.map (fun j -> j.uj_type) vdefj) (Array.map body_of_type lar) + env sigma + (Array.map (fun j -> j.uj_type) vdefj) (Array.map body_of_type lar) with IllBranch i -> error_ill_typed_rec_body CCI env i lna vdefj lar diff --git a/kernel/typeops.mli b/kernel/typeops.mli index 0a4419a608..f876012996 100644 --- a/kernel/typeops.mli +++ b/kernel/typeops.mli @@ -5,6 +5,7 @@ open Names open Univ open Term +open Evd open Environ (*i*) @@ -19,22 +20,25 @@ val j_val_only : unsafe_judgment -> constr constructs the typed type $t:s$, while [assumption_of_judgement env j] cosntructs the type type $c:t$, checking that $t$ is a sort. *) -val typed_type_of_judgment : unsafe_env -> unsafe_judgment -> typed_type -val assumption_of_judgment : unsafe_env -> unsafe_judgment -> typed_type +val typed_type_of_judgment : + unsafe_env -> 'a evar_map -> unsafe_judgment -> typed_type +val assumption_of_judgment : + unsafe_env -> 'a evar_map -> unsafe_judgment -> typed_type val relative : unsafe_env -> int -> unsafe_judgment -val type_of_constant : unsafe_env -> constr -> typed_type +val type_of_constant : unsafe_env -> 'a evar_map -> constr -> typed_type -val type_of_inductive : unsafe_env -> constr -> typed_type +val type_of_inductive : unsafe_env -> 'a evar_map -> constr -> typed_type -val type_of_constructor : unsafe_env -> constr -> constr +val type_of_constructor : unsafe_env -> 'a evar_map -> constr -> constr -val type_of_case : unsafe_env -> unsafe_judgment -> unsafe_judgment - -> unsafe_judgment array -> unsafe_judgment +val type_of_case : unsafe_env -> 'a evar_map + -> unsafe_judgment -> unsafe_judgment + -> unsafe_judgment array -> unsafe_judgment val type_case_branches : - unsafe_env -> constr -> constr -> constr -> constr + unsafe_env -> 'a evar_map -> constr -> constr -> constr -> constr -> constr * constr array * constr val type_of_prop_or_set : contents -> unsafe_judgment @@ -42,22 +46,23 @@ val type_of_prop_or_set : contents -> unsafe_judgment val type_of_type : universe -> unsafe_judgment * constraints val abs_rel : - unsafe_env -> name -> typed_type -> unsafe_judgment + unsafe_env -> 'a evar_map -> name -> typed_type -> unsafe_judgment -> unsafe_judgment * constraints val gen_rel : - unsafe_env -> name -> typed_type -> unsafe_judgment + unsafe_env -> 'a evar_map -> name -> typed_type -> unsafe_judgment -> unsafe_judgment * constraints val cast_rel : - unsafe_env -> unsafe_judgment -> unsafe_judgment -> unsafe_judgment + unsafe_env -> 'a evar_map -> unsafe_judgment -> unsafe_judgment + -> unsafe_judgment val apply_rel_list : - unsafe_env -> bool -> unsafe_judgment list -> unsafe_judgment + unsafe_env -> 'a evar_map -> bool -> unsafe_judgment list -> unsafe_judgment -> unsafe_judgment * constraints -val check_fix : unsafe_env -> Spset.t -> constr -> unit -val check_cofix : unsafe_env -> Spset.t -> constr -> unit +val check_fix : unsafe_env -> 'a evar_map -> Spset.t -> constr -> unit +val check_cofix : unsafe_env -> 'a evar_map -> Spset.t -> constr -> unit -val type_fixpoint : unsafe_env -> name list -> typed_type array +val type_fixpoint : unsafe_env -> 'a evar_map -> name list -> typed_type array -> unsafe_judgment array -> constraints diff --git a/kernel/typing.ml b/kernel/typing.ml index 071403d628..8a18c1e2b5 100644 --- a/kernel/typing.ml +++ b/kernel/typing.ml @@ -58,13 +58,13 @@ let rec execute mf env cstr = error "Cannot typecheck an unevaluable abstraction" | IsConst _ -> - (make_judge cstr (type_of_constant env cstr), cst0) + (make_judge cstr (type_of_constant env Evd.empty cstr), cst0) | IsMutInd _ -> - (make_judge cstr (type_of_inductive env cstr), cst0) + (make_judge cstr (type_of_inductive env Evd.empty cstr), cst0) | IsMutConstruct _ -> - let (typ,kind) = destCast (type_of_constructor env cstr) in + let (typ,kind) = destCast (type_of_constructor env Evd.empty cstr) in ({ uj_val = cstr; uj_type = typ; uj_kind = kind } , cst0) | IsMutCase (_,p,c,lf) -> @@ -72,20 +72,20 @@ let rec execute mf env cstr = let (pj,cst2) = execute mf env p in let (lfj,cst3) = execute_array mf env lf in let cst = Constraint.union cst1 (Constraint.union cst2 cst3) in - (type_of_case env pj cj lfj, cst) + (type_of_case env Evd.empty pj cj lfj, cst) | IsFix (vn,i,lar,lfi,vdef) -> if (not mf.fix) && array_exists (fun n -> n < 0) vn then error "General Fixpoints not allowed"; let (larv,vdefv,cst) = execute_fix mf env lar lfi vdef in let fix = mkFix vn i larv lfi vdefv in - check_fix env Spset.empty fix; + check_fix env Evd.empty Spset.empty fix; (make_judge fix larv.(i), cst) | IsCoFix (i,lar,lfi,vdef) -> let (larv,vdefv,cst) = execute_fix mf env lar lfi vdef in let cofix = mkCoFix i larv lfi vdefv in - check_cofix env Spset.empty cofix; + check_cofix env Evd.empty Spset.empty cofix; (make_judge cofix larv.(i), cst) | IsSort (Prop c) -> @@ -101,25 +101,25 @@ let rec execute mf env cstr = and tl = Array.to_list (Array.sub a 1 (la - 1)) in let (j,cst1) = execute mf env hd in let (jl,cst2) = execute_list mf env tl in - let (j,cst3) = apply_rel_list env mf.nocheck jl j in + let (j,cst3) = apply_rel_list env Evd.empty mf.nocheck jl j in let cst = Constraint.union cst1 (Constraint.union cst2 cst3) in (j, cst) | IsLambda (name,c1,c2) -> let (j,cst1) = execute mf env c1 in - let var = assumption_of_judgment env j in + let var = assumption_of_judgment env Evd.empty j in let env1 = push_rel (name,var) env in let (j',cst2) = execute mf env1 c2 in - let (j,cst3) = abs_rel env1 name var j' in + let (j,cst3) = abs_rel env1 Evd.empty name var j' in let cst = Constraint.union cst1 (Constraint.union cst2 cst3) in (j, cst) | IsProd (name,c1,c2) -> let (j,cst1) = execute mf env c1 in - let var = assumption_of_judgment env j in + let var = assumption_of_judgment env Evd.empty j in let env1 = push_rel (name,var) env in let (j',cst2) = execute mf env1 c2 in - let (j,cst3) = gen_rel env1 name var j' in + let (j,cst3) = gen_rel env1 Evd.empty name var j' in let cst = Constraint.union cst1 (Constraint.union cst2 cst3) in (j, cst) @@ -127,20 +127,20 @@ let rec execute mf env cstr = let (cj,cst1) = execute mf env c in let (tj,cst2) = execute mf env t in let cst = Constraint.union cst1 cst2 in - (cast_rel env cj tj, cst) + (cast_rel env Evd.empty cj tj, cst) | _ -> error_cant_execute CCI env cstr and execute_fix mf env lar lfi vdef = let (larj,cst1) = execute_array mf env lar in - let lara = Array.map (assumption_of_judgment env) larj in + let lara = Array.map (assumption_of_judgment env Evd.empty) larj in let nlara = List.combine (List.rev lfi) (Array.to_list (vect_lift_type lara)) in let env1 = List.fold_left (fun env nvar -> push_rel nvar env) env nlara in let (vdefj,cst2) = execute_array mf env1 vdef in let vdefv = Array.map j_val_only vdefj in - let cst3 = type_fixpoint env1 lfi lara vdefj in + let cst3 = type_fixpoint env1 Evd.empty lfi lara vdefj in let cst = Constraint.union cst1 (Constraint.union cst2 cst3) in (lara,vdefv,cst) @@ -161,7 +161,7 @@ and execute_list mf env = function let execute_type mf env constr = let (j,_) = execute mf env constr in - assumption_of_judgment env j + assumption_of_judgment env Evd.empty j (* Exported machines. First safe machines, with no general fixpoint @@ -200,13 +200,13 @@ let unsafe_machine_type env constr = (* ``Type of'' machines. *) let type_of env c = - let (j,_) = safe_machine env c in nf_betaiota env j.uj_type + let (j,_) = safe_machine env c in nf_betaiota env Evd.empty j.uj_type let type_of_type env c = let tt = safe_machine_type env c in DOP0 (Sort tt.typ) let unsafe_type_of env c = - let (j,_) = unsafe_machine env c in nf_betaiota env j.uj_type + let (j,_) = unsafe_machine env c in nf_betaiota env Evd.empty j.uj_type let unsafe_type_of_type env c = let tt = unsafe_machine_type env c in DOP0 (Sort tt.typ) @@ -250,7 +250,7 @@ let lookup_mind_specif = lookup_mind_specif let push_rel_or_var push (id,c) env = let (j,cst) = safe_machine env c in let env' = add_constraints cst env in - let var = assumption_of_judgment env' j in + let var = assumption_of_judgment env' Evd.empty j in push (id,var) env' let push_var nvar env = push_rel_or_var push_var nvar env @@ -271,14 +271,15 @@ let add_constant sp ce env = let (env'',ty,cst') = match ce.const_entry_type with | None -> - env', typed_type_of_judgment env' jb, Constraint.empty + env', typed_type_of_judgment env' Evd.empty jb, Constraint.empty | Some ty -> let (jt,cst') = safe_machine env ty in let env'' = add_constraints cst' env' in try - let cst'' = conv env'' jb.uj_type jt.uj_val in + let cst'' = conv env'' Evd.empty jb.uj_type jt.uj_val in let env'' = add_constraints cst'' env'' in - env'', assumption_of_judgment env'' jt, Constraint.union cst' cst'' + (env'', assumption_of_judgment env'' Evd.empty jt, + Constraint.union cst' cst'') with NotConvertible -> error_actual_type CCI env jb.uj_val jb.uj_type jt.uj_val in @@ -298,7 +299,7 @@ let add_parameter sp t env = let cb = { const_kind = kind_of_path sp; const_body = None; - const_type = assumption_of_judgment env' jt; + const_type = assumption_of_judgment env' Evd.empty jt; const_hyps = get_globals (context env); const_constraints = cst; const_opaque = false } @@ -312,7 +313,7 @@ let add_parameter sp t env = function taking a value of type [typed_type] as argument. *) let rec for_all_prods p env c = - match whd_betadeltaiota env c with + match whd_betadeltaiota env Evd.empty c with | DOP2(Prod, DOP2(Cast,t,DOP0 (Sort s)), DLAM(name,c)) -> (p (make_typed t s)) && (let ty = { body = t; typ = s } in @@ -320,7 +321,7 @@ let rec for_all_prods p env c = for_all_prods p env' c) | DOP2(Prod, b, DLAM(name,c)) -> let (jb,cst) = unsafe_machine env b in - let var = assumption_of_judgment env jb in + let var = assumption_of_judgment env Evd.empty jb in (p var) && (let env' = Environ.push_rel (name,var) (add_constraints cst env) in for_all_prods p env' c) @@ -329,7 +330,7 @@ let rec for_all_prods p env c = let is_small_type e c = for_all_prods (fun t -> is_small t.typ) e c let enforce_type_constructor env univ j cst = - match whd_betadeltaiota env j.uj_type with + match whd_betadeltaiota env Evd.empty j.uj_type with | DOP0 (Sort (Type uc)) -> Constraint.add (univ,Geq,uc) cst | _ -> error "Type of Constructor not well-formed" @@ -347,11 +348,13 @@ let type_one_constructor env_ar nparams ar c = ((issmall,j), Constraint.union cst' cst'') let logic_constr env c = - for_all_prods (fun t -> not (is_info_type env t)) env c + for_all_prods (fun t -> not (is_info_type env Evd.empty t)) env c let logic_arity env c = for_all_prods - (fun t -> (not (is_info_type env t)) or (is_small_type env t.body)) env c + (fun t -> + (not (is_info_type env Evd.empty t)) or (is_small_type env t.body)) + env c let is_unit env_par nparams ar spec = match decomp_all_DLAMV_name spec with |
