module Make: functor (Ground : Dalton_sig.GROUND) ->
functor (Print : Dalton_sig.PRINT) ->
functor (Draw : Dalton_sig.DRAW) ->
functor (Report : Dalton_sig.ERROR_REPORT) -> sig end
The constraint solver comes as a functor parametrized by four modules
whose respective expected signatures are given in
Dalton_sig
.
type cset
Constraint sets are represented by values of type cset
.
val cset : unit -> cset
Each invokation of cset ()
returns a new fresh empty constraint
set.
val merge_cset : cset -> cset -> unit
merge_cset cs1 cs2
merges the two constraint sets cs1
and cs2
.
After invoking this function, cs1
and cs2
point to the same
constraint set cs
which corresponds to the conjunction of the
previous cs1
and cs2
.
type node
(Multi-equations of) Terms are represented by values of type node
.
val variable : cset -> Dalton_aux.kind -> node
variable cs k
returns a fresh variable term of kind k
. This
variable may be used in the constraint set cs
.
val variable_in_sk : node -> node
variable_in_sk nd
returns a fresh variable belonging to the same
skeleton (and the same constraint set) as the node nd
.
val typ : cset -> node Ground.Type.t -> node
typ cs t
returns a fresh type term described by the type constructor
t
in the constraint set cs
. Every son of t
must be a node
belonging to cs
.
val row : cset ->
Ground.Label.t * node * node -> node
row cs (lbl, nd_lbl, nd')
returns a fresh row node representing
the term lbl: nd_lbl, nd'
in the constraint set cs
. nd_lbl
and
nd'
must both belong to cs
.
type skeleton
Multi-skeletons are represented by values of type skeleton
.
type node_or_skeleton =
A value of type node_or_skeleton
is either a node or a
skeleton. Such values are used to represent weak inequalities.
type unification_report
Unification errors are described by a value of type
unification_report
. The implementation of this type is not
described. As a result, reports may be used only in order to
print error messages thanks to the function report_unification
.
exception UnificationError of unification_report
Above functions report unification errors by raising an
exception UnificationError
with an appropriate report as
argument.
val report_unification : Format.formatter -> unification_report -> unit
report_unification ppf r
pretty prints an error message on the
formatter ppf
describing the unification error reported by r
.
val same_skel : node -> node -> unit
same_skel nd1 nd2
sets a constraint nd1 ~ nd2
. nd1
and nd2
must be nodes of the same constraint set and the same kind. If
setting this constrain entails an unification error, an exception
UnificationError
is raised.
val equal : node -> node -> unit
equal nd1 nd2
sets a constraint nd1 = nd2
. nd1
and nd2
must be nodes of the same constraint set and the same kind. If
setting this constrain entails an unification error, an exception
UnificationError
is raised.
val strong_leq : node -> node -> unit
strong_leq nd1 nd2
sets the strong inequality ns1 < ns2
. nd1
and nd2
must be nodes of the same constraint set and the same kind.
If setting this constrain entails an unification error, an exception
UnificationError
is raised.
val weak_leq : node_or_skeleton -> node_or_skeleton -> unit
weak_leq ns1 ns2
sets a weak inequality ns1 < ns2
. ns1
and
ns2
must be nodes or skeletons of the same constraint set.
val lower_bound : Ground.Lb.t -> node_or_skeleton -> unit
lower_bound lb ns
sets the weak inequality lb < ns
.
val upper_bound : node_or_skeleton -> Ground.Ub.t -> unit
upper_bound ns ub
sets the weak inequality ns < ub
.
type subst = {
|
lb : Ground.Lb.t -> Ground.Lb.t ; |
(* | The substitution applied on lower bounds appearing in
the constraint set. | *) |
|
ub : Ground.Ub.t -> Ground.Ub.t ; |
(* | The substitution applied on upper bounds appearing in
the constraint set. | *) |
|
typ : 'a. 'a Ground.Type.t -> 'a Ground.Type.t ; |
(* | The substitution applied on type constructors. | *) |
|
label : Ground.Label.t -> Ground.Label.t ; |
(* | The substitution applied on row labels. | *) |
}
A substitution may be applied while copying a scheme. It is defined
by a record of four functions of type subst
.
module type SCHEME_ROOT = sig end
A (type) scheme is made of a constraint set and a series of entry
nodes, its roots.
module Scheme: functor (Root : SCHEME_ROOT) -> sig end
The functor scheme allows to build an implementation of functions
dealing which each considered form schemes.