sig
  module type PreDomain =
    sig
      type 'a t
      val pp : Format.formatter -> 'Iteration.PreDomain.t -> unit
      val show : 'Iteration.PreDomain.t -> string
      val closure : 'Iteration.PreDomain.t -> 'Syntax.formula
      val join :
        'Iteration.PreDomain.t ->
        'Iteration.PreDomain.t -> 'Iteration.PreDomain.t
      val widen :
        'Iteration.PreDomain.t ->
        'Iteration.PreDomain.t -> 'Iteration.PreDomain.t
      val equal :
        'Iteration.PreDomain.t -> 'Iteration.PreDomain.t -> bool
      val tr_symbols :
        'Iteration.PreDomain.t -> (Syntax.symbol * Syntax.symbol) list
    end
  module type Domain =
    sig
      type 'a t
      val pp : Format.formatter -> 'a t -> unit
      val show : 'a t -> string
      val closure : 'a t -> 'Syntax.formula
      val join : 'a t -> 'a t -> 'a t
      val widen : 'a t -> 'a t -> 'a t
      val equal : 'a t -> 'a t -> bool
      val tr_symbols : 'a t -> (Syntax.symbol * Syntax.symbol) list
      val abstract_iter :
        ?exists:(Syntax.symbol -> bool) ->
        'Syntax.context ->
        'Syntax.formula -> (Syntax.symbol * Syntax.symbol) list -> 'a t
    end
  module type DomainPlus =
    sig
      type 'a t
      val pp : Format.formatter -> 'a t -> unit
      val show : 'a t -> string
      val closure : 'a t -> 'Syntax.formula
      val join : 'a t -> 'a t -> 'a t
      val widen : 'a t -> 'a t -> 'a t
      val equal : 'a t -> 'a t -> bool
      val tr_symbols : 'a t -> (Syntax.symbol * Syntax.symbol) list
      val abstract_iter :
        ?exists:(Syntax.symbol -> bool) ->
        'Syntax.context ->
        'Syntax.formula -> (Syntax.symbol * Syntax.symbol) list -> 'a t
      val closure_plus : 'a t -> 'Syntax.formula
    end
  module WedgeVector : DomainPlus
  module WedgeVectorOCRS : DomainPlus
  module WedgeMatrix : DomainPlus
  module Split : functor (Iter : DomainPlus-> Domain
  module Sum :
    functor (A : PreDomain) (B : PreDomain->
      sig
        type 'a t
        val pp : Format.formatter -> 'a t -> unit
        val show : 'a t -> string
        val closure : 'a t -> 'Syntax.formula
        val join : 'a t -> 'a t -> 'a t
        val widen : 'a t -> 'a t -> 'a t
        val equal : 'a t -> 'a t -> bool
        val tr_symbols : 'a t -> (Syntax.symbol * Syntax.symbol) list
        val left : 'A.t -> 'a t
        val right : 'B.t -> 'a t
      end
end