sig
  type result =
      (TypeCore.env * Derivations.derivation, Derivations.derivation)
      Either.either
  val unify : TypeCore.env -> TypeCore.var -> TypeCore.var -> TypeCore.env
  val add : TypeCore.env -> TypeCore.var -> TypeCore.typ -> TypeCore.env
  val add_perm : TypeCore.env -> TypeCore.typ -> TypeCore.env
  val sub :
    TypeCore.env -> TypeCore.var -> TypeCore.typ -> Permissions.result
  val sub_type :
    TypeCore.env -> TypeCore.typ -> TypeCore.typ -> Permissions.result
  val sub_perm : TypeCore.env -> TypeCore.typ -> Permissions.result
  val add_hint : TypeCore.name option -> string -> TypeCore.name option
  val sub_constraint :
    TypeCore.env -> TypeCore.mode_constraint -> Permissions.result
  val keep_only_duplicable : TypeCore.env -> TypeCore.env
  val instantiate_flexible :
    TypeCore.env -> TypeCore.var -> TypeCore.typ -> TypeCore.env option
  val import_flex_instanciations :
    TypeCore.env -> TypeCore.env -> TypeCore.env
  val drop_derivation : Permissions.result -> TypeCore.env option
  val safety_check : TypeCore.env -> unit
end