sig
  type ('a, 'b) t
  type setable
  type unsetable
  type 'a setable_t = ('a, Facile.Invariant.setable) Facile.Invariant.t
  type 'a unsetable_t = ('a, Facile.Invariant.unsetable) Facile.Invariant.t
  val create : ?name:string -> '-> 'Facile.Invariant.setable_t
  val constant : ?name:string -> '-> 'Facile.Invariant.unsetable_t
  val set : 'Facile.Invariant.setable_t -> '-> unit
  val get : ('a, 'b) Facile.Invariant.t -> 'a
  val id : ('a, 'b) Facile.Invariant.t -> int
  val name : ('a, 'b) Facile.Invariant.t -> string
  val fprint :
    Pervasives.out_channel ->
    ?printer:(Pervasives.out_channel -> '-> unit) ->
    ('a, 'b) Facile.Invariant.t -> unit
  val unary :
    ?name:string ->
    ('-> 'b) ->
    ('a, 'c) Facile.Invariant.t -> 'Facile.Invariant.unsetable_t
  val binary :
    ?name:string ->
    ('-> '-> 'c) ->
    ('a, 'd) Facile.Invariant.t ->
    ('b, 'e) Facile.Invariant.t -> 'Facile.Invariant.unsetable_t
  val ternary :
    ?name:string ->
    ('-> '-> '-> 'd) ->
    ('a, 'e) Facile.Invariant.t ->
    ('b, 'f) Facile.Invariant.t ->
    ('c, 'g) Facile.Invariant.t -> 'Facile.Invariant.unsetable_t
  val sum :
    (int, 'a) Facile.Invariant.t array -> int Facile.Invariant.unsetable_t
  val prod :
    (int, 'a) Facile.Invariant.t array -> int Facile.Invariant.unsetable_t
  module Array :
    sig
      val get :
        ('a, 'b) Facile.Invariant.t array ->
        (int, 'c) Facile.Invariant.t -> 'Facile.Invariant.unsetable_t
      val argmin :
        ('a, 'b) Facile.Invariant.t array ->
        ('-> 'c) -> int Facile.Invariant.unsetable_t
      val min :
        ('a, 'b) Facile.Invariant.t array ->
        ('-> 'c) -> 'Facile.Invariant.unsetable_t
    end
  module type FD =
    sig
      type fd
      type elt
      val min :
        Facile.Invariant.FD.fd ->
        Facile.Invariant.FD.elt Facile.Invariant.unsetable_t
      val max :
        Facile.Invariant.FD.fd ->
        Facile.Invariant.FD.elt Facile.Invariant.unsetable_t
      val size : Facile.Invariant.FD.fd -> int Facile.Invariant.unsetable_t
      val is_var :
        Facile.Invariant.FD.fd -> bool Facile.Invariant.unsetable_t
      val unary :
        ?name:string ->
        (Facile.Invariant.FD.fd -> 'a) ->
        Facile.Invariant.FD.fd -> 'Facile.Invariant.unsetable_t
    end
  module Fd :
    sig
      type fd = Var.Fd.t
      type elt = Var.Fd.elt
      val min : fd -> elt unsetable_t
      val max : fd -> elt unsetable_t
      val size : fd -> int unsetable_t
      val is_var : fd -> bool unsetable_t
      val unary : ?name:string -> (fd -> 'a) -> fd -> 'a unsetable_t
    end
  module SetFd :
    sig
      type fd = Var.SetFd.t
      type elt = Var.SetFd.elt
      val min : fd -> elt unsetable_t
      val max : fd -> elt unsetable_t
      val size : fd -> int unsetable_t
      val is_var : fd -> bool unsetable_t
      val unary : ?name:string -> (fd -> 'a) -> fd -> 'a unsetable_t
    end
end