aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--intf/tacexpr.mli6
-rw-r--r--parsing/g_tactic.ml48
-rw-r--r--printing/pptactic.ml6
-rw-r--r--tactics/tacintern.ml27
-rw-r--r--tactics/tacinterp.ml15
5 files changed, 32 insertions, 30 deletions
diff --git a/intf/tacexpr.mli b/intf/tacexpr.mli
index 3501917f2..2967c10dd 100644
--- a/intf/tacexpr.mli
+++ b/intf/tacexpr.mli
@@ -44,9 +44,9 @@ type inversion_kind =
type ('c,'id) inversion_strength =
| NonDepInversion of
- inversion_kind * 'id list * 'c or_and_intro_pattern_expr located option
+ inversion_kind * 'id list * 'c or_and_intro_pattern_expr located or_var option
| DepInversion of
- inversion_kind * 'c option * 'c or_and_intro_pattern_expr located option
+ inversion_kind * 'c option * 'c or_and_intro_pattern_expr located or_var option
| InversionUsing of 'c * 'id list
type ('a,'b) location = HypLocation of 'a | ConclLocation of 'b
@@ -59,7 +59,7 @@ type 'id message_token =
type 'constr induction_clause =
'constr with_bindings induction_arg *
(intro_pattern_naming_expr located option (* eqn:... *)
- * 'constr or_and_intro_pattern_expr located option) (* as ... *)
+ * 'constr or_and_intro_pattern_expr located or_var option) (* as ... *)
type ('constr,'id) induction_clause_list =
'constr induction_clause list
diff --git a/parsing/g_tactic.ml4 b/parsing/g_tactic.ml4
index 5ffabbcf5..4b9d223ad 100644
--- a/parsing/g_tactic.ml4
+++ b/parsing/g_tactic.ml4
@@ -476,12 +476,8 @@ GEXTEND Gram
| -> None ] ]
;
or_and_intropattern_loc:
- [ [ ipat = or_and_intropattern -> !@loc, ipat
- | id = ident ->
- !@loc,
- (* coding, see tacinterp.ml: *)
- [[Loc.ghost, IntroNaming (IntroIdentifier id)]]
- ] ]
+ [ [ ipat = or_and_intropattern -> ArgArg (!@loc,ipat)
+ | locid = identref -> ArgVar locid ] ]
;
as_or_and_ipat:
[ [ "as"; ipat = or_and_intropattern_loc -> Some ipat
diff --git a/printing/pptactic.ml b/printing/pptactic.ml
index bd4e9d93e..9b27f9c7b 100644
--- a/printing/pptactic.ml
+++ b/printing/pptactic.ml
@@ -377,8 +377,10 @@ let pr_bindings prc prlc = pr_bindings_gen false prc prlc
let pr_with_bindings prc prlc (c,bl) =
hov 1 (prc c ++ pr_bindings prc prlc bl)
-let pr_as_disjunctive_ipat prc (_,ipatl) =
- str "as " ++ Miscprint.pr_or_and_intro_pattern prc ipatl
+let pr_as_disjunctive_ipat prc ipatl =
+ str "as " ++
+ pr_or_var (fun (loc,p) -> Miscprint.pr_or_and_intro_pattern prc p) ipatl
+
let pr_eqn_ipat (_,ipat) = str "eqn:" ++ Miscprint.pr_intro_pattern_naming ipat
let pr_with_induction_names prc = function
diff --git a/tactics/tacintern.ml b/tactics/tacintern.ml
index 69798a6d2..23be27552 100644
--- a/tactics/tacintern.ml
+++ b/tactics/tacintern.ml
@@ -96,9 +96,13 @@ let intern_hyp ist (loc,id as locid) =
else
Pretype_errors.error_var_not_found_loc loc id
-let intern_or_var ist = function
+let intern_or_var f ist = function
| ArgVar locid -> ArgVar (intern_hyp ist locid)
- | ArgArg _ as x -> x
+ | ArgArg x -> ArgArg (f x)
+
+let intern_int_or_var = intern_or_var (fun (n : int) -> n)
+let intern_id_or_var = intern_or_var (fun (id : Id.t) -> id)
+let intern_string_or_var = intern_or_var (fun (s : string) -> s)
let intern_global_reference ist = function
| Ident (loc,id) when find_var id ist -> ArgVar (loc,id)
@@ -264,8 +268,9 @@ and intern_intro_pattern_action lf ist = function
and intern_or_and_intro_pattern lf ist =
List.map (List.map (intern_intro_pattern lf ist))
-let intern_or_and_intro_pattern_loc lf ist (loc,l) =
- (loc,intern_or_and_intro_pattern lf ist l)
+let intern_or_and_intro_pattern_loc lf ist l =
+ intern_or_var (fun (loc,l) -> (loc,intern_or_and_intro_pattern lf ist l))
+ ist l
let intern_intro_pattern_naming_loc lf ist (loc,pat) =
(loc,intern_intro_pattern_naming lf ist pat)
@@ -385,7 +390,7 @@ let intern_inversion_strength lf ist = function
(* Interprets an hypothesis name *)
let intern_hyp_location ist ((occs,id),hl) =
- ((Locusops.occurrences_map (List.map (intern_or_var ist)) occs,
+ ((Locusops.occurrences_map (List.map (intern_int_or_var ist)) occs,
intern_hyp ist id), hl)
(* Reads a pattern *)
@@ -488,7 +493,7 @@ let rec intern_atomic lf ist x =
(* Automation tactics *)
| TacTrivial (d,lems,l) -> TacTrivial (d,List.map (intern_constr ist) lems,l)
| TacAuto (d,n,lems,l) ->
- TacAuto (d,Option.map (intern_or_var ist) n,
+ TacAuto (d,Option.map (intern_int_or_var ist) n,
List.map (intern_constr ist) lems,l)
(* Derived basic tactics *)
@@ -574,7 +579,7 @@ and intern_tactic_seq onlytac ist = function
TacMatch (lz,intern_tactic_or_tacarg ist c,intern_match_rule onlytac ist lmr)
| TacId l -> ist.ltacvars, TacId (intern_message ist l)
| TacFail (n,l) ->
- ist.ltacvars, TacFail (intern_or_var ist n,intern_message ist l)
+ ist.ltacvars, TacFail (intern_int_or_var ist n,intern_message ist l)
| TacProgress tac -> ist.ltacvars, TacProgress (intern_pure_tactic ist tac)
| TacShowHyps tac -> ist.ltacvars, TacShowHyps (intern_pure_tactic ist tac)
| TacAbstract (tac,s) ->
@@ -602,12 +607,12 @@ and intern_tactic_seq onlytac ist = function
(* Que faire en cas de (tac complexe avec Match et Thens; tac2) ?? *)
lfun', TacThens (t, List.map (intern_pure_tactic ist') tl)
| TacDo (n,tac) ->
- ist.ltacvars, TacDo (intern_or_var ist n,intern_pure_tactic ist tac)
+ ist.ltacvars, TacDo (intern_int_or_var ist n,intern_pure_tactic ist tac)
| TacTry tac -> ist.ltacvars, TacTry (intern_pure_tactic ist tac)
| TacInfo tac -> ist.ltacvars, TacInfo (intern_pure_tactic ist tac)
| TacRepeat tac -> ist.ltacvars, TacRepeat (intern_pure_tactic ist tac)
| TacTimeout (n,tac) ->
- ist.ltacvars, TacTimeout (intern_or_var ist n,intern_tactic onlytac ist tac)
+ ist.ltacvars, TacTimeout (intern_int_or_var ist n,intern_tactic onlytac ist tac)
| TacTime (s,tac) ->
ist.ltacvars, TacTime (s,intern_tactic onlytac ist tac)
| TacOr (tac1,tac2) ->
@@ -664,7 +669,7 @@ and intern_tacarg strict onlytac ist = function
TacCall (loc,
intern_applied_tactic_reference ist f,
List.map (intern_tacarg !strict_check false ist) l)
- | TacFreshId x -> TacFreshId (List.map (intern_or_var ist) x)
+ | TacFreshId x -> TacFreshId (List.map (intern_string_or_var ist) x)
| TacPretype c -> TacPretype (intern_constr ist c)
| TacNumgoals -> TacNumgoals
| Tacexp t -> Tacexp (intern_tactic onlytac ist t)
@@ -696,7 +701,7 @@ and intern_match_rule onlytac ist = function
and intern_genarg ist x =
match genarg_tag x with
- | IntOrVarArgType -> map_raw wit_int_or_var intern_or_var ist x
+ | IntOrVarArgType -> map_raw wit_int_or_var intern_int_or_var ist x
| IdentArgType ->
let lf = ref Id.Set.empty in
map_raw wit_ident (intern_ident lf) ist x
diff --git a/tactics/tacinterp.ml b/tactics/tacinterp.ml
index 65794a0c0..e25a862dd 100644
--- a/tactics/tacinterp.ml
+++ b/tactics/tacinterp.ml
@@ -830,14 +830,13 @@ let interp_intro_pattern_naming_option ist env sigma = function
let interp_or_and_intro_pattern_option ist env sigma = function
| None -> sigma, None
- | Some (loc,l) ->
- let sigma, l = match l with
- | [[loc',IntroNaming (IntroIdentifier id)]] when (* Hack, see g_tactic.ml4 *) loc' = dloc ->
- (match coerce_to_intro_pattern env (Id.Map.find id ist.lfun) with
- | IntroAction (IntroOrAndPattern l) -> sigma, l
- | _ ->
- raise (CannotCoerceTo "a disjunctive/conjunctive introduction pattern"))
- | l -> interp_or_and_intro_pattern ist env sigma l in
+ | Some (ArgVar (loc,id)) ->
+ (match coerce_to_intro_pattern env (Id.Map.find id ist.lfun) with
+ | IntroAction (IntroOrAndPattern l) -> sigma, Some (loc,l)
+ | _ ->
+ raise (CannotCoerceTo "a disjunctive/conjunctive introduction pattern"))
+ | Some (ArgArg (loc,l)) ->
+ let sigma,l = interp_or_and_intro_pattern ist env sigma l in
sigma, Some (loc,l)
let interp_intro_pattern_option ist env sigma = function