diff options
Diffstat (limited to 'pretyping')
| -rw-r--r-- | pretyping/cases.ml | 79 | ||||
| -rw-r--r-- | pretyping/coercion.ml | 4 | ||||
| -rw-r--r-- | pretyping/detyping.ml | 47 | ||||
| -rw-r--r-- | pretyping/detyping.mli | 6 | ||||
| -rw-r--r-- | pretyping/evarconv.ml | 6 | ||||
| -rw-r--r-- | pretyping/evarutil.ml | 77 | ||||
| -rw-r--r-- | pretyping/evarutil.mli | 4 | ||||
| -rw-r--r-- | pretyping/pretype_errors.ml | 30 | ||||
| -rw-r--r-- | pretyping/pretyping.ml | 42 | ||||
| -rw-r--r-- | pretyping/retyping.ml | 6 | ||||
| -rw-r--r-- | pretyping/tacred.ml | 141 | ||||
| -rw-r--r-- | pretyping/typing.ml | 6 |
12 files changed, 238 insertions, 210 deletions
diff --git a/pretyping/cases.ml b/pretyping/cases.ml index 47fcdcc159..1d25ba84df 100644 --- a/pretyping/cases.ml +++ b/pretyping/cases.ml @@ -25,20 +25,20 @@ let mkExistential isevars env = new_isevar isevars env (mkCast dummy_sort dummy_sort) CCI let norec_branch_scheme env isevars cstr = - prod_it (mkExistential isevars env) cstr.cs_args + it_mkProd_or_LetIn (mkExistential isevars env) cstr.cs_args -let lift_args l = list_map_i (fun i (name,c) -> (name,liftn 1 i c)) 1 l - -let rec_branch_scheme env isevars ((sp,j),_) recargs cstr = +let rec_branch_scheme env isevars ((sp,j),_) recargs cstr = let rec crec (args,recargs) = match args, recargs with - | (name,c)::rea,(ra::reca) -> - DOP2(Prod,c,DLAM(name, + | (name,None,c)::rea,(ra::reca) -> + DOP2(Prod,body_of_type c,DLAM(name, match ra with | Mrec k when k=j -> mkArrow (mkExistential isevars env) - (crec (lift_args rea,reca)) + (crec (List.rev (lift_rel_context 1 (List.rev rea)),reca)) | _ -> crec (rea,reca))) + | (name,Some d,c)::rea, reca -> failwith "TODO" +(* mkLetIn (name,d,body_of_type c,crec (rea,reca))) *) | [],[] -> mkExistential isevars env | _ -> anomaly "rec_branch_scheme" in @@ -145,7 +145,7 @@ let inductive_of_rawconstructor c = (* Environment management *) let push_rel_type sigma (na,t) env = - push_rel (na,get_assumption_of env sigma t) env + push_rel_decl (na,get_assumption_of env sigma t) env let push_rels vars env = List.fold_right (fun nvar env -> push_rel_type Evd.empty nvar env) vars env @@ -537,6 +537,39 @@ let prepare_unif_pb typ cs = (* This is the problem: finding P s.t. cs_args |- (P realargs ci) = p' *) (Array.map (lift (-n)) cs.cs_concl_realargs, ci, p') +(* +(* Infering the predicate *) +let prepare_unif_pb typ cs = + let n = cs.cs_nargs in + let _,p = decompose_prod_n n typ in + let ci = build_dependent_constructor cs in + (* This is the problem: finding P s.t. cs_args |- (P realargs ci) = p *) + (n, cs.cs_concl_realargs, ci, p) + +let eq_operator_lift k (n,n') = function + | OpRel p, OpRel p' when p > k & p' > k -> + if p < k+n or p' < k+n' then false else p - n = p' - n' + | op, op' -> op = op' + +let rec transpose_args n = + if n=0 then [] + else + (Array.map (fun l -> List.hd l) lv):: + (transpose_args (m-1) (Array.init (fun l -> List.tl l))) + +let shift_operator k = function OpLambda _ | OpProd _ -> k+1 | _ -> k + +let reloc_operator (k,n) = function OpRel p when p > k -> +let rec unify_clauses k pv = + let pv'= Array.map (fun (n,sign,_,p) -> n,splay_constr (whd_betaiotaevar (push_rels (List.rev sign) env) !isevars) p) pv in + let n1,op1 = let (n1,(op1,args1)) = pv'.(0) in n1,op1 in + if Array.for_all (fun (ni,(opi,_)) -> eq_operator_lift k (n1,ni) (op1,opi)) pv' + then + let argvl = transpose_args (List.length args1) pv' in + let k' = shift_operator k op1 in + let argl = List.map (unify_clauses k') argvl in + gather_constr (reloc_operator (k,n1) op1) argl +*) let abstract_conclusion typ cs = let n = cs.cs_nargs in @@ -545,18 +578,17 @@ let abstract_conclusion typ cs = let infer_predicate env isevars typs cstrs (IndFamily (mis,_) as indf) = (* Il faudra substituer les isevars a un certain moment *) - let eqns = array_map2 prepare_unif_pb typs cstrs in - - (* First strategy: no dependencies at all *) - let (cclargs,_,typn) = eqns.(mis_nconstr mis -1) in - let (sign,_) = get_arity indf in - if array_for_all (fun (_,_,typ) -> the_conv_x env isevars typn typ) eqns - then - let pred = lam_it (lift (List.length sign) typn) sign in - (false,pred) (* true = dependent -- par défaut *) + if Array.length cstrs = 0 then + failwith "TODO4-3" else - if Array.length typs = 0 then - failwith "TODO4-3" + let eqns = array_map2 prepare_unif_pb typs cstrs in + (* First strategy: no dependencies at all *) + let (cclargs,_,typn) = eqns.(mis_nconstr mis -1) in + let (sign,_) = get_arity indf in + if array_for_all (fun (_,_,typ) -> the_conv_x env isevars typn typ) eqns + then + let pred = lam_it (lift (List.length sign) typn) sign in + (false,pred) (* true = dependent -- par défaut *) else let s = get_sort_of env !isevars typs.(0) in let predpred = lam_it (mkSort s) sign in @@ -717,7 +749,8 @@ let shift_problem pb = (* Building the sub-pattern-matching problem for a given branch *) let build_branch pb defaults current eqns const_info = - let names = get_names pb.env const_info.cs_args eqns in + let cs_args = decls_of_rel_context const_info.cs_args in + let names = get_names pb.env cs_args eqns in let newpats = if !substitute_alias then List.map (fun na -> PatVar (dummy_loc,na)) names @@ -726,7 +759,7 @@ let build_branch pb defaults current eqns const_info = let submatdef = List.map (expand_defaults newpats current) defaults in let submat = List.map (fun (tms,eqn) -> prepend_pattern tms eqn) eqns in if submat = [] & submatdef = [] then error "Non exhaustive"; - let typs = List.map2 (fun (_,t) na -> (na,t)) const_info.cs_args (List.rev names) in + let typs = List.map2 (fun (_,t) na -> (na,t)) cs_args (List.rev names) in let tomatchs = List.fold_left2 (fun l (na,t) dep_in_rhs -> @@ -834,7 +867,7 @@ let matx_of_eqns env eqns = let build_eqn (ids,lpatt,rhs) = let rhs = { rhs_env = env; - other_ids = ids@(ids_of_sign (get_globals (context env))); + other_ids = ids@(ids_of_var_context (var_context env)); private_ids = []; user_ids = ids; subst = []; @@ -874,7 +907,7 @@ let inh_coerce_to_ind isevars env ty tyi = List.fold_right (fun (na,ty) (env,evl) -> let aty = get_assumption_of env Evd.empty ty in - (push_rel (na,aty) env, + (push_rel_decl (na,aty) env, (new_isevar isevars env (incast_type aty) CCI)::evl)) ntys (env,[]) in let expected_typ = applist (mkMutInd tyi,evarl) in diff --git a/pretyping/coercion.ml b/pretyping/coercion.ml index 1e90ef8f3c..8269a47412 100644 --- a/pretyping/coercion.ml +++ b/pretyping/coercion.ml @@ -130,7 +130,7 @@ let rec inh_conv_coerce_to_fail env isevars c1 hj = (* let jv1 = exemeta_rec def_vty_con env isevars v1 in let assv1 = assumption_of_judgement env !isevars jv1 in *) let assv1 = outcast_type v1 in - let env1 = push_rel (x,assv1) env in + let env1 = push_rel_decl (x,assv1) env in let h2 = inh_conv_coerce_to_fail env isevars u2 {uj_val = v2; uj_type = get_assumption_of env1 !isevars t2 } in @@ -140,7 +140,7 @@ let rec inh_conv_coerce_to_fail env isevars c1 hj = let name = (match name with | Anonymous -> Name (id_of_string "x") | _ -> name) in - let env1 = push_rel (name,assu1) env in + let env1 = push_rel_decl (name,assu1) env in let h1 = inh_conv_coerce_to_fail env isevars t1 {uj_val = Rel 1; diff --git a/pretyping/detyping.ml b/pretyping/detyping.ml index 01ed9dc3bb..90697191a8 100644 --- a/pretyping/detyping.ml +++ b/pretyping/detyping.ml @@ -30,7 +30,7 @@ open Rawterm type used_idents = identifier list -let occur_id env id0 c = +let occur_id env_names id0 c = let rec occur n = function | VAR id -> id=id0 | DOPN (Const sp,cl) -> (basename sp = id0) or (array_exists (occur n) cl) @@ -49,26 +49,27 @@ let occur_id env id0 c = | DLAMV(_,v) -> array_exists (occur (n+1)) v | Rel p -> p>n & - (try (fst (lookup_rel (p-n) env) = Name id0) - with Not_found -> false) (* Unbound indice : may happen in debug *) + (try lookup_name_of_rel (p-n) env_names = Name id0 + with Not_found -> false) (* Unbound indice: may happen in debug *) | DOP0 _ -> false in occur 1 c -let next_name_not_occuring name l env t = +let next_name_not_occuring name l env_names t = let rec next id = - if List.mem id l or occur_id env id t then next (lift_ident id) else id + if List.mem id l or occur_id env_names id t then next (lift_ident id) + else id in match name with | Name id -> next id | Anonymous -> id_of_string "_" (* Remark: Anonymous var may be dependent in Evar's contexts *) -let concrete_name l env n c = +let concrete_name l env_names n c = if n = Anonymous & not (dependent (Rel 1) c) then (None,l) else - let fresh_id = next_name_not_occuring n l env c in + let fresh_id = next_name_not_occuring n l env_names c in let idopt = if dependent (Rel 1) c then (Some fresh_id) else None in (idopt, fresh_id::l) @@ -95,8 +96,6 @@ let global_vars_and_consts t = list_uniquize (collect [] t) let used_of = global_vars_and_consts -let ids_of_env = Sign.ids_of_env - (****************************************************************************) (* Tools for printing of Cases *) @@ -262,22 +261,22 @@ let ids_of_var cl = (Array.to_list cl) *) -let lookup_name_as_renamed env t s = - let rec lookup avoid env n = function - DOP2(Prod,_,DLAM(name,c')) -> - (match concrete_name avoid env name c' with +let lookup_name_as_renamed ctxt t s = + let rec lookup avoid env_names n = function + DOP2(Prod,t,DLAM(name,c')) -> + (match concrete_name avoid env_names name c' with (Some id,avoid') -> if id=s then (Some n) - else lookup avoid' (add_rel (Name id,()) env) (n+1) c' - | (None,avoid') -> lookup avoid' env (n+1) (pop c')) - | DOP2(Cast,c,_) -> lookup avoid env n c + else lookup avoid' (add_name (Name id) env_names) (n+1) c' + | (None,avoid') -> lookup avoid' env_names (n+1) (pop c')) + | DOP2(Cast,c,_) -> lookup avoid env_names n c | _ -> None - in lookup (ids_of_env env) env 1 t + in lookup (ids_of_var_context ctxt) empty_names_context 1 t let lookup_index_as_renamed t n = let rec lookup n d = function DOP2(Prod,_,DLAM(name,c')) -> - (match concrete_name [] (gLOB nil_sign) name c' with + (match concrete_name [] empty_names_context name c' with (Some _,_) -> lookup n (d+1) c' | (None ,_) -> if n=1 then Some d else lookup (n-1) (d+1) c') | DOP2(Cast,c,_) -> lookup n d c @@ -294,11 +293,11 @@ let rec detype avoid env t = | regular_constr -> (match kind_of_term regular_constr with | IsRel n -> - (try match fst (lookup_rel n env) with + (try match lookup_name_of_rel n env with | Name id -> RRef (dummy_loc, RVar id) | Anonymous -> anomaly "detype: index to an anonymous variable" with Not_found -> - let s = "[REL "^(string_of_int (number_of_rels env - n))^"]" + let s = "[REL "^(string_of_int n)^"]" in RRef (dummy_loc, RVar (id_of_string s))) | IsMeta n -> RMeta (dummy_loc, n) | IsVar id -> RRef (dummy_loc,RVar id) @@ -363,7 +362,7 @@ and detype_fix fk avoid env cl lfn vt = let lfi = List.map (fun id -> next_name_away id avoid) lfn in let def_avoid = lfi@avoid in let def_env = - List.fold_left (fun env id -> add_rel (Name id,()) env) env lfi in + List.fold_left (fun env id -> add_name (Name id) env) env lfi in RRec(dummy_loc,fk,Array.of_list lfi,Array.map (detype avoid env) cl, Array.map (detype def_avoid def_env) vt) @@ -372,9 +371,9 @@ and detype_eqn avoid env constr_id construct_nargs branch = let make_pat x avoid env b ids = if not (force_wildcard ()) or (dependent (Rel 1) b) then let id = next_name_away_with_default "x" x avoid in - PatVar (dummy_loc,Name id),id::avoid,(add_rel (Name id,()) env),id::ids + PatVar (dummy_loc,Name id),id::avoid,(add_name (Name id) env),id::ids else - PatVar (dummy_loc,Anonymous),avoid,(add_rel (Anonymous,()) env),ids + PatVar (dummy_loc,Anonymous),avoid,(add_name Anonymous env),ids in let rec buildrec ids patlist avoid env = function | 0 , rhs -> @@ -405,4 +404,4 @@ and detype_binder bk avoid env na ty c = | (None,l') -> Anonymous, l' in RBinder (dummy_loc,bk, na',detype [] env ty, - detype avoid' (add_rel (na',()) env) c) + detype avoid' (add_name na' env) c) diff --git a/pretyping/detyping.mli b/pretyping/detyping.mli index 9e0a30d09e..e961cfe917 100644 --- a/pretyping/detyping.mli +++ b/pretyping/detyping.mli @@ -5,6 +5,7 @@ open Names open Term open Sign +open Environ open Rawterm (*i*) @@ -13,11 +14,10 @@ open Rawterm exception StillDLAM -val detype : identifier list -> unit assumptions -> constr -> rawconstr +val detype : identifier list -> names_context -> constr -> rawconstr (* look for the index of a named var or a nondep var as it is renamed *) -val lookup_name_as_renamed : - unit assumptions -> constr -> identifier -> int option +val lookup_name_as_renamed : var_context -> constr -> identifier -> int option val lookup_index_as_renamed : constr -> int -> int option diff --git a/pretyping/evarconv.ml b/pretyping/evarconv.ml index a4faeb3e4b..3afc734695 100644 --- a/pretyping/evarconv.ml +++ b/pretyping/evarconv.ml @@ -261,9 +261,9 @@ and evar_eqappr_x env isevars pbty appr1 appr2 = | ((DOP2(Prod,c1,DLAM(n,c2)),[]), (DOP2(Prod,c'1,DLAM(_,c'2)),[])) -> evar_conv_x env isevars CONV c1 c'1 - & evar_conv_x - (push_rel (n,Retyping.get_assumption_of env !isevars (nf_ise1 !isevars c1)) env) isevars - pbty c2 c'2 + & + (let d = Retyping.get_assumption_of env !isevars (nf_ise1 !isevars c1) + in evar_conv_x (push_rel_decl (n,d) env) isevars pbty c2 c'2) | ((DOPN(MutInd _ as o1,cl1) as ind1,l'1), (DOPN(MutInd _ as o2,cl2) as ind2,l'2)) -> diff --git a/pretyping/evarutil.ml b/pretyping/evarutil.ml index 2de1219e31..804d635dbc 100644 --- a/pretyping/evarutil.ml +++ b/pretyping/evarutil.ml @@ -29,6 +29,7 @@ let distinct_id_list = in drec [] +(* let filter_sign p sign x = sign_it (fun id ty (v,ids,sgn) -> @@ -36,21 +37,21 @@ let filter_sign p sign x = if disc then (v', id::ids, sgn) else (v', ids, add_sign (id,ty) sgn)) sign (x,[],nil_sign) - +*) (*------------------------------------* * functional operations on evar sets * *------------------------------------*) (* All ids of sign must be distincts! *) -let new_isevar_sign env sigma typ args = +let new_isevar_sign env sigma typ instance = let sign = var_context env in - if not (list_distinct (ids_of_sign sign)) then + if not (list_distinct (ids_of_var_context sign)) then error "new_isevar_sign: two vars have the same name"; let newev = Evd.new_evar() in let info = { evar_concl = typ; evar_env = env; evar_body = Evar_empty; evar_info = None } in - (Evd.add sigma newev info, mkEvar newev args) + (Evd.add sigma newev info, mkEvar (newev,Array.of_list instance)) (* We don't try to guess in which sort the type should be defined, since any type has type Type. May cause some trouble, but not so far... *) @@ -60,8 +61,8 @@ let dummy_sort = mkType dummy_univ cumulativity now includes Prop and Set in Type. *) let new_type_var env sigma = let sign = var_context env in - let args = (Array.of_list (List.map mkVar (ids_of_sign sign))) in - let (sigma',c) = new_isevar_sign env sigma dummy_sort args in + let instance = List.map mkVar (ids_of_var_context sign) in + let (sigma',c) = new_isevar_sign env sigma dummy_sort instance in (sigma', c) let split_evar_to_arrow sigma c = @@ -70,16 +71,16 @@ let split_evar_to_arrow sigma c = let evenv = evd.evar_env in let (sigma1,dom) = new_type_var evenv sigma in let hyps = var_context evenv in - let nvar = next_ident_away (id_of_string "x") (ids_of_sign hyps) in - let nevenv = push_var (nvar,make_typed dom (Type dummy_univ)) evenv in - let (sigma2,rng) = new_type_var nevenv sigma1 in - let prod = mkProd (named_hd nevenv dom Anonymous) dom (subst_var nvar rng) in + let nvar = next_ident_away (id_of_string "x") (ids_of_var_context hyps) in + let newenv = push_var_decl (nvar,make_typed dom (Type dummy_univ)) evenv in + let (sigma2,rng) = new_type_var newenv sigma1 in + let prod = mkProd (named_hd newenv dom Anonymous) dom (subst_var nvar rng) in let sigma3 = Evd.define sigma2 ev prod in let dsp = num_of_evar dom in let rsp = num_of_evar rng in (sigma3, - mkEvar dsp args, - mkEvar rsp (array_cons (mkRel 1) (Array.map (lift 1) args))) + mkEvar (dsp,args), + mkEvar (rsp, array_cons (mkRel 1) (Array.map (lift 1) args))) (* Redefines an evar with a smaller context (i.e. it may depend on less @@ -99,17 +100,17 @@ let do_restrict_hyps sigma c = let (_,(rsign,ncargs)) = List.fold_left (fun (sign,(rs,na)) a -> - (tl_sign sign, + (List.tl sign, if not(closed0 a) then (rs,na) else - (add_sign (hd_sign sign) rs, a::na))) - (hyps,(nil_sign,[])) args + (add_var (List.hd sign) rs, a::na))) + (hyps,([],[])) args in - let sign' = rev_sign rsign in + let sign' = List.rev rsign in let env' = change_hyps (fun _ -> sign') env in - let args' = Array.of_list (List.map mkVar (ids_of_sign sign')) in - let (sigma',nc) = new_isevar_sign env' sigma evd.evar_concl args' in + let instance = List.map mkVar (ids_of_var_context sign') in + let (sigma',nc) = new_isevar_sign env' sigma evd.evar_concl instance in let sigma'' = Evd.define sigma' ev nc in (sigma'', nc) @@ -199,29 +200,16 @@ let real_clean isevars sp args rhs = (* [new_isevar] declares a new existential in an env env with type typ *) (* Converting the env into the sign of the evar to define *) -let append_rels_to_vars ctxt = - dbenv_it - (fun na t (subst,sign) -> - let na = if na = Anonymous then Name(id_of_string"_") else na in - let id = next_name_away na (ids_of_sign sign) in - ((VAR id)::subst, add_sign (id,typed_app (substl subst) t) sign)) - ctxt ([],get_globals ctxt) - let new_isevar isevars env typ k = - let ctxt = context env in - let subst,sign = append_rels_to_vars ctxt in + let subst,env' = push_rels_to_vars env in let typ' = substl subst typ in - let env' = change_hyps (fun _ -> sign) env in - let newargs = - (List.rev(rel_list 0 (number_of_rels ctxt))) - @(List.map (fun id -> VAR id) (ids_of_sign (get_globals ctxt))) in - let (sigma',evar) = - new_isevar_sign env' !isevars typ' (Array.of_list newargs) in + let instance = + (List.rev (rel_list 0 (rel_context_length (rel_context env)))) + @(List.map mkVar (ids_of_var_context (var_context env))) in + let (sigma',evar) = new_isevar_sign env' !isevars typ' instance in isevars := sigma'; evar - - (* [evar_define] solves the problem lhs = rhs when lhs is an uninstantiated * evar, i.e. tries to find the body ?sp for lhs=DOPN(Const sp,args) * ?sp [ sp.hyps \ args ] unifies to rhs @@ -247,7 +235,7 @@ let evar_define isevars lhs rhs = let evd = ise_map isevars ev in let hyps = var_context evd.evar_env in (* the substitution to invert *) - let worklist = List.combine (ids_of_sign hyps) args in + let worklist = List.combine (ids_of_var_context hyps) args in let body = real_clean isevars ev worklist rhs in ise_define isevars ev body; [ev] @@ -269,19 +257,19 @@ let solve_refl conv_algo isevars c1 c2 = array_fold_left2 (fun (sgn,rsgn) a1 a2 -> if conv_algo a1 a2 then - (tl_sign sgn, add_sign (hd_sign sgn) rsgn) + (List.tl sgn, add_var (List.hd sgn) rsgn) else - (tl_sign sgn, rsgn)) - (hyps,nil_sign) argsv1 argsv2 + (List.tl sgn, rsgn)) + (hyps,[]) argsv1 argsv2 in - let nsign = rev_sign rsign in + let nsign = List.rev rsign in let nenv = change_hyps (fun _ -> nsign) env in - let nargs = (Array.of_list (List.map mkVar (ids_of_sign nsign))) in + let nargs = (Array.of_list (List.map mkVar (ids_of_var_context nsign))) in let newev = Evd.new_evar () in let info = { evar_concl = evd.evar_concl; evar_env = nenv; evar_body = Evar_empty; evar_info = None } in isevars := - Evd.define (Evd.add !isevars newev info) ev (mkEvar newev nargs); + Evd.define (Evd.add !isevars newev info) ev (mkEvar (newev,nargs)); Some [ev] @@ -419,8 +407,7 @@ let split_tycon loc env isevars = function isevars := sigma; Some dom, Some rng | _ -> - Stdpp.raise_with_loc loc (Type_errors.TypeError (CCI,context env,Type_errors.NotProduct c))) + Stdpp.raise_with_loc loc (Type_errors.TypeError (CCI,env,Type_errors.NotProduct c))) let valcon_of_tycon x = x - diff --git a/pretyping/evarutil.mli b/pretyping/evarutil.mli index f648e4a830..dbebeac984 100644 --- a/pretyping/evarutil.mli +++ b/pretyping/evarutil.mli @@ -17,10 +17,6 @@ open Reduction val filter_unique : 'a list -> 'a list val distinct_id_list : identifier list -> identifier list -val filter_sign : - ('a -> identifier * typed_type -> bool * 'a) -> var_context -> 'a -> - 'a * identifier list * var_context - val dummy_sort : constr val do_restrict_hyps : 'a evar_map -> constr -> 'a evar_map * constr val has_ise : 'a evar_map -> constr -> bool diff --git a/pretyping/pretype_errors.ml b/pretyping/pretype_errors.ml index 9f711f390e..247620a676 100644 --- a/pretyping/pretype_errors.ml +++ b/pretyping/pretype_errors.ml @@ -11,51 +11,51 @@ let raise_pretype_error (loc,k,ctx,te) = Stdpp.raise_with_loc loc (TypeError(k,ctx,te)) let error_var_not_found_loc loc k s = - raise_pretype_error (loc,k, Global.context() (*bidon*), VarNotFound s) + raise_pretype_error (loc,k, Global.env() (*bidon*), VarNotFound s) let error_cant_find_case_type_loc loc env expr = - raise_pretype_error (loc, CCI, context env, CantFindCaseType expr) + raise_pretype_error (loc, CCI, env, CantFindCaseType expr) let error_actual_type_loc loc env c actty expty = - raise_pretype_error (loc, CCI, context env, ActualType (c,actty,expty)) + raise_pretype_error (loc, CCI, env, ActualType (c,actty,expty)) let error_cant_apply_not_functional_loc loc env rator randl = raise_pretype_error - (loc,CCI,context env, CantApplyNonFunctional (rator,randl)) + (loc,CCI,env, CantApplyNonFunctional (rator,randl)) let error_cant_apply_bad_type_loc loc env t rator randl = - raise_pretype_error (loc, CCI, context env, CantApplyBadType (t,rator,randl)) + raise_pretype_error (loc, CCI, env, CantApplyBadType (t,rator,randl)) let error_ill_formed_branch k env c i actty expty = - raise (TypeError (k, context env, IllFormedBranch (c,i,actty,expty))) + raise (TypeError (k, env, IllFormedBranch (c,i,actty,expty))) let error_number_branches_loc loc k env c ct expn = - raise_pretype_error (loc, k, context env, NumberBranches (c,ct,expn)) + raise_pretype_error (loc, k, env, NumberBranches (c,ct,expn)) let error_case_not_inductive_loc loc k env c ct = - raise_pretype_error (loc, k, context env, CaseNotInductive (c,ct)) + raise_pretype_error (loc, k, env, CaseNotInductive (c,ct)) (* Pattern-matching errors *) let error_bad_constructor_loc loc k cstr ind = - raise_pretype_error (loc, k, Global.context(), BadConstructor (cstr,ind)) + raise_pretype_error (loc, k, Global.env(), BadConstructor (cstr,ind)) let error_wrong_numarg_constructor_loc loc k c n = - raise_pretype_error (loc, k, Global.context(), WrongNumargConstructor (c,n)) + raise_pretype_error (loc, k, Global.env(), WrongNumargConstructor (c,n)) let error_wrong_predicate_arity_loc loc k env c n1 n2 = - raise_pretype_error (loc, k, context env, WrongPredicateArity (c,n1,n2)) + raise_pretype_error (loc, k, env, WrongPredicateArity (c,n1,n2)) let error_needs_inversion k env x t = - raise (TypeError (k, context env, NeedsInversion (x,t))) + raise (TypeError (k, env, NeedsInversion (x,t))) let error_ill_formed_branch_loc loc k env c i actty expty = - raise_pretype_error (loc, k, context env, IllFormedBranch (c,i,actty,expty)) + raise_pretype_error (loc, k, env, IllFormedBranch (c,i,actty,expty)) let error_occur_check k env ev c = - raise (TypeError (k, context env, OccurCheck (ev,c))) + raise (TypeError (k, env, OccurCheck (ev,c))) let error_not_clean k env ev c = - raise (TypeError (k, context env, NotClean (ev,c))) + raise (TypeError (k, env, NotClean (ev,c))) diff --git a/pretyping/pretyping.ml b/pretyping/pretyping.ml index 68a75ee32d..cadaa7f78c 100644 --- a/pretyping/pretyping.ml +++ b/pretyping/pretyping.ml @@ -189,21 +189,19 @@ let evar_type_case isevars env ct pt lft p c = in check_branches_message isevars env (c,ct) (bty,lft); (mind,rslty) *) -let pretype_var loc env lvar id = +let pretype_id loc env lvar id = try List.assoc id lvar - with - Not_found -> - (try - match lookup_id id (context env) with - | RELNAME (n,typ) -> - { uj_val = Rel n; - uj_type = typed_app (lift n) typ } - | GLOBNAME (id,typ) -> - { uj_val = VAR id; - uj_type = typ } - with Not_found -> - error_var_not_found_loc loc CCI id);; + with Not_found -> + try + let (n,typ) = lookup_rel_id id (rel_context env) in + { uj_val = Rel n; uj_type = typed_app (lift n) typ } + with Not_found -> + try + let typ = lookup_id_type id (var_context env) in + { uj_val = VAR id; uj_type = typ } + with Not_found -> + error_var_not_found_loc loc CCI id (*************************************************************************) (* Main pretyping function *) @@ -212,7 +210,7 @@ let trad_metamap = ref [] let trad_nocheck = ref false let pretype_ref pretype loc isevars env lvar = function -| RVar id -> pretype_var loc env lvar id +| RVar id -> pretype_id loc env lvar id | RConst (sp,ctxt) -> let cst = (sp,Array.map pretype ctxt) in @@ -287,6 +285,16 @@ match cstr with (* Où teste-t-on que le résultat doit satisfaire tycon ? *) | RHole loc -> if !compter then nbimpl:=!nbimpl+1; +(* OLD + (match vtcon with + (true,(Some v, _)) -> + {uj_val=v.utj_val; uj_type=make_typed (mkSort v.utj_type) (Type Univ.dummy_univ)} + | (false,(None,Some ty)) -> + let c = new_isevar isevars env ty CCI in + {uj_val=c;uj_type=make_typed ty (Type Univ.dummy_univ)} + | (true,(None,None)) -> + let ty = mkCast dummy_sort dummy_sort in +*) (match tycon with | Some ty -> let c = new_isevar isevars env ty CCI in @@ -305,7 +313,7 @@ match cstr with (* Où teste-t-on que le résultat doit satisfaire tycon ? *) let nbfix = Array.length lfi in let lfi = List.map (fun id -> Name id) (Array.to_list lfi) in let newenv = - array_fold_left2 (fun env id ar -> (push_rel (id,ar) env)) + array_fold_left2 (fun env id ar -> (push_rel_decl (id,ar) env)) env (Array.of_list (List.rev lfi)) (vect_lift_type lara) in let vdefj = Array.mapi @@ -345,7 +353,7 @@ match cstr with (* Où teste-t-on que le résultat doit satisfaire tycon ? *) let j = pretype_type dom_valcon env isevars lvar lmeta c1 in let assum = assumption_of_type_judgment (inh_ass_of_j env isevars j) in let var = (name,assum) in - let j' = pretype rng (push_rel var env) isevars lvar lmeta c2 + let j' = pretype rng (push_rel_decl var env) isevars lvar lmeta c2 in fst (abs_rel env !isevars name assum j') @@ -353,7 +361,7 @@ match cstr with (* Où teste-t-on que le résultat doit satisfaire tycon ? *) let j = pretype empty_tycon env isevars lvar lmeta c1 in let assum = inh_ass_of_j env isevars j in let var = (name,assumption_of_type_judgment assum) in - let j' = pretype empty_tycon (push_rel var env) isevars lvar lmeta c2 in + let j' = pretype empty_tycon (push_rel_decl var env) isevars lvar lmeta c2 in (try fst (gen_rel env !isevars name assum j') with TypeError _ as e -> Stdpp.raise_with_loc loc e) diff --git a/pretyping/retyping.ml b/pretyping/retyping.ml index 60647a946c..72a3d3d519 100644 --- a/pretyping/retyping.ml +++ b/pretyping/retyping.ml @@ -43,7 +43,7 @@ let rec type_of env cstr= IsMeta n -> (try strip_outer_cast (List.assoc n metamap) with Not_found -> anomaly "type_of: this is not a well-typed term") - | IsRel n -> lift n (body_of_type (snd (lookup_rel n env))) + | IsRel n -> lift n (body_of_type (snd (lookup_rel_type n env))) | IsVar id -> (try body_of_type (snd (lookup_var id env)) with Not_found -> @@ -65,7 +65,7 @@ let rec type_of env cstr= whd_betadeltaiota env sigma (applist (p,al)) | IsLambda (name,c1,c2) -> let var = make_typed c1 (sort_of env c1) in - mkProd name c1 (type_of (push_rel (name,var) env) c2) + mkProd name c1 (type_of (push_rel_decl (name,var) env) c2) | IsFix ((vn,i),(lar,lfi,vdef)) -> lar.(i) | IsCoFix (i,(lar,lfi,vdef)) -> lar.(i) | IsAppL(f,args)-> @@ -81,7 +81,7 @@ and sort_of env t = | IsSort (Type u) -> Type Univ.dummy_univ | IsProd (name,t,c2) -> let var = make_typed t (sort_of env t) in - (match (sort_of (push_rel (name,var) env) c2) with + (match (sort_of (push_rel_decl (name,var) env) c2) with | Prop _ as s -> s | Type u2 -> Type Univ.dummy_univ) | IsAppL(f,args) -> sort_of_atomic_type env sigma (type_of env f) args diff --git a/pretyping/tacred.ml b/pretyping/tacred.ml index f97b32cd12..a0fe84ee6e 100644 --- a/pretyping/tacred.ml +++ b/pretyping/tacred.ml @@ -26,69 +26,59 @@ let rev_firstn_liftn fn ln = in rfprec fn [] -let make_elim_fun f largs = - try - let (sp, _) = destConst f in - match constant_eval sp with - | EliminationCases n when List.length largs >= n -> f - | EliminationFix (lv,n) when List.length largs >= n -> - let labs,_ = list_chop n largs in - let p = List.length lv in - let la' = list_map_i - (fun q aq -> - try (Rel (p+1-(list_index (n+1-q) (List.map fst lv)))) - with Not_found -> aq) 1 - (List.map (lift p) labs) - in - list_fold_left_i - (fun i c (k,a) -> - DOP2(Lambda,(substl (rev_firstn_liftn (n-k) (-i) la') a), - DLAM(Name(id_of_string"x"),c))) 0 (applistc f la') lv - | _ -> raise Redelimination - with Failure _ -> - raise Redelimination - -(* F is convertible to DOPN(Fix(recindices,bodynum),bodyvect) make - the reduction using this extra information *) +(* EliminationFix ([(yi1,Ti1);...;(yip,Tip)],n) means f is some + [y1:T1,...,yn:Tn](Fix(..) yi1 ... yip); + f is applied to largs and we need for recursive calls to build + [x1:Ti1',...,xp:Tip'](f a1..a(n-p) yi1 ... yip) + where a1...an are the n first arguments of largs and Tik' is Tik[yil=al] + To check ... *) -let rebuild_global_name id = - let sp = Nametab.sp_of_id CCI id in - let (oper,hyps) = Declare.global_operator sp id in - DOPN(oper,Array.of_list(List.map (fun id -> VAR id) (Sign.ids_of_sign hyps))) +let make_elim_fun f lv n largs = + let (sp,args) = destConst f in + let labs,_ = list_chop n largs in + let p = List.length lv in + let ylv = List.map fst lv in + let la' = list_map_i + (fun q aq -> + try (Rel (p+1-(list_index (n-q) ylv))) + with Not_found -> aq) 0 + (List.map (lift p) labs) + in + fun id -> + let fi = DOPN(Const(make_path (dirpath sp) id (kind_of_path sp)),args) in + list_fold_left_i + (fun i c (k,a) -> + DOP2(Lambda,(substl (rev_firstn_liftn (n-k) (-i) la') a), + DLAM(Name(id_of_string"x"),c))) 0 (applistc fi la') lv -let mydestFix = function - | DOPN (Fix (recindxs,i),a) -> - let (types,funnames,bodies) = destGralFix a in - (recindxs,i,funnames,bodies) - | _ -> invalid_arg "destFix" +(* [f] is convertible to [DOPN(Fix(recindices,bodynum),bodyvect)] make + the reduction using this extra information *) -let contract_fix_use_function f fix = - let (recindices,bodynum,names,bodies) = mydestFix fix in +let contract_fix_use_function f + ((recindices,bodynum),(types,names,bodies as typedbodies)) = let nbodies = Array.length recindices in let make_Fi j = - let id = match List.nth names j with Name id -> id | _ -> assert false in - rebuild_global_name id in - let lbodies = list_assign (list_tabulate make_Fi nbodies) bodynum f in - substl (List.rev lbodies) bodies.(bodynum) + match List.nth names j with Name id -> f id | _ -> assert false in + let lbodies = list_tabulate make_Fi nbodies in + substl (List.rev lbodies) bodies.(bodynum) let reduce_fix_use_function f whfun fix stack = - match fix with - | DOPN (Fix(recindices,bodynum),bodyvect) -> - (match fix_recarg fix stack with - | None -> (false,(fix,stack)) - | Some (recargnum,recarg) -> - let (recarg'hd,_ as recarg')= whfun recarg [] in - let stack' = list_assign stack recargnum (applist recarg') in - (match recarg'hd with - | DOPN(MutConstruct _,_) -> - (true,(contract_fix_use_function f fix,stack')) - | _ -> (false,(fix,stack')))) - | _ -> assert false + let dfix = destFix fix in + match fix_recarg dfix stack with + | None -> (false,(fix,stack)) + | Some (recargnum,recarg) -> + let (recarg'hd,_ as recarg')= whfun recarg [] in + let stack' = list_assign stack recargnum (applist recarg') in + (match recarg'hd with + | DOPN(MutConstruct _,_) -> + (true,(contract_fix_use_function f dfix,stack')) + | _ -> (false,(fix,stack'))) -let contract_cofix_use_function f (bodynum,(_,_,bodies as typedbodies)) = +let contract_cofix_use_function f (bodynum,(_,names,bodies as typedbodies)) = let nbodies = Array.length bodies in - let make_Fi j = mkCoFix (nbodies-j-1,typedbodies) in - let subbodies = list_assign (list_tabulate make_Fi nbodies) bodynum f in + let make_Fi j = + match List.nth names j with Name id -> f id | _ -> assert false in + let subbodies = list_tabulate make_Fi nbodies in substl subbodies bodies.(bodynum) let reduce_mind_case_use_function env f mia = @@ -106,12 +96,14 @@ let special_red_case env whfun p c ci lf = let rec redrec c l = let (constr,cargs) = whfun c l in match constr with - | DOPN(Const _,_) as g -> + | DOPN(Const sp,args) as g -> if evaluable_constant env g then let gvalue = constant_value env g in if reducible_mind_case gvalue then - reduce_mind_case_use_function env g - {mP=p; mconstr=gvalue; mcargs=cargs; mci=ci; mlf=lf} + let build_fix_name id = + DOPN(Const(make_path (dirpath sp) id (kind_of_path sp)),args) + in reduce_mind_case_use_function env build_fix_name + {mP=p; mconstr=gvalue; mcargs=cargs; mci=ci; mlf=lf} else redrec gvalue cargs else @@ -127,17 +119,30 @@ let special_red_case env whfun p c ci lf = let rec red_elim_const env sigma k largs = if not (evaluable_constant env k) then raise Redelimination; - let f = make_elim_fun k largs in - match whd_betadeltaeta_stack env sigma (constant_value env k) largs with - | (DOPN(MutCase _,_) as mc,lrest) -> - let (ci,p,c,lf) = destCase mc in - (special_red_case env (construct_const env sigma) p c ci lf, lrest) - | (DOPN(Fix _,_) as fix,lrest) -> - let (b,(c,rest)) = - reduce_fix_use_function f (construct_const env sigma) fix lrest - in - if b then (nf_beta env sigma c, rest) else raise Redelimination - | _ -> assert false + let (sp, args) = destConst k in + let elim_style = constant_eval sp in + match elim_style with + | EliminationCases n when List.length largs >= n -> begin + let c = constant_value env k in + match whd_betadeltaeta_stack env sigma c largs with + | (DOPN(MutCase _,_) as mc,lrest) -> + let (ci,p,c,lf) = destCase mc in + (special_red_case env (construct_const env sigma) p c ci lf, + lrest) + | _ -> assert false + end + | EliminationFix (lv,n) when List.length largs >= n -> begin + let c = constant_value env k in + match whd_betadeltaeta_stack env sigma c largs with + | (DOPN(Fix _,_) as fix,lrest) -> + let f id = make_elim_fun k lv n largs id in + let (b,(c,rest)) = + reduce_fix_use_function f (construct_const env sigma) fix lrest + in + if b then (nf_beta env sigma c, rest) else raise Redelimination + | _ -> assert false + end + | _ -> raise Redelimination and construct_const env sigma c stack = let rec hnfstack x stack = diff --git a/pretyping/typing.ml b/pretyping/typing.ml index 985b1d3998..0dc0d0a5b8 100644 --- a/pretyping/typing.ml +++ b/pretyping/typing.ml @@ -92,7 +92,7 @@ let rec execute mf env sigma cstr = | IsLambda (name,c1,c2) -> let j = execute mf env sigma c1 in let var = assumption_of_judgment env sigma j in - let env1 = push_rel (name,var) env in + let env1 = push_rel_decl (name,var) env in let j' = execute mf env1 sigma c2 in let (j,_) = abs_rel env1 sigma name var j' in j @@ -101,7 +101,7 @@ let rec execute mf env sigma cstr = let j = execute mf env sigma c1 in let varj = type_judgment env sigma j in let var = assumption_of_type_judgment varj in - let env1 = push_rel (name,var) env in + let env1 = push_rel_decl (name,var) env in let j' = execute mf env1 sigma c2 in let (j,_) = gen_rel env1 sigma name varj j' in j @@ -119,7 +119,7 @@ and execute_fix mf env sigma lar lfi vdef = 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 + List.fold_left (fun env nvar -> push_rel_decl nvar env) env nlara in let vdefj = execute_array mf env1 sigma vdef in let vdefv = Array.map j_val_only vdefj in let cst3 = type_fixpoint env1 sigma lfi lara vdefj in |
