@@ -101,8 +101,10 @@ let catch_error loc tac g =
101
101
102
102
(* Signature for interpretation: val_interp and interpretation functions *)
103
103
type interp_sign =
104
- { lfun : (identifier * value ) list ;
105
- debug : debug_info }
104
+ { lfun : (identifier * value ) list ;
105
+ avoid_ids : identifier list ; (* ids inherited fromm the call context
106
+ (needed to get fresh ids) *)
107
+ debug : debug_info }
106
108
107
109
let check_is_value = function
108
110
| VRTactic _ -> (* These are goals produced by Match *)
@@ -1243,7 +1245,7 @@ let rec constr_list_aux env = function
1243
1245
1244
1246
let constr_list ist env = constr_list_aux env ist.lfun
1245
1247
1246
- (* Extract the identifier list from lfun: join all branches (what to do else?)*)
1248
+ (* Extract the identifier list from lfun: join all branches (what to do else?)*)
1247
1249
let rec intropattern_ids = function
1248
1250
| IntroIdentifier id -> [id]
1249
1251
| IntroOrAndPattern ll ->
@@ -1260,7 +1262,7 @@ let default_fresh_id = id_of_string "H"
1260
1262
1261
1263
let interp_fresh_id ist gl l =
1262
1264
let ids = map_succeed (function ArgVar (_ ,id ) -> id | _ -> failwith " " ) l in
1263
- let avoid = extract_ids ids ist.lfun in
1265
+ let avoid = ( extract_ids ids ist.lfun) @ ist.avoid_ids in
1264
1266
let id =
1265
1267
if l = [] then default_fresh_id
1266
1268
else
@@ -1613,7 +1615,8 @@ and interp_ltac_reference isapplied mustbetac ist gl = function
1613
1615
let v = List. assoc id ist.lfun in
1614
1616
if mustbetac then coerce_to_tactic loc id v else v
1615
1617
| ArgArg (loc ,r ) ->
1616
- let v = val_interp {lfun= [] ;debug= ist.debug} gl (lookup r) in
1618
+ let ids = extract_ids [] ist.lfun in
1619
+ let v = val_interp {lfun= [] ;avoid_ids= ids; debug= ist.debug} gl (lookup r) in
1617
1620
if isapplied then v else locate_tactic_call loc v
1618
1621
1619
1622
and interp_tacarg ist gl = function
@@ -2263,18 +2266,18 @@ let make_empty_glob_sign () =
2263
2266
gsigma = Evd. empty; genv = Global. env() }
2264
2267
2265
2268
(* Initial call for interpretation *)
2266
- let interp_tac_gen lfun debug t gl =
2267
- interp_tactic { lfun= lfun; debug= debug }
2269
+ let interp_tac_gen lfun avoid_ids debug t gl =
2270
+ interp_tactic { lfun= lfun; avoid_ids = avoid_ids; debug= debug }
2268
2271
(intern_tactic {
2269
2272
ltacvars = (List. map fst lfun, [] ); ltacrecvars = [] ;
2270
2273
gsigma = project gl; genv = pf_env gl } t) gl
2271
2274
2272
- let eval_tactic t gls = interp_tactic { lfun= [] ; debug= get_debug() } t gls
2275
+ let eval_tactic t gls = interp_tactic { lfun= [] ; avoid_ids = [] ; debug= get_debug() } t gls
2273
2276
2274
- let interp t = interp_tac_gen [] (get_debug() ) t
2277
+ let interp t = interp_tac_gen [] [] (get_debug() ) t
2275
2278
2276
2279
let eval_ltac_constr gl t =
2277
- interp_ltac_constr { lfun= [] ; debug= get_debug() } gl
2280
+ interp_ltac_constr { lfun= [] ; avoid_ids = [] ; debug= get_debug() } gl
2278
2281
(intern_tactic (make_empty_glob_sign () ) t )
2279
2282
2280
2283
(* Hides interpretation for pretty-print *)
@@ -2674,7 +2677,7 @@ let glob_tactic_env l env x =
2674
2677
x
2675
2678
2676
2679
let interp_redexp env sigma r =
2677
- let ist = { lfun= [] ; debug= get_debug () } in
2680
+ let ist = { lfun= [] ; avoid_ids = [] ; debug= get_debug () } in
2678
2681
let gist = {(make_empty_glob_sign () ) with genv = env; gsigma = sigma } in
2679
2682
interp_red_expr ist sigma env (intern_red_expr gist r)
2680
2683
@@ -2684,7 +2687,7 @@ let interp_redexp env sigma r =
2684
2687
let _ = Auto. set_extern_interp
2685
2688
(fun l ->
2686
2689
let l = List. map (fun (id ,c ) -> (id,VConstr c)) l in
2687
- interp_tactic {lfun= l;debug= get_debug() })
2690
+ interp_tactic {lfun= l;avoid_ids = [] ; debug= get_debug() })
2688
2691
let _ = Auto. set_extern_intern_tac
2689
2692
(fun l ->
2690
2693
Options. with_option strict_check
0 commit comments