Solver_mono.Cinclude Solver_intf.Lattices with type 'a elt := 'aval min : 'a obj -> 'aval max : 'a obj -> 'aval le : 'a obj -> 'a -> 'a -> boolval join : 'a obj -> 'a -> 'a -> 'aval meet : 'a obj -> 'a -> 'a -> 'aval print : 'a obj -> Format.formatter -> 'a -> unitval eq_obj : 'a obj -> 'b obj -> ('a, 'b) Ocaml_utils.Misc_stdlib.eq optionval print_obj : Format.formatter -> 'a obj -> unitMorphism from object of base type 'a to object of base type 'b with allowance 'd. See Note Allowance in allowance.mli.
'd is 'l * 'r, where 'l can be:
allowed, meaning the morphism can be on the left because it has right adjoint.disallowed, meaning the morphism cannot be on the left because it does not have right adjoint. Similar for 'r.val id : ('a, 'a, 'd) morphGive the identity morphism on an object
Compose two morphisms
val left_adjoint :
'b obj ->
('a, 'b, 'l * Allowance.allowed) morph ->
('b, 'a, Allowance.left_only) morphGive left adjoint of a morphism
val right_adjoint :
'b obj ->
('a, 'b, Allowance.allowed * 'r) morph ->
('b, 'a, Allowance.right_only) morphGive the right adjoint of a morphism
include Allowance.Allow_disallow
with type ('a, 'b, 'd) sided = ('a, 'b, 'd) morphtype ('a, 'b, 'd) sided = ('a, 'b, 'd) morphval disallow_right :
('a, 'b, 'l * 'r) sided ->
('a, 'b, 'l * Allowance.disallowed) sidedDisallows on the right.
val disallow_left :
('a, 'b, 'l * 'r) sided ->
('a, 'b, Allowance.disallowed * 'r) sidedDisallows a the left.
val allow_right :
('a, 'b, 'l * Allowance.allowed) sided ->
('a, 'b, 'l * 'r) sidedGeneralizes a right-hand-side allowed to be any allowance.
val allow_left :
('a, 'b, Allowance.allowed * 'r) sided ->
('a, 'b, 'l * 'r) sidedGeneralizes a left-hand-side allowed to be any allowance.
val eq_morph :
('a0, 'b, 'l0 * 'r0) morph ->
('a1, 'b, 'l1 * 'r1) morph ->
('a0, 'a1) Ocaml_utils.Misc_stdlib.eq optionChecks if two morphisms are equal. If so, returns Some Refl. Used for deduplication only; it is fine (but not recommended) to return None for equal morphisms.
While a morph must be acompanied by a destination obj to uniquely identify a morphism, two morph sharing the same destination can be compared on their own.
val print_morph : 'b obj -> Format.formatter -> ('a, 'b, 'd) morph -> unitPrint morphism