sig
  val i2e : int -> Facile.Arith.t
  val fd2e : Facile.Var.Fd.t -> Facile.Arith.t
  val ( +~ ) : Facile.Arith.t -> Facile.Arith.t -> Facile.Arith.t
  val ( *~ ) : Facile.Arith.t -> Facile.Arith.t -> Facile.Arith.t
  val ( -~ ) : Facile.Arith.t -> Facile.Arith.t -> Facile.Arith.t
  val ( /~ ) : Facile.Arith.t -> Facile.Arith.t -> Facile.Arith.t
  val ( **~ ) : Facile.Arith.t -> int -> Facile.Arith.t
  val ( %~ ) : Facile.Arith.t -> Facile.Arith.t -> Facile.Arith.t
  val ( <=~ ) : Facile.Arith.t -> Facile.Arith.t -> Facile.Cstr.t
  val ( <~ ) : Facile.Arith.t -> Facile.Arith.t -> Facile.Cstr.t
  val ( >~ ) : Facile.Arith.t -> Facile.Arith.t -> Facile.Cstr.t
  val ( =~ ) : Facile.Arith.t -> Facile.Arith.t -> Facile.Cstr.t
  val ( <>~ ) : Facile.Arith.t -> Facile.Arith.t -> Facile.Cstr.t
  val ( >=~ ) : Facile.Arith.t -> Facile.Arith.t -> Facile.Cstr.t
  val ( <=~~ ) : Facile.Arith.t -> Facile.Arith.t -> Facile.Arith.t
  val ( <~~ ) : Facile.Arith.t -> Facile.Arith.t -> Facile.Arith.t
  val ( >~~ ) : Facile.Arith.t -> Facile.Arith.t -> Facile.Arith.t
  val ( =~~ ) : Facile.Arith.t -> Facile.Arith.t -> Facile.Arith.t
  val ( <>~~ ) : Facile.Arith.t -> Facile.Arith.t -> Facile.Arith.t
  val ( >=~~ ) : Facile.Arith.t -> Facile.Arith.t -> Facile.Arith.t
  val ( &&~~ ) : Facile.Cstr.t -> Facile.Cstr.t -> Facile.Cstr.t
  val ( ||~~ ) : Facile.Cstr.t -> Facile.Cstr.t -> Facile.Cstr.t
  val ( =>~~ ) : Facile.Cstr.t -> Facile.Cstr.t -> Facile.Cstr.t
  val ( <=>~~ ) : Facile.Cstr.t -> Facile.Cstr.t -> Facile.Cstr.t
  val ( &&~ ) : Facile.Goals.t -> Facile.Goals.t -> Facile.Goals.t
  val ( ||~ ) : Facile.Goals.t -> Facile.Goals.t -> Facile.Goals.t
  module Fd :
    sig
      type t = Var.Fd.t
      type attr = Var.Attr.t
      type domain = Domain.t
      type elt = Domain.elt
      type event = Var.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) Var.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 -> Cstr.t -> unit
      val int : elt -> t
      val subst : t -> elt -> unit
      val unify_cstr : t -> elt -> Cstr.t
      val remove : t -> elt -> unit
      val values : t -> elt list
      val iter : (elt -> unit) -> t -> unit
    end
  type ('a, 'b) concrete' =
    ('a, 'b) Facile.Var.concrete =
      Unk of 'a
    | Val of 'b
  type concrete_fd =
      (Facile.Easy.Fd.attr, Facile.Easy.Fd.elt) Facile.Easy.concrete'
end