sig
  type (+'t, +'ty) t = private
      Yield of 't
    | Cases of ('t, 'ty) Model.DT.cases
  and ('t, 'ty) cases = {
    var : 'ty Var.t;
    tests : ('t, 'ty) Model.DT.case list;
    default : ('t, 'ty) Model.DT.t option;
  }
  and ('t, 'ty) case = 't * ('t, 'ty) Model.DT.t
  val yield : '-> ('t, 'a) Model.DT.t
  val const : 'ty Var.t list -> ('t, 'ty) Model.DT.t -> ('t, 'ty) Model.DT.t
  val cases :
    'ty Var.t ->
    tests:('t, 'ty) Model.DT.case list ->
    default:('t, 'ty) Model.DT.t option -> ('t, 'ty) Model.DT.t
  val map :
    term:('t1 -> 't2) ->
    ty:('ty1 -> 'ty2) -> ('t1, 'ty1) Model.DT.t -> ('t2, 'ty2) Model.DT.t
  val filter_map :
    test:('ty Var.t -> 't1 -> 't2 option) ->
    yield:('t1 -> 't2) -> ('t1, 'ty) Model.DT.t -> ('t2, 'ty) Model.DT.t
  val ty_args : ('a, 'ty) Model.DT.t -> 'ty list
  val vars : ('a, 'ty) Model.DT.t -> 'ty Var.t list
  val num_vars : ('a, 'b) Model.DT.t -> int
  val add_default : '-> ('t, 'ty) Model.DT.t -> ('t, 'ty) Model.DT.t
  type ('t, 'ty) flat_test = { ft_var : 'ty Var.t; ft_term : 't; }
  type ('t, 'ty) flat_dt = {
    fdt_vars : 'ty Var.t list;
    fdt_cases : (('t, 'ty) Model.DT.flat_test list * 't) list;
    fdt_default : 't option;
  }
  val mk_flat_test : 'ty Var.t -> '-> ('t, 'ty) Model.DT.flat_test
  val of_flat :
    equal:('-> '-> bool) ->
    hash:('-> int) -> ('t, 'ty) Model.DT.flat_dt -> ('t, 'ty) Model.DT.t
  val flatten : ('t, 'ty) Model.DT.t -> ('t, 'ty) Model.DT.flat_dt
  val check_ : ('a, 'b) Model.DT.t -> unit
  val print :
    'Model.prec_printer ->
    'ty Model.printer -> ('t, 'ty) Model.DT.t Model.printer
  val print_flat_test :
    'Model.prec_printer -> ('t, 'a) Model.DT.flat_test Model.printer
  val print_flat :
    'Model.prec_printer -> ('t, 'a) Model.DT.flat_dt Model.printer
  val to_sexp :
    'Model.to_sexp ->
    'ty Model.to_sexp -> ('t, 'ty) Model.DT.t Model.to_sexp
end