diff options
-rw-r--r-- | plugins/cc/cctac.ml | 50 | ||||
-rw-r--r-- | plugins/omega/coq_omega.ml | 40 | ||||
-rw-r--r-- | plugins/quote/quote.ml | 10 | ||||
-rw-r--r-- | proofs/clenvtac.ml | 10 | ||||
-rw-r--r-- | proofs/goal.ml | 4 | ||||
-rw-r--r-- | proofs/goal.mli | 2 | ||||
-rw-r--r-- | proofs/proofview.ml | 28 | ||||
-rw-r--r-- | proofs/proofview.mli | 4 | ||||
-rw-r--r-- | proofs/tacmach.ml | 85 | ||||
-rw-r--r-- | proofs/tacmach.mli | 34 | ||||
-rw-r--r-- | tactics/auto.ml | 25 | ||||
-rw-r--r-- | tactics/autorewrite.ml | 10 | ||||
-rw-r--r-- | tactics/contradiction.ml | 8 | ||||
-rw-r--r-- | tactics/elim.ml | 10 | ||||
-rw-r--r-- | tactics/eqdecide.ml4 | 20 | ||||
-rw-r--r-- | tactics/equality.ml | 89 | ||||
-rw-r--r-- | tactics/extratactics.ml4 | 16 | ||||
-rw-r--r-- | tactics/inv.ml | 30 | ||||
-rw-r--r-- | tactics/leminv.ml | 2 | ||||
-rw-r--r-- | tactics/rewrite.ml | 4 | ||||
-rw-r--r-- | tactics/tacinterp.ml | 170 | ||||
-rw-r--r-- | tactics/tacticals.ml | 40 | ||||
-rw-r--r-- | tactics/tactics.ml | 226 | ||||
-rw-r--r-- | toplevel/auto_ind_decl.ml | 8 |
24 files changed, 555 insertions, 370 deletions
diff --git a/plugins/cc/cctac.ml b/plugins/cc/cctac.ml index dee57cd04..0d1238814 100644 --- a/plugins/cc/cctac.ml +++ b/plugins/cc/cctac.ml @@ -246,7 +246,8 @@ let build_projection intype outtype (cstr:constructor) special default gls= let _M =mkMeta let rec proof_tac p : unit Proofview.tactic = - Tacmach.New.pf_apply Typing.type_of >>= fun type_of -> + Proofview.Goal.enter begin fun gl -> + let type_of = Tacmach.New.pf_apply Typing.type_of gl in try (* type_of can raise exceptions *) match p.p_rule with Ax c -> Proofview.V82.tactic (exact_check c) @@ -281,7 +282,7 @@ let rec proof_tac p : unit Proofview.tactic = let typf = Termops.refresh_universes (type_of tf1) in let typx = Termops.refresh_universes (type_of tx1) in let typfx = Termops.refresh_universes (type_of (mkApp (tf1,[|tx1|]))) in - Tacmach.New.of_old (fun gls -> pf_get_new_id (Id.of_string "f") gls) >>= fun id -> + let id = Tacmach.New.of_old (fun gls -> pf_get_new_id (Id.of_string "f") gls) gl in let appx1 = mkLambda(Name id,typf,mkApp(mkRel 1,[|tx1|])) in let lemma1 = mkApp(Lazy.force _f_equal, @@ -310,57 +311,72 @@ let rec proof_tac p : unit Proofview.tactic = let intype = Termops.refresh_universes (type_of ti) in let outtype = Termops.refresh_universes (type_of default) in let special=mkRel (1+nargs-argind) in - Tacmach.New.of_old (build_projection intype outtype cstr special default) >>= fun proj -> + let proj = + Tacmach.New.of_old (build_projection intype outtype cstr special default) gl + in let injt= mkApp (Lazy.force _f_equal,[|intype;outtype;proj;ti;tj;_M 1|]) in Tacticals.New.tclTHEN (Proofview.V82.tactic (refine injt)) (proof_tac prf) with e when Proofview.V82.catchable_exception e -> Proofview.tclZERO e + end let refute_tac c t1 t2 p = + Proofview.Goal.enter begin fun gl -> let tt1=constr_of_term t1 and tt2=constr_of_term t2 in - Tacmach.New.of_old (fun gls -> Termops.refresh_universes (pf_type_of gls tt1)) >>= fun intype -> + let intype = + Tacmach.New.of_old (fun gls -> Termops.refresh_universes (pf_type_of gls tt1)) gl + in let neweq= mkApp(Lazy.force _eq, [|intype;tt1;tt2|]) in - Tacmach.New.of_old (pf_get_new_id (Id.of_string "Heq")) >>= fun hid -> + let hid = Tacmach.New.of_old (pf_get_new_id (Id.of_string "Heq")) gl in let false_t=mkApp (c,[|mkVar hid|]) in Tacticals.New.tclTHENS (assert_tac (Name hid) neweq) [proof_tac p; simplest_elim false_t] + end let convert_to_goal_tac c t1 t2 p = + Proofview.Goal.enter begin fun gl -> let tt1=constr_of_term t1 and tt2=constr_of_term t2 in - Tacmach.New.of_old (fun gls -> Termops.refresh_universes (pf_type_of gls tt2)) >>= fun sort -> + let sort = + Tacmach.New.of_old (fun gls -> Termops.refresh_universes (pf_type_of gls tt2)) gl + in let neweq=mkApp(Lazy.force _eq,[|sort;tt1;tt2|]) in - Tacmach.New.of_old (pf_get_new_id (Id.of_string "e")) >>= fun e -> - Tacmach.New.of_old (pf_get_new_id (Id.of_string "X")) >>= fun x -> + let e = Tacmach.New.of_old (pf_get_new_id (Id.of_string "e")) gl in + let x = Tacmach.New.of_old (pf_get_new_id (Id.of_string "X")) gl in let identity=mkLambda (Name x,sort,mkRel 1) in let endt=mkApp (Lazy.force _eq_rect, [|sort;tt1;identity;c;tt2;mkVar e|]) in Tacticals.New.tclTHENS (assert_tac (Name e) neweq) [proof_tac p; Proofview.V82.tactic (exact_check endt)] + end let convert_to_hyp_tac c1 t1 c2 t2 p = + Proofview.Goal.enter begin fun gl -> let tt2=constr_of_term t2 in - Tacmach.New.of_old (pf_get_new_id (Id.of_string "H")) >>= fun h -> + let h = Tacmach.New.of_old (pf_get_new_id (Id.of_string "H")) gl in let false_t=mkApp (c2,[|mkVar h|]) in Tacticals.New.tclTHENS (assert_tac (Name h) tt2) [convert_to_goal_tac c1 t1 t2 p; simplest_elim false_t] + end let discriminate_tac cstr p = Proofview.Goal.enter begin fun gl -> let t1=constr_of_term p.p_lhs and t2=constr_of_term p.p_rhs in - Tacmach.New.of_old (fun gls -> Termops.refresh_universes (pf_type_of gls t1)) >>= fun intype -> + let intype = + Tacmach.New.of_old (fun gls -> Termops.refresh_universes (pf_type_of gls t1)) gl + in let concl = Proofview.Goal.concl gl in let outsort = mkType (Termops.new_univ ()) in - Tacmach.New.of_old (pf_get_new_id (Id.of_string "X")) >>= fun xid -> - Tacmach.New.of_old (pf_get_new_id (Id.of_string "t")) >>= fun tid -> + let xid = Tacmach.New.of_old (pf_get_new_id (Id.of_string "X")) gl in + let tid = Tacmach.New.of_old (pf_get_new_id (Id.of_string "t")) gl in let identity=mkLambda(Name xid,outsort,mkLambda(Name tid,mkRel 1,mkRel 1)) in - Tacmach.New.of_old (fun gls -> pf_type_of gls identity) >>= fun trivial -> + let trivial = Tacmach.New.of_old (fun gls -> pf_type_of gls identity) gl in let outtype = mkType (Termops.new_univ ()) in let pred=mkLambda(Name xid,outtype,mkRel 1) in - Tacmach.New.of_old (pf_get_new_id (Id.of_string "Heq")) >>= fun hid -> - Tacmach.New.of_old (build_projection intype outtype cstr trivial concl) >>= fun proj -> + let hid = Tacmach.New.of_old (pf_get_new_id (Id.of_string "Heq")) gl in + let proj = Tacmach.New.of_old (build_projection intype outtype cstr trivial concl) gl in let injt=mkApp (Lazy.force _f_equal, [|intype;outtype;proj;t1;t2;mkVar hid|]) in let endt=mkApp (Lazy.force _eq_rect, @@ -383,7 +399,7 @@ let cc_tactic depth additionnal_terms = Proofview.Goal.enter begin fun gl -> Coqlib.check_required_library Coqlib.logic_module_name; let _ = debug (Pp.str "Reading subgoal ...") in - Tacmach.New.of_old (fun gls -> make_prb gls depth additionnal_terms) >>= fun state -> + let state = Tacmach.New.of_old (fun gls -> make_prb gls depth additionnal_terms) gl in let _ = debug (Pp.str "Problem built, solving ...") in let sol = execute true state in let _ = debug (Pp.str "Computation completed.") in @@ -457,7 +473,7 @@ let simple_reflexivity () = apply (Lazy.force _refl_equal) let f_equal = Proofview.Goal.enter begin fun gl -> let concl = Proofview.Goal.concl gl in - Tacmach.New.pf_apply Typing.type_of >>= fun type_of -> + let type_of = Tacmach.New.pf_apply Typing.type_of gl in let cut_eq c1 c2 = try (* type_of can raise an exception *) let ty = Termops.refresh_universes (type_of c1) in diff --git a/plugins/omega/coq_omega.ml b/plugins/omega/coq_omega.ml index c865639e6..a647238bf 100644 --- a/plugins/omega/coq_omega.ml +++ b/plugins/omega/coq_omega.ml @@ -35,8 +35,9 @@ open OmegaSolver (* Added by JCF, 09/03/98 *) let elim_id id = - Tacmach.New.pf_global id >>= fun c -> - simplest_elim c + Proofview.Goal.enter begin fun gl -> + simplest_elim (Tacmach.New.pf_global id gl) + end let resolve_id id gl = apply (pf_global gl id) gl let timing timer_name f arg = f arg @@ -1379,10 +1380,10 @@ let reintroduce id = open Proofview.Notations let coq_omega = - Proofview.tclUNIT () >= fun () -> (* delay for the effects in [clear_tables] *) + Proofview.Goal.enter begin fun gl -> clear_tables (); - Tacmach.New.pf_hyps_types >>= fun hyps_types -> - Tacmach.New.of_old destructure_omega >>= fun destructure_omega -> + let hyps_types = Tacmach.New.pf_hyps_types gl in + let destructure_omega = Tacmach.New.of_old destructure_omega gl in let tactic_normalisation, system = List.fold_left destructure_omega ([],[]) hyps_types in let prelude,sys = @@ -1427,11 +1428,13 @@ let coq_omega = Tacticals.New.tclTHEN prelude (replay_history tactic_normalisation path) with NO_CONTRADICTION -> Proofview.tclZERO (UserError ("" , Pp.str"Omega can't solve this system")) end + end let coq_omega = coq_omega let nat_inject = - Tacmach.New.pf_apply Reductionops.is_conv >>= fun is_conv -> + Proofview.Goal.enter begin fun gl -> + let is_conv = Tacmach.New.pf_apply Reductionops.is_conv gl in let rec explore p t : unit Proofview.tactic = try match destructurate_term t with | Kapp(Plus,[t1;t2]) -> @@ -1562,8 +1565,9 @@ let nat_inject = | _ -> loop lit with e when catchable_exception e -> loop lit end in - Tacmach.New.pf_hyps_types >>= fun hyps_types -> + let hyps_types = Tacmach.New.pf_hyps_types gl in loop (List.rev hyps_types) + end let dec_binop = function | Zne -> coq_dec_Zne @@ -1633,21 +1637,25 @@ let onClearedName id tac = (* so renaming may be necessary *) Tacticals.New.tclTHEN (Proofview.V82.tactic (tclTRY (clear [id]))) - (Tacmach.New.of_old (fresh_id [] id) >>= fun id -> - Tacticals.New.tclTHEN (Proofview.V82.tactic (introduction id)) (tac id)) + (Proofview.Goal.enter begin fun gl -> + let id = Tacmach.New.of_old (fresh_id [] id) gl in + Tacticals.New.tclTHEN (Proofview.V82.tactic (introduction id)) (tac id) + end) let onClearedName2 id tac = Tacticals.New.tclTHEN (Proofview.V82.tactic (tclTRY (clear [id]))) - (Tacmach.New.of_old (fresh_id [] (add_suffix id "_left")) >>= fun id1 -> - Tacmach.New.of_old (fresh_id [] (add_suffix id "_right")) >>= fun id2 -> - Tacticals.New.tclTHENLIST [ Proofview.V82.tactic (introduction id1); Proofview.V82.tactic (introduction id2); tac id1 id2 ]) + (Proofview.Goal.enter begin fun gl -> + let id1 = Tacmach.New.of_old (fresh_id [] (add_suffix id "_left")) gl in + let id2 = Tacmach.New.of_old (fresh_id [] (add_suffix id "_right")) gl in + Tacticals.New.tclTHENLIST [ Proofview.V82.tactic (introduction id1); Proofview.V82.tactic (introduction id2); tac id1 id2 ] + end) let destructure_hyps = - Tacmach.New.pf_apply Typing.type_of >>= fun type_of -> - Tacmach.New.of_old decidability >>= fun decidability -> - Tacmach.New.of_old pf_nf >>= fun pf_nf -> Proofview.Goal.enter begin fun gl -> + let type_of = Tacmach.New.pf_apply Typing.type_of gl in + let decidability = Tacmach.New.of_old decidability gl in + let pf_nf = Tacmach.New.of_old pf_nf gl in let rec loop = function | [] -> (Tacticals.New.tclTHEN nat_inject coq_omega) | (i,body,t)::lit -> @@ -1791,7 +1799,7 @@ let destructure_hyps = let destructure_goal = Proofview.Goal.enter begin fun gl -> let concl = Proofview.Goal.concl gl in - Tacmach.New.of_old decidability >>= fun decidability -> + let decidability = Tacmach.New.of_old decidability gl in let rec loop t = match destructurate_prop t with | Kapp(Not,[t]) -> diff --git a/plugins/quote/quote.ml b/plugins/quote/quote.ml index 89d161f73..532a2f11d 100644 --- a/plugins/quote/quote.ml +++ b/plugins/quote/quote.ml @@ -454,8 +454,8 @@ let quote_terms ivs lc = let quote f lid = Proofview.Goal.enter begin fun gl -> - Tacmach.New.pf_global f >>= fun f -> - Proofview.Goal.lift (Goal.sensitive_list_map Tacmach.New.pf_global_sensitive lid) >>= fun cl -> + let f = Tacmach.New.pf_global f gl in + let cl = List.map (fun id -> Tacmach.New.pf_global id gl) lid in Proofview.Goal.lift (compute_ivs f cl) >>= fun ivs -> let concl = Proofview.Goal.concl gl in Proofview.Goal.lift (quote_terms ivs [concl]) >>= fun quoted_terms -> @@ -469,8 +469,9 @@ let quote f lid = end let gen_quote cont c f lid = - Tacmach.New.pf_global f >>= fun f -> - Proofview.Goal.lift (Goal.sensitive_list_map Tacmach.New.pf_global_sensitive lid) >>= fun cl -> + Proofview.Goal.enter begin fun gl -> + let f = Tacmach.New.pf_global f gl in + let cl = List.map (fun id -> Tacmach.New.pf_global id gl) lid in Proofview.Goal.lift (compute_ivs f cl) >>= fun ivs -> Proofview.Goal.lift (quote_terms ivs [c]) >>= fun quoted_terms -> let (p, vm) = match quoted_terms with @@ -480,6 +481,7 @@ let gen_quote cont c f lid = match ivs.variable_lhs with | None -> cont (mkApp (f, [| p |])) | Some _ -> cont (mkApp (f, [| vm; p |])) + end (*i diff --git a/proofs/clenvtac.ml b/proofs/clenvtac.ml index 7874f5ac6..f852995a0 100644 --- a/proofs/clenvtac.ml +++ b/proofs/clenvtac.ml @@ -85,10 +85,12 @@ let elim_res_pf_THEN_i clenv tac gls = open Proofview.Notations let new_elim_res_pf_THEN_i clenv tac = - Tacmach.New.of_old (clenv_unique_resolver ~flags:elim_flags clenv) >>= fun clenv' -> - Proofview.tclTHEN - (Proofview.V82.tactic (clenv_refine false clenv')) - (Proofview.tclEXTEND [] (Proofview.tclUNIT()) (Array.to_list (tac clenv'))) + Proofview.Goal.enter begin fun gl -> + let clenv' = Tacmach.New.of_old (clenv_unique_resolver ~flags:elim_flags clenv) gl in + Proofview.tclTHEN + (Proofview.V82.tactic (clenv_refine false clenv')) + (Proofview.tclEXTEND [] (Proofview.tclUNIT()) (Array.to_list (tac clenv'))) + end let e_res_pf clenv = res_pf clenv ~with_evars:true ~flags:dft diff --git a/proofs/goal.ml b/proofs/goal.ml index fec2503a9..2e7ee10bc 100644 --- a/proofs/goal.ml +++ b/proofs/goal.ml @@ -354,8 +354,8 @@ let env env _ _ _ = env let defs _ rdefs _ _ = !rdefs -let enter f = (); fun env rdefs _ info -> - f env !rdefs (Evd.evar_hyps info) (Evd.evar_concl info) +let enter f = (); fun env rdefs gl info -> + f env !rdefs (Evd.evar_hyps info) (Evd.evar_concl info) gl (*** Conversion in goals ***) diff --git a/proofs/goal.mli b/proofs/goal.mli index 6a19e0d69..fb6c9ddb1 100644 --- a/proofs/goal.mli +++ b/proofs/goal.mli @@ -149,7 +149,7 @@ val defs : Evd.evar_map sensitive (* [enter] combines [env], [defs], [hyps] and [concl] in a single primitive. *) -val enter : (Environ.env -> Evd.evar_map -> Environ.named_context_val -> Term.constr -> 'a) -> 'a sensitive +val enter : (Environ.env -> Evd.evar_map -> Environ.named_context_val -> Term.constr -> goal -> 'a) -> 'a sensitive (*** Additional functions ***) diff --git a/proofs/proofview.ml b/proofs/proofview.ml index 364cfeb4b..1e0cc7c24 100644 --- a/proofs/proofview.ml +++ b/proofs/proofview.ml @@ -668,12 +668,18 @@ end module Goal = struct - type t = Environ.env*Evd.evar_map*Environ.named_context_val*Term.constr - - let env (env,_,_,_) = env - let sigma (_,sigma,_,_) = sigma - let hyps (_,_,hyps,_) = hyps - let concl (_,_,_,concl) = concl + type t = { + env : Environ.env; + sigma : Evd.evar_map; + hyps : Environ.named_context_val; + concl : Term.constr ; + self : Goal.goal ; (* for compatibility with old-style definitions *) + } + + let env { env=env } = env + let sigma { sigma=sigma } = sigma + let hyps { hyps=hyps } = hyps + let concl { concl=concl } = concl let lift s = (* spiwack: convenience notations, waiting for ocaml 3.12 *) @@ -694,7 +700,9 @@ module Goal = struct let return x = lift (Goal.return x) - let enter_t f = Goal.enter (fun env sigma hyps concl -> f (env,sigma,hyps,concl)) + let enter_t f = Goal.enter begin fun env sigma hyps concl self -> + f {env=env;sigma=sigma;hyps=hyps;concl=concl;self=self} + end let enter f = lift (enter_t f) >= fun ts -> tclDISPATCH ts @@ -702,7 +710,11 @@ module Goal = struct lift (enter_t f) >= fun ts -> tclDISPATCHL ts >= fun res -> tclUNIT (List.flatten res) - + + + (* compatibility *) + let goal { self=self } = self + end module NonLogical = Proofview_monad.NonLogical diff --git a/proofs/proofview.mli b/proofs/proofview.mli index 6d5e9d75d..5051e195a 100644 --- a/proofs/proofview.mli +++ b/proofs/proofview.mli @@ -293,13 +293,15 @@ module Goal : sig (* [lift_sensitive s] returns the list corresponding to the evaluation of [s] on each of the focused goals *) val lift : 'a Goal.sensitive -> 'a glist tactic - (* [lift (Goal.return x)] *) val return : 'a -> 'a glist tactic val enter : (t -> unit tactic) -> unit tactic val enterl : (t -> 'a glist tactic) -> 'a glist tactic + + (* compatibility: avoid if possible *) + val goal : t -> Goal.goal end diff --git a/proofs/tacmach.ml b/proofs/tacmach.ml index a50c06b39..8e3ab5975 100644 --- a/proofs/tacmach.ml +++ b/proofs/tacmach.ml @@ -207,65 +207,46 @@ let pr_glls glls = module New = struct open Proofview.Notations - let pf_apply f = - Proofview.Goal.lift begin - Goal.env >- fun env -> - Goal.defs >- fun sigma -> - Goal.return (f env sigma) - end - - let of_old f = - Proofview.Goal.lift (Goal.V82.to_sensitive f) - - let pf_global_sensitive id = - Goal.hyps >- fun hyps -> - let hyps = Environ.named_context_of_val hyps in - Goal.return (Constrintern.construct_reference hyps id) + let pf_apply f gl = + f (Proofview.Goal.env gl) (Proofview.Goal.sigma gl) + + let of_old f gl = + f { Evd.it = Proofview.Goal.goal gl ; sigma = Proofview.Goal.sigma gl } - let pf_global id = - Proofview.Goal.lift (pf_global_sensitive id) + let pf_global id gl = + let hyps = Proofview.Goal.hyps gl in + let hyps = Environ.named_context_of_val hyps in + Constrintern.construct_reference hyps id - let pf_ids_of_hyps_sensitive = - Goal.hyps >- fun hyps -> + let pf_ids_of_hyps gl = + let hyps = Proofview.Goal.hyps gl in let hyps = Environ.named_context_of_val hyps in - Goal.return (ids_of_named_context hyps) - let pf_ids_of_hyps = - Proofview.Goal.lift pf_ids_of_hyps_sensitive - - let pf_get_new_id id = - Proofview.Goal.lift begin - pf_ids_of_hyps_sensitive >- fun ids -> - Goal.return (next_ident_away id ids) - end - - let pf_get_hyp_sensitive id = - Goal.hyps >- fun hyps -> + ids_of_named_context hyps + + let pf_get_new_id id gl = + let ids = pf_ids_of_hyps gl in + next_ident_away id ids + + let pf_get_hyp id gl = + let hyps = Proofview.Goal.hyps gl in let hyps = Environ.named_context_of_val hyps in let sign = try Context.lookup_named id hyps with Not_found -> Errors.error ("No such hypothesis: " ^ (string_of_id id)) in - Goal.return sign - let pf_get_hyp id = - Proofview.Goal.lift (pf_get_hyp_sensitive id) - - let pf_get_hyp_typ_sensitive id = - pf_get_hyp_sensitive id >- fun (_,_,ty) -> - Goal.return ty - let pf_get_hyp_typ id = - Proofview.Goal.lift (pf_get_hyp_typ_sensitive id) - - let pf_hyps_types = - Proofview.Goal.lift begin - Goal.env >- fun env -> - let sign = Environ.named_context env in - Goal.return (List.map (fun (id,_,x) -> (id, x)) sign) - end - - let pf_last_hyp = - Proofview.Goal.lift begin - Goal.hyps >- fun hyps -> - Goal.return (List.hd (Environ.named_context_of_val hyps)) - end + sign + + let pf_get_hyp_typ id gl = + let (_,_,ty) = pf_get_hyp id gl in + ty + + let pf_hyps_types gl = + let env = Proofview.Goal.env gl in + let sign = Environ.named_context env in + List.map (fun (id,_,x) -> (id, x)) sign + + let pf_last_hyp gl = + let hyps = Proofview.Goal.hyps gl in + List.hd (Environ.named_context_of_val hyps) end diff --git a/proofs/tacmach.mli b/proofs/tacmach.mli index 7c96bd93b..1ca15d9ae 100644 --- a/proofs/tacmach.mli +++ b/proofs/tacmach.mli @@ -134,31 +134,17 @@ val pr_glls : goal list sigma -> Pp.std_ppcmds (* Variants of [Tacmach] functions built with the new proof engine *) module New : sig - open Goal open Proofview - val pf_apply : (env -> evar_map -> 'a) -> 'a glist tactic - val pf_global_sensitive : identifier -> constr sensitive - val pf_global : identifier -> constr glist tactic - val of_old : (Proof_type.goal Evd.sigma -> 'a) -> 'a glist tactic - - val pf_get_new_id : identifier -> identifier glist tactic - val pf_ids_of_hyps_sensitive : identifier list sensitive - val pf_ids_of_hyps : identifier list glist tactic - val pf_hyps_types : (identifier * types) list glist tactic - - val pf_get_hyp_sensitive : identifier -> named_declaration sensitive - val pf_get_hyp : identifier -> named_declaration glist tactic - val pf_get_hyp_typ_sensitive : identifier -> types sensitive - val pf_get_hyp_typ : identifier -> types glist tactic - val pf_last_hyp : named_declaration glist tactic -end - - - - - - - + val pf_apply : (env -> evar_map -> 'a) -> Proofview.Goal.t -> 'a + val pf_global : identifier -> Proofview.Goal.t -> constr + val of_old : (Proof_type.goal Evd.sigma -> 'a) -> Proofview.Goal.t -> 'a + val pf_get_new_id : identifier -> Proofview.Goal.t -> identifier + val pf_ids_of_hyps : Proofview.Goal.t -> identifier list + val pf_hyps_types : Proofview.Goal.t -> (identifier * types) list + val pf_get_hyp : identifier -> Proofview.Goal.t -> named_declaration + val pf_get_hyp_typ : identifier -> Proofview.Goal.t -> types + val pf_last_hyp : Proofview.Goal.t -> named_declaration +end diff --git a/tactics/auto.ml b/tactics/auto.ml index 728eaa3fe..29381c7c8 100644 --- a/tactics/auto.ml +++ b/tactics/auto.ml @@ -1278,7 +1278,7 @@ let rec trivial_fail_db dbg mod_delta db_list local_db = ( Proofview.Goal.enter begin fun gl -> let sigma = Proofview.Goal.sigma gl in let env = Proofview.Goal.env gl in - Tacmach.New.pf_last_hyp >>= fun hyp -> + let hyp = Tacmach.New.pf_last_hyp gl in let hintl = make_resolve_hyp env sigma hyp in trivial_fail_db dbg mod_delta db_list (Hint_db.add_list hintl local_db) end) @@ -1376,20 +1376,24 @@ let make_db_list dbnames = List.map lookup dbnames let trivial ?(debug=Off) lems dbnames = + Proofview.Goal.enter begin fun gl -> let db_list = make_db_list dbnames in let d = mk_trivial_dbg debug in - Tacmach.New.of_old (make_local_hint_db false lems) >>= fun hints -> + let hints = Tacmach.New.of_old (make_local_hint_db false lems) gl in new_tclTRY_dbg d (trivial_fail_db d false db_list hints) + end let full_trivial ?(debug=Off) lems = + Proofview.Goal.enter begin fun gl -> let dbs = !searchtable in let dbs = String.Map.remove "v62" dbs in let db_list = List.map snd (String.Map.bindings dbs) in let d = mk_trivial_dbg debug in - Tacmach.New.of_old (make_local_hint_db false lems) >>= fun hints -> + let hints = Tacmach.New.of_old (make_local_hint_db false lems) gl in new_tclTRY_dbg d (trivial_fail_db d false db_list hints) + end let gen_trivial ?(debug=Off) lems = function | None -> full_trivial ~debug lems @@ -1423,8 +1427,10 @@ let extend_local_db gl decl db = let intro_register dbg kont db = Tacticals.New.tclTHEN (dbg_intro dbg) - (Tacmach.New.of_old extend_local_db >>= fun extend_local_db -> - Tacticals.New.onLastDecl (fun decl -> kont (extend_local_db decl db))) + (Proofview.Goal.enter begin fun gl -> + let extend_local_db = Tacmach.New.of_old extend_local_db gl in + Tacticals.New.onLastDecl (fun decl -> kont (extend_local_db decl db)) + end) (* n is the max depth of search *) (* local_db contains the local Hypotheses *) @@ -1452,12 +1458,13 @@ let search d n mod_delta db_list local_db = let default_search_depth = ref 5 let delta_auto ?(debug=Off) mod_delta n lems dbnames = - Proofview.tclUNIT () >= fun () -> (* delay for the side effects *) + Proofview.Goal.enter begin fun gl -> let db_list = make_db_list dbnames in let d = mk_auto_dbg debug in - Tacmach.New.of_old (make_local_hint_db false lems) >>= fun hints -> + let hints = Tacmach.New.of_old (make_local_hint_db false lems) gl in new_tclTRY_dbg d (search d n mod_delta db_list hints) + end let auto ?(debug=Off) n = delta_auto ~debug false n @@ -1466,13 +1473,15 @@ let new_auto ?(debug=Off) n = delta_auto ~debug true n let default_auto = auto !default_search_depth [] [] let delta_full_auto ?(debug=Off) mod_delta n lems = + Proofview.Goal.enter begin fun gl -> let dbs = !searchtable in let dbs = String.Map.remove "v62" dbs in let db_list = List.map snd (String.Map.bindings dbs) in let d = mk_auto_dbg debug in - Tacmach.New.of_old (make_local_hint_db false lems) >>= fun hints -> + let hints = Tacmach.New.of_old (make_local_hint_db false lems) gl in new_tclTRY_dbg d (search d n mod_delta db_list hints) + end let full_auto ?(debug=Off) n = delta_full_auto ~debug false n let new_full_auto ?(debug=Off) n = delta_full_auto ~debug true n diff --git a/tactics/autorewrite.ml b/tactics/autorewrite.ml index 9c1f462ba..da8f2668b 100644 --- a/tactics/autorewrite.ml +++ b/tactics/autorewrite.ml @@ -113,8 +113,9 @@ let autorewrite ?(conds=Naive) tac_main lbas = (Proofview.tclUNIT()) lbas)) let autorewrite_multi_in ?(conds=Naive) idl tac_main lbas = + Proofview.Goal.enter begin fun gl -> (* let's check at once if id exists (to raise the appropriate error) *) - Proofview.Goal.lift (Goal.sensitive_list_map Tacmach.New.pf_get_hyp_sensitive idl) >>= fun _ -> + let _ = List.map (fun id -> Tacmach.New.pf_get_hyp id gl) idl in let general_rewrite_in id = let id = ref id in let to_be_cleared = ref false in @@ -155,6 +156,7 @@ let autorewrite_multi_in ?(conds=Naive) idl tac_main lbas = (List.fold_left (fun tac bas -> Tacticals.New.tclTHEN tac (one_base (general_rewrite_in id) tac_main bas)) (Proofview.tclUNIT()) lbas))) idl + end let autorewrite_in ?(conds=Naive) id = autorewrite_multi_in ~conds [id] @@ -179,8 +181,10 @@ let gen_auto_multi_rewrite conds tac_main lbas cl = | None -> (* try to rewrite in all hypothesis (except maybe the rewritten one) *) - Tacmach.New.pf_ids_of_hyps >>= fun ids -> - try_do_hyps (fun id -> id) ids) + Proofview.Goal.enter begin fun gl -> + let ids = Tacmach.New.pf_ids_of_hyps gl in + try_do_hyps (fun id -> id) ids + end) let auto_multi_rewrite ?(conds=Naive) = gen_auto_multi_rewrite conds (Proofview.tclUNIT()) diff --git a/tactics/contradiction.ml b/tactics/contradiction.ml index c500a5969..5a244fe7d 100644 --- a/tactics/contradiction.ml +++ b/tactics/contradiction.ml @@ -62,11 +62,11 @@ let contradiction_context = else match kind_of_term typ with | Prod (na,t,u) when is_empty_type u -> (Proofview.tclORELSE - begin - Tacmach.New.pf_apply is_conv_leq >>= fun is_conv_leq -> + (Proofview.Goal.enter begin fun gl -> + let is_conv_leq = Tacmach.New.pf_apply is_conv_leq gl in filter_hyp (fun typ -> is_conv_leq typ t) (fun id' -> simplest_elim (mkApp (mkVar id,[|mkVar id'|]))) - end + end) begin function | Not_found -> seek_neg rest | e -> Proofview.tclZERO e @@ -87,7 +87,7 @@ let contradiction_term (c,lbind as cl) = Proofview.Goal.enter begin fun gl -> let sigma = Proofview.Goal.sigma gl in let env = Proofview.Goal.env gl in - Tacmach.New.pf_apply Typing.type_of >>= fun type_of -> + let type_of = Tacmach.New.pf_apply Typing.type_of gl in try (* type_of can raise exceptions. *) let typ = type_of c in let _, ccl = splay_prod env sigma typ in diff --git a/tactics/elim.ml b/tactics/elim.ml index b9f077aa4..de4c58371 100644 --- a/tactics/elim.ml +++ b/tactics/elim.ml @@ -86,7 +86,8 @@ let tmphyp_name = Id.of_string "_TmpHyp" let up_to_delta = ref false (* true *) let general_decompose recognizer c = - Tacmach.New.pf_apply Typing.type_of >>= fun type_of -> + Proofview.Goal.enter begin fun gl -> + let type_of = Tacmach.New.pf_apply Typing.type_of gl in try (* type_of can raise exceptions *) let typc = type_of c in Tacticals.New.tclTHENS (Proofview.V82.tactic (cut typc)) @@ -96,6 +97,7 @@ let general_decompose recognizer c = (fun id -> Proofview.V82.tactic (clear [id])))); Proofview.V82.tactic (exact_no_check c) ] with e when Proofview.V82.catchable_exception e -> Proofview.tclZERO e + end let head_in = Goal.env >- fun env -> @@ -169,8 +171,9 @@ let induction_trailer abs_i abs_j bargs = )) let double_ind h1 h2 = - Tacmach.New.of_old (depth_of_quantified_hypothesis true h1) >>= fun abs_i -> - Tacmach.New.of_old (depth_of_quantified_hypothesis true h2) >>= fun abs_j -> + Proofview.Goal.enter begin fun gl -> + let abs_i = Tacmach.New.of_old (depth_of_quantified_hypothesis true h1) gl in + let abs_j = Tacmach.New.of_old (depth_of_quantified_hypothesis true h2) gl in let abs = if abs_i < abs_j then Proofview.tclUNIT (abs_i,abs_j) else if abs_i > abs_j then Proofview.tclUNIT (abs_j,abs_i) else @@ -182,6 +185,7 @@ let double_ind h1 h2 = Tacticals.New.elimination_then (introElimAssumsThen (induction_trailer abs_i abs_j)) ([],[]) (mkVar id)))) + end let h_double_induction = double_ind diff --git a/tactics/eqdecide.ml4 b/tactics/eqdecide.ml4 index a0e8fcb88..ee398a8b4 100644 --- a/tactics/eqdecide.ml4 +++ b/tactics/eqdecide.ml4 @@ -120,12 +120,16 @@ let match_eqdec c = (* /spiwack *) let solveArg eqonleft op a1 a2 tac = - Tacmach.New.of_old (fun g -> pf_type_of g a1) >>= fun rectype -> - Tacmach.New.of_old (fun g -> mkDecideEqGoal eqonleft op rectype a1 a2 g) >>= fun decide -> + Proofview.Goal.enter begin fun gl -> + let rectype = Tacmach.New.of_old (fun g -> pf_type_of g a1) gl in + let decide = + Tacmach.New.of_old (fun g -> mkDecideEqGoal eqonleft op rectype a1 a2 g) gl + in let subtacs = if eqonleft then [eqCase tac;diseqCase eqonleft;default_auto] else [diseqCase eqonleft;eqCase tac;default_auto] in (Tacticals.New.tclTHENS (Proofview.V82.tactic (h_elim_type decide)) subtacs) + end let solveEqBranch rectype = Proofview.tclORELSE @@ -160,7 +164,7 @@ let decideGralEquality = Proofview.Goal.enter begin fun gl -> let concl = Proofview.Goal.concl gl in match_eqdec concl >= fun eqonleft,_,c1,c2,typ -> - Tacmach.New.of_old (fun g -> hd_app (pf_compute g typ)) >>= fun headtyp -> + let headtyp = Tacmach.New.of_old (fun g -> hd_app (pf_compute g typ)) gl in begin match kind_of_term headtyp with | Ind mi -> Proofview.tclUNIT mi | _ -> Proofview.tclZERO (UserError ("",Pp.str"This decision procedure only works for inductive objects.")) @@ -179,20 +183,24 @@ let decideGralEquality = let decideEqualityGoal = Tacticals.New.tclTHEN intros decideGralEquality let decideEquality rectype = - Tacmach.New.of_old (mkGenDecideEqGoal rectype) >>= fun decide -> + Proofview.Goal.enter begin fun gl -> + let decide = Tacmach.New.of_old (mkGenDecideEqGoal rectype) gl in (Tacticals.New.tclTHENS (Proofview.V82.tactic (cut decide)) [default_auto;decideEqualityGoal]) + end (* The tactic Compare *) let compare c1 c2 = - Tacmach.New.of_old (fun g -> pf_type_of g c1) >>= fun rectype -> - Tacmach.New.of_old (fun g -> mkDecideEqGoal true (build_coq_sumbool ()) rectype c1 c2 g) >>= fun decide -> + Proofview.Goal.enter begin fun gl -> + let rectype = Tacmach.New.of_old (fun g -> pf_type_of g c1) gl in + let decide = Tacmach.New.of_old (fun g -> mkDecideEqGoal true (build_coq_sumbool ()) rectype c1 c2 g) gl in (Tacticals.New.tclTHENS (Proofview.V82.tactic (cut decide)) [(Tacticals.New.tclTHEN intro (Tacticals.New.tclTHEN (Tacticals.New.onLastHyp simplest_case) (Proofview.V82.tactic clear_last))); decideEquality rectype]) + end (* User syntax *) diff --git a/tactics/equality.ml b/tactics/equality.ml index 782ca67d5..284199586 100644 --- a/tactics/equality.ml +++ b/tactics/equality.ml @@ -221,17 +221,18 @@ let general_elim_clause with_evars frzevars tac cls c t l l2r elim = | Some (tac, FirstSolved) -> true, true, Some (Tacticals.New.tclCOMPLETE tac) | Some (tac, AllMatches) -> true, false, Some (Tacticals.New.tclCOMPLETE tac) in - let cs = - Goal.env >- fun env -> - Goal.concl >- fun concl -> - Goal.V82.to_sensitive ( - (if not all then instantiate_lemma else instantiate_lemma_all frzevars) - env ) >- fun instantiate_lemma -> - let typ = - match cls with None -> Goal.return concl | Some id -> Tacmach.New.pf_get_hyp_typ_sensitive id - in - typ >- fun typ -> - Goal.return (instantiate_lemma c t l l2r typ) + let cs gl = + let env = Proofview.Goal.env gl in + let concl = Proofview.Goal.concl gl in + let instantiate_lemma = + Tacmach.New.of_old + ((if not all then instantiate_lemma else instantiate_lemma_all frzevars) env) + gl + in + let typ = + match cls with None -> concl | Some id -> Tacmach.New.pf_get_hyp_typ id gl + in + instantiate_lemma c t l l2r typ in let try_clause c = side_tac @@ -240,11 +241,13 @@ let general_elim_clause with_evars frzevars tac cls c t l l2r elim = (Proofview.V82.tactic (general_elim_clause with_evars frzevars cls c elim))) tac in - Proofview.Goal.lift cs >>= fun cs -> + Proofview.Goal.enter begin fun gl -> + let cs = cs gl in if firstonly then Tacticals.New.tclFIRST (List.map try_clause cs) else Tacticals.New.tclMAP try_clause cs + end (* The next function decides in particular whether to try a regular rewrite or a generalized rewrite. @@ -325,18 +328,22 @@ let find_elim hdcncl lft2rgt dep cls ot gl = let type_of_clause = function | None -> Proofview.Goal.enterl (fun gl -> Proofview.Goal.return (Proofview.Goal.concl gl)) - | Some id -> Tacmach.New.pf_get_hyp_typ id + | Some id -> Proofview.Goal.enterl (fun gl -> Proofview.Goal.return (Tacmach.New.pf_get_hyp_typ id gl)) let leibniz_rewrite_ebindings_clause cls lft2rgt tac c t l with_evars frzevars dep_proof_ok hdcncl = + Proofview.Goal.enter begin fun gl -> let isatomic = isProd (whd_zeta hdcncl) in let dep_fun = if isatomic then dependent else dependent_no_evar in type_of_clause cls >>= fun type_of_cls -> let dep = dep_proof_ok && dep_fun c type_of_cls in - Tacmach.New.of_old (find_elim hdcncl lft2rgt dep cls (Some t)) >>= fun (elim,effs) -> + let (elim,effs) = + Tacmach.New.of_old (find_elim hdcncl lft2rgt dep cls (Some t)) gl + in Proofview.V82.tactic (Tactics.emit_side_effects effs) <*> general_elim_clause with_evars frzevars tac cls c t l (match lft2rgt with None -> false | Some b -> b) {elimindex = None; elimbody = (elim,NoBindings)} + end let adjust_rewriting_direction args lft2rgt = match args with @@ -449,13 +456,14 @@ let general_multi_rewrite l2r with_evars ?tac c cl = in let do_hyps = (* If the term to rewrite uses an hypothesis H, don't rewrite in H *) - let ids = + let ids gl = let ids_in_c = Environ.global_vars_set (Global.env()) (fst c) in - Tacmach.New.pf_ids_of_hyps_sensitive >- fun ids_of_hyps -> - Goal.return (Id.Set.fold (fun id l -> List.remove Id.equal id l) ids_in_c ids_of_hyps) + let ids_of_hyps = Tacmach.New.pf_ids_of_hyps gl in + Id.Set.fold (fun id l -> List.remove Id.equal id l) ids_in_c ids_of_hyps in - Proofview.Goal.lift ids >>= fun ids -> - do_hyps_atleastonce ids + Proofview.Goal.enter begin fun gl -> + do_hyps_atleastonce (ids gl) + end in if cl.concl_occs == NoOccurrences then do_hyps else Tacticals.New.tclIFTHENTRYELSEMUST @@ -508,10 +516,11 @@ let multi_replace clause c2 c1 unsafe try_prove_eq_opt = | None -> Proofview.tclUNIT () | Some tac -> Tacticals.New.tclCOMPLETE tac in - Tacmach.New.pf_apply get_type_of >>= fun get_type_of -> + Proofview.Goal.enter begin fun gl -> + let get_type_of = Tacmach.New.pf_apply get_type_of gl in let t1 = get_type_of c1 and t2 = get_type_of c2 in - Tacmach.New.pf_apply is_conv >>= fun is_conv -> + let is_conv = Tacmach.New.pf_apply is_conv gl in if unsafe || (is_conv t1 t2) then let e = build_coq_eq () in let sym = build_coq_eq_sym () in @@ -529,7 +538,7 @@ let multi_replace clause c2 c1 unsafe try_prove_eq_opt = ] else Tacticals.New.tclFAIL 0 (str"Terms do not have convertible types.") - + end let replace c2 c1 = multi_replace onConcl c2 c1 false None @@ -794,12 +803,14 @@ let rec build_discriminator sigma env dirn c sort = function *) let gen_absurdity id = - Tacmach.New.pf_get_hyp_typ id >>= fun hyp_typ -> + Proofview.Goal.enter begin fun gl -> + let hyp_typ = Tacmach.New.pf_get_hyp_typ id gl in if is_empty_type hyp_typ then simplest_elim (mkVar id) else Proofview.tclZERO (Errors.UserError ("Equality.gen_absurdity" , str "Not the negation of an equality.")) + end (* Precondition: eq is leibniz equality @@ -860,28 +871,31 @@ let discrEq (lbeq,_,(t,t1,t2) as u) eq_clause = | Inr _ -> Proofview.tclZERO (Errors.UserError ("discr" , str"Not a discriminable equality.")) | Inl (cpath, (_,dirn), _) -> - Tacmach.New.pf_apply get_type_of >>= fun get_type_of -> - let sort = get_type_of concl in + let sort = Tacmach.New.pf_apply get_type_of gl concl in discr_positions env sigma u eq_clause cpath dirn sort end let onEquality with_evars tac (c,lbindc) = - Tacmach.New.pf_apply Typing.type_of >>= fun type_of -> - Tacmach.New.pf_apply Tacred.reduce_to_quantified_ind >>= fun reduce_to_quantified_ind -> + Proofview.Goal.enter begin fun gl -> + let type_of = Tacmach.New.pf_apply Typing.type_of gl in + let reduce_to_quantified_ind = Tacmach.New.pf_apply Tacred.reduce_to_quantified_ind gl in try (* type_of can raise exceptions *) let t = type_of c in let t' = try snd (reduce_to_quantified_ind t) with UserError _ -> t in - Tacmach.New.of_old (fun gl -> make_clenv_binding gl (c,t') lbindc) >>= fun eq_clause -> + let eq_clause = Tacmach.New.of_old (fun gl -> make_clenv_binding gl (c,t') lbindc) gl in begin try (* clenv_pose_dependent_evars can raise exceptions *) let eq_clause' = clenv_pose_dependent_evars with_evars eq_clause in let eqn = clenv_type eq_clause' in - Tacmach.New.of_old (fun gl -> find_this_eq_data_decompose gl eqn) >>= fun (eq,eq_args) -> + let (eq,eq_args) = + Tacmach.New.of_old (fun gl -> find_this_eq_data_decompose gl eqn) gl + in Tacticals.New.tclTHEN (Proofview.V82.tactic (Refiner.tclEVARS eq_clause'.evd)) (tac (eq,eqn,eq_args) eq_clause') with e when Proofview.V82.catchable_exception e -> Proofview.tclZERO e end with e when Proofview.V82.catchable_exception e -> Proofview.tclZERO e + end let onNegatedEquality with_evars tac = Proofview.Goal.enter begin fun gl -> @@ -1278,7 +1292,9 @@ let injHyp id = injClause None false (Some (ElimOnIdent (Loc.ghost,id))) let decompEqThen ntac (lbeq,_,(t,t1,t2) as u) clause = Proofview.Goal.enter begin fun gl -> - Tacmach.New.of_old (fun gls -> pf_apply get_type_of gls (pf_concl gls)) >>= fun sort -> + let sort = + Tacmach.New.of_old (fun gls -> pf_apply get_type_of gls (pf_concl gls)) gl + in let sigma = clause.evd in let env = Proofview.Goal.env gl in match find_positions env sigma t1 t2 with @@ -1572,7 +1588,7 @@ let subst_one_var dep_proof_ok x = Proofview.Goal.enter begin fun gl -> let hyps = Proofview.Goal.hyps gl in let hyps = Environ.named_context_of_val hyps in - Tacmach.New.pf_get_hyp x >>= fun (_,xval,_) -> + let (_,xval,_) = Tacmach.New.pf_get_hyp x gl in (* If x has a body, simply replace x with body and clear x *) if not (Option.is_empty xval) then Proofview.V82.tactic (tclTHEN (unfold_body x) (clear [x])) else (* x is a variable: *) @@ -1586,7 +1602,7 @@ let subst_one_var dep_proof_ok x = (str "Cannot find any non-recursive equality over " ++ pr_id x ++ str".") with FoundHyp res -> res in - Tacmach.New.of_old found >>= fun (hyp,rhs,dir) -> + let (hyp,rhs,dir) = Tacmach.New.of_old found gl in subst_one dep_proof_ok x (hyp,rhs,dir) end @@ -1611,7 +1627,8 @@ let default_subst_tactic_flags () = { only_leibniz = true; rewrite_dependent_proof = false } let subst_all ?(flags=default_subst_tactic_flags ()) () = - Tacmach.New.of_old find_eq_data_decompose >>= fun find_eq_data_decompose -> + Proofview.Goal.enter begin fun gl -> + let find_eq_data_decompose = Tacmach.New.of_old find_eq_data_decompose gl in let test (_,c) = try let lbeq,(_,x,y) = find_eq_data_decompose c in @@ -1623,10 +1640,11 @@ let subst_all ?(flags=default_subst_tactic_flags ()) () = with PatternMatchingFailure -> failwith "caught" in let test p = try Some (test p) with Failure _ -> None in - Tacmach.New.pf_hyps_types >>= fun hyps -> + let hyps = Tacmach.New.pf_hyps_types gl in let ids = List.map_filter test hyps in let ids = List.uniquize ids in subst_gen flags.rewrite_dependent_proof ids + end (* Rewrite the first assumption for which the condition faildir does not fail and gives the direction of the rewrite *) @@ -1679,6 +1697,9 @@ let replace_multi_term dir_opt c = | Some true -> cond_eq_term_left c | Some false -> cond_eq_term_right c in + let cond_eq_fun t = + Proofview.Goal.enterl (fun gl -> Proofview.Goal.return (cond_eq_fun t gl)) + in rewrite_multi_assumption_cond cond_eq_fun let _ = diff --git a/tactics/extratactics.ml4 b/tactics/extratactics.ml4 index fcb131161..088ce71d4 100644 --- a/tactics/extratactics.ml4 +++ b/tactics/extratactics.ml4 @@ -644,10 +644,12 @@ END exception Found of unit Proofview.tactic let rewrite_except h = - Tacmach.New.pf_ids_of_hyps >>= fun hyps -> + Proofview.Goal.enter begin fun gl -> + let hyps = Tacmach.New.pf_ids_of_hyps gl in Tacticals.New.tclMAP (fun id -> if Id.equal id h then Proofview.tclUNIT () else Tacticals.New.tclTRY (Equality.general_rewrite_in true Locus.AllOccurrences true true id (mkVar h) false)) hyps + end let refl_equal = @@ -661,7 +663,8 @@ let refl_equal = should be replaced by a call to the tactic but I don't know how to call it before it is defined. *) let mkCaseEq a : unit Proofview.tactic = - Tacmach.New.of_old (fun g -> Tacmach.pf_type_of g a) >>= fun type_of_a -> + Proofview.Goal.enter begin fun gl -> + let type_of_a = Tacmach.New.of_old (fun g -> Tacmach.pf_type_of g a) gl in Tacticals.New.tclTHENLIST [Proofview.V82.tactic (Hiddentac.h_generalize [mkApp(delayed_force refl_equal, [| type_of_a; a|])]); Proofview.Goal.enter begin fun gl -> @@ -673,6 +676,7 @@ let mkCaseEq a : unit Proofview.tactic = end end; simplest_case a] + end let case_eq_intros_rewrite x = @@ -685,9 +689,9 @@ let case_eq_intros_rewrite x = mkCaseEq x; Proofview.Goal.enter begin fun gl -> let concl = Proofview.Goal.concl gl in - Tacmach.New.pf_ids_of_hyps >>= fun hyps -> + let hyps = Tacmach.New.pf_ids_of_hyps gl in let n' = nb_prod concl in - Tacmach.New.of_old (fun g -> fresh_id hyps (Id.of_string "heq") g) >>= fun h -> + let h = Tacmach.New.of_old (fun g -> fresh_id hyps (Id.of_string "heq") g) gl in Tacticals.New.tclTHENLIST [ Tacticals.New.tclDO (n'-n-1) intro; Proofview.V82.tactic (Tacmach.introduction h); @@ -713,10 +717,12 @@ let destauto t = with Found tac -> tac let destauto_in id = - Tacmach.New.of_old (fun g -> Tacmach.pf_type_of g (mkVar id)) >>= fun ctype -> + Proofview.Goal.enter begin fun gl -> + let ctype = Tacmach.New.of_old (fun g -> Tacmach.pf_type_of g (mkVar id)) gl in (* Pp.msgnl (Printer.pr_lconstr (mkVar id)); *) (* Pp.msgnl (Printer.pr_lconstr (ctype)); *) destauto ctype + end TACTIC EXTEND destauto | [ "destauto" ] -> [ Proofview.Goal.enter (fun gl -> destauto (Proofview.Goal.concl gl)) ] diff --git a/tactics/inv.ml b/tactics/inv.ml index b3c8b2837..ebccd95b7 100644 --- a/tactics/inv.ml +++ b/tactics/inv.ml @@ -274,11 +274,13 @@ Nota: with Inversion_clear, only four useless hypotheses *) let generalizeRewriteIntros tac depids id = - Tacmach.New.of_old (dependent_hyps id depids) >>= fun dids -> + Proofview.Goal.enter begin fun gl -> + let dids = Tacmach.New.of_old (dependent_hyps id depids) gl in (Tacticals.New.tclTHENLIST [Proofview.V82.tactic (bring_hyps dids); tac; (* may actually fail to replace if dependent in a previous eq *) intros_replacing (ids_of_named_context dids)]) + end let rec tclMAP_i n tacfun = function | [] -> Tacticals.New.tclDO n (tacfun None) @@ -302,11 +304,15 @@ let projectAndApply thin id eqname names depids = (if thin then clear [id] else (remember_first_eq id eqname; tclIDTAC)) in let substHypIfVariable tac id = - Tacmach.New.of_old (fun gls -> Hipattern.dest_nf_eq gls (pf_get_hyp_typ gls id)) >>= fun (t,t1,t2) -> + Proofview.Goal.enter begin fun gl -> + let (t,t1,t2) = + Tacmach.New.of_old (fun gls -> Hipattern.dest_nf_eq gls (pf_get_hyp_typ gls id)) gl + in match (kind_of_term t1, kind_of_term t2) with | Var id1, _ -> generalizeRewriteIntros (Proofview.V82.tactic (subst_hyp true id)) depids id1 | _, Var id2 -> generalizeRewriteIntros (Proofview.V82.tactic (subst_hyp false id)) depids id2 | _ -> tac id + end in let deq_trailer id _ neqns = Tacticals.New.tclTHENLIST @@ -331,7 +337,10 @@ let projectAndApply thin id eqname names depids = (* Inversion qui n'introduit pas les hypotheses, afin de pouvoir les nommer soi-meme (proposition de Valerie). *) let rewrite_equations_gene othin neqns ba = - Tacmach.New.of_old (fun gl -> split_dep_and_nodep ba.assums gl) >>= fun (depids,nodepids) -> + Proofview.Goal.enter begin fun gl -> + let (depids,nodepids) = + Tacmach.New.of_old (fun gl -> split_dep_and_nodep ba.assums gl) gl + in let rewrite_eqns = match othin with | Some thin -> @@ -361,6 +370,7 @@ let rewrite_equations_gene othin neqns ba = (tclORELSE (clear [id]) (tclTHEN (bring_hyps [d]) (clear [id])))) depids)]) + end (* Introduction of the equations on arguments othin: discriminates Simple Inversion, Inversion and Inversion_clear @@ -397,8 +407,11 @@ let extract_eqn_names = function | Some x -> x let rewrite_equations othin neqns names ba = + Proofview.Goal.enter begin fun gl -> let names = List.map (get_names true) names in - Tacmach.New.of_old (fun gl -> split_dep_and_nodep ba.assums gl) >>= fun (depids,nodepids) -> + let (depids,nodepids) = + Tacmach.New.of_old (fun gl -> split_dep_and_nodep ba.assums gl) gl + in let rewrite_eqns = let first_eq = ref MoveLast in match othin with @@ -424,6 +437,7 @@ let rewrite_equations othin neqns names ba = Proofview.V82.tactic (bring_hyps nodepids); Proofview.V82.tactic (clear (ids_of_named_context nodepids)); rewrite_eqns]) + end let interp_inversion_kind = function | SimpleInversion -> None @@ -448,8 +462,8 @@ let raw_inversion inv_kind id status names = let env = Proofview.Goal.env gl in let concl = Proofview.Goal.concl gl in let c = mkVar id in - Tacmach.New.pf_apply Tacred.reduce_to_atomic_ind >>= fun reduce_to_atomic_ind -> - Tacmach.New.pf_apply Typing.type_of >>= fun type_of -> + let reduce_to_atomic_ind = Tacmach.New.pf_apply Tacred.reduce_to_atomic_ind gl in + let type_of = Tacmach.New.pf_apply Typing.type_of gl in begin try Proofview.tclUNIT (reduce_to_atomic_ind (type_of c)) @@ -457,7 +471,7 @@ let raw_inversion inv_kind id status names = Proofview.tclZERO (Errors.UserError ("raw_inversion" , str ("The type of "^(Id.to_string id)^" is not inductive."))) end >= fun (ind,t) -> - Tacmach.New.of_old (fun gl -> mk_clenv_from gl (c,t)) >>= fun indclause -> + let indclause = Tacmach.New.of_old (fun gl -> mk_clenv_from gl (c,t)) gl in let ccl = clenv_type indclause in check_no_metas indclause ccl; let IndType (indf,realargs) = find_rectype env sigma ccl in @@ -526,7 +540,7 @@ let dinv_clear_tac id = dinv FullInversionClear None None (NamedHyp id) let invIn k names ids id = Proofview.Goal.enter begin fun gl -> - Proofview.Goal.lift (Goal.sensitive_list_map Tacmach.New.pf_get_hyp_sensitive ids) >>= fun hyps -> + let hyps = List.map (fun id -> Tacmach.New.pf_get_hyp id gl) ids in let concl = Proofview.Goal.concl gl in let nb_prod_init = nb_prod concl in let intros_replace_ids = diff --git a/tactics/leminv.ml b/tactics/leminv.ml index e726e7692..86ec3a835 100644 --- a/tactics/leminv.ml +++ b/tactics/leminv.ml @@ -285,7 +285,7 @@ let lemInv_gen id c = try_intros_until (fun id -> Proofview.V82.tactic (lemInv i let lemInvIn id c ids = Proofview.Goal.enter begin fun gl -> - Proofview.Goal.lift (Goal.sensitive_list_map Tacmach.New.pf_get_hyp_sensitive ids) >>= fun hyps -> + let hyps = List.map (fun id -> Tacmach.New.pf_get_hyp id gl) ids in let intros_replace_ids = let concl = Proofview.Goal.concl gl in let nb_of_new_hyp = nb_prod concl - List.length ids in diff --git a/tactics/rewrite.ml b/tactics/rewrite.ml index 14a9eb0ed..f40ec7659 100644 --- a/tactics/rewrite.ml +++ b/tactics/rewrite.ml @@ -1820,7 +1820,8 @@ let setoid_transitivity c = (transitivity_red true c) let setoid_symmetry_in id = - Tacmach.New.of_old (fun gl -> pf_type_of gl (mkVar id)) >>= fun ctype -> + Proofview.Goal.enter begin fun gl -> + let ctype = Tacmach.New.of_old (fun gl -> pf_type_of gl (mkVar id)) gl in let binders,concl = decompose_prod_assum ctype in let (equiv, args) = decompose_app concl in let rec split_last_two = function @@ -1835,6 +1836,7 @@ let setoid_symmetry_in id = Tacticals.New.tclTHENS (Proofview.V82.tactic (Tactics.cut new_hyp)) [ Proofview.V82.tactic (intro_replacing id); Tacticals.New.tclTHENLIST [ intros; setoid_symmetry; Proofview.V82.tactic (apply (mkVar id)); Proofview.V82.tactic (Tactics.assumption) ] ] + end let _ = Hook.set Tactics.setoid_reflexivity setoid_reflexivity let _ = Hook.set Tactics.setoid_symmetry setoid_symmetry diff --git a/tactics/tacinterp.ml b/tactics/tacinterp.ml index 83958eca2..2bf3c8e06 100644 --- a/tactics/tacinterp.ml +++ b/tactics/tacinterp.ml @@ -1179,9 +1179,11 @@ and interp_ltac_reference loc' mustbetac ist = function and interp_tacarg ist arg = let tac_of_old f = - Tacmach.New.of_old f >>== fun (sigma,v) -> - Proofview.V82.tclEVARS sigma <*> - (Proofview.Goal.return v) + Proofview.Goal.enterl begin fun gl -> + let (sigma,v) = Tacmach.New.of_old f gl in + Proofview.V82.tclEVARS sigma <*> + (Proofview.Goal.return v) + end in match arg with | TacGeneric arg -> @@ -1209,8 +1211,10 @@ and interp_tacarg ist arg = end la ((Proofview.Goal.return [])) >>== fun la_interp -> tac_of_old (fun gl -> interp_external loc ist { gl with sigma=project gl } com req la_interp) | TacFreshId l -> - Tacmach.New.of_old (fun gl -> pf_interp_fresh_id ist gl l) >>== fun id -> + Proofview.Goal.enterl begin fun gl -> + let id = Tacmach.New.of_old (fun gl -> pf_interp_fresh_id ist gl l) gl in (Proofview.Goal.return (in_gen (topwit wit_intro_pattern) (dloc, IntroIdentifier id))) + end | Tacexp t -> val_interp ist t | TacDynamic(_,t) -> let tg = (Dyn.tag t) in @@ -1465,8 +1469,8 @@ and apply_hyps_context ist env lz mt lctxt lgmatch mhyps hyps = end in let init_match_pattern = Tacmach.New.of_old (fun gl -> - apply_one_mhyp_context gl lmatch hyp_pat lhyps_rest) in - init_match_pattern >>== match_next_pattern + apply_one_mhyp_context gl lmatch hyp_pat lhyps_rest) gl in + match_next_pattern init_match_pattern | [] -> let lfun = lfun +++ ist.lfun in let lfun = extend_values_with_bindings lmatch lfun in @@ -1712,8 +1716,12 @@ and interp_atomic ist tac = match tac with (* Basic tactics *) | TacIntroPattern l -> - Tacmach.New.of_old (fun gl -> interp_intro_pattern_list_as_list ist gl l) >>= fun patterns -> + Proofview.Goal.enter begin fun gl -> + let patterns = + Tacmach.New.of_old (fun gl -> interp_intro_pattern_list_as_list ist gl l) gl + in h_intro_patterns patterns + end | TacIntrosUntil hyp -> begin try (* interp_quantified_hypothesis can raise an exception *) h_intros_until (interp_quantified_hypothesis ist hyp) @@ -1722,7 +1730,7 @@ and interp_atomic ist tac = | TacIntroMove (ido,hto) -> Proofview.Goal.enter begin fun gl -> let env = Proofview.Goal.env gl in - Tacmach.New.of_old (fun gl -> interp_move_location ist gl hto) >>= fun mloc -> + let mloc = Tacmach.New.of_old (fun gl -> interp_move_location ist gl hto) gl in h_intro_move (Option.map (interp_fresh_ident ist env) ido) mloc end | TacAssumption -> Proofview.V82.tactic h_assumption @@ -1762,8 +1770,10 @@ and interp_atomic ist tac = | None -> fun l -> Proofview.V82.tactic (h_apply a ev l) | Some cl -> (fun l -> - Tacmach.New.of_old (fun gl -> interp_in_hyp_as ist gl cl) >>= fun cl -> - h_apply_in a ev l cl) in + Proofview.Goal.enter begin fun gl -> + let cl = Tacmach.New.of_old (fun gl -> interp_in_hyp_as ist gl cl) gl in + h_apply_in a ev l cl + end) in Tacticals.New.tclWITHHOLES ev tac sigma l with e when Proofview.V82.catchable_exception e -> Proofview.tclZERO e end @@ -1858,7 +1868,7 @@ and interp_atomic ist tac = let sigma = Proofview.Goal.sigma gl in try (* intrerpreation function may raise exceptions *) let (sigma,c) = (if Option.is_empty t then interp_constr else interp_type) ist env sigma c in - Tacmach.New.of_old (fun gl -> interp_intro_pattern ist gl) >>= fun patt -> + let patt = Tacmach.New.of_old (fun gl -> interp_intro_pattern ist gl) gl in Tacticals.New.tclTHEN (Proofview.V82.tclEVARS sigma) (Tactics.forward (Option.map (interp_tactic ist) t) @@ -1884,11 +1894,15 @@ and interp_atomic ist tac = Proofview.Goal.enter begin fun gl -> let env = Proofview.Goal.env gl in let sigma = Proofview.Goal.sigma gl in - Tacmach.New.of_old (fun gl -> interp_clause ist gl clp) >>= fun clp -> - Tacmach.New.of_old (fun gl -> Option.map (interp_intro_pattern ist gl) eqpat) >>= fun eqpat -> + let clp = Tacmach.New.of_old (fun gl -> interp_clause ist gl clp) gl in + let eqpat = + Tacmach.New.of_old (fun gl -> Option.map (interp_intro_pattern ist gl) eqpat) gl + in if Locusops.is_nowhere clp then (* We try to fully-typecheck the term *) - Tacmach.New.of_old (fun gl -> pf_interp_constr ist gl c) >>= fun (sigma,c_interp) -> + let (sigma,c_interp) = + Tacmach.New.of_old (fun gl -> pf_interp_constr ist gl c) gl + in Tacticals.New.tclTHEN (Proofview.V82.tclEVARS sigma) (h_let_tac b (interp_fresh_name ist env na) c_interp clp eqpat) @@ -1926,21 +1940,20 @@ and interp_atomic ist tac = Proofview.Goal.enter begin fun gl -> let env = Proofview.Goal.env gl in let l = - Goal.sensitive_list_map begin fun (c,(ipato,ipats)) -> - Goal.V82.to_sensitive (fun gl -> interp_induction_arg ist gl c) >- fun c -> - Goal.V82.to_sensitive (fun gl -> interp_intro_pattern ist gl) >- fun interp_intro_pattern -> - Goal.return begin - c, - (Option.map interp_intro_pattern ipato, - Option.map interp_intro_pattern ipats) - end + List.map begin fun (c,(ipato,ipats)) -> + let c = Tacmach.New.of_old (fun gl -> interp_induction_arg ist gl c) gl in + let interp_intro_pattern = + Tacmach.New.of_old (fun gl -> interp_intro_pattern ist gl) gl + in + c, + (Option.map interp_intro_pattern ipato, + Option.map interp_intro_pattern ipats) end l in let sigma = Proofview.Goal.sigma gl in - Proofview.Goal.lift l >>= fun l -> let sigma,el = Option.fold_map (interp_constr_with_bindings ist env) sigma el in - Tacmach.New.of_old (fun gl -> interp_clause ist gl) >>= fun interp_clause -> + let interp_clause = Tacmach.New.of_old (fun gl -> interp_clause ist gl) gl in let cls = Option.map interp_clause cls in Tacticals.New.tclWITHHOLES ev (h_induction_destruct isrec ev) sigma (l,el,cls) end @@ -1949,21 +1962,27 @@ and interp_atomic ist tac = let h2 = interp_quantified_hypothesis ist h2 in Elim.h_double_induction h1 h2 | TacDecomposeAnd c -> - Tacmach.New.of_old (fun gl -> pf_interp_constr ist gl c) >>= fun (sigma,c_interp) -> + Proofview.Goal.enter begin fun gl -> + let (sigma,c_interp) = Tacmach.New.of_old (fun gl -> pf_interp_constr ist gl c) gl in Tacticals.New.tclTHEN (Proofview.V82.tclEVARS sigma) (Elim.h_decompose_and c_interp) + end | TacDecomposeOr c -> - Tacmach.New.of_old (fun gl -> pf_interp_constr ist gl c) >>= fun (sigma,c_interp) -> + Proofview.Goal.enter begin fun gl -> + let (sigma,c_interp) = Tacmach.New.of_old (fun gl -> pf_interp_constr ist gl c) gl in Tacticals.New.tclTHEN (Proofview.V82.tclEVARS sigma) (Elim.h_decompose_or c_interp) + end | TacDecompose (l,c) -> + Proofview.Goal.enter begin fun gl -> let l = List.map (interp_inductive ist) l in - Tacmach.New.of_old (fun gl -> pf_interp_constr ist gl c) >>= fun (sigma,c_interp) -> + let (sigma,c_interp) = Tacmach.New.of_old (fun gl -> pf_interp_constr ist gl c) gl in Tacticals.New.tclTHEN (Proofview.V82.tclEVARS sigma) (Elim.h_decompose l c_interp) + end | TacSpecialize (n,cb) -> Proofview.Goal.enter begin fun gl -> let env = Proofview.Goal.env gl in @@ -2095,71 +2114,94 @@ and interp_atomic ist tac = (* Equivalence relations *) | TacReflexivity -> h_reflexivity | TacSymmetry c -> - Tacmach.New.of_old (fun gl -> interp_clause ist gl c) >>= fun cl -> + Proofview.Goal.enter begin fun gl -> + let cl = Tacmach.New.of_old (fun gl -> interp_clause ist gl c) gl in h_symmetry cl + end | TacTransitivity c -> begin match c with | None -> h_transitivity None | Some c -> - Tacmach.New.of_old (fun gl -> pf_interp_constr ist gl c) >>= fun (sigma,c_interp) -> + Proofview.Goal.enter begin fun gl -> + let (sigma,c_interp) = + Tacmach.New.of_old (fun gl -> pf_interp_constr ist gl c) gl + in Tacticals.New.tclTHEN (Proofview.V82.tclEVARS sigma) (h_transitivity (Some c_interp)) + end end (* Equality and inversion *) | TacRewrite (ev,l,cl,by) -> + Proofview.Goal.enter begin fun gl -> let l = List.map (fun (b,m,c) -> let f env sigma = interp_open_constr_with_bindings ist env sigma c in (b,m,f)) l in - Tacmach.New.of_old (fun gl -> interp_clause ist gl cl) >>= fun cl -> + let cl = Tacmach.New.of_old (fun gl -> interp_clause ist gl cl) gl in Equality.general_multi_multi_rewrite ev l cl (Option.map (fun by -> Tacticals.New.tclCOMPLETE (interp_tactic ist by), Equality.Naive) by) + end | TacInversion (DepInversion (k,c,ids),hyp) -> - Proofview.tclEVARMAP >= fun sigma -> - Proofview.Goal.lift begin match c with - | None -> Goal.return (sigma , None) - | Some c -> - Goal.V82.to_sensitive (fun gl -> pf_interp_constr ist gl c) >- fun (sigma,c_interp) -> - Goal.return (sigma , Some c_interp) - end >>= fun (sigma,c_interp) -> - Tacmach.New.of_old (interp_intro_pattern ist) >>= fun interp_intro_pattern -> - Tacmach.New.of_old (fun gl -> interp_declared_or_quantified_hypothesis ist gl hyp) >>= fun dqhyps -> + Proofview.Goal.enter begin fun gl -> + let sigma = Proofview.Goal.sigma gl in + let (sigma,c_interp) = + match c with + | None -> sigma , None + | Some c -> + let (sigma,c_interp) = + Tacmach.New.of_old (fun gl -> pf_interp_constr ist gl c) gl + in + sigma , Some c_interp + in + let interp_intro_pattern = Tacmach.New.of_old (interp_intro_pattern ist) gl in + let dqhyps = + Tacmach.New.of_old (fun gl -> interp_declared_or_quantified_hypothesis ist gl hyp) gl + in Inv.dinv k c_interp (Option.map interp_intro_pattern ids) dqhyps + end | TacInversion (NonDepInversion (k,idl,ids),hyp) -> - Tacmach.New.of_old (interp_intro_pattern ist) >>= fun interp_intro_pattern -> - Tacmach.New.of_old (fun gl -> interp_hyp_list ist gl idl) >>= fun hyps -> - Tacmach.New.of_old (fun gl -> interp_declared_or_quantified_hypothesis ist gl hyp) >>= fun dqhyps -> + Proofview.Goal.enter begin fun gl -> + let interp_intro_pattern = Tacmach.New.of_old (interp_intro_pattern ist) gl in + let hyps = Tacmach.New.of_old (fun gl -> interp_hyp_list ist gl idl) gl in + let dqhyps = Tacmach.New.of_old (fun gl -> interp_declared_or_quantified_hypothesis ist gl hyp) gl in Inv.inv_clause k (Option.map interp_intro_pattern ids) hyps dqhyps + end | TacInversion (InversionUsing (c,idl),hyp) -> - Tacmach.New.of_old (fun gl -> pf_interp_constr ist gl c) >>= fun (sigma,c_interp) -> - Tacmach.New.of_old (fun gl -> interp_declared_or_quantified_hypothesis ist gl hyp) >>= fun dqhyps -> - Tacmach.New.of_old (fun gl -> interp_hyp_list ist gl idl) >>= fun hyps -> + Proofview.Goal.enter begin fun gl -> + let (sigma,c_interp) = Tacmach.New.of_old (fun gl -> pf_interp_constr ist gl c) gl in + let dqhyps = Tacmach.New.of_old (fun gl -> interp_declared_or_quantified_hypothesis ist gl hyp) gl in + let hyps = Tacmach.New.of_old (fun gl -> interp_hyp_list ist gl idl) gl in Leminv.lemInv_clause dqhyps c_interp hyps + end (* For extensions *) | TacExtend (loc,opn,l) -> - Proofview.tclEVARMAP >= fun goal_sigma -> + Proofview.Goal.enter begin fun gl -> + let goal_sigma = Proofview.Goal.sigma gl in let tac = lookup_tactic opn in - Tacmach.New.of_old begin fun gl -> + let (sigma,args) = Tacmach.New.of_old begin fun gl -> List.fold_right begin fun a (sigma,acc) -> let (sigma,a_interp) = interp_genarg ist { gl with sigma=sigma } a in sigma , a_interp::acc end l (goal_sigma,[]) - end >>= fun (sigma,args) -> + end gl in Proofview.V82.tclEVARS sigma <*> tac args ist + end | TacAlias (loc,s,l,(_,body)) -> Proofview.Goal.enter begin fun gl -> let env = Proofview.Goal.env gl in - let rec f x = match genarg_tag x with + let rec f x = + Proofview.Goal.enterl begin fun gl -> + match genarg_tag x with | IntOrVarArgType -> (Proofview.Goal.return (mk_int_or_var_value ist (out_gen (glbwit wit_int_or_var) x))) | IdentArgType b -> @@ -2168,40 +2210,49 @@ and interp_atomic ist tac = (out_gen (glbwit (wit_ident_gen b)) x))) end | VarArgType -> - Tacmach.New.of_old (fun gl -> mk_hyp_value ist gl (out_gen (glbwit wit_var) x)) + Proofview.Goal.return ( + Tacmach.New.of_old (fun gl -> mk_hyp_value ist gl (out_gen (glbwit wit_var) x)) + gl + ) | RefArgType -> + Proofview.Goal.return ( Tacmach.New.of_old (fun gl -> Value.of_constr (constr_of_global (pf_interp_reference ist gl (out_gen (glbwit wit_ref) x)))) + gl + ) | GenArgType -> f (out_gen (glbwit wit_genarg) x) | ConstrArgType -> - Tacmach.New.of_old (fun gl -> mk_constr_value ist gl (out_gen (glbwit wit_constr) x)) >>== fun (sigma,v) -> + Proofview.Goal.return (Tacmach.New.of_old (fun gl -> mk_constr_value ist gl (out_gen (glbwit wit_constr) x)) gl) >>== fun (sigma,v) -> (Proofview.V82.tclEVARS sigma) <*> (Proofview.Goal.return v) | OpenConstrArgType false -> - Tacmach.New.of_old (fun gl -> mk_open_constr_value ist gl (snd (out_gen (glbwit wit_open_constr) x))) >>== fun (sigma,v) -> + Proofview.Goal.return ( + Tacmach.New.of_old (fun gl -> mk_open_constr_value ist gl (snd (out_gen (glbwit wit_open_constr) x))) gl) >>== fun (sigma,v) -> (Proofview.V82.tclEVARS sigma) <*> (Proofview.Goal.return v) | ConstrMayEvalArgType -> - Tacmach.New.of_old (fun gl -> interp_constr_may_eval ist gl (out_gen (glbwit wit_constr_may_eval) x)) >>== fun (sigma,c_interp) -> + Proofview.Goal.return ( + Tacmach.New.of_old (fun gl -> interp_constr_may_eval ist gl (out_gen (glbwit wit_constr_may_eval) x)) + gl) >>== fun (sigma,c_interp) -> Proofview.V82.tclEVARS sigma <*> Proofview.Goal.return (Value.of_constr c_interp) | ListArgType ConstrArgType -> let wit = glbwit (wit_list wit_constr) in - Tacmach.New.of_old begin fun gl -> + let (sigma,l_interp) = Tacmach.New.of_old begin fun gl -> List.fold_right begin fun c (sigma,acc) -> let (sigma,c_interp) = mk_constr_value ist { gl with sigma=sigma } c in sigma , c_interp::acc end (out_gen wit x) (project gl,[]) - end >>== fun (sigma,l_interp) -> + end gl in (Proofview.V82.tclEVARS sigma) <*> (Proofview.Goal.return (in_gen (topwit (wit_list wit_genarg)) l_interp)) | ListArgType VarArgType -> let wit = glbwit (wit_list wit_var) in - Tacmach.New.of_old (fun gl -> + Proofview.Goal.return (Tacmach.New.of_old (fun gl -> let ans = List.map (mk_hyp_value ist gl) (out_gen wit x) in in_gen (topwit (wit_list wit_genarg)) ans - ) + ) gl) | ListArgType IntOrVarArgType -> let wit = glbwit (wit_list wit_int_or_var) in let ans = List.map (mk_int_or_var_value ist) (out_gen wit x) in @@ -2228,8 +2279,8 @@ and interp_atomic ist tac = val_interp ist tac >>== fun v -> Proofview.Goal.return v else - Tacmach.New.of_old (fun gl -> - Geninterp.generic_interp ist gl x) >>== fun (newsigma,v) -> + let (newsigma,v) = Tacmach.New.of_old (fun gl -> + Geninterp.generic_interp ist gl x) gl in Proofview.V82.tactic (tclEVARS newsigma) <*> Proofview.Goal.return v | QuantHypArgType | RedExprArgType @@ -2237,6 +2288,7 @@ and interp_atomic ist tac = | BindingsArgType | OptArgType _ | PairArgType _ -> Proofview.tclZERO (UserError("" , str"This argument type is not supported in tactic notations.")) + end in let addvar (x, v) accu = accu >>== fun accu -> diff --git a/tactics/tacticals.ml b/tactics/tacticals.ml index 5d3c8b97a..265af5b08 100644 --- a/tactics/tacticals.ml +++ b/tactics/tacticals.ml @@ -554,38 +554,47 @@ module New = struct let onLastDecl = onNthDecl 1 let ifOnHyp pred tac1 tac2 id = - Tacmach.New.pf_get_hyp_typ id >>= fun typ -> + Proofview.Goal.enter begin fun gl -> + let typ = Tacmach.New.pf_get_hyp_typ id gl in if pred (id,typ) then tac1 id else tac2 id + end let fullGoal = - Tacmach.New.pf_ids_of_hyps >>== fun hyps -> + Proofview.Goal.enterl begin fun gl -> + let hyps = Tacmach.New.pf_ids_of_hyps gl in Proofview.Goal.return (None :: List.map Option.make hyps) + end let tryAllHyps tac = - Tacmach.New.pf_ids_of_hyps >>= fun hyps -> + Proofview.Goal.enter begin fun gl -> + let hyps = Tacmach.New.pf_ids_of_hyps gl in tclFIRST_PROGRESS_ON tac hyps + end let tryAllHypsAndConcl tac = fullGoal >>= fun fullGoal -> tclFIRST_PROGRESS_ON tac fullGoal let onClause tac cl = - Tacmach.New.pf_ids_of_hyps >>= fun hyps -> + Proofview.Goal.enter begin fun gl -> + let hyps = Tacmach.New.pf_ids_of_hyps gl in tclMAP tac (Locusops.simple_clause_of (fun () -> hyps) cl) + end (* Find the right elimination suffix corresponding to the sort of the goal *) (* c should be of type A1->.. An->B with B an inductive definition *) let general_elim_then_using mk_elim isrec allnames tac predicate (indbindings,elimbindings) ind indclause = - Tacmach.New.of_old (mk_elim ind) >>= fun elim -> + Proofview.Goal.enter begin fun gl -> + let elim = Tacmach.New.of_old (mk_elim ind) gl in (* applying elimination_scheme just a little modified *) let indclause' = clenv_match_args indbindings indclause in - Tacmach.New.pf_apply Typing.type_of >>= fun type_of -> + let type_of = Tacmach.New.pf_apply Typing.type_of gl in begin try (* type_of can raise an exception *) - Tacmach.New.of_old (fun gl -> mk_clenv_from gl (elim,type_of elim)) + Proofview.Goal.return (Tacmach.New.of_old (fun gl -> mk_clenv_from gl (elim,type_of elim)) gl) with e when Proofview.V82.catchable_exception e -> Proofview.tclZERO e end >>= fun elimclause -> let indmv = @@ -634,10 +643,14 @@ module New = struct Reduction.CONV (mkMeta pmv) p elimclause' in new_elim_res_pf_THEN_i elimclause' branchtacs + end let elimination_then_using tac predicate bindings c = - Tacmach.New.of_old (fun gl -> pf_reduce_to_quantified_ind gl (pf_type_of gl c)) >>= fun (ind,t) -> - Tacmach.New.of_old (fun gl -> mk_clenv_from gl (c,t)) >>= fun indclause -> + Proofview.Goal.enter begin fun gl -> + let (ind,t) = + Tacmach.New.of_old (fun gl -> pf_reduce_to_quantified_ind gl (pf_type_of gl c)) gl + in + let indclause = Tacmach.New.of_old (fun gl -> mk_clenv_from gl (c,t)) gl in let isrec,mkelim = if (Global.lookup_mind (fst ind)).mind_record then false,gl_make_case_dep @@ -645,6 +658,7 @@ module New = struct in general_elim_then_using mkelim isrec None tac predicate bindings ind indclause + end let case_then_using = general_elim_then_using gl_make_case_dep false @@ -656,10 +670,14 @@ module New = struct let elimination_then tac = elimination_then_using tac None let elim_on_ba tac ba = - Tacmach.New.of_old (make_elim_branch_assumptions ba) >>= fun branches -> + Proofview.Goal.enter begin fun gl -> + let branches = Tacmach.New.of_old (make_elim_branch_assumptions ba) gl in tac branches + end let case_on_ba tac ba = - Tacmach.New.of_old (make_case_branch_assumptions ba) >>= fun branches -> + Proofview.Goal.enter begin fun gl -> + let branches = Tacmach.New.of_old (make_case_branch_assumptions ba) gl in tac branches + end end diff --git a/tactics/tactics.ml b/tactics/tactics.ml index 5e62451f9..c317ca0d4 100644 --- a/tactics/tactics.ml +++ b/tactics/tactics.ml @@ -606,8 +606,10 @@ let depth_of_quantified_hypothesis red h gl = str".") let intros_until_gen red h = - Tacmach.New.of_old (depth_of_quantified_hypothesis red h) >>= fun n -> + Proofview.Goal.enter begin fun gl -> + let n = Tacmach.New.of_old (depth_of_quantified_hypothesis red h) gl in Tacticals.New.tclDO n (if red then introf else intro) + end let intros_until_id id = intros_until_gen true (NamedHyp id) let intros_until_n_gen red n = intros_until_gen red (AnonHyp n) @@ -873,8 +875,10 @@ let find_eliminator c gl = let default_elim with_evars (c,_ as cx) = Proofview.tclORELSE - (Tacmach.New.of_old (find_eliminator c) >>= fun elim -> - Proofview.V82.tactic (general_elim with_evars cx elim)) + (Proofview.Goal.enter begin fun gl -> + let elim = Tacmach.New.of_old (find_eliminator c) gl in + Proofview.V82.tactic (general_elim with_evars cx elim) + end) begin function | IsRecord -> (* For records, induction principles aren't there by default @@ -1285,7 +1289,9 @@ let check_number_of_constructors expctdnumopt i nconstr = let constructor_tac with_evars expctdnumopt i lbind = Proofview.Goal.enter begin fun gl -> let cl = Proofview.Goal.concl gl in - Tacmach.New.pf_apply Tacred.reduce_to_quantified_ind >>= fun reduce_to_quantified_ind -> + let reduce_to_quantified_ind = + Tacmach.New.pf_apply Tacred.reduce_to_quantified_ind gl + in try (* reduce_to_quantified_ind can raise an exception *) let (mind,redcl) = reduce_to_quantified_ind cl in let nconstr = @@ -1309,7 +1315,9 @@ let any_constructor with_evars tacopt = let t = match tacopt with None -> Proofview.tclUNIT () | Some t -> t in Proofview.Goal.enter begin fun gl -> let cl = Proofview.Goal.concl gl in - Tacmach.New.pf_apply Tacred.reduce_to_quantified_ind >>= fun reduce_to_quantified_ind -> + let reduce_to_quantified_ind = + Tacmach.New.pf_apply Tacred.reduce_to_quantified_ind gl + in try (* reduce_to_quantified_ind can raise an exception *) let mind = fst (reduce_to_quantified_ind cl) in let nconstr = @@ -1386,9 +1394,12 @@ let intro_decomp_eq loc b l l' thin tac id gl = (eq,t,eq_args) eq_clause) gl let intro_or_and_pattern loc b ll l' thin tac id = + Proofview.Goal.enter begin fun gl -> let c = mkVar id in - Tacmach.New.of_old (fun gl -> - pf_reduce_to_quantified_ind gl (pf_type_of gl c)) >>= fun (ind,t) -> + let (ind,t) = + Tacmach.New.of_old (fun gl -> + pf_reduce_to_quantified_ind gl (pf_type_of gl c)) gl + in let nv = mis_constr_nargs ind in let bracketed = b || not (List.is_empty l') in let adjust n l = if bracketed then adjust_intro_patterns n l else l in @@ -1398,6 +1409,7 @@ let intro_or_and_pattern loc b ll l' thin tac id = (Tacticals.New.tclTHEN (simplest_case c) (Proofview.V82.tactic (clear [id]))) (Array.map2 (fun n l -> tac thin ((adjust n l)@l')) nv (Array.of_list ll)) + end let rewrite_hyp l2r id = let rew_on l2r = @@ -1408,8 +1420,8 @@ let rewrite_hyp l2r id = tclTRY (tclTHEN (clear [id]) (tclTRY (clear [destVar c]))) in Proofview.Goal.enter begin fun gl -> let env = Proofview.Goal.env gl in - Tacmach.New.pf_apply Typing.type_of >>= fun type_of -> - Tacmach.New.pf_apply whd_betadeltaiota >>= fun whd_betadeltaiota -> + let type_of = Tacmach.New.pf_apply Typing.type_of gl in + let whd_betadeltaiota = Tacmach.New.pf_apply whd_betadeltaiota gl in try (* type_of can raise an exception *) let t = whd_betadeltaiota (type_of (mkVar id)) in (* TODO: detect setoid equality? better detect the different equalities *) @@ -1518,41 +1530,32 @@ let intro_patterns = function let make_id s = fresh_id [] (default_id_of_sort s) -let prepare_intros s ipat = - let make_id s = Tacmach.New.of_old (make_id s) in - let fresh_id l id = Tacmach.New.of_old (fresh_id l id) in - let (>>=) t k = - t >>== fun x -> - Proofview.Goal.return (k x) - in +let prepare_intros s ipat gl = + let make_id s = Tacmach.New.of_old (make_id s) gl in + let fresh_id l id = Tacmach.New.of_old (fresh_id l id) gl in match ipat with | None -> - make_id s >>= fun id -> - id , Proofview.tclUNIT () + make_id s , Proofview.tclUNIT () | Some (loc,ipat) -> match ipat with | IntroIdentifier id -> - Proofview.Goal.return (id, Proofview.tclUNIT ()) + id, Proofview.tclUNIT () | IntroAnonymous -> - make_id s >>= fun id -> - id , Proofview.tclUNIT () + make_id s , Proofview.tclUNIT () | IntroFresh id -> - fresh_id [] id >>= fun id -> - id , Proofview.tclUNIT () + fresh_id [] id , Proofview.tclUNIT () | IntroWildcard -> - make_id s >>= fun id -> + let id = make_id s in id , Proofview.V82.tactic (clear_wildcards [dloc,id]) | IntroRewrite l2r -> - make_id s >>= fun id -> - id, Hook.get forward_general_multi_rewrite l2r false (mkVar id,NoBindings) allHypsAndConcl + let id = make_id s in + id , Hook.get forward_general_multi_rewrite l2r false (mkVar id,NoBindings) allHypsAndConcl | IntroOrAndPattern ll -> - make_id s >>= fun id -> - id , + make_id s , Tacticals.New.onLastHypId (intro_or_and_pattern loc true ll [] [] (fun thin -> intros_patterns true [] [] thin MoveLast (fun _ l -> Proofview.V82.tactic (clear_wildcards l)))) | IntroInjection l -> - make_id s >>= fun id -> - id , + make_id s , Proofview.V82.tactic (onLastHypId (intro_decomp_eq loc true l [] [] (fun thin -> intros_patterns true [] [] thin MoveLast (fun _ l -> Proofview.V82.tactic (clear_wildcards l)))) @@ -1577,15 +1580,17 @@ let clear_if_overwritten c ipats = | _ -> tclIDTAC let assert_as first ipat c = - Tacmach.New.of_old pf_hnf_type_of >>= fun hnf_type_of -> + Proofview.Goal.enter begin fun gl -> + let hnf_type_of = Tacmach.New.of_old pf_hnf_type_of gl in match kind_of_term (hnf_type_of c) with | Sort s -> - prepare_intros s ipat >>= fun (id,tac) -> + let (id,tac) = prepare_intros s ipat gl in let repl = not (Option.is_empty (allow_replace c ipat)) in Tacticals.New.tclTHENS (Proofview.V82.tactic ((if first then internal_cut_gen else internal_cut_rev_gen) repl id c)) (if first then [Proofview.tclUNIT (); tac] else [tac; Proofview.tclUNIT ()]) | _ -> Proofview.tclZERO (Errors.UserError ("",str"Not a proposition or a type.")) + end let assert_tac na = assert_as true (ipat_of_name na) @@ -1908,36 +1913,33 @@ let letin_tac_gen with_eq name (sigmac,c) test ty occs = let id = let t = match ty with Some t -> t | None -> typ_of env sigmac c in let x = id_of_name_using_hdchar (Global.env()) t name in - if name == Anonymous then Tacmach.New.of_old (fresh_id [] x) else - Proofview.Goal.lift begin - if not (mem_named_context x hyps) then Goal.return x else + if name == Anonymous then Tacmach.New.of_old (fresh_id [] x) gl else + if not (mem_named_context x hyps) then x else error ("The variable "^(Id.to_string x)^" is already declared.") - end in - id >>= fun id -> - Tacmach.New.of_old (letin_abstract id c test occs) >>= fun (depdecls,lastlhyp,ccl,c) -> - let t = match ty with Some t -> (Proofview.Goal.return t) | None -> Tacmach.New.pf_apply (fun e s -> typ_of e s c) in - t >>= fun t -> - let newcl = match with_eq with + in + let (depdecls,lastlhyp,ccl,c) = + Tacmach.New.of_old (letin_abstract id c test occs) gl + in + let t = + match ty with Some t -> t | None -> Tacmach.New.pf_apply (fun e s -> typ_of e s c) gl + in + let (newcl,eq_tac) = match with_eq with | Some (lr,(loc,ido)) -> let heq = match ido with - | IntroAnonymous -> Tacmach.New.of_old (fresh_id [id] (add_prefix "Heq" id)) - | IntroFresh heq_base -> Tacmach.New.of_old (fresh_id [id] heq_base) - | IntroIdentifier id -> (Proofview.Goal.return id) - | _ -> Proofview.tclZERO (UserError ("" , Pp.str"Expect an introduction pattern naming one hypothesis.")) in - heq >>== fun heq -> + | IntroAnonymous -> Tacmach.New.of_old (fresh_id [id] (add_prefix "Heq" id)) gl + | IntroFresh heq_base -> Tacmach.New.of_old (fresh_id [id] heq_base) gl + | IntroIdentifier id -> id + | _ -> Errors.error "Expect an introduction pattern naming one hypothesis." in let eqdata = build_coq_eq_data () in let args = if lr then [t;mkVar id;c] else [t;c;mkVar id]in let eq = applist (eqdata.eq,args) in let refl = applist (eqdata.refl, [t;mkVar id]) in - Proofview.Goal.return begin mkNamedLetIn id c t (mkLetIn (Name heq, refl, eq, ccl)), Tacticals.New.tclTHEN (intro_gen loc (IntroMustBe heq) lastlhyp true false) (Proofview.V82.tactic (thin_body [heq;id])) - end | None -> - (Proofview.Goal.return (mkNamedLetIn id c t ccl, Proofview.tclUNIT ())) in - newcl >>= fun (newcl,eq_tac) -> + (mkNamedLetIn id c t ccl, Proofview.tclUNIT ()) in Tacticals.New.tclTHENLIST [ Proofview.V82.tactic (convert_concl_no_check newcl DEFAULTcast); intro_gen dloc (IntroMustBe id) lastlhyp true false; @@ -1964,12 +1966,14 @@ let letin_pat_tac with_eq name c ty occs = let forward usetac ipat c = match usetac with | None -> - Tacmach.New.pf_apply Typing.type_of >>= fun type_of -> + Proofview.Goal.enter begin fun gl -> + let type_of = Tacmach.New.pf_apply Typing.type_of gl in begin try (* type_of can raise an exception *) let t = type_of c in Tacticals.New.tclTHENFIRST (assert_as true ipat t) (Proofview.V82.tactic (exact_no_check c)) with e when Proofview.V82.catchable_exception e -> Proofview.tclZERO e end + end | Some tac -> Tacticals.New.tclTHENFIRST (assert_as true ipat c) tac @@ -2121,30 +2125,36 @@ let induct_discharge dests avoid' tac (avoid,ra) names = match ra with | (RecArg,deprec,recvarname) :: (IndArg,depind,hyprecname) :: ra' -> - let recpat = match names with + Proofview.Goal.enter begin fun gl -> + let (recpat,names) = match names with | [loc,IntroIdentifier id as pat] -> let id' = next_ident_away (add_prefix "IH" id) avoid in - (Proofview.Goal.return (pat, [dloc, IntroIdentifier id'])) - | _ -> Tacmach.New.of_old (fun gl -> consume_pattern avoid recvarname deprec gl names) in - recpat >>= fun (recpat,names) -> + (pat, [dloc, IntroIdentifier id']) + | _ -> Tacmach.New.of_old (fun gl -> consume_pattern avoid recvarname deprec gl names) gl in let dest = get_recarg_dest dests in safe_dest_intros_patterns avoid thin dest [recpat] (fun ids thin -> - let hyprec = Tacmach.New.of_old (fun gl -> consume_pattern avoid hyprecname depind gl names) in - hyprec >>= fun (hyprec,names) -> - safe_dest_intros_patterns avoid thin MoveLast [hyprec] (fun ids' thin -> - peel_tac ra' (update_dest dests ids') names thin)) + Proofview.Goal.enter begin fun gl -> + let (hyprec,names) = + Tacmach.New.of_old (fun gl -> consume_pattern avoid hyprecname depind gl names) gl + in + safe_dest_intros_patterns avoid thin MoveLast [hyprec] (fun ids' thin -> + peel_tac ra' (update_dest dests ids') names thin) + end) + end | (IndArg,dep,hyprecname) :: ra' -> + Proofview.Goal.enter begin fun gl -> (* Rem: does not happen in Coq schemes, only in user-defined schemes *) - let pat = Tacmach.New.of_old (fun gl -> consume_pattern avoid hyprecname dep gl names) in - pat >>= fun (pat,names) -> + let (pat,names) = Tacmach.New.of_old (fun gl -> consume_pattern avoid hyprecname dep gl names) gl in safe_dest_intros_patterns avoid thin MoveLast [pat] (fun ids thin -> peel_tac ra' (update_dest dests ids) names thin) + end | (RecArg,dep,recvarname) :: ra' -> - let pat = Tacmach.New.of_old (fun gl -> consume_pattern avoid recvarname dep gl names) in - pat >>= fun (pat,names) -> + Proofview.Goal.enter begin fun gl -> + let (pat,names) = Tacmach.New.of_old (fun gl -> consume_pattern avoid recvarname dep gl names) gl in let dest = get_recarg_dest dests in safe_dest_intros_patterns avoid thin dest [pat] (fun ids thin -> peel_tac ra' dests names thin) + end | (OtherArg,_,_) :: ra' -> let pat,names = match names with | [] -> (dloc, IntroAnonymous), [] @@ -2165,8 +2175,9 @@ let induct_discharge dests avoid' tac (avoid,ra) names = (* Marche pas... faut prendre en compte l'occurrence précise... *) let atomize_param_of_ind (indref,nparams,_) hyp0 = - Tacmach.New.pf_get_hyp_typ hyp0 >>= fun tmptyp0 -> - Tacmach.New.pf_apply reduce_to_quantified_ref >>= fun reduce_to_quantified_ref -> + Proofview.Goal.enter begin fun gl -> + let tmptyp0 = Tacmach.New.pf_get_hyp_typ hyp0 gl in + let reduce_to_quantified_ref = Tacmach.New.pf_apply reduce_to_quantified_ref gl in try (* reduce_to_quantified_ref can raise an exception *) let typ0 = reduce_to_quantified_ref indref tmptyp0 in let prods, indtyp = decompose_prod typ0 in @@ -2176,10 +2187,12 @@ let atomize_param_of_ind (indref,nparams,_) hyp0 = let rec atomize_one i avoid = Proofview.Goal.enter begin fun gl -> if not (Int.equal i nparams) then - Tacmach.New.pf_get_hyp_typ hyp0 >>= fun tmptyp0 -> + let tmptyp0 = Tacmach.New.pf_get_hyp_typ hyp0 gl in (* If argl <> [], we expect typ0 not to be quantified, in order to avoid bound parameters... then we call pf_reduce_to_atomic_ind *) - Tacmach.New.pf_apply reduce_to_atomic_ref >>= fun reduce_to_atomic_ref -> + let reduce_to_atomic_ref = + Tacmach.New.pf_apply reduce_to_atomic_ref gl + in let indtyp = reduce_to_atomic_ref indref tmptyp0 in let argl = snd (decompose_app indtyp) in let c = List.nth argl (i-1) in @@ -2188,15 +2201,15 @@ let atomize_param_of_ind (indref,nparams,_) hyp0 = | Var id when not (List.exists (occur_var env id) avoid) -> atomize_one (i-1) ((mkVar id)::avoid) | Var id -> - Tacmach.New.of_old (fresh_id [] id) >>= fun x -> + let x = Tacmach.New.of_old (fresh_id [] id) gl in Tacticals.New.tclTHEN (letin_tac None (Name x) (mkVar id) None allHypsAndConcl) (atomize_one (i-1) ((mkVar x)::avoid)) | _ -> - Tacmach.New.pf_apply Typing.type_of >>= fun type_of -> + let type_of = Tacmach.New.pf_apply Typing.type_of gl in let id = id_of_name_using_hdchar (Global.env()) (type_of c) Anonymous in - Tacmach.New.of_old (fresh_id [] id) >>= fun x -> + let x = Tacmach.New.of_old (fresh_id [] id) gl in Tacticals.New.tclTHEN (letin_tac None (Name x) c None allHypsAndConcl) (atomize_one (i-1) ((mkVar x)::avoid)) @@ -2206,6 +2219,7 @@ let atomize_param_of_ind (indref,nparams,_) hyp0 = in atomize_one (List.length argl) params with e when Proofview.V82.catchable_exception e -> Proofview.tclZERO e + end let find_atomic_param_of_ind nparams indtyp = let argl = snd (decompose_app indtyp) in @@ -2663,25 +2677,22 @@ let abstract_args gl generalize_vars dep id defined f args = else None let abstract_generalize ?(generalize_vars=true) ?(force_dep=false) id = - Proofview.tclUNIT () >= fun () -> (* delay for [check_required_library] *) + Proofview.Goal.enter begin fun gl -> Coqlib.check_required_library Coqlib.jmeq_module_name; - let args = - Tacmach.New.pf_get_new_id id >>== fun oldid -> - Tacmach.New.pf_get_hyp id >>== fun (_, b, t) -> - Proofview.Goal.return begin + let (f, args, def, id, oldid) = + let oldid = Tacmach.New.pf_get_new_id id gl in + let (_, b, t) = Tacmach.New.pf_get_hyp id gl in match b with | None -> let f, args = decompose_app t in (f, args, false, id, oldid) | Some t -> let f, args = decompose_app t in (f, args, true, id, oldid) - end in - args >>= fun (f, args, def, id, oldid) -> if List.is_empty args then Proofview.tclUNIT () else let args = Array.of_list args in - Tacmach.New.of_old (fun gl -> abstract_args gl generalize_vars force_dep id def f args) >>= fun newc -> + let newc = Tacmach.New.of_old (fun gl -> abstract_args gl generalize_vars force_dep id def f args) gl in match newc with | None -> Proofview.tclUNIT () | Some (newc, dep, n, vars) -> @@ -2697,6 +2708,7 @@ let abstract_generalize ?(generalize_vars=true) ?(force_dep=false) id = (Proofview.V82.tactic (fun gl -> tclFIRST [revert vars ; tclMAP (fun id -> tclTRY (generalize_dep ~with_let:true (mkVar id))) vars] gl)) + end let rec compare_upto_variables x y = if (isVar x || isRel x) && (isVar y || isRel y) then true @@ -3123,13 +3135,15 @@ let induction_tac_felim with_evars indvars nparams elim gl = induction applies with the induction hypotheses *) let apply_induction_with_discharge induct_tac elim indhyps destopt avoid names tac = - Tacmach.New.of_old (get_eliminator elim) >>= fun (isrec, elim, indsign) -> + Proofview.Goal.enter begin fun gl -> + let (isrec, elim, indsign) = Tacmach.New.of_old (get_eliminator elim) gl in let names = compute_induction_names (Array.length indsign) names in (if isrec then Tacticals.New.tclTHENFIRSTn else Tacticals.New.tclTHENLASTn) (Tacticals.New.tclTHEN (induct_tac elim) (Proofview.V82.tactic (tclMAP (fun id -> tclTRY (expand_hyp id)) (List.rev indhyps)))) (Array.map2 (induct_discharge destopt avoid tac) indsign names) + end (* Apply induction "in place" taking into account dependent hypotheses from the context *) @@ -3218,8 +3232,11 @@ let induction_tac with_evars elim (varname,lbind) typ gl = let induction_from_context isrec with_evars (indref,nparams,elim) (hyp0,lbind) names inhyps = - Tacmach.New.pf_get_hyp_typ hyp0 >>= fun tmptyp0 -> - Tacmach.New.pf_apply reduce_to_quantified_ref >>= fun reduce_to_quantified_ref -> + Proofview.Goal.enter begin fun gl -> + let tmptyp0 = Tacmach.New.pf_get_hyp_typ hyp0 gl in + let reduce_to_quantified_ref = + Tacmach.New.pf_apply reduce_to_quantified_ref gl + in try (* reduce_to_quantified_ref can raise an exception *) let typ0 = reduce_to_quantified_ref indref tmptyp0 in let indvars = find_atomic_param_of_ind nparams ((strip_prod typ0)) in @@ -3231,19 +3248,23 @@ let induction_from_context isrec with_evars (indref,nparams,elim) (hyp0,lbind) n apply_induction_in_context (Some (hyp0,inhyps)) elim indvars names induct_tac with e when Proofview.V82.catchable_exception e -> Proofview.tclZERO e + end let induction_with_atomization_of_ind_arg isrec with_evars elim names (hyp0,lbind) inhyps = - Tacmach.New.of_old (find_induction_type isrec elim hyp0) >>= fun elim_info -> + Proofview.Goal.enter begin fun gl -> + let elim_info = Tacmach.New.of_old (find_induction_type isrec elim hyp0) gl in Tacticals.New.tclTHEN (atomize_param_of_ind elim_info hyp0) (induction_from_context isrec with_evars elim_info (hyp0,lbind) names inhyps) + end (* Induction on a list of induction arguments. Analyse the elim scheme (which is mandatory for multiple ind args), check that all parameters and arguments are given (mandatory too). *) let induction_without_atomization isrec with_evars elim names lid = - Tacmach.New.of_old (find_elim_signature isrec elim (List.hd lid)) >>= fun (indsign,scheme as elim_info) -> + Proofview.Goal.enter begin fun gl -> + let (indsign,scheme as elim_info) = Tacmach.New.of_old (find_elim_signature isrec elim (List.hd lid)) gl in let awaited_nargs = scheme.nparams + scheme.nargs + (if scheme.farg_in_concl then 1 else 0) @@ -3253,6 +3274,7 @@ let induction_without_atomization isrec with_evars elim names lid = if not (Int.equal nlid awaited_nargs) then Proofview.tclZERO (Errors.UserError ("", str"Not the right number of induction arguments.")) else induction_from_context_l with_evars elim_info lid names + end let has_selected_occurrences = function | None -> false @@ -3301,7 +3323,7 @@ let new_induct_gen isrec with_evars elim (eqname,names) (sigma,(c,lbind)) cls = let env = Proofview.Goal.env gl in let x = id_of_name_using_hdchar (Global.env()) (typ_of env sigma c) Anonymous in - Tacmach.New.of_old (fresh_id [] x) >>= fun id -> + let id = Tacmach.New.of_old (fresh_id [] x) gl in (* We need the equality name now *) let with_eq = Option.map (fun eq -> (false,eq)) eqname in (* TODO: if ind has predicate parameters, use JMeq instead of eq *) @@ -3339,19 +3361,21 @@ let new_induct_gen_l isrec with_evars elim (eqname,names) lc = atomize_list l' | _ -> - Tacmach.New.pf_apply Typing.type_of >>= fun type_of -> + Proofview.Goal.enter begin fun gl -> + let type_of = Tacmach.New.pf_apply Typing.type_of gl in try (* type_of can raise an exception *) let x = id_of_name_using_hdchar (Global.env()) (type_of c) Anonymous in - Tacmach.New.of_old (fresh_id [] x) >>= fun id -> + let id = Tacmach.New.of_old (fresh_id [] x) gl in let newl' = List.map (replace_term c (mkVar id)) l' in let _ = newlc:=id::!newlc in let _ = letids:=id::!letids in Tacticals.New.tclTHEN (letin_tac None (Name id) c None allHypsAndConcl) (atomize_list newl') - with e when Proofview.V82.catchable_exception e -> Proofview.tclZERO e in + with e when Proofview.V82.catchable_exception e -> Proofview.tclZERO e + end in Tacticals.New.tclTHENLIST [ (atomize_list lc); @@ -3370,7 +3394,8 @@ let new_induct_gen_l isrec with_evars elim (eqname,names) lc = args *) let induct_destruct isrec with_evars (lc,elim,names,cls) = assert (List.length lc > 0); (* ensured by syntax, but if called inside caml? *) - Tacmach.New.of_old (is_functional_induction elim) >>= fun ifi -> + Proofview.Goal.enter begin fun gl -> + let ifi = Tacmach.New.of_old (is_functional_induction elim) gl in if Int.equal (List.length lc) 1 && not ifi then (* standard induction *) onOpenInductionArg @@ -3385,7 +3410,7 @@ let induct_destruct isrec with_evars (lc,elim,names,cls) = str "Example: induction x1 x2 x3 using my_scheme."); if not (Option.is_empty cls) then error "'in' clause not supported here."; - Tacmach.New.pf_apply finish_evar_resolution >>= fun finish_evar_resolution -> + let finish_evar_resolution = Tacmach.New.pf_apply finish_evar_resolution gl in let lc = List.map (map_induction_arg finish_evar_resolution) lc in begin match lc with @@ -3407,6 +3432,7 @@ let induct_destruct isrec with_evars (lc,elim,names,cls) = new_induct_gen_l isrec with_evars elim names newlc end end + end let induction_destruct isrec with_evars = function | [],_,_ -> Proofview.tclUNIT () @@ -3494,13 +3520,15 @@ let case_type t gl = *) let andE id = - Tacmach.New.pf_get_hyp_typ id >>= fun t -> - Tacmach.New.of_old pf_hnf_constr >>= fun hnf_constr -> + Proofview.Goal.enter begin fun gl -> + let t = Tacmach.New.pf_get_hyp_typ id gl in + let hnf_constr = Tacmach.New.of_old pf_hnf_constr gl in if is_conjunction (hnf_constr t) then (Tacticals.New.tclTHEN (simplest_elim (mkVar id)) (Tacticals.New.tclDO 2 intro)) else Proofview.tclZERO (Errors.UserError ( "andE" , (str("Tactic andE expects "^(Id.to_string id)^" is a conjunction.")))) + end let dAnd cls = Tacticals.New.onClause @@ -3510,13 +3538,15 @@ let dAnd cls = cls let orE id = - Tacmach.New.pf_get_hyp_typ id >>= fun t -> - Tacmach.New.of_old pf_hnf_constr >>= fun hnf_constr -> + Proofview.Goal.enter begin fun gl -> + let t = Tacmach.New.pf_get_hyp_typ id gl in + let hnf_constr = Tacmach.New.of_old pf_hnf_constr gl in if is_disjunction (hnf_constr t) then (Tacticals.New.tclTHEN (simplest_elim (mkVar id)) intro) else Proofview.tclZERO (Errors.UserError ( "orE" , (str("Tactic orE expects "^(Id.to_string id)^" is a disjunction.")))) + end let dorE b cls = Tacticals.New.onClause @@ -3526,8 +3556,9 @@ let dorE b cls = cls let impE id = - Tacmach.New.pf_get_hyp_typ id >>= fun t -> - Tacmach.New.of_old pf_hnf_constr >>= fun hnf_constr -> + Proofview.Goal.enter begin fun gl -> + let t = Tacmach.New.pf_get_hyp_typ id gl in + let hnf_constr = Tacmach.New.of_old pf_hnf_constr gl in if is_imp_term (hnf_constr t) then let (dom, _, rng) = destProd (hnf_constr t) in Tacticals.New.tclTHENLAST @@ -3537,6 +3568,7 @@ let impE id = Proofview.tclZERO (Errors.UserError ( "impE" , (str("Tactic impE expects "^(Id.to_string id)^ " is a an implication.")))) + end let dImp cls = Tacticals.New.onClause @@ -3644,7 +3676,8 @@ let (forward_setoid_symmetry_in, setoid_symmetry_in) = Hook.make () let symmetry_in id = - Tacmach.New.pf_apply Typing.type_of >>= fun type_of -> + Proofview.Goal.enter begin fun gl -> + let type_of = Tacmach.New.pf_apply Typing.type_of gl in try (* type_of can raise an exception *) let ctype = type_of (mkVar id) in let sign,t = decompose_prod_assum ctype in @@ -3664,6 +3697,7 @@ let symmetry_in id = | e -> Proofview.tclZERO e end with e when Proofview.V82.catchable_exception e -> Proofview.tclZERO e + end let intros_symmetry = Tacticals.New.onClause diff --git a/toplevel/auto_ind_decl.ml b/toplevel/auto_ind_decl.ml index bc756eb82..c3d83b394 100644 --- a/toplevel/auto_ind_decl.ml +++ b/toplevel/auto_ind_decl.ml @@ -351,7 +351,8 @@ let do_replace_lb lb_scheme_key aavoid narg p q = ))) ) in - Tacmach.New.of_old (fun gl -> pf_type_of gl p) >>= fun type_of_pq -> + Proofview.Goal.enter begin fun gl -> + let type_of_pq = Tacmach.New.of_old (fun gl -> pf_type_of gl p) gl in let u,v = destruct_ind type_of_pq in let lb_type_of_p = try @@ -380,6 +381,7 @@ let do_replace_lb lb_scheme_key aavoid narg p q = Tacticals.New.tclTHENLIST [ Proofview.V82.tactic (Tactics.emit_side_effects eff); Equality.replace p q ; Proofview.V82.tactic (apply app) ; Auto.default_auto] + end (* used in the bool -> leib side *) let do_replace_bl bl_scheme_key ind aavoid narg lft rgt = @@ -410,7 +412,8 @@ let do_replace_bl bl_scheme_key ind aavoid narg lft rgt = let rec aux l1 l2 = match (l1,l2) with | (t1::q1,t2::q2) -> - Tacmach.New.pf_apply Typing.type_of >>= fun type_of -> + Proofview.Goal.enter begin fun gl -> + let type_of = Tacmach.New.pf_apply Typing.type_of gl in begin try (* type_of can raise an exception *) let tt1 = type_of t1 in if eq_constr t1 t2 then aux q1 q2 @@ -454,6 +457,7 @@ let do_replace_bl bl_scheme_key ind aavoid narg lft rgt = ) with e when Proofview.V82.catchable_exception e -> Proofview.tclZERO e end + end | ([],[]) -> Proofview.tclUNIT () | _ -> Proofview.tclZERO (UserError ("" , str"Both side of the equality must have the same arity.")) in |