`module type SET = sig ... end`
`module type MAP = sig ... end`
`module Make (N : sig ... end) (NSet : SET with type elt = N.t) (NMap : MAP with type key = N.t) : sig ... end`
`module type ISet = sig ... end`
`module type Tbl = sig ... end`
`module Make_Imperative (N : sig ... end) (NSet : ISet with type elt = N.t) (NTbl : Tbl with type key = N.t) : sig ... end`
`module type ACTION = sig ... end`
`module type DOMAIN = sig ... end`
`module Solver (N : sig ... end) (NSet : ISet with type elt = N.t) (NTbl : Tbl with type key = N.t) (A : ACTION) (D : DOMAIN) : sig ... end`