sig
  type tvar
  type levar
  type otvar
  type prevar
  type lsvar
  module rec Vars :
    sig
      module TVar :
        sig
          type obs
          type t
          val create : unit -> t
          val compare : t -> t -> int
          val total_ord : t -> t -> int
          val add_alias : t -> t -> unit
          val do_normalize : t -> unit
          val add_observer : obs -> t -> unit
          val remove_observer : obs -> t -> unit
          val string_of : t -> string
          val reset : unit -> unit
          val get_all_ts : unit -> t list
          type img
          type elm
          val set_lower : elm -> t -> unit
          val set_upper : elm -> t -> unit
          val set_eq : elm -> t -> unit
          val subset : t -> t -> unit
          val get_lower : t -> elm option
          val get_upper : t -> elm option
          val string_of_img : t -> string
          val get_exact : t -> elm option
          val string_of_with_img : t -> string
          val do_on_exact :
            ?nothing:(unit -> unit) -> ?something:(elm -> unit) -> t -> unit
          val do_on_lower :
            ?nothing:(unit -> unit) -> ?something:(elm -> unit) -> t -> unit
          val do_on_upper :
            ?nothing:(unit -> unit) -> ?something:(elm -> unit) -> t -> unit
        end
      module LSVar :
        sig
          type obs
          type t
          val create : unit -> t
          val compare : t -> t -> int
          val total_ord : t -> t -> int
          val add_alias : t -> t -> unit
          val do_normalize : t -> unit
          val add_observer : obs -> t -> unit
          val remove_observer : obs -> t -> unit
          val string_of : t -> string
          val reset : unit -> unit
          val get_all_ts : unit -> t list
          type img
          type elm = Location.LSet.t
          val set_lower : elm -> t -> unit
          val set_upper : elm -> t -> unit
          val set_eq : elm -> t -> unit
          val subset : t -> t -> unit
          val get_lower : t -> elm option
          val get_upper : t -> elm option
          val string_of_img : t -> string
          val get_exact : t -> elm option
          val string_of_with_img : t -> string
          val set_neg : elm -> t -> unit
          val disjoint : t -> t -> unit
          val get_neg : t -> elm option
          val lower_one_element :
            ?nothing:(unit -> unit) ->
            ?exact:(Location.Loc.t -> unit) ->
            ?tomuch:(unit -> unit) -> t -> unit
          val lower_iter : (Location.Loc.t -> unit) -> t -> unit
          val upper_iter : (Location.Loc.t -> unit) -> t -> unit
          val is_one_possible : t -> bool
          val equal_possible : t -> t -> bool
          val equal_possible_lset : t -> Location.LSet.t -> bool
          val subset_possible : t -> t -> bool
          val subset_possible_lset : t -> Location.LSet.t -> bool
          val choose_lower : t -> Location.Loc.t option
          val set_upper_for_all : Location.LSet.t -> unit
        end
      module PrVar :
        sig
          type obs
          type t
          val create : unit -> t
          val compare : t -> t -> int
          val total_ord : t -> t -> int
          val add_alias : t -> t -> unit
          val do_normalize : t -> unit
          val add_observer : obs -> t -> unit
          val remove_observer : obs -> t -> unit
          val string_of : t -> string
          val reset : unit -> unit
          val get_all_ts : unit -> t list
          type img
          type elm
          val set_lower : elm -> t -> unit
          val set_upper : elm -> t -> unit
          val set_eq : elm -> t -> unit
          val subset : t -> t -> unit
          val get_lower : t -> elm option
          val get_upper : t -> elm option
          val string_of_img : t -> string
          val get_exact : t -> elm option
          val string_of_with_img : t -> string
          val do_on_lower :
            ?nothing:(unit -> unit) ->
            ?exact:(unit -> unit) ->
            ?inexact:(unit -> unit) -> ?nv:(NoValue.nv -> unit) -> t -> unit
          val do_on_upper :
            ?nothing:(unit -> unit) ->
            ?exact:(unit -> unit) ->
            ?inexact:(unit -> unit) -> ?nv:(NoValue.nv -> unit) -> t -> unit
        end
      module ObjectType :
        sig type t type key = Syntax.label type img = TVar.t end
      module OTVar :
        sig
          type obs
          type t
          val create : unit -> t
          val compare : t -> t -> int
          val total_ord : t -> t -> int
          val add_alias : t -> t -> unit
          val do_normalize : t -> unit
          val add_observer : obs -> t -> unit
          val remove_observer : obs -> t -> unit
          val string_of : t -> string
          val reset : unit -> unit
          val get_all_ts : unit -> t list
          type img
          module I : sig type key = Syntax.label type img = TVar.t end
          val domain : t -> I.key list
          val find' : I.key -> t -> I.img option
          val find_or_add :
            create:(unit -> I.img) -> key:I.key -> map:t -> I.img
          val iter : (I.key -> I.img -> unit) -> t -> unit
          val fold : (I.key -> I.img -> '-> 'a) -> t -> '-> 'a
          val make_write_equal :
            (I.key -> I.key -> int) ->
            (I.img -> I.img -> unit) -> t -> t -> I.key -> unit
          val string_of_map : t -> string
          val string_of_with_img : t -> string
          type domain_var
          val get_domain_var : t -> domain_var
        end
      module LEVar :
        sig
          type obs
          type t
          val create : unit -> t
          val compare : t -> t -> int
          val total_ord : t -> t -> int
          val add_alias : t -> t -> unit
          val do_normalize : t -> unit
          val add_observer : obs -> t -> unit
          val remove_observer : obs -> t -> unit
          val string_of : t -> string
          val reset : unit -> unit
          val get_all_ts : unit -> t list
          type img
          module I : sig type key = Location.Loc.t type img = OTVar.t end
          val domain : t -> I.key list
          val find' : I.key -> t -> I.img option
          val find_or_add :
            create:(unit -> I.img) -> key:I.key -> map:t -> I.img
          val iter : (I.key -> I.img -> unit) -> t -> unit
          val fold : (I.key -> I.img -> '-> 'a) -> t -> '-> 'a
          val make_write_equal :
            (I.key -> I.key -> int) ->
            (I.img -> I.img -> unit) -> t -> t -> I.key -> unit
          val string_of_map : t -> string
          val string_of_with_img : t -> string
          type domain_var = LSVar.t
          val get_domain_var : t -> domain_var
          val synchronize : t -> unit
        end
      val reset : unit -> unit
    end
  and Type :
    sig
      type t
      type tau
      type lenv
      type r
      type phi
      type q
      val t_top : Inf.Type.t
      val t_undef : Inf.Type.t
      val t_int : Inf.Type.t
      val create_t_obj : Inf.Type.q -> Inf.Type.phi -> Inf.Type.t
      val create_t_fun :
        Inf.Vars.LEVar.t ->
        Inf.Type.t ->
        Inf.Type.t ->
        Inf.Type.phi -> Inf.Vars.LEVar.t -> Inf.Type.t -> Inf.Type.t
      val create_t_tv : Inf.Vars.TVar.t -> Inf.Type.t
      val empty_lenv : Inf.Type.lenv
      val add_to_lenv :
        Inf.Type.lenv -> Location.Loc.t -> Inf.Type.r -> Inf.Type.lenv
      val union_lenv : Inf.Type.lenv -> Inf.Type.lenv -> Inf.Type.lenv
      val create_lenv_levar : Inf.levar -> Inf.Type.lenv
      val empty_obj : Inf.Type.r
      val add_to_obj :
        Inf.Type.r -> Syntax.label -> Inf.Vars.TVar.t -> Inf.Type.r
      val create_r_otv : Inf.Vars.OTVar.t -> Inf.Type.r
      val create_phi_ls : Location.LSet.t -> Inf.Type.phi
      val create_phi_lsvar : Inf.Vars.LSVar.t -> Inf.Type.phi
      val q_in : Inf.Type.q
      val q_ex : Inf.Type.q
      val create_q_pv : Inf.Vars.PrVar.t -> Inf.Type.q
      val string_of : Inf.Type.t -> string
      val string_of_p : Inf.Type.q * Inf.Type.phi -> string
      val string_of_lenv : Inf.Type.lenv -> string
      val string_of_r : Inf.Type.r -> string
      val string_of_phi : Inf.Type.phi -> string
      val string_of_q : Inf.Type.q -> string
    end
  module ConstBasic :
    sig
      type t
      type obs
      val c_true : Inf.ConstBasic.t
      val c_false : string option -> Inf.ConstBasic.t
      val create_c_demotation_lenv :
        Inf.Vars.LEVar.t ->
        Inf.Type.phi -> Inf.Vars.LEVar.t -> Inf.ConstBasic.t
      val create_c_demotation_lenv_phi :
        Inf.Vars.LEVar.t ->
        Inf.Type.phi -> Inf.Type.phi -> Inf.Vars.LEVar.t -> Inf.ConstBasic.t
      val create_c_demotation_type :
        Inf.Type.t -> Inf.Type.phi -> Inf.Type.t -> Inf.ConstBasic.t
      val create_c_include :
        Location.Loc.t -> Inf.Type.phi -> Inf.ConstBasic.t
      val create_c_exclude :
        Location.Loc.t -> Inf.Type.phi -> Inf.ConstBasic.t
      val create_c_subset :
        ?prio:int -> Inf.Type.phi -> Inf.Type.phi -> Inf.ConstBasic.t
      val create_c_disjoint :
        ?prio:int -> Inf.Type.phi -> Inf.Type.phi -> Inf.ConstBasic.t
      val create_c_subtype :
        ?prio:int -> Inf.Type.t -> Inf.Type.t -> Inf.ConstBasic.t
      val create_c_eqtype : Inf.Type.t -> Inf.Type.t -> Inf.ConstBasic.t
      val create_c_eqlenv :
        Inf.Type.lenv -> Inf.Type.lenv -> Inf.ConstBasic.t
      val create_c_eqobj : Inf.Type.r -> Inf.Type.r -> Inf.ConstBasic.t
      val create_c_eqset : Inf.Type.phi -> Inf.Type.phi -> Inf.ConstBasic.t
      val create_c_eqpres : Inf.Type.q -> Inf.Type.q -> Inf.ConstBasic.t
      val create_c_domain_eq :
        Inf.Type.phi -> Inf.Vars.LEVar.t -> Inf.ConstBasic.t
      val create_c_lev_empty_obj :
        Inf.Vars.LEVar.t ->
        Inf.Vars.LEVar.t -> Location.Loc.t -> Inf.ConstBasic.t
      val create_c_flow :
        Inf.Vars.LEVar.t -> Inf.Type.t -> Inf.Type.t -> Inf.ConstBasic.t
      val create_c_read :
        Inf.Vars.LEVar.t ->
        Inf.Vars.PrVar.t ->
        Inf.Vars.LSVar.t ->
        Syntax.label -> Inf.Vars.TVar.t -> Inf.ConstBasic.t
      val create_c_write :
        Inf.Vars.LEVar.t ->
        Inf.Vars.TVar.t ->
        Syntax.label ->
        Inf.Vars.TVar.t -> Inf.Vars.LEVar.t -> Inf.ConstBasic.t
      val create_c_locs : Inf.Type.phi -> Inf.Type.t -> Inf.ConstBasic.t
      val string_of : Inf.ConstBasic.t -> string
    end
  module Const :
    sig
      type obs = Inf.ConstBasic.obs
      val add : Inf.ConstBasic.t -> unit
      val is_false : string -> unit
      val remove : Inf.ConstBasic.t -> unit
      val add_wl : Inf.Const.obs -> unit
      val solve : unit -> unit
      val string_of : unit -> string
      val reset : unit -> unit
      val full_visit : unit -> unit
    end
  module GEnv :
    sig val string_of : unit -> string val reset : unit -> unit end
end