aboutsummaryrefslogtreecommitdiffhomepage
path: root/proofs/logic.ml
diff options
context:
space:
mode:
authorGravatar ppedrot <ppedrot@85f007b7-540e-0410-9357-904b9bb8a0f7>2013-10-28 12:43:06 +0000
committerGravatar ppedrot <ppedrot@85f007b7-540e-0410-9357-904b9bb8a0f7>2013-10-28 12:43:06 +0000
commit257e3a047456f579b4d3ed8e115aa5e891a1cd5c (patch)
tree3a8cc363df588300c69692375a49edacc62fb4ca /proofs/logic.ml
parent959682e41f9e35e883b0c55b63f31cd4c78003d8 (diff)
Useless array to list conversions in proof/logic.ml.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@16941 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'proofs/logic.ml')
-rw-r--r--proofs/logic.ml38
1 files changed, 21 insertions, 17 deletions
diff --git a/proofs/logic.ml b/proofs/logic.ml
index c848a45ab..516c90daa 100644
--- a/proofs/logic.ml
+++ b/proofs/logic.ml
@@ -379,10 +379,9 @@ let rec mk_refgoals sigma goal goalacc conclty trm =
| _ ->
mk_hdgoals sigma goal goalacc f
in
- let (acc'',conclty',sigma, args) =
- mk_arggoals sigma goal acc' hdty (Array.to_list l) in
+ let ((acc'',conclty',sigma), args) = mk_arggoals sigma goal acc' hdty l in
check_conv_leq_goal env sigma trm conclty' conclty;
- (acc'',conclty',sigma, Term.mkApp (applicand, Array.of_list args))
+ (acc'',conclty',sigma, Term.mkApp (applicand, args))
| Case (ci,p,c,lf) ->
let (acc',lbrty,conclty',sigma,p',c') = mk_casegoals sigma goal goalacc p c in
@@ -429,9 +428,8 @@ and mk_hdgoals sigma goal goalacc trm =
(goalacc,type_of_global_reference_knowing_parameters env sigma f l,sigma,f)
else mk_hdgoals sigma goal goalacc f
in
- let (acc'',conclty',sigma, args) =
- mk_arggoals sigma goal acc' hdty (Array.to_list l) in
- (acc'',conclty',sigma, Term.mkApp (applicand, Array.of_list args))
+ let ((acc'',conclty',sigma), args) = mk_arggoals sigma goal acc' hdty l in
+ (acc'',conclty',sigma, Term.mkApp (applicand, args))
| Case (ci,p,c,lf) ->
let (acc',lbrty,conclty',sigma,p',c') = mk_casegoals sigma goal goalacc p c in
@@ -448,19 +446,25 @@ and mk_hdgoals sigma goal goalacc trm =
anomaly (Pp.str "refine called with a dependent meta");
goalacc, goal_type_of env sigma trm, sigma, trm
-and mk_arggoals sigma goal goalacc funty = function
- | [] -> goalacc,funty,sigma, []
- | harg::tlargs as allargs ->
+and mk_arggoals sigma goal goalacc funty allargs =
+ let len = Array.length allargs in
+ let ans = Array.make len mkProp (** dummy *) in
+ let rec fill sigma goalacc funty i =
+ if Int.equal i len then (goalacc, funty, sigma)
+ else
+ let harg = Array.unsafe_get allargs i in
let t = whd_betadeltaiota (Goal.V82.env sigma goal) sigma funty in
match kind_of_term t with
- | Prod (_,c1,b) ->
- let (acc',hargty,sigma,arg') = mk_refgoals sigma goal goalacc c1 harg in
- let (acc'',fty, sigma', args) =
- mk_arggoals sigma goal acc' (subst1 harg b) tlargs in
- (acc'',fty,sigma',arg'::args)
- | LetIn (_,c1,_,b) ->
- mk_arggoals sigma goal goalacc (subst1 c1 b) allargs
- | _ -> raise (RefinerError (CannotApply (t,harg)))
+ | Prod (_, c1, b) ->
+ let (acc',hargty,sigma,arg') = mk_refgoals sigma goal goalacc c1 harg in
+ let (acc'',fty, sigma') = fill sigma acc' (subst1 harg b) (succ i) in
+ let () = Array.unsafe_set ans i arg' in
+ (acc'',fty,sigma')
+ | LetIn (_, c1, _, b) ->
+ fill sigma goalacc (subst1 c1 b) i
+ | _ -> raise (RefinerError (CannotApply (t,harg)))
+ in
+ (fill sigma goalacc funty 0, ans)
and mk_casegoals sigma goal goalacc p c =
let env = Goal.V82.env sigma goal in