diff options
-rw-r--r-- | kernel/term.ml | 1 | ||||
-rw-r--r-- | kernel/term.mli | 1 | ||||
-rw-r--r-- | pretyping/clenv.ml | 91 | ||||
-rw-r--r-- | pretyping/clenv.mli | 8 | ||||
-rw-r--r-- | pretyping/evd.ml | 6 | ||||
-rw-r--r-- | pretyping/evd.mli | 4 | ||||
-rw-r--r-- | pretyping/reductionops.ml | 55 | ||||
-rw-r--r-- | pretyping/reductionops.mli | 1 | ||||
-rw-r--r-- | pretyping/retyping.mli | 2 | ||||
-rw-r--r-- | pretyping/termops.ml | 4 | ||||
-rw-r--r-- | pretyping/termops.mli | 7 | ||||
-rw-r--r-- | pretyping/unification.ml | 2 | ||||
-rw-r--r-- | proofs/clenvtac.ml | 25 | ||||
-rw-r--r-- | proofs/logic.ml | 4 | ||||
-rw-r--r-- | proofs/refiner.mli | 2 | ||||
-rw-r--r-- | proofs/tacmach.mli | 2 | ||||
-rw-r--r-- | tactics/auto.ml | 6 | ||||
-rw-r--r-- | tactics/class_tactics.ml4 | 21 | ||||
-rw-r--r-- | tactics/decl_proof_instr.mli | 5 | ||||
-rw-r--r-- | tactics/equality.ml | 2 | ||||
-rw-r--r-- | tactics/refine.ml | 2 | ||||
-rw-r--r-- | tactics/setoid_replace.ml | 2 | ||||
-rw-r--r-- | tactics/tacinterp.ml | 8 | ||||
-rw-r--r-- | tactics/tactics.ml | 14 | ||||
-rw-r--r-- | tactics/tactics.mli | 3 |
25 files changed, 170 insertions, 108 deletions
diff --git a/kernel/term.ml b/kernel/term.ml index d274857af..49d7afa22 100644 --- a/kernel/term.ml +++ b/kernel/term.ml @@ -261,6 +261,7 @@ let mkFix fix = Fix fix let mkCoFix cofix = CoFix cofix let kind_of_term c = c +let kind_of_term2 c = c (************************************************************************) (* kind_of_term = constructions as seen by the user *) diff --git a/kernel/term.mli b/kernel/term.mli index 2ab03e50f..5d75df4bf 100644 --- a/kernel/term.mli +++ b/kernel/term.mli @@ -208,6 +208,7 @@ type ('constr, 'types) kind_of_term = term *) val kind_of_term : constr -> (constr, types) kind_of_term +val kind_of_term2 : constr -> ((constr,types) kind_of_term,constr) kind_of_term (* Experimental *) type ('constr, 'types) kind_of_type = diff --git a/pretyping/clenv.ml b/pretyping/clenv.ml index 732ff1e69..c5c246877 100644 --- a/pretyping/clenv.ml +++ b/pretyping/clenv.ml @@ -54,11 +54,77 @@ let subst_clenv sub clenv = env = clenv.env } let clenv_nf_meta clenv c = nf_meta clenv.evd c +let clenv_direct_nf_meta clenv c = direct_nf_meta clenv.evd c let clenv_term clenv c = meta_instance clenv.evd c let clenv_meta_type clenv mv = Typing.meta_type clenv.evd mv let clenv_value clenv = meta_instance clenv.evd clenv.templval +let clenv_direct_value clenv = nf_betaiota clenv.templval.rebus let clenv_type clenv = meta_instance clenv.evd clenv.templtyp - +let clenv_direct_nf_type clenv = nf_betaiota clenv.templtyp.rebus + +let plain_instance find c = + let rec irec u = match kind_of_term u with + | Meta p -> find p + | App (f,l) when isCast f -> + let (f,_,t) = destCast f in + let l' = Array.map irec l in + (match kind_of_term f with + | Meta p -> + (* Don't flatten application nodes: this is used to extract a + proof-term from a proof-tree and we want to keep the structure + of the proof-tree *) + let g = find p in + (match kind_of_term g with + | App _ -> + let h = id_of_string "H" in + mkLetIn (Name h,g,t,mkApp(mkRel 1,Array.map (lift 1) l')) + | _ -> mkApp (g,l')) + | _ -> mkApp (irec f,l')) + | Cast (m,_,_) when isMeta m -> find (destMeta m) + | _ -> map_constr irec u + in + local_strong whd_betaiota + (if c.freemetas = Metaset.empty then c.rebus else irec c.rebus) + +let clenv_expand_metas clenv = + let seen = ref Metamap.empty in + let ongoing = ref Metaset.empty in + let todo = ref (meta_list clenv.evd) in + + let rec process_all () = match !todo with + | [] -> () + | (mv,cl)::_ -> let _ = process_meta mv cl in process_all () + + and process_meta mv cl = + ongoing := Metaset.add mv !ongoing; + let (body,typ) = match cl with + | Clval (na,(body,status),typ) -> + let body = plain_instance instance_of_meta body in + let typ = plain_instance instance_of_meta typ in + (body,Clval(na,(mk_freelisted body,status),mk_freelisted typ)) + | Cltyp (na,typ) -> + let typ = plain_instance instance_of_meta typ in + (mkMeta mv,Cltyp(na,mk_freelisted typ)) in + ongoing := Metaset.remove mv !ongoing; + seen := Metamap.add mv (body,typ) !seen; + todo := List.remove_assoc mv !todo; + body + + and instance_of_meta mv = + try fst (Metamap.find mv !seen) + with Not_found -> + if Metaset.mem mv !ongoing then + error "Cannot instantiate an existential variable with a term which depends on itself"; + process_meta mv (find_meta clenv.evd mv) in + + process_all (); + + { clenv with + evd = replace_metas (Metamap.map snd !seen) clenv.evd; + templtyp = mk_freelisted(plain_instance instance_of_meta clenv.templtyp); + templval = mk_freelisted(plain_instance instance_of_meta clenv.templval)} + +let instantiated_clenv_template clenv = (clenv.templval,clenv.templtyp) let clenv_hnf_constr ce t = hnf_constr (cl_env ce) (cl_sigma ce) t @@ -68,7 +134,8 @@ let clenv_get_type_of ce c = exception NotExtensibleClause let clenv_push_prod cl = - let typ = whd_betadeltaiota (cl_env cl) (cl_sigma cl) (clenv_type cl) in + let typ = + whd_betadeltaiota (cl_env cl) (cl_sigma cl) (clenv_direct_nf_type cl) in let rec clrec typ = match kind_of_term typ with | Cast (t,_,_) -> clrec t | Prod (na,t,u) -> @@ -213,13 +280,9 @@ let clenv_wtactic f clenv = {clenv with evd = f clenv.evd } * returns a list of the metavars which appear in the type of * the metavar mv. The list is unordered. *) -let clenv_metavars evd mv = - (mk_freelisted (meta_instance evd (meta_ftype evd mv))).freemetas - let dependent_metas clenv mvs conclmetas = List.fold_right - (fun mv deps -> - Metaset.union deps (clenv_metavars clenv.evd mv)) + (fun mv deps -> Metaset.union deps (meta_ftype clenv.evd mv).freemetas) mvs conclmetas let duplicated_metas c = @@ -231,14 +294,14 @@ let duplicated_metas c = snd (collrec ([],[]) c) let clenv_dependent hyps_only clenv = + let (body,typ) = instantiated_clenv_template clenv in let mvs = undefined_metas clenv.evd in - let ctyp_mvs = (mk_freelisted (clenv_type clenv)).freemetas in - let deps = dependent_metas clenv mvs ctyp_mvs in - let nonlinear = duplicated_metas (clenv_value clenv) in + let deps = dependent_metas clenv mvs typ.freemetas in + let nonlinear = duplicated_metas body.rebus in (* Make the assumption that duplicated metas have internal dependencies *) List.filter (fun mv -> (Metaset.mem mv deps && - not (hyps_only && Metaset.mem mv ctyp_mvs)) + not (hyps_only && Metaset.mem mv typ.freemetas)) or List.mem mv nonlinear) mvs @@ -367,9 +430,9 @@ type arg_bindings = open_constr explicit_bindings * of cval, ctyp. *) let clenv_independent clenv = - let mvs = collect_metas (clenv_value clenv) in - let ctyp_mvs = (mk_freelisted (clenv_type clenv)).freemetas in - let deps = dependent_metas clenv mvs ctyp_mvs in + let (body,typ) = instantiated_clenv_template clenv in + let mvs = Metaset.elements body.freemetas in + let deps = dependent_metas clenv mvs typ.freemetas in List.filter (fun mv -> not (Metaset.mem mv deps)) mvs let check_bindings bl = diff --git a/pretyping/clenv.mli b/pretyping/clenv.mli index dfa751349..de5a1e375 100644 --- a/pretyping/clenv.mli +++ b/pretyping/clenv.mli @@ -43,10 +43,16 @@ val subst_clenv : substitution -> clausenv -> clausenv (* subject of clenv (instantiated) *) val clenv_value : clausenv -> constr +(* subject of clenv (assume it is pre-instantiated) *) +val clenv_direct_value : clausenv -> constr (* type of clenv (instantiated) *) val clenv_type : clausenv -> types +(* type of clenv (assume it is pre-instantiated) *) +val clenv_direct_nf_type : clausenv -> types (* substitute resolved metas *) val clenv_nf_meta : clausenv -> constr -> constr +(* substitute resolved metas (assume the metas in clausenv are expanded) *) +val clenv_direct_nf_meta : clausenv -> constr -> constr (* type of a meta in clenv context *) val clenv_meta_type : clausenv -> metavariable -> types @@ -83,6 +89,8 @@ val clenv_dependent : bool -> clausenv -> metavariable list val clenv_pose_metas_as_evars : clausenv -> metavariable list -> clausenv +val clenv_expand_metas : clausenv -> clausenv + (***************************************************************) (* Bindings *) diff --git a/pretyping/evd.ml b/pretyping/evd.ml index b29afc0cb..2b9a0ed82 100644 --- a/pretyping/evd.ml +++ b/pretyping/evd.ml @@ -610,12 +610,18 @@ let meta_with_name evd id = (str "Binder name \"" ++ pr_id id ++ strbrk "\" occurs more than once in clause.") +let mk_meta_subst evd = + Metamap.fold (fun mv cl subst -> match cl with + | Clval(_,(b,_),typ) -> (mv, b.rebus) :: subst + | Cltyp (_,typ) -> subst) evd.metas [] let meta_merge evd1 evd2 = {evd2 with metas = List.fold_left (fun m (n,v) -> Metamap.add n v m) evd2.metas (metamap_to_list evd1.metas) } +let replace_metas metas evd = { evd with metas = metas } + type metabinding = metavariable * constr * instance_status let retract_coercible_metas evd = diff --git a/pretyping/evd.mli b/pretyping/evd.mli index 38db90dad..2fd668043 100644 --- a/pretyping/evd.mli +++ b/pretyping/evd.mli @@ -218,13 +218,15 @@ val meta_declare : metavariable -> types -> ?name:name -> evar_defs -> evar_defs val meta_assign : metavariable -> constr * instance_status -> evar_defs -> evar_defs val meta_reassign : metavariable -> constr * instance_status -> evar_defs -> evar_defs +val mk_meta_subst : evar_defs -> meta_value_map (* [meta_merge evd1 evd2] returns [evd2] extended with the metas of [evd1] *) val meta_merge : evar_defs -> evar_defs -> evar_defs val undefined_metas : evar_defs -> metavariable list -val metas_of : evar_defs -> metamap +val metas_of : evar_defs -> meta_type_map val map_metas_fvalue : (constr -> constr) -> evar_defs -> evar_defs +val replace_metas : clbinding Metamap.t -> evar_defs -> evar_defs type metabinding = metavariable * constr * instance_status diff --git a/pretyping/reductionops.ml b/pretyping/reductionops.ml index 57af582a1..e3553ddd6 100644 --- a/pretyping/reductionops.ml +++ b/pretyping/reductionops.ml @@ -130,15 +130,15 @@ type local_state_reduction_function = state -> state (*** Reduction Functions Operators ***) (*************************************) -let rec whd_state (x, stack as s) = +let rec whd_app_state (x, stack as s) = match kind_of_term x with - | App (f,cl) -> whd_state (f, append_stack cl stack) - | Cast (c,_,_) -> whd_state (c, stack) + | App (f,cl) -> whd_app_state (f, append_stack cl stack) + | Cast (c,_,_) -> whd_app_state (c, stack) | _ -> s let appterm_of_stack (f,s) = (f,list_of_stack s) -let whd_stack x = appterm_of_stack (whd_state (x, empty_stack)) +let whd_stack x = appterm_of_stack (whd_app_state (x, empty_stack)) let whd_castapp_stack = whd_stack let stack_reduction_of_reduction red_fun env sigma s = @@ -185,26 +185,6 @@ module type RedFlagsSig = sig val red_zeta : flags -> bool end -(* Naive Implementation -module RedFlags = (struct - type flag = BETA | DELTA | EVAR | IOTA | ZETA | ETA - type flags = flag list - let fbeta = BETA - let fdelta = DELTA - let fevar = EVAR - let fiota = IOTA - let fzeta = ZETA - let feta = ETA - let mkflags l = l - let red_beta = List.mem BETA - let red_delta = List.mem DELTA - let red_evar = List.mem EVAR - let red_eta = List.mem ETA - let red_iota = List.mem IOTA - let red_zeta = List.mem ZETA -end : RedFlagsSig) -*) - (* Compact Implementation *) module RedFlags = (struct type flag = int @@ -531,14 +511,14 @@ let rec whd_evar sigma c = with NotInstantiatedEvar | Not_found -> None in (match d with Some c -> whd_evar sigma c | None -> c) | Sort s when is_sort_variable sigma s -> whd_sort_variable sigma c - | _ -> collapse_appl c + | _ -> c let nf_evar sigma = local_strong (whd_evar sigma) (* lazy reduction functions. The infos must be created for each term *) let clos_norm_flags flgs env sigma t = - norm_val (create_clos_infos flgs env) (inject (nf_evar sigma t)) + norm_val (create_clos_infos flgs env) (inject ((*nf_evar sigma *)t)) let nf_beta = clos_norm_flags Closure.beta empty_env Evd.empty let nf_betaiota = clos_norm_flags Closure.betaiota empty_env Evd.empty @@ -645,8 +625,8 @@ let is_trans_fconv = function | CONV -> is_trans_conv | CUMUL -> is_trans_conv_l (* Special-Purpose Reduction *) (********************************************************************) -let whd_meta metamap c = match kind_of_term c with - | Meta p -> (try List.assoc p metamap with Not_found -> c) +let whd_meta metasubst c = match kind_of_term c with + | Meta p -> (try List.assoc p metasubst with Not_found -> c) | _ -> c (* Try to replace all metas. Does not replace metas in the metas' values @@ -905,27 +885,18 @@ let meta_value evd mv = in valrec mv -let meta_instance env b = +let meta_instance evd b = let c_sigma = List.map - (fun mv -> (mv,meta_value env mv)) (Metaset.elements b.freemetas) + (fun mv -> (mv,meta_value evd mv)) (Metaset.elements b.freemetas) in if c_sigma = [] then b.rebus else instance c_sigma b.rebus -let nf_meta env c = meta_instance env (mk_freelisted c) +let nf_meta evd c = meta_instance evd (mk_freelisted c) -(* Instantiate metas that create beta/iota redexes *) +let direct_nf_meta evd c = instance (mk_meta_subst evd) c -let meta_value evd mv = - let rec valrec mv = - match meta_opt_fvalue evd mv with - | Some (b,_) -> - instance - (List.map (fun mv' -> (mv',valrec mv')) (Metaset.elements b.freemetas)) - b.rebus - | None -> mkMeta mv - in - valrec mv +(* Instantiate metas that create beta/iota redexes *) let meta_reducible_instance evd b = let fm = Metaset.elements b.freemetas in diff --git a/pretyping/reductionops.mli b/pretyping/reductionops.mli index 371a66a9d..397377473 100644 --- a/pretyping/reductionops.mli +++ b/pretyping/reductionops.mli @@ -223,4 +223,5 @@ val whd_betaiota_deltazeta_for_iota_state : state_reduction_function (*s Meta-related reduction functions *) val meta_instance : evar_defs -> constr freelisted -> constr val nf_meta : evar_defs -> constr -> constr +val direct_nf_meta : evar_defs -> constr -> constr val meta_reducible_instance : evar_defs -> constr freelisted -> constr diff --git a/pretyping/retyping.mli b/pretyping/retyping.mli index c7901e949..52e5d7049 100644 --- a/pretyping/retyping.mli +++ b/pretyping/retyping.mli @@ -26,7 +26,7 @@ val get_sort_of : env -> evar_map -> types -> sorts val get_sort_family_of : env -> evar_map -> types -> sorts_family val get_type_of_with_meta : - env -> evar_map -> Termops.metamap -> constr -> types + env -> evar_map -> Termops.meta_type_map -> constr -> types (* Makes an assumption from a constr *) val get_assumption_of : env -> evar_map -> constr -> types diff --git a/pretyping/termops.ml b/pretyping/termops.ml index 7cbde2d07..a77fc5741 100644 --- a/pretyping/termops.ml +++ b/pretyping/termops.ml @@ -555,7 +555,9 @@ let pop t = lift (-1) t (* bindings functions *) (***************************) -type metamap = (metavariable * constr) list +type meta_type_map = (metavariable * types) list + +type meta_value_map = (metavariable * constr) list let rec subst_meta bl c = match kind_of_term c with diff --git a/pretyping/termops.mli b/pretyping/termops.mli index 15751b91c..e9516ec48 100644 --- a/pretyping/termops.mli +++ b/pretyping/termops.mli @@ -105,8 +105,11 @@ val free_rels : constr -> Intset.t val dependent : constr -> constr -> bool val collect_metas : constr -> int list (* Substitution of metavariables *) -type metamap = (metavariable * constr) list -val subst_meta : metamap -> constr -> constr +type meta_value_map = (metavariable * constr) list +val subst_meta : meta_value_map -> constr -> constr + +(* Type assignment for metavariables *) +type meta_type_map = (metavariable * types) list (* [pop c] lifts by -1 the positive indexes in [c] *) val pop : constr -> constr diff --git a/pretyping/unification.ml b/pretyping/unification.ml index a2671b5d1..a18db9026 100644 --- a/pretyping/unification.ml +++ b/pretyping/unification.ml @@ -467,7 +467,7 @@ let unify_to_type env evd flags c u = let sigma = evars_of evd in let c = refresh_universes c in let t = get_type_of_with_meta env sigma (metas_of evd) c in - let t = Tacred.hnf_constr env sigma (nf_betaiota (nf_meta evd t)) in + let t = Tacred.hnf_constr env sigma (nf_meta evd t) in let u = Tacred.hnf_constr env sigma u in try unify_0 env sigma Cumul flags t u with e when precatchable_exception e -> ([],[]) diff --git a/proofs/clenvtac.ml b/proofs/clenvtac.ml index 624b671d3..5c204c8bb 100644 --- a/proofs/clenvtac.ml +++ b/proofs/clenvtac.ml @@ -40,28 +40,30 @@ open Clenv let clenv_cast_meta clenv = let rec crec u = - match kind_of_term u with + match kind_of_term2 u with | App _ | Case _ -> crec_hd u - | Cast (c,_,_) when isMeta c -> u + | Cast (Meta mv,_,_) | Meta mv -> + (match Evd.meta_opt_fvalue clenv.evd mv with + | Some (c,_) -> c.rebus + | None -> u) | _ -> map_constr crec u and crec_hd u = match kind_of_term (strip_outer_cast u) with | Meta mv -> - (try - let b = Typing.meta_type clenv.evd mv in - if occur_meta b then u - else mkCast (mkMeta mv, DEFAULTcast, b) - with Not_found -> u) + (match Evd.find_meta clenv.evd mv with + | Clval (_,(body,_),_) -> body.rebus + | Cltyp (_,typ) -> + assert (not (occur_meta typ.rebus)); + mkCast (mkMeta mv, DEFAULTcast, typ.rebus)) | App(f,args) -> mkApp (crec_hd f, Array.map crec args) - | Case(ci,p,c,br) -> - mkCase (ci, crec_hd p, crec_hd c, Array.map crec br) + | Case(ci,p,c,br) -> mkCase (ci, crec p, crec_hd c, Array.map crec br) | _ -> u in crec let clenv_value_cast_meta clenv = - clenv_cast_meta clenv (clenv_value clenv) + clenv_cast_meta clenv (clenv_direct_value clenv) let clenv_pose_dependent_evars with_evars clenv = let dep_mvs = clenv_dependent false clenv in @@ -72,10 +74,11 @@ let clenv_pose_dependent_evars with_evars clenv = let clenv_refine with_evars clenv gls = + let clenv = clenv_expand_metas clenv in let clenv = clenv_pose_dependent_evars with_evars clenv in tclTHEN (tclEVARS (evars_of clenv.evd)) - (refine (clenv_cast_meta clenv (clenv_value clenv))) + (refine (clenv_value_cast_meta clenv)) gls let dft = Unification.default_unify_flags diff --git a/proofs/logic.ml b/proofs/logic.ml index eb879d977..c358de9ba 100644 --- a/proofs/logic.ml +++ b/proofs/logic.ml @@ -251,7 +251,7 @@ let rec mk_refgoals sigma goal goalacc conclty trm = match kind_of_term trm with | Meta _ -> if !check && occur_meta conclty then - anomaly "refined called with a dependent meta"; + anomaly "refine called with a dependent meta"; (mk_goal hyps (nf_betaiota conclty))::goalacc, conclty | Cast (t,_, ty) -> @@ -329,7 +329,7 @@ and mk_hdgoals sigma goal goalacc trm = | _ -> if !check && occur_meta trm then - anomaly "refined called with a dependent meta"; + anomaly "refine called with a dependent meta"; goalacc, goal_type_of env sigma trm and mk_arggoals sigma goal goalacc funty = function diff --git a/proofs/refiner.mli b/proofs/refiner.mli index 6d5f26bae..f6ebcae66 100644 --- a/proofs/refiner.mli +++ b/proofs/refiner.mli @@ -205,7 +205,7 @@ val weak_undo_pftreestate : pftreestate -> pftreestate val mk_pftreestate : goal -> pftreestate val extract_open_proof : evar_map -> proof_tree -> constr * (int * types) list -val extract_open_pftreestate : pftreestate -> constr * Termops.metamap +val extract_open_pftreestate : pftreestate -> constr * Termops.meta_type_map val extract_pftreestate : pftreestate -> constr val first_unproven : pftreestate -> pftreestate val last_unproven : pftreestate -> pftreestate diff --git a/proofs/tacmach.mli b/proofs/tacmach.mli index d9a89329a..a73e79a0c 100644 --- a/proofs/tacmach.mli +++ b/proofs/tacmach.mli @@ -106,7 +106,7 @@ val weak_undo_pftreestate : pftreestate -> pftreestate val solve_nth_pftreestate : int -> tactic -> pftreestate -> pftreestate val solve_pftreestate : tactic -> pftreestate -> pftreestate val mk_pftreestate : goal -> pftreestate -val extract_open_pftreestate : pftreestate -> constr * Termops.metamap +val extract_open_pftreestate : pftreestate -> constr * Termops.meta_type_map val extract_pftreestate : pftreestate -> constr val first_unproven : pftreestate -> pftreestate val last_unproven : pftreestate -> pftreestate diff --git a/tactics/auto.ml b/tactics/auto.ml index 58730d5d1..e9ec90ec3 100644 --- a/tactics/auto.ml +++ b/tactics/auto.ml @@ -264,7 +264,7 @@ let make_exact_entry pri (c,cty) = failwith "make_exact_entry" | _ -> let ce = mk_clenv_from dummy_goal (c,cty) in - let c' = clenv_type ce in + let c' = clenv_direct_nf_type ce in let pat = Pattern.pattern_of_constr c' in (Some (head_of_constr_reference (List.hd (head_constr cty))), { pri=(match pri with Some pri -> pri | None -> 0); pat=Some pat; code=Give_exact c }) @@ -274,7 +274,7 @@ let make_apply_entry env sigma (eapply,hnf,verbose) pri (c,cty) = match kind_of_term cty with | Prod _ -> let ce = mk_clenv_from dummy_goal (c,cty) in - let c' = clenv_type ce in + let c' = clenv_direct_nf_type ce in let pat = Pattern.pattern_of_constr c' in let hd = (try head_pattern_bound pat with BoundPattern -> failwith "make_apply_entry") in @@ -342,7 +342,7 @@ let make_trivial env sigma c = let hd = head_of_constr_reference (List.hd (head_constr t)) in let ce = mk_clenv_from dummy_goal (c,t) in (Some hd, { pri=1; - pat = Some (Pattern.pattern_of_constr (clenv_type ce)); + pat = Some (Pattern.pattern_of_constr (clenv_direct_nf_type ce)); code=Res_pf_THEN_trivial_fail(c,{ce with env=empty_env}) }) open Vernacexpr diff --git a/tactics/class_tactics.ml4 b/tactics/class_tactics.ml4 index e9bd15b11..c7cebd110 100644 --- a/tactics/class_tactics.ml4 +++ b/tactics/class_tactics.ml4 @@ -751,7 +751,7 @@ let evd_convertible env evd x y = let decompose_setoid_eqhyp env sigma c left2right = let ctype = Typing.type_of env sigma c in let eqclause = Clenv.mk_clenv_from_env env sigma None (c,ctype) in - let (equiv, args) = decompose_app (Clenv.clenv_type eqclause) in + let (equiv, args) = decompose_app (Clenv.clenv_direct_nf_type eqclause) in let rec split_last_two = function | [c1;c2] -> [],(c1, c2) | x::y::z -> @@ -764,7 +764,7 @@ let decompose_setoid_eqhyp env sigma c left2right = if not (evd_convertible env eqclause.evd ty1 ty2) then error "The term does not end with an applied homogeneous relation." else - { cl=eqclause; prf=(Clenv.clenv_value eqclause); + { cl=eqclause; prf=(Clenv.clenv_direct_value eqclause); car=ty1; rel=mkApp (equiv, Array.of_list others); l2r=left2right; c1=c1; c2=c2; c=Some c; abs=None } @@ -808,6 +808,7 @@ let unify_eqn env sigma hypinfo t = cl, prf, c1, c2, car, rel else raise Not_found*) let env' = clenv_unify allowK ~flags:rewrite2_unif_flags CONV left t cl in + let env' = clenv_expand_metas env' in let env' = let mvs = clenv_dependent false env' in clenv_pose_metas_as_evars env' mvs @@ -818,7 +819,8 @@ let unify_eqn env sigma hypinfo t = and rel = Clenv.clenv_nf_meta env' rel in hypinfo := { !hypinfo with cl = env'; - abs = Some (Clenv.clenv_value env', Clenv.clenv_type env') }; + abs = Some (Clenv.clenv_direct_value env', + Clenv.clenv_direct_nf_type env') }; env', prf, c1, c2, car, rel | None -> let env' = @@ -829,6 +831,7 @@ let unify_eqn env sigma hypinfo t = clenv_unify allowK ~flags:rewrite2_unif_flags CONV left t cl in + let env' = clenv_expand_metas env' in let env' = let mvs = clenv_dependent false env' in clenv_pose_metas_as_evars env' mvs @@ -838,7 +841,7 @@ let unify_eqn env sigma hypinfo t = let nf c = Evarutil.nf_evar (Evd.evars_of evd') (Clenv.clenv_nf_meta env' c) in let c1 = nf c1 and c2 = nf c2 and car = nf car and rel = nf rel - and prf = nf (Clenv.clenv_value env') in + and prf = nf (Clenv.clenv_direct_value env') in let ty1 = Typing.mtype_of env'.env env'.evd c1 and ty2 = Typing.mtype_of env'.env env'.evd c2 in @@ -1577,12 +1580,12 @@ let unification_rewrite l2r c1 c2 cl car rel but gl = Unification.w_unify_to_subterm ~flags:rewrite2_unif_flags (pf_env gl) ((if l2r then c1 else c2),but) cl.evd in - let cl' = {cl with evd = env'} in - let c1 = Clenv.clenv_nf_meta cl' c1 - and c2 = Clenv.clenv_nf_meta cl' c2 in + let cl' = clenv_expand_metas {cl with evd = env'} in + let c1 = Clenv.clenv_direct_nf_meta cl' c1 + and c2 = Clenv.clenv_direct_nf_meta cl' c2 in check_evar_map_of_evars_defs env'; - let prf = Clenv.clenv_value cl' in - let prfty = Clenv.clenv_type cl' in + let prf = Clenv.clenv_direct_value cl' in + let prfty = Clenv.clenv_direct_nf_type cl' in let cl' = { cl' with templval = mk_freelisted prf ; templtyp = mk_freelisted prfty } in {cl=cl'; prf=(mkRel 1); car=car; rel=rel; l2r=l2r; c1=c1; c2=c2; c=None; abs=Some (prf, prfty)} diff --git a/tactics/decl_proof_instr.mli b/tactics/decl_proof_instr.mli index 5777d6af8..fa1a703b9 100644 --- a/tactics/decl_proof_instr.mli +++ b/tactics/decl_proof_instr.mli @@ -6,7 +6,7 @@ (* * GNU Lesser General Public License Version 2.1 *) (************************************************************************) -(* $Id:$ *) +(* $Id$ *) open Refiner open Names @@ -23,7 +23,8 @@ val automation_tac : tactic val daimon_subtree: pftreestate -> pftreestate -val concl_refiner: Termops.metamap -> constr -> Proof_type.goal sigma -> constr +val concl_refiner: + Termops.meta_type_map -> constr -> Proof_type.goal sigma -> constr val do_instr: Decl_expr.raw_proof_instr -> pftreestate -> pftreestate val proof_instr: Decl_expr.raw_proof_instr -> unit diff --git a/tactics/equality.ml b/tactics/equality.ml index 9994bd784..123c83e40 100644 --- a/tactics/equality.ml +++ b/tactics/equality.ml @@ -565,7 +565,7 @@ let apply_on_clause (f,t) clause = (match kind_of_term (last_arg f_clause.templval.Evd.rebus) with | Meta mv -> mv | _ -> errorlabstrm "" (str "Ill-formed clause applicator.")) in - clenv_fchain argmv f_clause clause + clenv_expand_metas (clenv_fchain argmv f_clause clause) let discr_positions env sigma (lbeq,(t,t1,t2)) eq_clause cpath dirn sort = let e = next_ident_away eq_baseid (ids_of_context env) in diff --git a/tactics/refine.ml b/tactics/refine.ml index 39567f981..c0db5def5 100644 --- a/tactics/refine.ml +++ b/tactics/refine.ml @@ -60,7 +60,7 @@ open Tactics open Tacticals open Printer -type term_with_holes = TH of constr * metamap * sg_proofs +type term_with_holes = TH of constr * meta_type_map * sg_proofs and sg_proofs = (term_with_holes option) list (* pour debugger *) diff --git a/tactics/setoid_replace.ml b/tactics/setoid_replace.ml index 644a68666..22596ac3c 100644 --- a/tactics/setoid_replace.ml +++ b/tactics/setoid_replace.ml @@ -1815,7 +1815,7 @@ let relation_rewrite c1 c2 (input_direction,cl) ~new_goals gl = let analyse_hypothesis gl c = let ctype = pf_type_of gl c in let eqclause = Clenv.make_clenv_binding gl (c,ctype) Rawterm.NoBindings in - let (equiv, args) = decompose_app (Clenv.clenv_type eqclause) in + let (equiv, args) = decompose_app (Clenv.clenv_direct_nf_type eqclause) in let rec split_last_two = function | [c1;c2] -> [],(c1, c2) | x::y::z -> diff --git a/tactics/tacinterp.ml b/tactics/tacinterp.ml index c40d40208..72500c7e3 100644 --- a/tactics/tacinterp.ml +++ b/tactics/tacinterp.ml @@ -486,7 +486,9 @@ let rec intern_intro_pattern lf ist = function loc, IntroOrAndPattern (intern_or_and_intro_pattern lf ist l) | loc, IntroIdentifier id -> loc, IntroIdentifier (intern_ident lf ist id) - | loc, (IntroWildcard | IntroAnonymous | IntroFresh _ | IntroRewrite _) + | loc, IntroFresh id -> + loc, IntroFresh (intern_ident lf ist id) + | loc, (IntroWildcard | IntroAnonymous | IntroRewrite _) as x -> x and intern_or_and_intro_pattern lf ist = @@ -1644,7 +1646,9 @@ let rec interp_intro_pattern ist gl = function loc, IntroOrAndPattern (interp_or_and_intro_pattern ist gl l) | loc, IntroIdentifier id -> loc, interp_intro_pattern_var loc ist (pf_env gl) id - | loc, (IntroWildcard | IntroAnonymous | IntroFresh _ | IntroRewrite _) + | loc, IntroFresh id -> + loc, IntroFresh (interp_fresh_ident ist gl id) + | loc, (IntroWildcard | IntroAnonymous | IntroRewrite _) as x -> x and interp_or_and_intro_pattern ist gl = diff --git a/tactics/tactics.ml b/tactics/tactics.ml index 02d9544f0..65082c2ee 100644 --- a/tactics/tactics.ml +++ b/tactics/tactics.ml @@ -560,11 +560,12 @@ let error_uninstantiated_metas t clenv = in errorlabstrm "" (str "Cannot find an instance for " ++ pr_id id ++ str".") let clenv_refine_in with_evars id clenv gl = + let clenv = clenv_expand_metas clenv in let clenv = clenv_pose_dependent_evars with_evars clenv in - let new_hyp_typ = clenv_type clenv in + let new_hyp_typ = clenv_type clenv in if not with_evars & occur_meta new_hyp_typ then error_uninstantiated_metas new_hyp_typ clenv; - let new_hyp_prf = clenv_value clenv in + let new_hyp_prf = clenv_value_cast_meta clenv in tclTHEN (tclEVARS (evars_of clenv.evd)) (cut_replacing id new_hyp_typ @@ -597,12 +598,6 @@ let elimination_clause_scheme with_evars allow_K elimclause indclause gl = res_pf elimclause' ~with_evars:with_evars ~allow_K:allow_K ~flags:elim_flags gl -(* cast added otherwise tactics Case (n1,n2) generates (?f x y) and - * refine fails *) - -let type_clenv_binding wc (c,t) lbind = - clenv_type (make_clenv_binding wc (c,t) lbind) - (* * Elimination tactic with bindings and using an arbitrary * elimination constant called elimc. This constant should end @@ -947,7 +942,8 @@ let specialize mopt (c,lbind) g = else let clause = make_clenv_binding g (c,pf_type_of g c) lbind in let clause = clenv_unify_meta_types clause in - let (thd,tstack) = whd_stack (clenv_value clause) in + let clause = clenv_expand_metas clause in + let (thd,tstack) = whd_stack (clenv_direct_value clause) in let nargs = List.length tstack in let tstack = match mopt with | Some m -> diff --git a/tactics/tactics.mli b/tactics/tactics.mli index 1ebaec3b4..99f2140dd 100644 --- a/tactics/tactics.mli +++ b/tactics/tactics.mli @@ -38,9 +38,6 @@ val inj_ebindings : constr bindings -> open_constr bindings (*s General functions. *) -val type_clenv_binding : goal sigma -> - constr * constr -> open_constr bindings -> constr - val string_of_inductive : constr -> string val head_constr : constr -> constr list val head_constr_bound : constr -> constr list -> constr list |