sig
  module type Fun =
    sig
      type dom
      type cod
      val f :
        Memo.Tabulate.Fun.dom -> (Memo.Tabulate.Fun.cod -> unit) -> unit
      val hash : Memo.Tabulate.Fun.dom -> int
      val join :
        Memo.Tabulate.Fun.cod ->
        Memo.Tabulate.Fun.cod -> Memo.Tabulate.Fun.cod
      val bottom : Memo.Tabulate.Fun.cod
      val dom_equal : Memo.Tabulate.Fun.dom -> Memo.Tabulate.Fun.dom -> bool
      val cod_equal : Memo.Tabulate.Fun.cod -> Memo.Tabulate.Fun.cod -> bool
    end
  module type RecFun =
    sig
      type dom
      type cod
      val f :
        (Memo.Tabulate.RecFun.dom ->
         (Memo.Tabulate.RecFun.cod -> unit) -> unit) ->
        Memo.Tabulate.RecFun.dom ->
        (Memo.Tabulate.RecFun.cod -> unit) -> unit
      val hash : Memo.Tabulate.RecFun.dom -> int
      val join :
        Memo.Tabulate.RecFun.cod ->
        Memo.Tabulate.RecFun.cod -> Memo.Tabulate.RecFun.cod
      val bottom : Memo.Tabulate.RecFun.cod
      val dom_equal :
        Memo.Tabulate.RecFun.dom -> Memo.Tabulate.RecFun.dom -> bool
      val cod_equal :
        Memo.Tabulate.RecFun.cod -> Memo.Tabulate.RecFun.cod -> bool
    end
  module type S =
    sig
      type dom
      type cod
      val update : Memo.Tabulate.S.dom -> Memo.Tabulate.S.cod -> unit
      val call : Memo.Tabulate.S.dom -> (Memo.Tabulate.S.cod -> unit) -> unit
      val call_direct : Memo.Tabulate.S.dom -> Memo.Tabulate.S.cod
    end
  module Make :
    functor (F : Fun->
      sig
        type dom = F.dom
        type cod = F.cod
        val update : dom -> cod -> unit
        val call : dom -> (cod -> unit) -> unit
        val call_direct : dom -> cod
      end
  module MakeRec :
    functor (F : RecFun->
      sig
        type dom = F.dom
        type cod = F.cod
        val update : dom -> cod -> unit
        val call : dom -> (cod -> unit) -> unit
        val call_direct : dom -> cod
      end
end