diff options
| author | Hugo Herbelin | 2014-10-13 17:53:44 +0200 |
|---|---|---|
| committer | Hugo Herbelin | 2014-10-13 19:15:57 +0200 |
| commit | 9d838f4d90b8bb7079de44dd9e1c57c518c4a4ea (patch) | |
| tree | b28991d2b1490fc787367e2636deb29869e79ffb | |
| parent | e9c25b3368a73737553821d2e954383c57698a86 (diff) | |
Fixing "change" and "fold" after convert_hyp/convert_concl moved to
new proof engine in e824d4293. Because of the expansion made by "fold"
and possibly by "change", checking the order of hypotheses is
necessary in general in "reduce". Before, it was done by side-effect
on reference "check", now it has to be explicit. To do for
optimization: flag each of the red_expr conversion strategy according
to whether they really need a check.
Also renamed the e_reduce family to e_change to emphasize that some
expansion can occur and that typing has to be rechecked.
This fixes recent failure of CoLoR (and probably Ergo).
| -rw-r--r-- | tactics/tactics.ml | 44 | ||||
| -rw-r--r-- | tactics/tactics.mli | 8 |
2 files changed, 26 insertions, 26 deletions
diff --git a/tactics/tactics.ml b/tactics/tactics.ml index 08dbf39652..e9fbf6d156 100644 --- a/tactics/tactics.ml +++ b/tactics/tactics.ml @@ -119,13 +119,13 @@ let _ = let introduction = Tacmach.introduction let refine = Tacmach.refine -let convert_concl ?(unsafe=false) ty k = +let convert_concl ?(check=true) ty k = Proofview.Goal.nf_enter begin fun gl -> let env = Proofview.Goal.env gl in let sigma = Proofview.Goal.sigma gl in let conclty = Proofview.Goal.raw_concl gl in let sigma = - if not unsafe then begin + if check then begin ignore (Typing.type_of env sigma ty); let sigma,b = Reductionops.infer_conv env sigma ty conclty in if not b then error "Not convertible."; @@ -138,18 +138,18 @@ let convert_concl ?(unsafe=false) ty k = (h, if k == DEFAULTcast then x else mkCast(x,k,conclty)))) end -let convert_hyp ?(unsafe=false) d = +let convert_hyp ?(check=true) d = Proofview.Goal.nf_enter begin fun gl -> let env = Proofview.Goal.env gl in let sigma = Proofview.Goal.sigma gl in let ty = Proofview.Goal.raw_concl gl in - let sign = convert_hyp (not unsafe) (named_context_val env) sigma d in + let sign = convert_hyp check (named_context_val env) sigma d in let env = reset_with_named_context sign env in Proofview.Refine.refine (fun h -> Proofview.Refine.new_evar h ~main:true env ty) end -let convert_concl_no_check = convert_concl ~unsafe:true -let convert_hyp_no_check = convert_hyp ~unsafe:true +let convert_concl_no_check = convert_concl ~check:false +let convert_hyp_no_check = convert_hyp ~check:false let convert_gen pb x y = Proofview.Goal.enter begin fun gl -> @@ -422,15 +422,15 @@ let bind_red_expr_occurrences occs nbcl redexp = let reduct_in_concl (redfun,sty) gl = Proofview.V82.of_tactic (convert_concl_no_check (pf_reduce redfun gl (pf_concl gl)) sty) gl -let reduct_in_hyp redfun (id,where) gl = - Proofview.V82.of_tactic (convert_hyp_no_check +let reduct_in_hyp ?(check=false) redfun (id,where) gl = + Proofview.V82.of_tactic (convert_hyp ~check (pf_reduce_decl redfun where (pf_get_hyp gl id) gl)) gl let revert_cast (redfun,kind as r) = if kind == DEFAULTcast then (redfun,REVERTcast) else r -let reduct_option redfun = function - | Some id -> reduct_in_hyp (fst redfun) id +let reduct_option ?(check=false) redfun = function + | Some id -> reduct_in_hyp ~check (fst redfun) id | None -> reduct_in_concl (revert_cast redfun) (** Versions with evars to maintain the unification of universes resulting @@ -440,12 +440,12 @@ let tclWITHEVARS f k gl = let evm, c' = pf_apply f gl in tclTHEN (tclEVARS evm) (k c') gl -let e_reduct_in_concl (redfun,sty) gl = +let e_change_in_concl (redfun,sty) gl = tclWITHEVARS (fun env sigma -> redfun env sigma (pf_concl gl)) (fun c -> Proofview.V82.of_tactic (convert_concl_no_check c sty)) gl -let e_pf_reduce_decl (redfun : bool -> e_reduction_function) where (id,c,ty) env sigma = +let e_pf_change_decl (redfun : bool -> e_reduction_function) where (id,c,ty) env sigma = match c with | None -> if where == InHypValueOnly then @@ -457,10 +457,10 @@ let e_pf_reduce_decl (redfun : bool -> e_reduction_function) where (id,c,ty) env let sigma',ty' = if where != InHypValueOnly then redfun false env sigma ty else sigma', ty in sigma', (id,Some b',ty') -let e_reduct_in_hyp redfun (id,where) gl = +let e_change_in_hyp redfun (id,where) gl = tclWITHEVARS - (e_pf_reduce_decl redfun where (pf_get_hyp gl id)) - (fun s -> Proofview.V82.of_tactic (convert_hyp_no_check s)) gl + (e_pf_change_decl redfun where (pf_get_hyp gl id)) + (fun s -> Proofview.V82.of_tactic (convert_hyp s)) gl type change_arg = env -> evar_map -> evar_map * constr @@ -495,10 +495,10 @@ let change_on_subterm cv_pb deep t = function (fun subst -> change_and_check_subst Reduction.CONV subst t) let change_in_concl occl t = - e_reduct_in_concl ((change_on_subterm Reduction.CUMUL false t occl),DEFAULTcast) + e_change_in_concl ((change_on_subterm Reduction.CUMUL false t occl),DEFAULTcast) let change_in_hyp occl t id = - with_check (e_reduct_in_hyp (fun x -> change_on_subterm Reduction.CONV x t occl) id) + e_change_in_hyp (fun x -> change_on_subterm Reduction.CONV x t occl) id let change_option occl t = function | Some id -> change_in_hyp occl t id @@ -518,16 +518,16 @@ let change_concl t = (* Pour usage interne (le niveau User est pris en compte par reduce) *) let red_in_concl = reduct_in_concl (red_product,REVERTcast) -let red_in_hyp = reduct_in_hyp red_product +let red_in_hyp = reduct_in_hyp red_product let red_option = reduct_option (red_product,REVERTcast) let hnf_in_concl = reduct_in_concl (hnf_constr,REVERTcast) -let hnf_in_hyp = reduct_in_hyp hnf_constr +let hnf_in_hyp = reduct_in_hyp hnf_constr let hnf_option = reduct_option (hnf_constr,REVERTcast) let simpl_in_concl = reduct_in_concl (simpl,REVERTcast) -let simpl_in_hyp = reduct_in_hyp simpl +let simpl_in_hyp = reduct_in_hyp simpl let simpl_option = reduct_option (simpl,REVERTcast) let normalise_in_concl = reduct_in_concl (compute,REVERTcast) -let normalise_in_hyp = reduct_in_hyp compute +let normalise_in_hyp = reduct_in_hyp compute let normalise_option = reduct_option (compute,REVERTcast) let normalise_vm_in_concl = reduct_in_concl (Redexpr.cbv_vm,VMcast) let unfold_in_concl loccname = reduct_in_concl (unfoldn loccname,REVERTcast) @@ -549,7 +549,7 @@ let reduce redexp cl goal = let cl = concrete_clause_of (fun () -> pf_ids_of_hyps goal) cl in let redexps = reduction_clause redexp cl in let tac = tclMAP (fun (where,redexp) -> - reduct_option + reduct_option ~check:true (Redexpr.reduction_of_red_expr (pf_env goal) redexp) where) redexps in match redexp with | Fold _ | Pattern _ -> with_check tac goal diff --git a/tactics/tactics.mli b/tactics/tactics.mli index c2beefdfb8..e724f675e1 100644 --- a/tactics/tactics.mli +++ b/tactics/tactics.mli @@ -32,8 +32,8 @@ val is_quantified_hypothesis : Id.t -> goal sigma -> bool val introduction : Id.t -> tactic val refine : constr -> tactic -val convert_concl : ?unsafe:bool -> types -> cast_kind -> unit Proofview.tactic -val convert_hyp : ?unsafe:bool -> named_declaration -> unit Proofview.tactic +val convert_concl : ?check:bool -> types -> cast_kind -> unit Proofview.tactic +val convert_hyp : ?check:bool -> named_declaration -> unit Proofview.tactic val convert_concl_no_check : types -> cast_kind -> unit Proofview.tactic val convert_hyp_no_check : named_declaration -> unit Proofview.tactic val thin : Id.t list -> tactic @@ -127,8 +127,8 @@ type tactic_reduction = env -> evar_map -> constr -> constr type change_arg = env -> evar_map -> evar_map * constr -val reduct_in_hyp : tactic_reduction -> hyp_location -> tactic -val reduct_option : tactic_reduction * cast_kind -> goal_location -> tactic +val reduct_in_hyp : ?check:bool -> tactic_reduction -> hyp_location -> tactic +val reduct_option : ?check:bool -> tactic_reduction * cast_kind -> goal_location -> tactic val reduct_in_concl : tactic_reduction * cast_kind -> tactic val change_in_concl : (occurrences * constr_pattern) option -> change_arg -> tactic val change_concl : constr -> tactic |
