diff options
| author | Pierre-Marie Pédrot | 2020-04-28 15:45:04 +0200 |
|---|---|---|
| committer | Pierre-Marie Pédrot | 2020-04-29 09:41:04 +0200 |
| commit | 23952efb51664ef30fee44bff31dcbf38c5bff63 (patch) | |
| tree | 2cd76a7983ad121e32a786155af54ecd7c145364 | |
| parent | 6a6272ad2b452624e75418245fbbf30d3dc5597f (diff) | |
Merge the call to tclEFFECTS into find_scheme.
This encapsulates better the invariants of this function.
| -rw-r--r-- | tactics/equality.ml | 14 | ||||
| -rw-r--r-- | tactics/ind_tables.ml | 19 | ||||
| -rw-r--r-- | tactics/ind_tables.mli | 2 | ||||
| -rw-r--r-- | vernac/auto_ind_decl.ml | 14 |
4 files changed, 23 insertions, 26 deletions
diff --git a/tactics/equality.ml b/tactics/equality.ml index 8f2336c0e0..f3073acb0a 100644 --- a/tactics/equality.ml +++ b/tactics/equality.ml @@ -411,8 +411,7 @@ let find_elim hdcncl lft2rgt dep cls ot = match EConstr.kind sigma hdcncl with | Ind (ind,u) -> - let c, eff = find_scheme scheme_name ind in - Proofview.tclEFFECTS eff <*> + find_scheme scheme_name ind >>= fun c -> pf_constr_of_global (GlobRef.ConstRef c) | _ -> assert false end @@ -1001,14 +1000,13 @@ let ind_scheme_of_eq lbeq to_kind = let from_kind = inductive_sort_family mip in (* use ind rather than case by compatibility *) let kind = Elimschemes.nondep_elim_scheme from_kind to_kind in - let c, eff = find_scheme kind (destIndRef lbeq.eq) in - GlobRef.ConstRef c, eff + find_scheme kind (destIndRef lbeq.eq) >>= fun c -> + Proofview.tclUNIT (GlobRef.ConstRef c) let discrimination_pf e (t,t1,t2) discriminator lbeq to_kind = build_coq_I () >>= fun i -> - let eq_elim, eff = ind_scheme_of_eq lbeq to_kind in - Proofview.tclEFFECTS eff <*> + ind_scheme_of_eq lbeq to_kind >>= fun eq_elim -> pf_constr_of_global eq_elim >>= fun eq_elim -> Proofview.tclUNIT (applist (eq_elim, [t;t1;mkNamedLambda (make_annot e Sorts.Relevant) t discriminator;i;t2])) @@ -1352,10 +1350,10 @@ let inject_if_homogenous_dependent_pair ty = check_required_library ["Coq";"Logic";"Eqdep_dec"]; let new_eq_args = [|pf_get_type_of gl ar1.(3);ar1.(3);ar2.(3)|] in let inj2 = lib_ref "core.eqdep_dec.inj_pair2" in - let c, eff = find_scheme (!eq_dec_scheme_kind_name()) ind in + find_scheme (!eq_dec_scheme_kind_name()) ind >>= fun c -> (* cut with the good equality and prove the requested goal *) tclTHENLIST - [Proofview.tclEFFECTS eff; + [ intro; onLastHyp (fun hyp -> Tacticals.New.pf_constr_of_global Coqlib.(lib_ref "core.eq.type") >>= fun ceq -> diff --git a/tactics/ind_tables.ml b/tactics/ind_tables.ml index ae27cf1019..9164a4ff26 100644 --- a/tactics/ind_tables.ml +++ b/tactics/ind_tables.ml @@ -165,23 +165,26 @@ and declare_scheme_dependence mode eff = function let _, eff' = define_mutual_scheme kind mode [] mind in Evd.concat_side_effects eff' eff -let find_scheme_on_env_too kind ind = - let s = DeclareScheme.lookup_scheme kind ind in - s, Evd.empty_side_effects - let find_scheme ?(mode=InternalTacticRequest) kind (mind,i as ind) = - try find_scheme_on_env_too kind ind - with Not_found -> + let open Proofview.Notations in + match lookup_scheme kind ind with + | Some s -> + (* FIXME: we need to perform this call to reset the environment, since the + imperative scheme table is desynchronized from the monadic interface. *) + Proofview.tclEFFECTS Evd.empty_side_effects <*> + Proofview.tclUNIT s + | None -> match Hashtbl.find scheme_object_table kind with | s,IndividualSchemeFunction (f, deps) -> let deps = match deps with None -> [] | Some deps -> deps ind in let eff = List.fold_left (fun eff dep -> declare_scheme_dependence mode eff dep) Evd.empty_side_effects deps in - define_individual_scheme_base kind s f mode None ind eff + let c, eff = define_individual_scheme_base kind s f mode None ind eff in + Proofview.tclEFFECTS eff <*> Proofview.tclUNIT c | s,MutualSchemeFunction (f, deps) -> let deps = match deps with None -> [] | Some deps -> deps mind in let eff = List.fold_left (fun eff dep -> declare_scheme_dependence mode eff dep) Evd.empty_side_effects deps in let ca, eff = define_mutual_scheme_base kind s f mode [] mind eff in - ca.(i), eff + Proofview.tclEFFECTS eff <*> Proofview.tclUNIT ca.(i) let define_individual_scheme kind mode names ind = ignore (define_individual_scheme kind mode names ind) diff --git a/tactics/ind_tables.mli b/tactics/ind_tables.mli index 9259a4a540..09fb051194 100644 --- a/tactics/ind_tables.mli +++ b/tactics/ind_tables.mli @@ -59,7 +59,7 @@ val define_mutual_scheme : mutual scheme_kind -> internal_flag (** internal *) - (int * Id.t) list -> MutInd.t -> unit (** Main function to retrieve a scheme in the cache or to generate it *) -val find_scheme : ?mode:internal_flag -> 'a scheme_kind -> inductive -> Constant.t * Evd.side_effects +val find_scheme : ?mode:internal_flag -> 'a scheme_kind -> inductive -> Constant.t Proofview.tactic (** Like [find_scheme] but does not generate a constant on the fly *) val lookup_scheme : 'a scheme_kind -> inductive -> Constant.t option diff --git a/vernac/auto_ind_decl.ml b/vernac/auto_ind_decl.ml index 5fb12092d7..ebea5e146c 100644 --- a/vernac/auto_ind_decl.ml +++ b/vernac/auto_ind_decl.ml @@ -442,7 +442,7 @@ let do_replace_lb mode lb_scheme_key aavoid narg p q = let sigma = Tacmach.New.project gl in let env = Tacmach.New.pf_env gl in let u,v = destruct_ind env sigma type_of_pq in - let c, eff = find_scheme ~mode lb_scheme_key (fst u) (*FIXME*) in + find_scheme ~mode lb_scheme_key (fst u) (*FIXME*) >>= fun c -> let lb_type_of_p = mkConst c in Proofview.tclEVARMAP >>= fun sigma -> let lb_args = Array.append (Array.append @@ -453,7 +453,6 @@ let do_replace_lb mode lb_scheme_key aavoid narg p q = then lb_type_of_p else mkApp (lb_type_of_p,lb_args) in Tacticals.New.tclTHENLIST [ - Proofview.tclEFFECTS eff; Equality.replace p q ; apply app ; Auto.default_auto] end @@ -499,7 +498,7 @@ let do_replace_bl bl_scheme_key (ind,u as indu) aavoid narg lft rgt = in if eq_ind (fst u) ind then Tacticals.New.tclTHENLIST [Equality.replace t1 t2; Auto.default_auto ; aux q1 q2 ] else ( - let c, eff = find_scheme bl_scheme_key (fst u) (*FIXME*) in + find_scheme bl_scheme_key (fst u) (*FIXME*) >>= fun c -> let bl_t1 = mkConst c in let bl_args = Array.append (Array.append @@ -511,7 +510,6 @@ let do_replace_bl bl_scheme_key (ind,u as indu) aavoid narg lft rgt = then bl_t1 else mkApp (bl_t1,bl_args) in Tacticals.New.tclTHENLIST [ - Proofview.tclEFFECTS eff; Equality.replace_by t1 t2 (Tacticals.New.tclTHEN (apply app) (Auto.default_auto)) ; aux q1 q2 ] @@ -928,7 +926,7 @@ let compute_dec_tact ind lnamesparrec nparrec = let eq = eq () and tt = tt () and ff = ff () and bb = bb () in let list_id = list_id lnamesparrec in - let (_, eff) = find_scheme beq_scheme_kind ind in + find_scheme beq_scheme_kind ind >>= fun _ -> let eqI = eqI ind lnamesparrec in let avoid = ref [] in let eqtrue x = mkApp(eq,[|bb;x;tt|]) in @@ -951,13 +949,11 @@ let compute_dec_tact ind lnamesparrec nparrec = let eqbnm = mkApp(eqI,[|mkVar freshn;mkVar freshm|]) in let arfresh = Array.of_list fresh_first_intros in let xargs = Array.sub arfresh 0 (2*nparrec) in - let c, eff' = find_scheme bl_scheme_kind ind in + find_scheme bl_scheme_kind ind >>= fun c -> let blI = mkConst c in - let c, eff'' = find_scheme lb_scheme_kind ind in + find_scheme lb_scheme_kind ind >>= fun c -> let lbI = mkConst c in - let eff = (Evd.concat_side_effects eff'' (Evd.concat_side_effects eff' eff)) in Tacticals.New.tclTHENLIST [ - Proofview.tclEFFECTS eff; intros_using fresh_first_intros; intros_using [freshn;freshm]; (*we do this so we don't have to prove the same goal twice *) |
