aboutsummaryrefslogtreecommitdiff
path: root/tactics
diff options
context:
space:
mode:
authorherbelin2009-04-24 10:12:49 +0000
committerherbelin2009-04-24 10:12:49 +0000
commitcf71bfb25ddba52c72bdec4507021cd6e5ee06e8 (patch)
tree593d4585cb99091c76a8586dc4f9c17d87cf7bcf /tactics
parent8bc5a17d7beb67a68befe2fcd73932d477d1925f (diff)
Fixing bug #2308 ("instantiate" tactic did not comply with
the interpretation mechanism of ltac variables) git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@12100 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'tactics')
-rw-r--r--tactics/evar_tactics.ml30
-rw-r--r--tactics/evar_tactics.mli2
-rw-r--r--tactics/extraargs.ml44
-rw-r--r--tactics/extraargs.mli2
-rw-r--r--tactics/hiddentac.ml4
-rw-r--r--tactics/hiddentac.mli2
-rw-r--r--tactics/tacinterp.ml12
-rw-r--r--tactics/tacinterp.mli3
-rw-r--r--tactics/tacticals.ml1
-rw-r--r--tactics/tactics.mllib2
10 files changed, 27 insertions, 35 deletions
diff --git a/tactics/evar_tactics.ml b/tactics/evar_tactics.ml
index d03b26192c..0d08b72aae 100644
--- a/tactics/evar_tactics.ml
+++ b/tactics/evar_tactics.ml
@@ -29,7 +29,7 @@ let evar_list evc c =
in
evrec [] c
-let instantiate n rawc ido gl =
+let instantiate n (ist,rawc) ido gl =
let sigma = gl.sigma in
let evl =
match ido with
@@ -49,31 +49,19 @@ let instantiate n rawc ido gl =
(_,Some body,_) -> evar_list sigma body
| _ -> error "Not a defined hypothesis.") in
if List.length evl < n then
- error "not enough uninstantiated existential variables";
+ error "Not enough uninstantiated existential variables.";
if n <= 0 then error "Incorrect existential variable index.";
- let ev,_ = destEvar (List.nth evl (n-1)) in
- let evd' = w_refine ev rawc (create_goal_evar_defs sigma) in
+ let evk,_ = destEvar (List.nth evl (n-1)) in
+ let evi = Evd.find sigma evk in
+ let ltac_vars = Tacinterp.extract_ltac_vars ist sigma (Evd.evar_env evi) in
+ let sigma' = w_refine (evk,evi) (ltac_vars,rawc) sigma in
tclTHEN
- (tclEVARS ( evd'))
+ (tclEVARS sigma')
tclNORMEVAR
gl
-(*
-let pfic gls c =
- let evc = gls.sigma in
- Constrintern.interp_constr evc (Global.env_of_context gls.it.evar_hyps) c
-
-let instantiate_tac = function
- | [Integer n; Command com] ->
- (fun gl -> instantiate n (pfic gl com) gl)
- | [Integer n; Constr c] ->
- (fun gl -> instantiate n c gl)
- | _ -> invalid_arg "Instantiate called with bad arguments"
-*)
-
let let_evar name typ gls =
- let evd = Evd.create_goal_evar_defs gls.sigma in
- let evd',evar = Evarutil.new_evar evd (pf_env gls) typ in
- Refiner.tclTHEN (Refiner.tclEVARS ( evd'))
+ let sigma',evar = Evarutil.new_evar gls.sigma (pf_env gls) typ in
+ Refiner.tclTHEN (Refiner.tclEVARS sigma')
(Tactics.letin_tac None name evar None nowhere) gls
diff --git a/tactics/evar_tactics.mli b/tactics/evar_tactics.mli
index 66b24153ad..7a305f2001 100644
--- a/tactics/evar_tactics.mli
+++ b/tactics/evar_tactics.mli
@@ -13,7 +13,7 @@ open Names
open Tacexpr
open Termops
-val instantiate : int -> Rawterm.rawconstr ->
+val instantiate : int -> Tacinterp.interp_sign * Rawterm.rawconstr ->
(identifier * hyp_location_flag, unit) location -> tactic
(*i
diff --git a/tactics/extraargs.ml4 b/tactics/extraargs.ml4
index 0eb4a76f3a..4e3e04c67f 100644
--- a/tactics/extraargs.ml4
+++ b/tactics/extraargs.ml4
@@ -100,9 +100,9 @@ END
let pr_gen prc _prlc _prtac c = prc c
-let pr_rawc _prc _prlc _prtac raw = Printer.pr_rawconstr raw
+let pr_rawc _prc _prlc _prtac (_,raw) = Printer.pr_rawconstr raw
-let interp_raw _ _ (t,_) = t
+let interp_raw ist gl (t,_) = (ist,t)
let glob_raw = Tacinterp.intern_constr
diff --git a/tactics/extraargs.mli b/tactics/extraargs.mli
index b27d8fffc8..4492fd8421 100644
--- a/tactics/extraargs.mli
+++ b/tactics/extraargs.mli
@@ -25,7 +25,7 @@ val rawwit_occurrences : (int list or_var) raw_abstract_argument_type
val wit_occurrences : (int list) typed_abstract_argument_type
val rawwit_raw : constr_expr raw_abstract_argument_type
-val wit_raw : rawconstr typed_abstract_argument_type
+val wit_raw : (Tacinterp.interp_sign * rawconstr) typed_abstract_argument_type
val raw : constr_expr Pcoq.Gram.Entry.e
type 'id gen_place= ('id * hyp_location_flag,unit) location
diff --git a/tactics/hiddentac.ml b/tactics/hiddentac.ml
index 60916fda4c..2aff94b640 100644
--- a/tactics/hiddentac.ml
+++ b/tactics/hiddentac.ml
@@ -75,10 +75,6 @@ let h_generalize_dep c =
let h_let_tac b na c cl =
let with_eq = if b then None else Some (true,(dummy_loc,IntroAnonymous)) in
abstract_tactic (TacLetTac (na,inj_open c,cl,b)) (letin_tac with_eq na c None cl)
-let h_instantiate n c ido =
-(Evar_tactics.instantiate n c ido)
- (* abstract_tactic (TacInstantiate (n,c,cls))
- (Evar_refiner.instantiate n c (goal_location_of cls)) *)
(* Derived basic tactics *)
let h_simple_induction_destruct isrec h =
diff --git a/tactics/hiddentac.mli b/tactics/hiddentac.mli
index faa8c4150d..5aafb91a0d 100644
--- a/tactics/hiddentac.mli
+++ b/tactics/hiddentac.mli
@@ -62,8 +62,6 @@ val h_generalize_gen : (constr with_occurrences * name) list -> tactic
val h_generalize_dep : constr -> tactic
val h_let_tac : letin_flag -> name -> constr ->
Tacticals.clause -> tactic
-val h_instantiate : int -> Rawterm.rawconstr ->
- (identifier * hyp_location_flag, unit) location -> tactic
(* Derived basic tactics *)
diff --git a/tactics/tacinterp.ml b/tactics/tacinterp.ml
index a7b3a15e3a..da7ae038ab 100644
--- a/tactics/tacinterp.ml
+++ b/tactics/tacinterp.ml
@@ -1401,6 +1401,14 @@ let retype_list sigma env lst =
try (x,Retyping.get_judgment_of env sigma csr)::a with
| Anomaly _ -> a) lst []
+let extract_ltac_vars_data ist sigma env =
+ let (ltacvars,_ as vars) = constr_list ist env in
+ vars, retype_list sigma env ltacvars
+
+let extract_ltac_vars ist sigma env =
+ let (_,unbndltacvars),typs = extract_ltac_vars_data ist sigma env in
+ typs,unbndltacvars
+
let implicit_tactic = ref None
let declare_implicit_tactic tac = implicit_tactic := Some tac
@@ -1446,8 +1454,8 @@ let solve_remaining_evars env initial_sigma evd c =
proc_rec (Evarutil.nf_isevar !evdref c)
let interp_gen kind ist sigma env (c,ce) =
- let (ltacvars,unbndltacvars as vars) = constr_list ist env in
- let typs = retype_list sigma env ltacvars in
+ let (ltacvars,unbndltacvars as vars),typs =
+ extract_ltac_vars_data ist sigma env in
let c = match ce with
| None -> c
(* If at toplevel (ce<>None), the error can be due to an incorrect
diff --git a/tactics/tacinterp.mli b/tactics/tacinterp.mli
index 6faae3adc1..6b7aabe2e3 100644
--- a/tactics/tacinterp.mli
+++ b/tactics/tacinterp.mli
@@ -44,6 +44,9 @@ and interp_sign =
debug : debug_info;
trace : ltac_trace }
+val extract_ltac_vars : interp_sign -> Evd.evar_defs -> Environ.env ->
+ Pretyping.var_map * Pretyping.unbound_ltac_var_map
+
(* Transforms an id into a constr if possible *)
val constr_of_id : Environ.env -> identifier -> constr
diff --git a/tactics/tacticals.ml b/tactics/tacticals.ml
index fa23cfb857..ab7120b8be 100644
--- a/tactics/tacticals.ml
+++ b/tactics/tacticals.ml
@@ -26,7 +26,6 @@ open Clenvtac
open Rawterm
open Pattern
open Matching
-open Evar_refiner
open Genarg
open Tacexpr
diff --git a/tactics/tactics.mllib b/tactics/tactics.mllib
index 220c8e782d..0a0cfb79b4 100644
--- a/tactics/tactics.mllib
+++ b/tactics/tactics.mllib
@@ -5,7 +5,6 @@ Nbtermdn
Tacticals
Hipattern
Tactics
-Evar_tactics
Hiddentac
Elim
Dhyp
@@ -16,6 +15,7 @@ Contradiction
Inv
Leminv
Tacinterp
+Evar_tactics
Autorewrite
Decl_interp
Decl_proof_instr