aboutsummaryrefslogtreecommitdiff
path: root/pretyping/typeclasses.mli
diff options
context:
space:
mode:
Diffstat (limited to 'pretyping/typeclasses.mli')
-rw-r--r--pretyping/typeclasses.mli148
1 files changed, 148 insertions, 0 deletions
diff --git a/pretyping/typeclasses.mli b/pretyping/typeclasses.mli
new file mode 100644
index 0000000000..f8aedf88c2
--- /dev/null
+++ b/pretyping/typeclasses.mli
@@ -0,0 +1,148 @@
+(************************************************************************)
+(* * The Coq Proof Assistant / The Coq Development Team *)
+(* v * INRIA, CNRS and contributors - Copyright 1999-2018 *)
+(* <O___,, * (see CREDITS file for the list of authors) *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(* * (see LICENSE file for the text of the license) *)
+(************************************************************************)
+
+open Names
+open Globnames
+open Constr
+open Evd
+open Environ
+
+type direction = Forward | Backward
+
+(* Core typeclasses hints *)
+type 'a hint_info_gen =
+ { hint_priority : int option;
+ hint_pattern : 'a option }
+
+type hint_info = (Pattern.patvar list * Pattern.constr_pattern) hint_info_gen
+
+(** This module defines type-classes *)
+type typeclass = {
+ cl_univs : Univ.AUContext.t;
+ (** The toplevel universe quantification in which the typeclass lives. In
+ particular, [cl_props] and [cl_context] are quantified over it. *)
+
+ cl_impl : GlobRef.t;
+ (** The class implementation: a record parameterized by the context with defs in it or a definition if
+ the class is a singleton. This acts as the class' global identifier. *)
+
+ cl_context : GlobRef.t option list * Constr.rel_context;
+ (** Context in which the definitions are typed. Includes both typeclass parameters and superclasses.
+ The global reference gives a direct link to the class itself. *)
+
+ cl_props : Constr.rel_context;
+ (** Context of definitions and properties on defs, will not be shared *)
+
+ cl_projs : (Name.t * (direction * hint_info) option * Constant.t option) list;
+ (** The methods implementations of the typeclass as projections.
+ Some may be undefinable due to sorting restrictions or simply undefined if
+ no name is provided. The [int option option] indicates subclasses whose hint has
+ the given priority. *)
+
+ cl_strict : bool;
+ (** Whether we use matching or full unification during resolution *)
+
+ cl_unique : bool;
+ (** Whether we can assume that instances are unique, which allows
+ no backtracking and sharing of resolution. *)
+}
+
+type instance
+
+val instances : GlobRef.t -> instance list
+val typeclasses : unit -> typeclass list
+val all_instances : unit -> instance list
+
+val add_class : typeclass -> unit
+
+val new_instance : typeclass -> hint_info -> bool -> GlobRef.t -> instance
+val add_instance : instance -> unit
+val remove_instance : instance -> unit
+
+val class_info : GlobRef.t -> typeclass (** raises a UserError if not a class *)
+
+
+(** These raise a UserError if not a class.
+ Caution: the typeclass structures is not instantiated w.r.t. the universe instance.
+ This is done separately by typeclass_univ_instance. *)
+val dest_class_app : env -> evar_map -> EConstr.constr -> (typeclass * EConstr.EInstance.t) * constr list
+
+(** Get the instantiated typeclass structure for a given universe instance. *)
+val typeclass_univ_instance : typeclass Univ.puniverses -> typeclass
+
+(** Just return None if not a class *)
+val class_of_constr : evar_map -> EConstr.constr -> (EConstr.rel_context * ((typeclass * EConstr.EInstance.t) * constr list)) option
+
+val instance_impl : instance -> GlobRef.t
+
+val hint_priority : instance -> int option
+
+val is_class : GlobRef.t -> bool
+
+(** Returns the term and type for the given instance of the parameters and fields
+ of the type class. *)
+
+val instance_constructor : typeclass EConstr.puniverses -> EConstr.t list ->
+ EConstr.t option * EConstr.t
+
+(** Filter which evars to consider for resolution. *)
+type evar_filter = Evar.t -> Evar_kinds.t Lazy.t -> bool
+val all_evars : evar_filter
+val all_goals : evar_filter
+val no_goals : evar_filter
+val no_goals_or_obligations : evar_filter
+
+(** Resolvability.
+ Only undefined evars can be marked or checked for resolvability.
+ They represent type-class search roots.
+
+ A resolvable evar is an evar the type-class engine may try to solve
+ An unresolvable evar is an evar the type-class engine will NOT try to solve
+*)
+
+val make_unresolvables : (Evar.t -> bool) -> evar_map -> evar_map
+
+val is_class_evar : evar_map -> evar_info -> bool
+val is_class_type : evar_map -> EConstr.types -> bool
+
+val resolve_typeclasses : ?filter:evar_filter -> ?unique:bool ->
+ ?split:bool -> ?fail:bool -> env -> evar_map -> evar_map
+val resolve_one_typeclass : ?unique:bool -> env -> evar_map -> EConstr.types -> evar_map * EConstr.constr
+
+val set_typeclass_transparency_hook : (evaluable_global_reference -> bool (*local?*) -> bool -> unit) Hook.t
+val set_typeclass_transparency : evaluable_global_reference -> bool -> bool -> unit
+
+val classes_transparent_state_hook : (unit -> TransparentState.t) Hook.t
+val classes_transparent_state : unit -> TransparentState.t
+
+val add_instance_hint_hook :
+ (global_reference_or_constr -> GlobRef.t list ->
+ bool (* local? *) -> hint_info -> Decl_kinds.polymorphic -> unit) Hook.t
+val remove_instance_hint_hook : (GlobRef.t -> unit) Hook.t
+val add_instance_hint : global_reference_or_constr -> GlobRef.t list ->
+ bool -> hint_info -> Decl_kinds.polymorphic -> unit
+val remove_instance_hint : GlobRef.t -> unit
+
+val solve_all_instances_hook : (env -> evar_map -> evar_filter -> bool -> bool -> bool -> evar_map) Hook.t
+val solve_one_instance_hook : (env -> evar_map -> EConstr.types -> bool -> evar_map * EConstr.constr) Hook.t
+
+(** Declares the given global reference as an instance of its type.
+ Does nothing — or emit a “not-a-class” warning if the [warn] argument is set —
+ when said type is not a registered type class. *)
+val declare_instance : ?warn:bool -> hint_info option -> bool -> GlobRef.t -> unit
+
+
+(** Build the subinstances hints for a given typeclass object.
+ check tells if we should check for existence of the
+ subinstances and add only the missing ones. *)
+
+val build_subclasses : check:bool -> env -> evar_map -> GlobRef.t ->
+ hint_info ->
+ (GlobRef.t list * hint_info * constr) list