sig
  type t =
    Regexp(X).t =
      Letter of X.t
    | Union of t * t
    | Empty
    | Concat of t * t
    | Singl
    | Star of t
  val letter : X.t -> t
  val union : t -> t -> t
  val empty : t
  val concat : t -> t -> t
  val star : t -> t
  val unions : t list -> t
  val to_string : t -> string
  val simpl : t -> t
  module Series :
    sig
      type t = Field.Int.t Weak.t ref * (int -> Field.Int.t)
      val eq : t -> t -> 'a
      val get : t -> int -> Field.Int.t
      val coeff : t -> int -> Field.Int.t
      val to_string : t -> string
      val make : (int -> Field.Int.t) -> t
      val zero : t
      val one : t
      val var : t
      val add : t -> t -> t
      val sub : t -> t -> t
      val mul : t -> t -> t
      val expn : t -> int -> t
      val hadamard : t -> t -> t
      val cmul : Field.Int.t -> t -> t
      val neg : t -> t
      val star : t -> t
      val inv : t -> t
      module Polynomial :
        sig
          type t = Field.Int.t array
          val length : t -> int
          val degree : t -> int
          val eq : t -> t -> bool
          val compact : t -> t
          val coeff : t -> int -> Field.Int.t
          val init : int -> (int -> Field.Int.t) -> t
          val add : t -> t -> t
          val zero : 'a array
          val cmul : Field.Int.t -> t -> t
          val neg : t -> t
          val sub : t -> t -> t
          val mul : t -> t -> t
          val one : Field.Int.t array
          val to_string : t -> string
          val monomial : Field.Int.t -> int -> Field.Int.t array
        end
      val polynomial : Polynomial.t -> t
      module RationalFractions :
        sig
          module Polynomial :
            functor (F : Field.T->
              sig
                type t = Ring.Polynomial(F).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
                val div : t -> t -> t * t
              end
          type t = Polynomial(Field.Int).t * Polynomial(Field.Int).t
          val gcd :
            Polynomial(Field.Int).t ->
            Polynomial(Field.Int).t -> Polynomial(Field.Int).t
          val canonize : t -> 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 inv : t -> t
          val to_string : t -> string
        end
      val rational : RationalFractions.t -> t
    end
  val series : t -> Series.t
end