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