aboutsummaryrefslogtreecommitdiff
path: root/pretyping/typeclasses.ml
diff options
context:
space:
mode:
authorPierre-Marie Pédrot2020-09-28 11:14:23 +0200
committerPierre-Marie Pédrot2020-09-30 13:20:27 +0200
commite3a1cf35313bbc4eaca2a43f5fc95ca306bc45fa (patch)
tree288992d95abc5eadcdaa22867ebf0fd944e07a72 /pretyping/typeclasses.ml
parent2c802aaf74c83274ae922c59081c01bfc267d31b (diff)
Remove the forward class hint feature.
It was not documented, not properly tested and thus likely buggy. Judging from the code alone I spotted already one potential bug. Further more it was prominently making use of the infamous "arbitrary term as hint" feature. Since the only user in our CI seems to be a math-classes file that introduced the feature under a claim of "cleanup", I believe we can safely remove it without anyone noticing.
Diffstat (limited to 'pretyping/typeclasses.ml')
-rw-r--r--pretyping/typeclasses.ml63
1 files changed, 1 insertions, 62 deletions
diff --git a/pretyping/typeclasses.ml b/pretyping/typeclasses.ml
index adb9c5299f..78f04c99e5 100644
--- a/pretyping/typeclasses.ml
+++ b/pretyping/typeclasses.ml
@@ -11,7 +11,6 @@
(*i*)
open Names
open Globnames
-open Term
open Constr
open Vars
open Evd
@@ -42,7 +41,7 @@ let get_solve_one_instance, solve_one_instance_hook = Hook.make ()
let resolve_one_typeclass ?(unique=get_typeclasses_unique_solutions ()) env evm t =
Hook.get get_solve_one_instance env evm t unique
-type direction = Forward | Backward
+type direction = Backward
(* This module defines type-classes *)
type typeclass = {
@@ -156,66 +155,6 @@ let load_class cl =
(** Build the subinstances hints. *)
-let check_instance env sigma c =
- try
- let (evd, c) = resolve_one_typeclass env sigma
- (Retyping.get_type_of env sigma c) in
- not (Evd.has_undefined evd)
- with e when CErrors.noncritical e -> false
-
-let build_subclasses ~check env sigma glob { hint_priority = pri } =
- let _id = Nametab.basename_of_global glob in
- let _next_id =
- let i = ref (-1) in
- (fun () -> incr i;
- Nameops.add_suffix _id ("_subinstance_" ^ string_of_int !i))
- in
- let ty, ctx = Typeops.type_of_global_in_context env glob in
- let inst, ctx = UnivGen.fresh_instance_from ctx None in
- let ty = Vars.subst_instance_constr inst ty in
- let ty = EConstr.of_constr ty in
- let sigma = Evd.merge_context_set Evd.univ_rigid sigma ctx in
- let rec aux pri c ty path =
- match class_of_constr env sigma ty with
- | None -> []
- | Some (rels, ((tc,u), args)) ->
- let instapp =
- Reductionops.whd_beta env sigma (EConstr.of_constr (appvectc c (Context.Rel.to_extended_vect mkRel 0 rels)))
- in
- let instapp = EConstr.Unsafe.to_constr instapp in
- let projargs = Array.of_list (args @ [instapp]) in
- let projs = List.map_filter
- (fun (n, b, proj) ->
- match b with
- | None -> None
- | Some (Backward, _) -> None
- | Some (Forward, info) ->
- let proj = Option.get proj in
- let rels = List.map (fun d -> Termops.map_rel_decl EConstr.Unsafe.to_constr d) rels in
- let u = EConstr.EInstance.kind sigma u in
- let body = it_mkLambda_or_LetIn (mkApp (mkConstU (proj,u), projargs)) rels in
- if check && check_instance env sigma (EConstr.of_constr body) then None
- else
- let newpri =
- match pri, info.hint_priority with
- | Some p, Some p' -> Some (p + p')
- | Some p, None -> Some (p + 1)
- | _, _ -> None
- in
- Some (GlobRef.ConstRef proj, { info with hint_priority = newpri }, body)) tc.cl_projs
- in
- let declare_proj hints (cref, info, body) =
- let path' = cref :: path in
- let ty = Retyping.get_type_of env sigma (EConstr.of_constr body) in
- let rest = aux pri body ty path' in
- hints @ (path', info, body) :: rest
- in List.fold_left declare_proj [] projs
- in
- let term = Constr.mkRef (glob, inst) in
- (*FIXME subclasses should now get substituted for each particular instance of
- the polymorphic superclass *)
- aux pri term ty [glob]
-
(*
* interface functions
*)