aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--interp/notation.ml2
-rw-r--r--kernel/term.ml5
-rw-r--r--kernel/term.mli3
-rw-r--r--pretyping/reductionops.ml5
-rw-r--r--pretyping/reductionops.mli1
-rw-r--r--pretyping/tacred.ml2
-rw-r--r--pretyping/unification.ml7
-rw-r--r--proofs/clenv.ml4
8 files changed, 20 insertions, 9 deletions
diff --git a/interp/notation.ml b/interp/notation.ml
index 5fa6346f0..737687adc 100644
--- a/interp/notation.ml
+++ b/interp/notation.ml
@@ -558,7 +558,7 @@ let scope_class_compare sc1 sc2 = match sc1, sc2 with
let scope_class_of_reference x = ScopeRef x
let compute_scope_class t =
- let t', _ = Reductionops.whd_betaiotazeta_stack Evd.empty t in
+ let t', _ = decompose_appvect (Reductionops.whd_betaiotazeta Evd.empty t) in
match kind_of_term t' with
| Var _ | Const _ | Ind _ -> ScopeRef (global_of_constr t')
| Sort _ -> ScopeSort
diff --git a/kernel/term.ml b/kernel/term.ml
index fa204b570..44a10aa35 100644
--- a/kernel/term.ml
+++ b/kernel/term.ml
@@ -339,6 +339,11 @@ let decompose_app c =
| App (f,cl) -> (f, Array.to_list cl)
| _ -> (c,[])
+let decompose_appvect c =
+ match kind_of_term c with
+ | App (f,cl) -> (f, cl)
+ | _ -> (c,[||])
+
(****************************************************************************)
(* Functions for dealing with constr terms *)
(****************************************************************************)
diff --git a/kernel/term.mli b/kernel/term.mli
index a3745d5e3..8131753fe 100644
--- a/kernel/term.mli
+++ b/kernel/term.mli
@@ -152,6 +152,9 @@ val destApplication : constr -> constr * constr array
(** Decompose any term as an applicative term; the list of args can be empty *)
val decompose_app : constr -> constr * constr list
+(** Same as [decompose_app], but returns an array. *)
+val decompose_appvect : constr -> constr * constr array
+
(** Destructs a constant *)
val destConst : constr -> constant
diff --git a/pretyping/reductionops.ml b/pretyping/reductionops.ml
index 43e0e9989..8a614d65f 100644
--- a/pretyping/reductionops.ml
+++ b/pretyping/reductionops.ml
@@ -202,8 +202,6 @@ let safe_meta_value sigma ev =
try Some (Evd.meta_value sigma ev)
with Not_found -> None
-let appterm_of_stack t = decompose_app (zip t)
-
let strong whdfun env sigma t =
let rec strongrec env t =
map_constr_with_full_binders push_rel strongrec env (whdfun env sigma t) in
@@ -551,7 +549,7 @@ let local_whd_state_gen flags sigma =
let raw_whd_state_gen flags env sigma s = fst (whd_state_gen false flags env sigma s)
let stack_red_of_state_red f sigma x =
- appterm_of_stack (f sigma (x, empty_stack))
+ decompose_app (zip (f sigma (x, empty_stack)))
let red_of_state_red f sigma x =
zip (f sigma (x,empty_stack))
@@ -560,6 +558,7 @@ let red_of_state_red f sigma x =
let whd_nored_state = local_whd_state_gen nored
let whd_nored_stack = stack_red_of_state_red whd_nored_state
+let whd_nored = red_of_state_red whd_nored_state
(* 1. Beta Reduction Functions *)
diff --git a/pretyping/reductionops.mli b/pretyping/reductionops.mli
index b98a7d309..664039206 100644
--- a/pretyping/reductionops.mli
+++ b/pretyping/reductionops.mli
@@ -115,6 +115,7 @@ val nf_betaiota_preserving_vm_cast : reduction_function
(** Lazy strategy, weak head reduction *)
val whd_evar : evar_map -> constr -> constr
+val whd_nored : local_reduction_function
val whd_beta : local_reduction_function
val whd_betaiota : local_reduction_function
val whd_betaiotazeta : local_reduction_function
diff --git a/pretyping/tacred.ml b/pretyping/tacred.ml
index b8dbefb88..e49f88128 100644
--- a/pretyping/tacred.ml
+++ b/pretyping/tacred.ml
@@ -1109,7 +1109,7 @@ let reduce_to_ref_gen allow_product env sigma ref t =
else
(* lazily reduces to match the head of [t] with the expected [ref] *)
let rec elimrec env t l =
- let c, _ = Reductionops.whd_nored_stack sigma t in
+ let c, _ = decompose_appvect (Reductionops.whd_nored sigma t) in
match kind_of_term c with
| Prod (n,ty,t') ->
if allow_product then
diff --git a/pretyping/unification.ml b/pretyping/unification.ml
index 9c3b5c4df..ce18804d9 100644
--- a/pretyping/unification.ml
+++ b/pretyping/unification.ml
@@ -969,13 +969,16 @@ let w_unify_meta_types env ?(flags=default_unify_flags) evd =
[clenv_typed_unify M N clenv] expects in addition that expected
types of metavars are unifiable with the types of their instances *)
+let head_app sigma m =
+ fst (decompose_appvect (whd_nored sigma m))
+
let check_types env flags (sigma,_,_ as subst) m n =
- if isEvar_or_Meta (fst (whd_nored_stack sigma m)) then
+ if isEvar_or_Meta (head_app sigma m) then
unify_0_with_initial_metas subst true env CUMUL
flags
(get_type_of env sigma n)
(get_type_of env sigma m)
- else if isEvar_or_Meta (fst (whd_nored_stack sigma n)) then
+ else if isEvar_or_Meta (head_app sigma n) then
unify_0_with_initial_metas subst true env CUMUL
flags
(get_type_of env sigma m)
diff --git a/proofs/clenv.ml b/proofs/clenv.ml
index 0df882b2b..a8bbfe127 100644
--- a/proofs/clenv.ml
+++ b/proofs/clenv.ml
@@ -255,7 +255,7 @@ let clenv_unify_meta_types ?(flags=default_unify_flags) clenv =
let clenv_unique_resolver ?(flags=default_unify_flags) clenv gl =
let concl = Goal.V82.concl clenv.evd (sig_it gl) in
- if isMeta (fst (whd_nored_stack clenv.evd clenv.templtyp.rebus)) then
+ if isMeta (fst (decompose_appvect (whd_nored clenv.evd clenv.templtyp.rebus))) then
clenv_unify CUMUL ~flags (clenv_type clenv) concl
(clenv_unify_meta_types ~flags clenv)
else
@@ -408,7 +408,7 @@ let error_already_defined b =
(str "Position " ++ int n ++ str" already defined.")
let clenv_unify_binding_type clenv c t u =
- if isMeta (fst (whd_nored_stack clenv.evd u)) then
+ if isMeta (fst (decompose_appvect (whd_nored clenv.evd u))) then
(* Not enough information to know if some subtyping is needed *)
CoerceToType, clenv, c
else