sig
  type e = private
      SExp of Syntax.s
    | Let of Syntax.plab * Location.LSet.t option * Syntax.var * Syntax.s *
        Syntax.e
    | Mask of Syntax.plab * Location.LSet.t option * Syntax.e
  and s = private
      Val of Syntax.v
    | App of Syntax.plab * Syntax.v * Syntax.v
    | New of Syntax.plab * Location.Loc.t
    | Read of Syntax.p
    | Write of Syntax.plab * Syntax.p * Syntax.v
    | MethodCall of Syntax.plab * Syntax.p * Syntax.v
  and v = private
      Var of Syntax.plab * Syntax.var
    | Lam of Syntax.plab * Syntax.var * Syntax.var * Syntax.e
    | Undef of Syntax.plab
    | Pointer of Syntax.plab * Location.P.t
    | Int of Syntax.plab * int
  and p = private Prop of Syntax.plab * Syntax.v * Syntax.label
  and var
  and label
  and plab
  val e_sexp : Syntax.s -> Syntax.e
  val e_let : Syntax.var -> Syntax.s -> Syntax.e -> Syntax.e
  val e_mask : Location.LSet.t -> Syntax.e -> Syntax.e
  val string_of_e : Syntax.e -> string
  val string_of_e_with_plabs : Syntax.e -> string
  val s_val : Syntax.v -> Syntax.s
  val s_app : Syntax.v -> Syntax.v -> Syntax.s
  val s_new : unit -> Syntax.s
  val s_new_loc : Location.Loc.t -> Syntax.s
  val s_read : Syntax.v -> Syntax.label -> Syntax.s
  val s_write : Syntax.v -> Syntax.label -> Syntax.v -> Syntax.s
  val s_mcall : Syntax.v -> Syntax.label -> Syntax.v -> Syntax.s
  val v_var : Syntax.var -> Syntax.v
  val v_lam : Syntax.var -> Syntax.var -> Syntax.e -> Syntax.v
  val v_undef : unit -> Syntax.v
  val v_int : int -> Syntax.v
  val string_of_v : Syntax.v -> string
  val string_of_lam : Syntax.var -> Syntax.var -> Syntax.e -> string
  val string_of_v_with_plabs : Syntax.v -> string
  val string_of_lam_with_plabs :
    Syntax.var -> Syntax.var -> Syntax.e -> string
  val string_of_v_without_plabs : Syntax.v -> string
  val create_var : string -> Syntax.var
  val compare_var : Syntax.var -> Syntax.var -> int
  val string_of_var : Syntax.var -> string
  val create_label : string -> Syntax.label
  val compare_label : Syntax.label -> Syntax.label -> int
  val string_of_label : Syntax.label -> string
  val create_plab : unit -> Syntax.plab
  val compare_plab : Syntax.plab -> Syntax.plab -> int
  val string_of_plab : Syntax.plab -> string
  val e_get_plab : Syntax.e -> Syntax.plab
  val s_get_plab : Syntax.s -> Syntax.plab
  val v_get_plab : Syntax.v -> Syntax.plab
  val p_get_plab : Syntax.p -> Syntax.plab
  val collect_locs : Syntax.e -> Location.LSet.t
  module VarSet :
    sig
      type elt = var
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val add_list : elt list -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val fold : (elt -> '-> 'a) -> t -> '-> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val max_elt : t -> elt
      val choose : t -> elt
      val choose' : t -> elt option
      val split : elt -> t -> t * bool * t
      val from_list : elt list -> t
      val string_of : t -> string
      val string_of_complex :
        ?start_char:string -> ?end_char:string -> t -> string
    end
  val free_e : Syntax.e -> Syntax.VarSet.t
  val free_s : Syntax.s -> Syntax.VarSet.t
  val free_v : Syntax.v -> Syntax.VarSet.t
  module LabelSet : ProglangUtils.ExtSSet.S
  module LabelSetRef :
    sig
      type t
      type elt = label
      val create : unit -> t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> unit
      val add_list : elt list -> t -> unit
      val singleton : elt -> t
      val remove : elt -> t -> unit
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val fold : (elt -> '-> 'a) -> t -> '-> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> unit
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val max_elt : t -> elt
      val choose : t -> elt
      val from_list : elt list -> t
      val string_of : t -> string
      val string_of_complex :
        ?start_char:string -> ?end_char:string -> t -> string
      val laset : t -> LabelSet.t
    end
  val set_print_with_label : unit -> unit
  val set_print_without_label : unit -> unit
end