sig
  module type ATTR =
    sig
      type t
      type domain
      type elt
      type event
      val dom : Fcl_var.ATTR.t -> Fcl_var.ATTR.domain
      val on_refine : Fcl_var.ATTR.event
      val on_subst : Fcl_var.ATTR.event
      val on_min : Fcl_var.ATTR.event
      val on_max : Fcl_var.ATTR.event
      val fprint : Pervasives.out_channel -> Fcl_var.ATTR.t -> unit
      val min : Fcl_var.ATTR.t -> Fcl_var.ATTR.elt
      val max : Fcl_var.ATTR.t -> Fcl_var.ATTR.elt
      val member : Fcl_var.ATTR.t -> Fcl_var.ATTR.elt -> bool
      val id : Fcl_var.ATTR.t -> int
      val constraints_number : Fcl_var.ATTR.t -> int
      val size : Fcl_var.ATTR.t -> int
    end
  module Attr :
    sig
      type t
      type domain = Fcl_domain.t
      type elt = Fcl_domain.elt
      type event
      val dom : t -> domain
      val on_refine : event
      val on_subst : event
      val on_min : event
      val on_max : event
      val fprint : out_channel -> t -> unit
      val min : t -> elt
      val max : t -> elt
      val member : t -> elt -> bool
      val id : t -> int
      val constraints_number : t -> int
      val size : t -> int
    end
  module SetAttr :
    sig
      type t
      type domain = Fcl_setDomain.t
      type elt = Fcl_setDomain.S.t
      type event
      val dom : t -> domain
      val on_refine : event
      val on_subst : event
      val on_min : event
      val on_max : event
      val fprint : out_channel -> t -> unit
      val min : t -> elt
      val max : t -> elt
      val member : t -> elt -> bool
      val id : t -> int
      val constraints_number : t -> int
      val size : t -> int
    end
  type ('a, 'b) concrete = Unk of '| Val of 'b
  module type BASICFD =
    sig
      type t
      type attr
      type domain
      type elt
      type event
      val create :
        ?name:string -> Fcl_var.BASICFD.domain -> Fcl_var.BASICFD.t
      val interval :
        ?name:string ->
        Fcl_var.BASICFD.elt -> Fcl_var.BASICFD.elt -> Fcl_var.BASICFD.t
      val array :
        ?name:string ->
        int ->
        Fcl_var.BASICFD.elt -> Fcl_var.BASICFD.elt -> Fcl_var.BASICFD.t array
      val elt : Fcl_var.BASICFD.elt -> Fcl_var.BASICFD.t
      val is_var : Fcl_var.BASICFD.t -> bool
      val is_bound : Fcl_var.BASICFD.t -> bool
      val value :
        Fcl_var.BASICFD.t ->
        (Fcl_var.BASICFD.attr, Fcl_var.BASICFD.elt) Fcl_var.concrete
      val min : Fcl_var.BASICFD.t -> Fcl_var.BASICFD.elt
      val max : Fcl_var.BASICFD.t -> Fcl_var.BASICFD.elt
      val min_max :
        Fcl_var.BASICFD.t -> Fcl_var.BASICFD.elt * Fcl_var.BASICFD.elt
      val elt_value : Fcl_var.BASICFD.t -> Fcl_var.BASICFD.elt
      val int_value : Fcl_var.BASICFD.t -> Fcl_var.BASICFD.elt
      val size : Fcl_var.BASICFD.t -> int
      val member : Fcl_var.BASICFD.t -> Fcl_var.BASICFD.elt -> bool
      val id : Fcl_var.BASICFD.t -> int
      val name : Fcl_var.BASICFD.t -> string
      val compare : Fcl_var.BASICFD.t -> Fcl_var.BASICFD.t -> int
      val equal : Fcl_var.BASICFD.t -> Fcl_var.BASICFD.t -> bool
      val fprint : Pervasives.out_channel -> Fcl_var.BASICFD.t -> unit
      val fprint_array :
        Pervasives.out_channel -> Fcl_var.BASICFD.t array -> unit
      val unify : Fcl_var.BASICFD.t -> Fcl_var.BASICFD.elt -> unit
      val refine : Fcl_var.BASICFD.t -> Fcl_var.BASICFD.domain -> unit
      val refine_low : Fcl_var.BASICFD.t -> Fcl_var.BASICFD.elt -> unit
      val refine_up : Fcl_var.BASICFD.t -> Fcl_var.BASICFD.elt -> unit
      val refine_low_up :
        Fcl_var.BASICFD.t ->
        Fcl_var.BASICFD.elt -> Fcl_var.BASICFD.elt -> unit
      val on_refine : Fcl_var.BASICFD.event
      val on_subst : Fcl_var.BASICFD.event
      val on_min : Fcl_var.BASICFD.event
      val on_max : Fcl_var.BASICFD.event
      val delay :
        Fcl_var.BASICFD.event list ->
        Fcl_var.BASICFD.t -> ?waking_id:int -> Fcl_cstr.t -> unit
      val int : Fcl_var.BASICFD.elt -> Fcl_var.BASICFD.t
      val subst : Fcl_var.BASICFD.t -> Fcl_var.BASICFD.elt -> unit
      val unify_cstr : Fcl_var.BASICFD.t -> Fcl_var.BASICFD.elt -> Fcl_cstr.t
    end
  module type FD =
    sig
      type t
      type attr
      type domain
      type elt
      type event
      val create : ?name:string -> domain -> t
      val interval : ?name:string -> elt -> elt -> t
      val array : ?name:string -> int -> elt -> elt -> t array
      val elt : elt -> t
      val is_var : t -> bool
      val is_bound : t -> bool
      val value : t -> (attr, elt) concrete
      val min : t -> elt
      val max : t -> elt
      val min_max : t -> elt * elt
      val elt_value : t -> elt
      val int_value : t -> elt
      val size : t -> int
      val member : t -> elt -> bool
      val id : t -> int
      val name : t -> string
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val fprint : out_channel -> t -> unit
      val fprint_array : out_channel -> t array -> unit
      val unify : t -> elt -> unit
      val refine : t -> domain -> unit
      val refine_low : t -> elt -> unit
      val refine_up : t -> elt -> unit
      val refine_low_up : t -> elt -> elt -> unit
      val on_refine : event
      val on_subst : event
      val on_min : event
      val on_max : event
      val delay : event list -> t -> ?waking_id:int -> Fcl_cstr.t -> unit
      val int : elt -> t
      val subst : t -> elt -> unit
      val unify_cstr : t -> elt -> Fcl_cstr.t
      val remove : t -> elt -> unit
      val values : t -> elt list
      val iter : (elt -> unit) -> t -> unit
    end
  module Fd :
    sig
      type t
      type attr = Attr.t
      type domain = Fcl_domain.t
      type elt = Fcl_domain.elt
      type event = Attr.event
      val create : ?name:string -> domain -> t
      val interval : ?name:string -> elt -> elt -> t
      val array : ?name:string -> int -> elt -> elt -> t array
      val elt : elt -> t
      val is_var : t -> bool
      val is_bound : t -> bool
      val value : t -> (attr, elt) concrete
      val min : t -> elt
      val max : t -> elt
      val min_max : t -> elt * elt
      val elt_value : t -> elt
      val int_value : t -> elt
      val size : t -> int
      val member : t -> elt -> bool
      val id : t -> int
      val name : t -> string
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val fprint : out_channel -> t -> unit
      val fprint_array : out_channel -> t array -> unit
      val unify : t -> elt -> unit
      val refine : t -> domain -> unit
      val refine_low : t -> elt -> unit
      val refine_up : t -> elt -> unit
      val refine_low_up : t -> elt -> elt -> unit
      val on_refine : event
      val on_subst : event
      val on_min : event
      val on_max : event
      val delay : event list -> t -> ?waking_id:int -> Fcl_cstr.t -> unit
      val int : elt -> t
      val subst : t -> elt -> unit
      val unify_cstr : t -> elt -> Fcl_cstr.t
      val remove : t -> elt -> unit
      val values : t -> elt list
      val iter : (elt -> unit) -> t -> unit
    end
  module SetFd :
    sig
      type t
      type attr = SetAttr.t
      type domain = Fcl_setDomain.t
      type elt = Fcl_setDomain.S.t
      type event = SetAttr.event
      val create : ?name:string -> domain -> t
      val interval : ?name:string -> elt -> elt -> t
      val array : ?name:string -> int -> elt -> elt -> t array
      val elt : elt -> t
      val is_var : t -> bool
      val is_bound : t -> bool
      val value : t -> (attr, elt) concrete
      val min : t -> elt
      val max : t -> elt
      val min_max : t -> elt * elt
      val elt_value : t -> elt
      val int_value : t -> elt
      val size : t -> int
      val member : t -> elt -> bool
      val id : t -> int
      val name : t -> string
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val fprint : out_channel -> t -> unit
      val fprint_array : out_channel -> t array -> unit
      val unify : t -> elt -> unit
      val refine : t -> domain -> unit
      val refine_low : t -> elt -> unit
      val refine_up : t -> elt -> unit
      val refine_low_up : t -> elt -> elt -> unit
      val on_refine : event
      val on_subst : event
      val on_min : event
      val on_max : event
      val delay : event list -> t -> ?waking_id:int -> Fcl_cstr.t -> unit
      val int : elt -> t
      val subst : t -> elt -> unit
      val unify_cstr : t -> elt -> Fcl_cstr.t
    end
  type concrete_fd = (Fcl_var.Fd.attr, Fcl_var.Fd.elt) Fcl_var.concrete
  val delay :
    Fcl_var.Attr.event list ->
    Fcl_var.Fd.t -> ?waking_id:int -> Fcl_cstr.t -> unit
end