sig
  val memo : ?size:int -> ('-> 'b) -> '-> 'b
  val memo_recursive : ?size:int -> (('-> 'b) -> '-> 'b) -> '-> 'b
  module Make :
    functor (M : Hashtbl.HashedType->
      sig
        val memo : ?size:int -> (M.t -> 'a) -> M.t -> 'a
        val memo_recursive :
          ?size:int -> ((M.t -> 'a) -> M.t -> 'a) -> M.t -> 'a
      end
  module Tabulate :
    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
end