diff options
| author | herbelin | 2000-05-25 15:00:43 +0000 |
|---|---|---|
| committer | herbelin | 2000-05-25 15:00:43 +0000 |
| commit | 36c150fac098e1a038d23b812744e1aaaa5993da (patch) | |
| tree | b062f1c9500c584b65fd234580da1b78f05a6539 /kernel | |
| parent | bfb42267924cbdafc101ac1cab55ace5e2733bfb (diff) | |
Bug existential_value au lieu de existential_type + divers sur existential
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@476 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/instantiate.ml | 10 | ||||
| -rw-r--r-- | kernel/instantiate.mli | 4 | ||||
| -rw-r--r-- | kernel/reduction.ml | 71 | ||||
| -rw-r--r-- | kernel/typeops.ml | 3 |
4 files changed, 40 insertions, 48 deletions
diff --git a/kernel/instantiate.ml b/kernel/instantiate.ml index 94ab793c6a..7a929b9fa3 100644 --- a/kernel/instantiate.ml +++ b/kernel/instantiate.ml @@ -58,15 +58,13 @@ let constant_value env cst = let name_of_existential n = id_of_string ("?" ^ string_of_int n) -let existential_type sigma c = - let (n,args) = destEvar c in +let existential_type sigma (n,args) = let info = Evd.map sigma n in let hyps = evar_hyps info in (* TODO: check args [this comment was in Typeops] *) instantiate_constr (ids_of_sign hyps) info.evar_concl (Array.to_list args) -let existential_value sigma c = - let (n,args) = destEvar c in +let existential_value sigma (n,args) = let info = Evd.map sigma n in let hyps = evar_hyps info in match info.evar_body with @@ -79,9 +77,9 @@ let const_abst_opt_value env sigma c = match c with | DOPN(Const sp,_) -> if evaluable_constant env c then Some (constant_value env c) else None - | DOPN(Evar ev,_) -> + | DOPN(Evar ev,args) -> if Evd.is_defined sigma ev then - Some (existential_value sigma c) + Some (existential_value sigma (ev,args)) else None | DOPN(Abst sp,_) -> diff --git a/kernel/instantiate.mli b/kernel/instantiate.mli index af4dd6f1d3..40601c6045 100644 --- a/kernel/instantiate.mli +++ b/kernel/instantiate.mli @@ -23,7 +23,7 @@ exception NotEvaluableConst of const_evaluation_error val constant_value : env -> constr -> constr val constant_type : env -> 'a evar_map -> constant -> typed_type -val existential_value : 'a evar_map -> constr -> constr -val existential_type : 'a evar_map -> constr -> constr +val existential_value : 'a evar_map -> existential -> constr +val existential_type : 'a evar_map -> existential -> constr val const_abst_opt_value : env -> 'a evar_map -> constr -> constr option diff --git a/kernel/reduction.ml b/kernel/reduction.ml index 4361a1bf39..4dfeca8823 100644 --- a/kernel/reduction.ml +++ b/kernel/reduction.ml @@ -124,8 +124,8 @@ let red_product env sigma c = DOPN(AppL,Array.append [|redrec (array_hd cl)|] (array_tl cl)) | DOPN(Const _,_) when evaluable_constant env x -> constant_value env x - | DOPN(Evar ev,_) when Evd.is_defined sigma ev -> - existential_value sigma x + | DOPN(Evar ev,args) when Evd.is_defined sigma ev -> + existential_value sigma (ev,args) | DOPN(Abst _,_) when evaluable_abst env x -> abst_value env x | DOP2(Cast,c,_) -> redrec c @@ -353,9 +353,9 @@ let whd_delta_stack env sigma = whrec (constant_value env c) l else x,l - | DOPN(Evar ev,_) as c -> + | DOPN(Evar ev,args) -> if Evd.is_defined sigma ev then - whrec (existential_value sigma c) l + whrec (existential_value sigma (ev,args)) l else x,l | (DOPN(Abst _,_)) as c -> @@ -380,9 +380,9 @@ let whd_betadelta_stack env sigma = whrec (constant_value env x) l else (x,l) - | DOPN(Evar ev,_) -> + | DOPN(Evar ev,args) -> if Evd.is_defined sigma ev then - whrec (existential_value sigma x) l + whrec (existential_value sigma (ev,args)) l else (x,l) | DOPN(Abst _,_) -> @@ -406,9 +406,9 @@ let whd_betadelta env sigma c = applist(whd_betadelta_stack env sigma c []) let whd_betaevar_stack env sigma = let rec whrec x l = match x with - | DOPN(Evar ev,_) -> + | DOPN(Evar ev,args) -> if Evd.is_defined sigma ev then - whrec (existential_value sigma x) l + whrec (existential_value sigma (ev,args)) l else (x,l) | DOPN(Abst _,_) -> @@ -437,9 +437,9 @@ let whd_betadeltaeta_stack env sigma = whrec (constant_value env x) stack else (x,stack) - | DOPN(Evar ev,_) -> + | DOPN(Evar ev,args) -> if Evd.is_defined sigma ev then - whrec (existential_value sigma x) stack + whrec (existential_value sigma (ev,args)) stack else (x,stack) | DOPN(Abst _,_) -> @@ -576,9 +576,9 @@ let whd_betaiota x = applist (whd_betaiota_stack x []) let whd_betaiotaevar_stack env sigma = let rec whrec x stack = match x with - | DOPN(Evar ev,_) -> + | DOPN(Evar ev,args) -> if Evd.is_defined sigma ev then - whrec (existential_value sigma x) stack + whrec (existential_value sigma (ev,args)) stack else (x,stack) | DOPN(Abst _,_) -> @@ -619,9 +619,9 @@ let whd_betadeltaiota_stack env sigma = bdi_rec (constant_value env x) stack else (x,stack) - | DOPN(Evar ev,_) -> + | DOPN(Evar ev,args) -> if Evd.is_defined sigma ev then - bdi_rec (existential_value sigma x) stack + bdi_rec (existential_value sigma (ev,args)) stack else (x,stack) | DOPN(Abst _,_) -> @@ -662,9 +662,9 @@ let whd_betadeltaiotaeta_stack env sigma = whrec (constant_value env x) stack else (x,stack) - | DOPN(Evar ev,_) -> + | DOPN(Evar ev,args) -> if Evd.is_defined sigma ev then - whrec (existential_value sigma x) stack + whrec (existential_value sigma (ev,args)) stack else (x,stack) | DOPN(Abst _,_) -> @@ -1240,12 +1240,10 @@ let poly_args env sigma t = exception Uninstantiated_evar of int let rec whd_ise sigma = function - | DOPN(Evar sp,_) as k -> - if Evd.in_dom sigma sp then - if Evd.is_defined sigma sp then - whd_ise sigma (existential_value sigma k) - else raise (Uninstantiated_evar sp) - else k + | DOPN(Evar ev,args) when Evd.in_dom sigma ev -> + if Evd.is_defined sigma ev then + whd_ise sigma (existential_value sigma (ev,args)) + else raise (Uninstantiated_evar ev) | DOP2(Cast,c,_) -> whd_ise sigma c | DOP0(Sort(Type _)) -> DOP0(Sort(Type dummy_univ)) | c -> c @@ -1253,11 +1251,8 @@ let rec whd_ise sigma = function (* 2- undefined existentials are left unchanged *) let rec whd_ise1 sigma = function - | (DOPN(Evar sp,_) as k) -> - if Evd.in_dom sigma sp & Evd.is_defined sigma sp then - whd_ise1 sigma (existential_value sigma k) - else - k + | DOPN(Evar ev,args) when Evd.in_dom sigma ev & Evd.is_defined sigma ev -> + whd_ise1 sigma (existential_value sigma (ev,args)) | DOP2(Cast,c,_) -> whd_ise1 sigma c (* A quoi servait cette ligne ??? | DOP0(Sort(Type _)) -> DOP0(Sort(Type dummy_univ)) @@ -1272,16 +1267,14 @@ let whd_evar env = whd_ise1 (* 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 sigma = function - | (DOPN(Evar n,_) as k) -> - if Evd.in_dom sigma n then - if Evd.is_defined sigma n then - whd_ise1_metas sigma (existential_value sigma k) - else - let m = DOP0(Meta (new_meta())) in - DOP2(Cast,m,existential_type sigma k) - else - k - | DOP2(Cast,c,_) -> whd_ise1_metas sigma c - | c -> c +let rec whd_ise1_metas sigma t = + let t' = strip_outer_cast t in + match kind_of_term t' with + | IsEvar (ev,args as k) when Evd.in_dom sigma ev -> + if Evd.is_defined sigma ev then + whd_ise1_metas sigma (existential_value sigma k) + else + let m = DOP0(Meta (new_meta())) in + DOP2(Cast,m,existential_type sigma k) + | _ -> t' diff --git a/kernel/typeops.ml b/kernel/typeops.ml index b62e31714f..6c7e1bbe5e 100644 --- a/kernel/typeops.ml +++ b/kernel/typeops.ml @@ -114,7 +114,8 @@ let type_inst_construct i (IndFamily (mis,globargs)) = let tc = mis_type_mconstruct i mis in prod_applist tc globargs -let type_of_existential env sigma c = Instantiate.existential_value sigma c +let type_of_existential env sigma c = + Instantiate.existential_type sigma (destEvar c) (* Case. *) |
