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