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