sig
  module Ring :
    sig
      type t = K.t
      val eq : t -> t -> bool
      val add : t -> t -> t
      val zero : t
      val neg : t -> t
      val mul : t -> t -> t
      val one : t
      val to_string : t -> string
    end
  module E :
    sig
      type key = M.Anick.t
      type 'a t = 'Map.Make(M.Anick).t
      val empty : 'a t
      val is_empty : 'a t -> bool
      val mem : key -> 'a t -> bool
      val update : key -> ('a option -> 'a option) -> 'a t -> 'a t
      val singleton : key -> '-> 'a t
      val remove : key -> 'a t -> 'a t
      val merge :
        (key -> 'a option -> 'b option -> 'c option) -> 'a t -> 'b t -> 'c t
      val union : (key -> '-> '-> 'a option) -> 'a t -> 'a t -> 'a t
      val compare : ('-> '-> int) -> 'a t -> 'a t -> int
      val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
      val iter : (key -> '-> unit) -> 'a t -> unit
      val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
      val for_all : (key -> '-> bool) -> 'a t -> bool
      val exists : (key -> '-> bool) -> 'a t -> bool
      val filter : (key -> '-> bool) -> 'a t -> 'a t
      val partition : (key -> '-> bool) -> 'a t -> 'a t * 'a t
      val cardinal : 'a t -> int
      val bindings : 'a t -> (key * 'a) list
      val min_binding : 'a t -> key * 'a
      val min_binding_opt : 'a t -> (key * 'a) option
      val max_binding : 'a t -> key * 'a
      val max_binding_opt : 'a t -> (key * 'a) option
      val choose : 'a t -> key * 'a
      val choose_opt : 'a t -> (key * 'a) option
      val split : key -> 'a t -> 'a t * 'a option * 'a t
      val find : key -> 'a t -> 'a
      val find_opt : key -> 'a t -> 'a option
      val find_first : (key -> bool) -> 'a t -> key * 'a
      val find_first_opt : (key -> bool) -> 'a t -> (key * 'a) option
      val find_last : (key -> bool) -> 'a t -> key * 'a
      val find_last_opt : (key -> bool) -> 'a t -> (key * 'a) option
      val map : ('-> 'b) -> 'a t -> 'b t
      val mapi : (key -> '-> 'b) -> 'a t -> 'b t
      val to_seq : 'a t -> (key * 'a) Seq.t
      val to_seq_from : key -> 'a t -> (key * 'a) Seq.t
      val add_seq : (key * 'a) Seq.t -> 'a t -> 'a t
      val of_seq : (key * 'a) Seq.t -> 'a t
      val add : key -> K.t -> K.t t -> K.t t
    end
  type r = K.t
  type t = r E.t
  val zero : t
  val cinj : K.t -> M.Anick.t -> t
  val inj : M.Anick.t -> t
  val coeff : t -> M.Anick.t -> r
  val included : t -> t -> bool
  val eq : t -> t -> bool
  val add_monomial : t -> r -> M.Anick.t -> t
  val add : t -> t -> t
  val cmul : K.t -> t -> t
  val neg : t -> t
  val sub : t -> t -> t
  val to_string : t -> string
  val map : (M.Anick.t -> t) -> t -> t
  val iter : (K.t -> M.Anick.t -> unit) -> K.t E.t -> unit
  module Map :
    sig
      module E :
        sig
          type key = M.Anick.t
          type 'a t = 'Map.Make(M.Anick).t
          val empty : 'a t
          val is_empty : 'a t -> bool
          val mem : key -> 'a t -> bool
          val add : key -> '-> 'a t -> 'a t
          val update : key -> ('a option -> 'a option) -> 'a t -> 'a t
          val singleton : key -> '-> 'a t
          val remove : key -> 'a t -> 'a t
          val merge :
            (key -> 'a option -> 'b option -> 'c option) ->
            'a t -> 'b t -> 'c t
          val union : (key -> '-> '-> 'a option) -> 'a t -> 'a t -> 'a t
          val compare : ('-> '-> int) -> 'a t -> 'a t -> int
          val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
          val iter : (key -> '-> unit) -> 'a t -> unit
          val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
          val for_all : (key -> '-> bool) -> 'a t -> bool
          val exists : (key -> '-> bool) -> 'a t -> bool
          val filter : (key -> '-> bool) -> 'a t -> 'a t
          val partition : (key -> '-> bool) -> 'a t -> 'a t * 'a t
          val cardinal : 'a t -> int
          val bindings : 'a t -> (key * 'a) list
          val min_binding : 'a t -> key * 'a
          val min_binding_opt : 'a t -> (key * 'a) option
          val max_binding : 'a t -> key * 'a
          val max_binding_opt : 'a t -> (key * 'a) option
          val choose : 'a t -> key * 'a
          val choose_opt : 'a t -> (key * 'a) option
          val split : key -> 'a t -> 'a t * 'a option * 'a t
          val find : key -> 'a t -> 'a
          val find_opt : key -> 'a t -> 'a option
          val find_first : (key -> bool) -> 'a t -> key * 'a
          val find_first_opt : (key -> bool) -> 'a t -> (key * 'a) option
          val find_last : (key -> bool) -> 'a t -> key * 'a
          val find_last_opt : (key -> bool) -> 'a t -> (key * 'a) option
          val map : ('-> 'b) -> 'a t -> 'b t
          val mapi : (key -> '-> 'b) -> 'a t -> 'b t
          val to_seq : 'a t -> (key * 'a) Seq.t
          val to_seq_from : key -> 'a t -> (key * 'a) Seq.t
          val add_seq : (key * 'a) Seq.t -> 'a t -> 'a t
          val of_seq : (key * 'a) Seq.t -> 'a t
        end
      type map = t E.t
      val set : map -> M.Anick.t -> t -> map
      val app : map -> M.Anick.t -> t
      val bind : map -> t -> t
      val zero : map
      val to_string : map -> string
      type t = map
    end
  module Presentation :
    sig
      type pres = M.Anick.t array
      type t = pres
      val make : t -> t
      val dim : t -> int
      val presentation_to_string : M.Anick.t array -> string
      module Map :
        sig
          module M :
            sig
              type t = K.t array array
              type matrix = t
              val zero : int -> int -> t
              val init : int -> int -> (int -> int -> K.t) -> t
              val rows : t -> int
              val cols : t -> int
              val get : t -> int -> int -> K.t
              val to_string : t -> string
              module Row :
                sig
                  val is_zero : K.t array array -> int -> bool
                  val replace : t -> int -> K.t array -> t
                  val exchange : t -> int -> int -> t
                  val mult : t -> K.t -> int -> t
                  val madd : t -> int -> K.t -> int -> t
                end
              val row_echelon : t -> t
              val rank : t -> int
              val nullity : t -> int
              module Labeled :
                functor (X : Alphabet.T->
                  sig
                    module L :
                      sig
                        type key = X.t
                        type 'a t = 'Map.Make(X).t
                        val empty : 'a t
                        val is_empty : 'a t -> bool
                        val mem : key -> 'a t -> bool
                        val add : key -> '-> 'a t -> 'a t
                        val update :
                          key -> ('a option -> 'a option) -> 'a t -> 'a t
                        val singleton : key -> '-> 'a t
                        val remove : key -> 'a t -> 'a t
                        val merge :
                          (key -> 'a option -> 'b option -> 'c option) ->
                          'a t -> 'b t -> 'c t
                        val union :
                          (key -> '-> '-> 'a option) ->
                          'a t -> 'a t -> 'a t
                        val compare :
                          ('-> '-> int) -> 'a t -> 'a t -> int
                        val equal :
                          ('-> '-> bool) -> 'a t -> 'a t -> bool
                        val fold :
                          (key -> '-> '-> 'b) -> 'a t -> '-> 'b
                        val for_all : (key -> '-> bool) -> 'a t -> bool
                        val exists : (key -> '-> bool) -> 'a t -> bool
                        val filter : (key -> '-> bool) -> 'a t -> 'a t
                        val partition :
                          (key -> '-> bool) -> 'a t -> 'a t * 'a t
                        val cardinal : 'a t -> int
                        val bindings : 'a t -> (key * 'a) list
                        val min_binding : 'a t -> key * 'a
                        val min_binding_opt : 'a t -> (key * 'a) option
                        val max_binding : 'a t -> key * 'a
                        val max_binding_opt : 'a t -> (key * 'a) option
                        val choose : 'a t -> key * 'a
                        val choose_opt : 'a t -> (key * 'a) option
                        val split : key -> 'a t -> 'a t * 'a option * 'a t
                        val find_opt : key -> 'a t -> 'a option
                        val find_first : (key -> bool) -> 'a t -> key * 'a
                        val find_first_opt :
                          (key -> bool) -> 'a t -> (key * 'a) option
                        val find_last : (key -> bool) -> 'a t -> key * 'a
                        val find_last_opt :
                          (key -> bool) -> 'a t -> (key * 'a) option
                        val map : ('-> 'b) -> 'a t -> 'b t
                        val mapi : (key -> '-> 'b) -> 'a t -> 'b t
                        val to_seq : 'a t -> (key * 'a) Seq.t
                        val to_seq_from : key -> 'a t -> (key * 'a) Seq.t
                        val add_seq : (key * 'a) Seq.t -> 'a t -> 'a t
                        val of_seq : (key * 'a) Seq.t -> 'a t
                        val find : X.t -> 'a t -> 'a
                        val iter : (X.t -> '-> unit) -> 'a t -> unit
                        val of_array : X.t array -> int t
                      end
                    type map = int L.t
                    type t = map * map * matrix
                    val matrix : t -> matrix
                    val zero : X.t array -> X.t array -> t
                    val set : t -> X.t -> X.t -> K.t -> unit
                    val get : t -> X.t -> X.t -> K.t
                    val rank : t -> int
                    val nullity : t -> int
                    val iter_src : (X.t -> unit) -> t -> unit
                    val iter_tgt : (X.t -> unit) -> t -> unit
                    val iter : (X.t -> X.t -> unit) -> t -> unit
                  end
            end
          module L :
            sig
              module L :
                sig
                  type key = M.Anick.t
                  type 'a t = 'Map.Make(M.Anick).t
                  val empty : 'a t
                  val is_empty : 'a t -> bool
                  val mem : key -> 'a t -> bool
                  val add : key -> '-> 'a t -> 'a t
                  val update :
                    key -> ('a option -> 'a option) -> 'a t -> 'a t
                  val singleton : key -> '-> 'a t
                  val remove : key -> 'a t -> 'a t
                  val merge :
                    (key -> 'a option -> 'b option -> 'c option) ->
                    'a t -> 'b t -> 'c t
                  val union :
                    (key -> '-> '-> 'a option) -> 'a t -> 'a t -> 'a t
                  val compare : ('-> '-> int) -> 'a t -> 'a t -> int
                  val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
                  val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
                  val for_all : (key -> '-> bool) -> 'a t -> bool
                  val exists : (key -> '-> bool) -> 'a t -> bool
                  val filter : (key -> '-> bool) -> 'a t -> 'a t
                  val partition : (key -> '-> bool) -> 'a t -> 'a t * 'a t
                  val cardinal : 'a t -> int
                  val bindings : 'a t -> (key * 'a) list
                  val min_binding : 'a t -> key * 'a
                  val min_binding_opt : 'a t -> (key * 'a) option
                  val max_binding : 'a t -> key * 'a
                  val max_binding_opt : 'a t -> (key * 'a) option
                  val choose : 'a t -> key * 'a
                  val choose_opt : 'a t -> (key * 'a) option
                  val split : key -> 'a t -> 'a t * 'a option * 'a t
                  val find_opt : key -> 'a t -> 'a option
                  val find_first : (key -> bool) -> 'a t -> key * 'a
                  val find_first_opt :
                    (key -> bool) -> 'a t -> (key * 'a) option
                  val find_last : (key -> bool) -> 'a t -> key * 'a
                  val find_last_opt :
                    (key -> bool) -> 'a t -> (key * 'a) option
                  val map : ('-> 'b) -> 'a t -> 'b t
                  val mapi : (key -> '-> 'b) -> 'a t -> 'b t
                  val to_seq : 'a t -> (key * 'a) Seq.t
                  val to_seq_from : key -> 'a t -> (key * 'a) Seq.t
                  val add_seq : (key * 'a) Seq.t -> 'a t -> 'a t
                  val of_seq : (key * 'a) Seq.t -> 'a t
                  val find : M.Anick.t -> 'a t -> 'a
                  val iter : (M.Anick.t -> '-> unit) -> 'a t -> unit
                  val of_array : M.Anick.t array -> int t
                end
              type map = int L.t
              type t = map * map * M.matrix
              val matrix : t -> M.matrix
              val zero : M.Anick.t array -> M.Anick.t array -> t
              val set : t -> M.Anick.t -> M.Anick.t -> K.t -> unit
              val get : t -> M.Anick.t -> M.Anick.t -> K.t
              val rank : t -> int
              val nullity : t -> int
              val iter_src : (M.Anick.t -> unit) -> t -> unit
              val iter_tgt : (M.Anick.t -> unit) -> t -> unit
              val iter : (M.Anick.t -> M.Anick.t -> unit) -> t -> unit
            end
          type map = L.t
          type t = map
          val app : t -> t -> t
          val zero : M.Anick.t array -> M.Anick.t array -> t
          val of_map : Map.map -> M.Anick.t array -> M.Anick.t array -> t
          val to_map : t -> Map.map
          val rank : t -> int
          val nullity : t -> int
          val to_string : t -> string
        end
      val iter : (M.Anick.t -> unit) -> t -> unit
      module Complex :
        sig
          type t =
            Module.FreeLeft(K)(M.Anick).Presentation.Complex.t = {
            modules : pres array;
            d : Map.t array;
          }
          val modules : t -> pres array
          val maps : t -> Map.t array
          val length : t -> int
          val make : pres array -> Map.t array -> t
          val valid : t -> bool
          val to_string : t -> string
          val homology : t -> int array
        end
      val to_string : M.Anick.t array -> string
    end
end