aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--proofs/proofview.ml37
-rw-r--r--proofs/proofview.mli21
-rw-r--r--tactics/extratactics.ml47
-rw-r--r--tactics/rewrite.ml2
-rw-r--r--tactics/tactics.ml13
5 files changed, 19 insertions, 61 deletions
diff --git a/proofs/proofview.ml b/proofs/proofview.ml
index 49615a5f8..d42ea8b80 100644
--- a/proofs/proofview.ml
+++ b/proofs/proofview.ml
@@ -639,22 +639,9 @@ let in_proofview p k =
k p.solution
-(* spiwack: to help using `bind' like construct consistently. A glist
- is promissed to have exactly one element per goal when it is
- produced. *)
-type 'a glist = 'a list
module Notations = struct
let (>=) = tclBIND
- let (>>=) t k =
- t >= fun l ->
- tclDISPATCHGEN k ignore l
- let (>>==) t k =
- begin
- t >= fun l ->
- tclDISPATCHGEN k List.rev l
- end >= fun l' ->
- tclUNIT (List.flatten l')
let (<*>) = tclTHEN
let (<+>) t1 t2 = tclOR t1 (fun _ -> t2)
end
@@ -797,26 +784,24 @@ module Goal = struct
let hyps { hyps=hyps } = Environ.named_context_of_val hyps
let concl { concl=concl } = concl
- let lift s =
+ let lift s k =
(* spiwack: convenience notations, waiting for ocaml 3.12 *)
let (>>=) = Proof.bind in
let (>>) = Proof.seq in
Proof.current >>= fun env ->
Proof.get >>= fun step ->
try
- let (res,sigma) =
+ let (ks,sigma) =
Goal.list_map begin fun sigma g ->
- Goal.eval s env sigma g
+ Util.on_fst k (Goal.eval s env sigma g)
end step.comb step.solution
in
Proof.set { step with solution=sigma } >>
- Proof.ret res
+ tclDISPATCH ks
with e when catchable_exception e ->
let e = Errors.push e in
tclZERO e
- let return x = lift (Goal.return x)
-
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
@@ -832,20 +817,6 @@ module Goal = struct
let e = Errors.push e in
tclZERO e
end
- let enterl f =
- list_iter_goal [] begin fun goal acc ->
- Proof.current >= fun env ->
- tclEVARMAP >= fun sigma ->
- try
- (* enter_t cannot modify the sigma. *)
- let (t,_) = Goal.eval (enter_t f) env sigma goal in
- t >= fun r ->
- tclUNIT (r::acc)
- with e when catchable_exception e ->
- let e = Errors.push e in
- tclZERO e
- end >= fun res ->
- tclUNIT (List.flatten (List.rev res))
(* compatibility *)
diff --git a/proofs/proofview.mli b/proofs/proofview.mli
index 021155c42..c608bc841 100644
--- a/proofs/proofview.mli
+++ b/proofs/proofview.mli
@@ -266,11 +266,6 @@ val list_map : ('a -> 'b tactic) -> 'a list -> 'b list tactic
val in_proofview : proofview -> (Evd.evar_map -> 'a) -> 'a
-(* spiwack: to help using `bind' like construct consistently. A glist
- is promissed to have exactly one element per goal when it is
- produced. *)
-type 'a glist = private 'a list
-
(* Notations for building tactics. *)
module Notations : sig
@@ -280,10 +275,6 @@ module Notations : sig
The [t] is supposed to return a list of values of the size of the
list of goals. [k] is then applied to each of this value in the
corresponding goal. *)
- val (>>=) : 'a glist tactic -> ('a -> unit tactic) -> unit tactic
- (* [t >>== k] acts as [t] except that [k] returns a list of value
- corresponding to its produced subgoals. *)
- val (>>==) : 'a glist tactic -> ('a -> 'b glist tactic) -> 'b glist tactic
(* tclTHEN *)
val (<*>) : unit tactic -> 'a tactic -> 'a tactic
@@ -356,20 +347,14 @@ module Goal : sig
val env : t -> Environ.env
val sigma : t -> Evd.evar_map
- (* [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
-
- (* [return x] returns a copy of [x] per focused goal. *)
- val return : 'a -> 'a glist tactic
+ (* [lift_sensitive s k] applies [s] in each goal independently
+ raising result [a] then continues with [k a]. *)
+ val lift : 'a Goal.sensitive -> ('a->unit tactic) -> unit tactic
(* [enter t] execute the goal-dependent tactic [t] in each goal
independently. In particular [t] need not backtrack the same way in
each goal. *)
val enter : (t -> unit tactic) -> unit tactic
- (* [enterl t] works like [enter t] except that [t] returns a value
- in each of the produced subgoals. *)
- val enterl : (t -> 'a glist tactic) -> 'a glist tactic
(* compatibility: avoid if possible *)
diff --git a/tactics/extratactics.ml4 b/tactics/extratactics.ml4
index a1e57fd3c..033a4dc1b 100644
--- a/tactics/extratactics.ml4
+++ b/tactics/extratactics.ml4
@@ -344,9 +344,10 @@ let refine_tac (ist, c) =
let tycon = Pretyping.OfType concl in
Goal.Refinable.constr_of_raw h tycon flags vars c)
end in
- Proofview.Goal.lift c >>= fun c ->
- Proofview.tclSENSITIVE (Goal.refine c) <*>
- Proofview.V82.tactic (reduce refine_red_flags refine_locs))
+ Proofview.Goal.lift c begin fun c ->
+ Proofview.tclSENSITIVE (Goal.refine c) <*>
+ Proofview.V82.tactic (reduce refine_red_flags refine_locs)
+ end)
TACTIC EXTEND refine
[ "refine" glob(c) ] -> [ refine_tac c ]
diff --git a/tactics/rewrite.ml b/tactics/rewrite.ml
index a10b62162..853215a5a 100644
--- a/tactics/rewrite.ml
+++ b/tactics/rewrite.ml
@@ -1305,7 +1305,7 @@ let cl_rewrite_clause_newtac ?abs strat clause =
| TypeClassError (env, (UnsatisfiableConstraints _ as e)) ->
raise (RewriteFailure (str"Unable to satisfy the rewriting constraints."
++ fnl () ++ Himsg.explain_typeclass_error env e)))
- in Proofview.Notations.(>>=) (Proofview.Goal.lift info) (fun i -> treat i)
+ in Proofview.Goal.lift info (fun i -> treat i)
let newtactic_init_setoid () =
try init_setoid (); Proofview.tclUNIT ()
diff --git a/tactics/tactics.ml b/tactics/tactics.ml
index b4fb6b900..b4b6934f2 100644
--- a/tactics/tactics.ml
+++ b/tactics/tactics.ml
@@ -3937,11 +3937,12 @@ module New = struct
let c = Goal.Refinable.make begin fun h ->
Goal.Refinable.constr_of_open_constr h true c
end in
- Proofview.Goal.lift c >>= fun c ->
- Proofview.tclSENSITIVE (Goal.refine c) <*>
- Proofview.V82.tactic (reduce
- (Lazy {rBeta=true;rIota=true;rZeta=false;rDelta=false;rConst=[]})
- {onhyps=None; concl_occs=AllOccurrences }
- )
+ Proofview.Goal.lift c begin fun c ->
+ Proofview.tclSENSITIVE (Goal.refine c) <*>
+ Proofview.V82.tactic (reduce
+ (Lazy {rBeta=true;rIota=true;rZeta=false;rDelta=false;rConst=[]})
+ {onhyps=None; concl_occs=AllOccurrences }
+ )
+ end
end