sig
  module Mod :
    sig
      module Ring :
        sig
          type t = Ring.Op(A).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 -> Ring.Op(A).t -> Ring.Op(A).t t -> Ring.Op(A).t t
        end
      type r = Ring.Op(A).t
      type t = r E.t
      val zero : 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 neg : t -> t
      val sub : t -> t -> t
      val map : (M.Anick.t -> t) -> t -> t
      val iter :
        (Ring.Op(A).t -> M.Anick.t -> unit) -> Ring.Op(A).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 = Ring.Op(A).t array array
                  type matrix = t
                  val zero : int -> int -> t
                  val init : int -> int -> (int -> int -> Ring.Op(A).t) -> t
                  val rows : t -> int
                  val cols : t -> int
                  val get : t -> int -> int -> Ring.Op(A).t
                  val to_string : t -> string
                  module Row :
                    sig
                      val is_zero : Ring.Op(A).t array array -> int -> bool
                      val replace : t -> int -> Ring.Op(A).t array -> t
                      val exchange : t -> int -> int -> t
                      val mult : t -> Ring.Op(A).t -> int -> t
                      val madd : t -> int -> Ring.Op(A).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 -> Ring.Op(A).t -> unit
                        val get : t -> X.t -> X.t -> Ring.Op(A).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 -> Ring.Op(A).t -> unit
                  val get : t -> M.Anick.t -> M.Anick.t -> Ring.Op(A).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(Ring.Op(A))(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
      val cinj : M.Anick.t -> Ring.Op(A).t -> t
      val cmul : t -> Ring.Op(A).t -> t
      val to_string : t -> string
    end
  module Ring :
    sig
      type t = Ring.Op(A).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 -> Ring.Op(A).t -> Ring.Op(A).t t -> Ring.Op(A).t t
    end
  type r = Ring.Op(A).t
  type t = r E.t
  val zero : 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 neg : t -> t
  val sub : t -> t -> t
  val map : (M.Anick.t -> t) -> t -> t
  val iter : (Ring.Op(A).t -> M.Anick.t -> unit) -> Ring.Op(A).t E.t -> unit
  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 = Ring.Op(A).t array array
              type matrix = t
              val zero : int -> int -> t
              val init : int -> int -> (int -> int -> Ring.Op(A).t) -> t
              val rows : t -> int
              val cols : t -> int
              val get : t -> int -> int -> Ring.Op(A).t
              val to_string : t -> string
              module Row :
                sig
                  val is_zero : Ring.Op(A).t array array -> int -> bool
                  val replace : t -> int -> Ring.Op(A).t array -> t
                  val exchange : t -> int -> int -> t
                  val mult : t -> Ring.Op(A).t -> int -> t
                  val madd : t -> int -> Ring.Op(A).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 -> Ring.Op(A).t -> unit
                    val get : t -> X.t -> X.t -> Ring.Op(A).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 -> Ring.Op(A).t -> unit
              val get : t -> M.Anick.t -> M.Anick.t -> Ring.Op(A).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 : Mod.Map.map -> M.Anick.t array -> M.Anick.t array -> t
          val to_map : t -> Mod.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(Ring.Op(A))(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
  val cinj : M.Anick.t -> Ring.Op(A).t -> t
  val cmul : t -> Ring.Op(A).t -> t
  val to_string : t -> string
  val normalize :
    Algebra.Presentation.t -> Ring.Op(A).t E.t -> Algebra.Presentation.t
  module Map :
    sig
      module E = Mod.Map.E
      type map = Mod.t E.t
      val set : map -> M.Anick.t -> Mod.t -> map
      val app : map -> M.Anick.t -> Mod.t
      val zero : map
      val to_string : map -> string
      type t = map
      val bind :
        Algebra.Presentation.t ->
        map ->
        Algebra.Presentation.Anick.AMod.Mod.t -> Algebra.Presentation.t
    end
end