aboutsummaryrefslogtreecommitdiff
path: root/tactics
diff options
context:
space:
mode:
Diffstat (limited to 'tactics')
-rw-r--r--tactics/equality.ml20
-rw-r--r--tactics/equality.mli2
-rw-r--r--tactics/tacinterp.ml7
3 files changed, 20 insertions, 9 deletions
diff --git a/tactics/equality.ml b/tactics/equality.ml
index 6770390152..b6c3acface 100644
--- a/tactics/equality.ml
+++ b/tactics/equality.ml
@@ -166,11 +166,21 @@ let general_multi_rewrite l2r with_evars c cl =
(general_rewrite_ebindings l2r c with_evars)
do_hyps
-let rec general_multi_multi_rewrite with_evars l cl = match l with
- | [] -> tclIDTAC
- | (l2r,c)::l ->
- tclTHEN (general_multi_rewrite l2r with_evars c cl)
- (general_multi_multi_rewrite with_evars l cl)
+let general_multi_multi_rewrite with_evars l cl =
+ let do1 l2r c = general_multi_rewrite l2r with_evars c cl in
+ let rec doN l2r c = function
+ | Precisely n when n <= 0 -> tclIDTAC
+ | Precisely 1 -> do1 l2r c
+ | Precisely n -> tclTHENFIRST (do1 l2r c) (doN l2r c (Precisely (n-1)))
+ | RepeatStar -> tclREPEAT_MAIN (do1 l2r c)
+ | RepeatPlus -> tclTHENFIRST (do1 l2r c) (doN l2r c RepeatStar)
+ | UpTo n when n<=0 -> tclIDTAC
+ | UpTo n -> tclTHENFIRST (tclTRY (do1 l2r c)) (doN l2r c (UpTo (n-1)))
+ in
+ let rec loop = function
+ | [] -> tclIDTAC
+ | (l2r,m,c)::l -> tclTHENFIRST (doN l2r c m) (loop l)
+ in loop l
(* Conditional rewriting, the success of a rewriting is related
to the resolution of the conditions by a given tactic *)
diff --git a/tactics/equality.mli b/tactics/equality.mli
index 772f9cdc8e..475304fb6c 100644
--- a/tactics/equality.mli
+++ b/tactics/equality.mli
@@ -49,7 +49,7 @@ val general_rewrite_in :
val general_multi_rewrite :
bool -> evars_flag -> constr with_ebindings -> clause -> tactic
val general_multi_multi_rewrite :
- evars_flag -> (bool * constr with_ebindings) list -> clause -> tactic
+ evars_flag -> (bool * multi * constr with_ebindings) list -> clause -> tactic
val conditional_rewrite : bool -> tactic -> constr with_ebindings -> tactic
val conditional_rewrite_in :
diff --git a/tactics/tacinterp.ml b/tactics/tacinterp.ml
index effd6f9afb..8de4fcd10b 100644
--- a/tactics/tacinterp.ml
+++ b/tactics/tacinterp.ml
@@ -745,7 +745,7 @@ let rec intern_atomic lf ist x =
| TacRewrite (ev,l,cl) ->
TacRewrite
(ev,
- List.map (fun (b,c) -> (b,intern_constr_with_bindings ist c)) l,
+ List.map (fun (b,m,c) -> (b,m,intern_constr_with_bindings ist c)) l,
clause_app (intern_hyp_location ist) cl)
| TacInversion (inv,hyp) ->
TacInversion (intern_inversion_strength lf ist inv,
@@ -2107,7 +2107,7 @@ and interp_atomic ist gl = function
(* Equality and inversion *)
| TacRewrite (ev,l,cl) ->
Equality.general_multi_multi_rewrite ev
- (List.map (fun (b,c) -> (b, interp_constr_with_bindings ist gl c)) l)
+ (List.map (fun (b,m,c) -> (b,m,interp_constr_with_bindings ist gl c)) l)
(interp_clause ist gl cl)
| TacInversion (DepInversion (k,c,ids),hyp) ->
Inv.dinv k (Option.map (pf_interp_constr ist gl) c)
@@ -2405,7 +2405,8 @@ let rec subst_atomic subst (t:glob_atomic_tactic_expr) = match t with
(* Equality and inversion *)
| TacRewrite (ev,l,cl) ->
TacRewrite (ev,
- List.map (fun (b,c) ->b,subst_raw_with_bindings subst c) l,
+ List.map (fun (b,m,c) ->
+ b,m,subst_raw_with_bindings subst c) l,
cl)
| TacInversion (DepInversion (k,c,l),hyp) ->
TacInversion (DepInversion (k,Option.map (subst_rawconstr subst) c,l),hyp)