functor (L1 : Lattice->
  functor (L2 : Lattice->
    functor (C : Collapse->
      sig
        type t1 = L1.t
        type t2 = L2.t
        type tt = private Product of t1 * t2 | Bottom
        exception Error_Top
        exception Error_Bottom
        type t = tt
        type widen_hint
        val equal : t -> t -> bool
        val join : t -> t -> t
        val link : t -> t -> t
        val meet : t -> t -> t
        val narrow : t -> t -> t
        val bottom : t
        val top : t
        val is_included : t -> t -> bool
        val is_included_exn : t -> t -> unit
        val intersects : t -> t -> bool
        val pretty : Format.formatter -> t -> unit
        val widen : widen_hint -> t -> t -> t
        val cardinal_zero_or_one : t -> bool
        val cardinal_less_than : t -> int -> int
        val tag : t -> int
        module Datatype :
          sig
            type t = t
            val rehash : t -> t
            val descr : Unmarshal.t
            val copy : t -> t
            val name : string
            val register_comparable :
              ?compare:(t -> t -> int) ->
              ?equal:(t -> t -> bool) ->
              ?hash:(t -> int) -> ?physical_hash:(t -> int) -> unit -> unit
            val is_comparable_set : unit -> bool
            val hash : t -> int
            val physical_hash : t -> int
            val equal : t -> t -> bool
            val compare : t -> t -> int
            val contain_project : (Project.project -> t -> bool) option ref
          end
        val inject : t1 -> t2 -> t
        val fst : t -> t1
        val snd : t -> t2
      end