sig
  module type Domain =
    sig
      type t
      val bot : Fixpoint.Domain.t
      val leq : Fixpoint.Domain.t -> Fixpoint.Domain.t -> bool
      val cap : Fixpoint.Domain.t -> Fixpoint.Domain.t -> Fixpoint.Domain.t
      val cup : Fixpoint.Domain.t -> Fixpoint.Domain.t -> Fixpoint.Domain.t
      val wide : Fixpoint.Domain.t -> Fixpoint.Domain.t -> Fixpoint.Domain.t
      val pretty : Format.formatter -> Fixpoint.Domain.t -> unit
    end
  module Make :
    functor (D : Domain->
      sig
        type var
        type system
        type fixpoint
        type f1 = D.t -> D.t
        type f2 = D.t -> D.t -> D.t
        type fn = D.t list -> D.t
        val create : unit -> Fixpoint.Make.system
        val var : Fixpoint.Make.system -> Fixpoint.Make.var
        val add :
          Fixpoint.Make.system ->
          Fixpoint.Make.var -> Fixpoint.Make.var -> unit
        val add0 : Fixpoint.Make.system -> Fixpoint.Make.var -> D.t -> unit
        val add1 :
          Fixpoint.Make.system ->
          Fixpoint.Make.var -> Fixpoint.Make.f1 -> Fixpoint.Make.var -> unit
        val add2 :
          Fixpoint.Make.system ->
          Fixpoint.Make.var ->
          Fixpoint.Make.f2 -> Fixpoint.Make.var -> Fixpoint.Make.var -> unit
        val addn :
          Fixpoint.Make.system ->
          Fixpoint.Make.var ->
          Fixpoint.Make.fn -> Fixpoint.Make.var list -> unit
        val fixpoint :
          system:Fixpoint.Make.system ->
          root:Fixpoint.Make.var -> timeout:int -> Fixpoint.Make.fixpoint
        val get : Fixpoint.Make.fixpoint -> Fixpoint.Make.var -> D.t
      end
end