functor (X : Alphabet.T->
  sig
    module W :
      sig
        type t = X.t array
        type word = t
        val mul : t -> t -> t
        val one : t
        val inj : X.t -> t
        val length : t -> int
        val sub : t -> int -> int -> t
        val eq : t -> t -> bool
        val compare : t -> t -> int
        val peq : t -> int -> t -> int -> int -> bool
        val to_string : t -> string
        val included : t -> t -> bool
        val unifier : ?i:int -> t -> t -> int
        val ordered_unifiers : t -> t -> int list
        val ordered_unifiers_bicontext : t -> t -> ((t * t) * (t * t)) list
        val unifiers_bicontext : t -> t -> ((t * t) * (t * t)) list
        module Order :
          sig
            val lexicographic : (X.t -> X.t -> bool) -> t -> t -> bool
            val deglex : (X.t -> X.t -> bool) -> t -> t -> bool
          end
        module Anick :
          sig
            type t = word list
            val empty : t
            val singleton : X.t -> t
            val singletons : X.t list -> t list
            val hd : t -> word
            val tl : t -> t
            val weq : t -> t -> bool
            val eq : t list -> t list -> bool
            val compare : t list -> t list -> int
            val extend : word list -> t list -> t list
            val eval : t -> t
            val length : t -> int
            val to_string : t -> string
          end
      end
    type t = {
      generators : X.t list;
      rules : (Monoid.Presentation.W.t * Monoid.Presentation.W.t) list;
    }
    val make :
      X.t list ->
      (Monoid.Presentation.W.t * Monoid.Presentation.W.t) list ->
      Monoid.Presentation.t
    val orient :
      (Monoid.Presentation.W.t -> Monoid.Presentation.W.t -> bool) ->
      Monoid.Presentation.t -> Monoid.Presentation.t
    val normalize :
      Monoid.Presentation.t ->
      Monoid.Presentation.W.t -> Monoid.Presentation.W.t
    val add_rule :
      Monoid.Presentation.t ->
      Monoid.Presentation.W.t * Monoid.Presentation.W.t ->
      Monoid.Presentation.t
    val reduce : Monoid.Presentation.t -> Monoid.Presentation.t
    val complete :
      (Monoid.Presentation.W.t -> Monoid.Presentation.W.t -> bool) ->
      Monoid.Presentation.t -> Monoid.Presentation.t
    module Make :
      functor (P : sig val presentation : Monoid.Presentation.t end-> T
  end