sig
  module Make :
    functor (Ground : Dalton_sig.GROUND->
      functor (Print : Dalton_sig.PRINT->
        functor (Draw : Dalton_sig.DRAW->
          functor (Report : Dalton_sig.ERROR_REPORT->
            sig
              type cset
              val cset : unit -> Dalton.Make.cset
              val merge_cset : Dalton.Make.cset -> Dalton.Make.cset -> unit
              type node
              val variable :
                Dalton.Make.cset -> Dalton_aux.kind -> Dalton.Make.node
              val variable_in_sk : Dalton.Make.node -> Dalton.Make.node
              val typ :
                Dalton.Make.cset ->
                Dalton.Make.node Ground.Type.t -> Dalton.Make.node
              val row :
                Dalton.Make.cset ->
                Ground.Label.t * Dalton.Make.node * Dalton.Make.node ->
                Dalton.Make.node
              type skeleton
              and node_or_skeleton =
                  Nd of Dalton.Make.node
                | Sk of Dalton.Make.skeleton
              and unification_report
              exception UnificationError of Dalton.Make.unification_report
              val report_unification :
                Format.formatter -> Dalton.Make.unification_report -> unit
              val same_skel : Dalton.Make.node -> Dalton.Make.node -> unit
              val equal : Dalton.Make.node -> Dalton.Make.node -> unit
              val strong_leq : Dalton.Make.node -> Dalton.Make.node -> unit
              val weak_leq :
                Dalton.Make.node_or_skeleton ->
                Dalton.Make.node_or_skeleton -> unit
              val lower_bound :
                Ground.Lb.t -> Dalton.Make.node_or_skeleton -> unit
              val upper_bound :
                Dalton.Make.node_or_skeleton -> Ground.Ub.t -> unit
              type subst = {
                lb : Ground.Lb.t -> Ground.Lb.t;
                ub : Ground.Ub.t -> Ground.Ub.t;
                typ : 'a. 'Ground.Type.t -> 'Ground.Type.t;
                label : Ground.Label.t -> Ground.Label.t;
              } 
              module type SCHEME_ROOT =
                sig
                  type t
                  val cset : Dalton.Make.SCHEME_ROOT.t -> Dalton.Make.cset
                  val copy :
                    Dalton.Make.cset ->
                    (Dalton.Make.node -> Dalton.Make.node) ->
                    Dalton.Make.SCHEME_ROOT.t -> Dalton.Make.SCHEME_ROOT.t
                  val iter :
                    (Dalton_aux.variance -> Dalton.Make.node -> unit) ->
                    Dalton.Make.SCHEME_ROOT.t -> unit
                  val iter2 :
                    (Dalton_aux.variance ->
                     Dalton.Make.node -> Dalton.Make.node -> unit) ->
                    Dalton.Make.SCHEME_ROOT.t ->
                    Dalton.Make.SCHEME_ROOT.t -> unit
                  val fprint :
                    Format.formatter ->
                    Dalton.Make.cset Dalton_aux.printer ->
                    (Dalton_aux.variance ->
                     Format.formatter -> Dalton.Make.node -> unit) ->
                    Dalton.Make.SCHEME_ROOT.t -> unit
                end
              module Scheme :
                functor (Root : SCHEME_ROOT->
                  sig
                    val copy : ?subst:Dalton.Make.subst -> Root.t -> Root.t
                    val fprint : Format.formatter -> Root.t -> unit
                    val draw :
                      Draw.window -> Root.t -> int -> int -> int * int
                    type solve_report
                    val report_solve :
                      Format.formatter ->
                      Dalton.Make.Scheme.solve_report -> unit
                    val solve :
                      Root.t -> Dalton.Make.Scheme.solve_report option
                    type comparison_report
                    val report_comparison :
                      Format.formatter ->
                      Dalton.Make.Scheme.comparison_report -> unit
                    val compare :
                      Root.t ->
                      Root.t -> Dalton.Make.Scheme.comparison_report option
                    val equivalent : Root.t -> Root.t -> bool
                    type minimal_report
                    val report_minimal :
                      Format.formatter ->
                      Dalton.Make.Scheme.minimal_report -> unit
                    val has_minimal_instance :
                      Root.t -> Dalton.Make.Scheme.minimal_report option
                  end
              val set_expand_manifest :
                (Dalton.Make.skeleton Ground.Type.t ->
                 (Dalton.Make.node * Dalton.Make.node) option) ->
                unit
              val skeleton_stamp : Dalton.Make.node -> int
              val get_lower_bound : Dalton.Make.node -> Ground.Lb.t
              val get_upper_bound : Dalton.Make.node -> Ground.Ub.t
            end
end