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