sig
  module type SYMBOL_SEED =
    sig
      type t
      val name : string
      val compare : t -> t -> int
      val pair : t -> t -> t
      val of_string : string -> t
      val to_string : t -> string
      val print : ?oc:out_channel -> t -> unit
      val print_ : ?oc:out_channel -> t -> unit
      val are_compatible : t -> t -> bool
      val conform : t -> t -> t
    end
  module type SYMBOL_TYPE =
    sig
      type t
      val name : string
      val compare : t -> t -> int
      val pair : t -> t -> t
      val of_string : string -> t
      val to_string : t -> string
      val print : ?oc:out_channel -> t -> unit
      val print_ : ?oc:out_channel -> t -> unit
      val are_unifiable : t -> t -> bool
      val conform : t -> t -> t
      type x
      val of_x : Symbols.SYMBOL_TYPE.x -> t
      val to_x : t -> Symbols.SYMBOL_TYPE.x
      val blank : t
      val wild : t
    end
  module Make :
    functor (X : SYMBOL_SEED->
      sig
        type t
        val name : string
        val compare : t -> t -> int
        val pair : t -> t -> t
        val of_string : string -> t
        val to_string : t -> string
        val print : ?oc:out_channel -> t -> unit
        val print_ : ?oc:out_channel -> t -> unit
        val are_unifiable : t -> t -> bool
        val conform : t -> t -> t
        type x = X.t
        val of_x : x -> t
        val to_x : t -> x
        val blank : t
        val wild : t
      end
end