sig
  module type Domain =
    sig
      type t
      val fprint : Format.formatter -> NonRelational.Domain.t -> unit
      val order : NonRelational.Domain.t -> NonRelational.Domain.t -> bool
      val top : NonRelational.Domain.t
      val bottom : NonRelational.Domain.t
      val join :
        NonRelational.Domain.t ->
        NonRelational.Domain.t -> NonRelational.Domain.t
      val meet :
        NonRelational.Domain.t ->
        NonRelational.Domain.t -> NonRelational.Domain.t
      val widening :
        NonRelational.Domain.t ->
        NonRelational.Domain.t -> NonRelational.Domain.t
      val sem_itv : int -> int -> NonRelational.Domain.t
      val sem_plus :
        NonRelational.Domain.t ->
        NonRelational.Domain.t -> NonRelational.Domain.t
      val sem_minus :
        NonRelational.Domain.t ->
        NonRelational.Domain.t -> NonRelational.Domain.t
      val sem_times :
        NonRelational.Domain.t ->
        NonRelational.Domain.t -> NonRelational.Domain.t
      val sem_div :
        NonRelational.Domain.t ->
        NonRelational.Domain.t -> NonRelational.Domain.t
      val sem_guard : NonRelational.Domain.t -> NonRelational.Domain.t
      val backsem_plus :
        NonRelational.Domain.t ->
        NonRelational.Domain.t ->
        NonRelational.Domain.t ->
        NonRelational.Domain.t * NonRelational.Domain.t
      val backsem_minus :
        NonRelational.Domain.t ->
        NonRelational.Domain.t ->
        NonRelational.Domain.t ->
        NonRelational.Domain.t * NonRelational.Domain.t
      val backsem_times :
        NonRelational.Domain.t ->
        NonRelational.Domain.t ->
        NonRelational.Domain.t ->
        NonRelational.Domain.t * NonRelational.Domain.t
      val backsem_div :
        NonRelational.Domain.t ->
        NonRelational.Domain.t ->
        NonRelational.Domain.t ->
        NonRelational.Domain.t * NonRelational.Domain.t
    end
  module MakeRelational : functor (D : Domain-> Relational.Domain
end