sig
  val equal : ('a, 'b) Syntax.expr -> ('a, 'b) Syntax.expr -> bool
  val compare : ('a, 'b) Syntax.expr -> ('a, 'b) Syntax.expr -> int
  val pp :
    ?env:string Syntax.Env.t ->
    'Syntax.context -> Format.formatter -> ('a, 'b) Syntax.expr -> unit
  val refine :
    'Syntax.context ->
    ('a, Syntax.typ_fo) Syntax.expr ->
    [ `Formula of 'Syntax.formula | `Term of 'Syntax.term ]
  module HT :
    sig
      type ('a, 'typ, 'b) t
      val create : int -> ('a, 'typ, 'b) Syntax.Expr.HT.t
      val add :
        ('a, 'typ, 'b) Syntax.Expr.HT.t ->
        ('a, 'typ) Syntax.expr -> '-> unit
      val replace :
        ('a, 'typ, 'b) Syntax.Expr.HT.t ->
        ('a, 'typ) Syntax.expr -> '-> unit
      val remove :
        ('a, 'typ, 'b) Syntax.Expr.HT.t -> ('a, 'typ) Syntax.expr -> unit
      val find :
        ('a, 'typ, 'b) Syntax.Expr.HT.t -> ('a, 'typ) Syntax.expr -> 'b
      val mem :
        ('a, 'typ, 'b) Syntax.Expr.HT.t -> ('a, 'typ) Syntax.expr -> bool
      val keys :
        ('a, 'typ, 'b) Syntax.Expr.HT.t -> ('a, 'typ) Syntax.expr BatEnum.t
      val values : ('a, 'typ, 'b) Syntax.Expr.HT.t -> 'BatEnum.t
      val enum :
        ('a, 'typ, 'b) Syntax.Expr.HT.t ->
        (('a, 'typ) Syntax.expr * 'b) BatEnum.t
    end
  module Set :
    sig
      type ('a, 'typ) t
      val empty : ('a, 'typ) Syntax.Expr.Set.t
      val add :
        ('a, 'typ) Syntax.expr ->
        ('a, 'typ) Syntax.Expr.Set.t -> ('a, 'typ) Syntax.Expr.Set.t
      val union :
        ('a, 'typ) Syntax.Expr.Set.t ->
        ('a, 'typ) Syntax.Expr.Set.t -> ('a, 'typ) Syntax.Expr.Set.t
      val inter :
        ('a, 'typ) Syntax.Expr.Set.t ->
        ('a, 'typ) Syntax.Expr.Set.t -> ('a, 'typ) Syntax.Expr.Set.t
      val enum :
        ('a, 'typ) Syntax.Expr.Set.t -> ('a, 'typ) Syntax.expr BatEnum.t
      val mem :
        ('a, 'typ) Syntax.expr -> ('a, 'typ) Syntax.Expr.Set.t -> bool
    end
  module Map :
    sig
      type ('a, 'typ, 'b) t
      val empty : ('a, 'typ, 'b) Syntax.Expr.Map.t
      val is_empty : ('a, 'typ, 'b) Syntax.Expr.Map.t -> bool
      val add :
        ('a, 'typ) Syntax.expr ->
        '->
        ('a, 'typ, 'b) Syntax.Expr.Map.t -> ('a, 'typ, 'b) Syntax.Expr.Map.t
      val remove :
        ('a, 'typ) Syntax.expr ->
        ('a, 'typ, 'b) Syntax.Expr.Map.t -> ('a, 'typ, 'b) Syntax.Expr.Map.t
      val filter :
        (('a, 'typ) Syntax.expr -> '-> bool) ->
        ('a, 'typ, 'b) Syntax.Expr.Map.t -> ('a, 'typ, 'b) Syntax.Expr.Map.t
      val filter_map :
        (('a, 'typ) Syntax.expr -> '-> 'c option) ->
        ('a, 'typ, 'b) Syntax.Expr.Map.t -> ('a, 'typ, 'c) Syntax.Expr.Map.t
      val map :
        ('-> 'c) ->
        ('a, 'typ, 'b) Syntax.Expr.Map.t -> ('a, 'typ, 'c) Syntax.Expr.Map.t
      val find :
        ('a, 'typ) Syntax.expr -> ('a, 'typ, 'b) Syntax.Expr.Map.t -> 'b
      val keys :
        ('a, 'typ, 'b) Syntax.Expr.Map.t -> ('a, 'typ) Syntax.expr BatEnum.t
      val values : ('a, 'typ, 'b) Syntax.Expr.Map.t -> 'BatEnum.t
      val enum :
        ('a, 'typ, 'b) Syntax.Expr.Map.t ->
        (('a, 'typ) Syntax.expr * 'b) BatEnum.t
      val merge :
        (('a, 'typ) Syntax.expr -> 'b option -> 'c option -> 'd option) ->
        ('a, 'typ, 'b) Syntax.Expr.Map.t ->
        ('a, 'typ, 'c) Syntax.Expr.Map.t -> ('a, 'typ, 'd) Syntax.Expr.Map.t
      val fold :
        (('a, 'typ) Syntax.expr -> '-> '-> 'c) ->
        ('a, 'typ, 'b) Syntax.Expr.Map.t -> '-> 'c
    end
end