@@ -551,10 +551,16 @@ module Lattices_mono = struct
551
551
('a0 , 'a1 , 'd ) morph
552
552
-> ('a0 comonadic_with , 'a1 comonadic_with , 'd ) morph
553
553
(* * Lift an morphism on areality to a morphism on the comonadic fragment *)
554
- | Unique_to_linear : (Uniqueness_op .t , Linearity .t , 'l * 'r ) morph
555
- (* * Returns the linearity dual to the given uniqueness *)
556
- | Linear_to_unique : (Linearity .t , Uniqueness_op .t , 'l * 'r ) morph
557
- (* * Returns the uniqueness dual to the given linearity *)
554
+ | Monadic_to_comonadic_min
555
+ : (Monadic_op .t , 'a comonadic_with , 'l * disallowed ) morph
556
+ (* * Dualize the monadic fragment to the comonadic fragment. The areality is set to min. *)
557
+ | Comonadic_to_monadic :
558
+ 'a comonadic_with obj
559
+ -> ('a comonadic_with , Monadic_op .t , 'l * 'r ) morph
560
+ (* * Dualize the comonadic fragment to the monadic fragment. The areality axis is ignored. *)
561
+ | Monadic_to_comonadic_max
562
+ : (Monadic_op .t , 'a comonadic_with , disallowed * 'r ) morph
563
+ (* * Dualize the monadic fragment to the comonadic fragment. The areality is set to max. *)
558
564
(* Following is a chain of adjunction (complete and cannot extend in
559
565
either direction) *)
560
566
| Local_to_regional : (Locality .t , Regionality .t , 'l * disallowed ) morph
@@ -585,8 +591,8 @@ module Lattices_mono = struct
585
591
let f = allow_left f in
586
592
let g = allow_left g in
587
593
Compose (f, g)
588
- | Unique_to_linear -> Unique_to_linear
589
- | Linear_to_unique -> Linear_to_unique
594
+ | Monadic_to_comonadic_min -> Monadic_to_comonadic_min
595
+ | Comonadic_to_monadic a -> Comonadic_to_monadic a
590
596
| Local_to_regional -> Local_to_regional
591
597
| Locality_as_regionality -> Locality_as_regionality
592
598
| Regional_to_local -> Regional_to_local
@@ -607,8 +613,8 @@ module Lattices_mono = struct
607
613
let f = allow_right f in
608
614
let g = allow_right g in
609
615
Compose (f, g)
610
- | Unique_to_linear -> Unique_to_linear
611
- | Linear_to_unique -> Linear_to_unique
616
+ | Comonadic_to_monadic a -> Comonadic_to_monadic a
617
+ | Monadic_to_comonadic_max -> Monadic_to_comonadic_max
612
618
| Global_to_regional -> Global_to_regional
613
619
| Locality_as_regionality -> Locality_as_regionality
614
620
| Regional_to_local -> Regional_to_local
@@ -632,8 +638,9 @@ module Lattices_mono = struct
632
638
let f = disallow_left f in
633
639
let g = disallow_left g in
634
640
Compose (f, g)
635
- | Unique_to_linear -> Unique_to_linear
636
- | Linear_to_unique -> Linear_to_unique
641
+ | Monadic_to_comonadic_min -> Monadic_to_comonadic_min
642
+ | Comonadic_to_monadic a -> Comonadic_to_monadic a
643
+ | Monadic_to_comonadic_max -> Monadic_to_comonadic_max
637
644
| Local_to_regional -> Local_to_regional
638
645
| Global_to_regional -> Global_to_regional
639
646
| Locality_as_regionality -> Locality_as_regionality
@@ -658,8 +665,9 @@ module Lattices_mono = struct
658
665
let f = disallow_right f in
659
666
let g = disallow_right g in
660
667
Compose (f, g)
661
- | Unique_to_linear -> Unique_to_linear
662
- | Linear_to_unique -> Linear_to_unique
668
+ | Monadic_to_comonadic_min -> Monadic_to_comonadic_min
669
+ | Comonadic_to_monadic a -> Comonadic_to_monadic a
670
+ | Monadic_to_comonadic_max -> Monadic_to_comonadic_max
663
671
| Local_to_regional -> Local_to_regional
664
672
| Global_to_regional -> Global_to_regional
665
673
| Locality_as_regionality -> Locality_as_regionality
@@ -684,8 +692,9 @@ module Lattices_mono = struct
684
692
| Compose (f , g ) ->
685
693
let mid = src dst f in
686
694
src mid g
687
- | Unique_to_linear -> Uniqueness_op
688
- | Linear_to_unique -> Linearity
695
+ | Monadic_to_comonadic_min -> Monadic_op
696
+ | Comonadic_to_monadic src -> src
697
+ | Monadic_to_comonadic_max -> Monadic_op
689
698
| Local_to_regional -> Locality
690
699
| Locality_as_regionality -> Locality
691
700
| Global_to_regional -> Locality
@@ -728,8 +737,10 @@ module Lattices_mono = struct
728
737
| Join_with c0 , Join_with c1 -> if c0 = c1 then Some Refl else None
729
738
| Imply c0 , Imply c1 -> if c0 = c1 then Some Refl else None
730
739
| Subtract c0 , Subtract c1 -> if c0 = c1 then Some Refl else None
731
- | Unique_to_linear , Unique_to_linear -> Some Refl
732
- | Linear_to_unique , Linear_to_unique -> Some Refl
740
+ | Monadic_to_comonadic_min , Monadic_to_comonadic_min -> Some Refl
741
+ | Comonadic_to_monadic a0 , Comonadic_to_monadic a1 -> (
742
+ match eq_obj a0 a1 with None -> None | Some Refl -> Some Refl )
743
+ | Monadic_to_comonadic_max , Monadic_to_comonadic_max -> Some Refl
733
744
| Local_to_regional , Local_to_regional -> Some Refl
734
745
| Locality_as_regionality , Locality_as_regionality -> Some Refl
735
746
| Global_to_regional , Global_to_regional -> Some Refl
@@ -743,7 +754,8 @@ module Lattices_mono = struct
743
754
| Map_comonadic f , Map_comonadic g -> (
744
755
match equal f g with Some Refl -> Some Refl | None -> None )
745
756
| ( ( Id | Proj _ | Max_with _ | Min_with _ | Meet_with _ | Join_with _
746
- | Unique_to_linear | Linear_to_unique | Local_to_regional
757
+ | Monadic_to_comonadic_min | Comonadic_to_monadic _
758
+ | Monadic_to_comonadic_max | Local_to_regional
747
759
| Locality_as_regionality | Global_to_regional | Regional_to_local
748
760
| Regional_to_global | Compose _ | Map_comonadic _ | Imply _
749
761
| Subtract _ ),
@@ -767,8 +779,9 @@ module Lattices_mono = struct
767
779
| Map_comonadic f ->
768
780
let dst0 = proj_obj Areality dst in
769
781
Format. fprintf ppf " map_comonadic(%a)" (print_morph dst0) f
770
- | Unique_to_linear -> Format. fprintf ppf " unique_to_linear"
771
- | Linear_to_unique -> Format. fprintf ppf " linear_to_unique"
782
+ | Monadic_to_comonadic_min -> Format. fprintf ppf " monadic_to_comonadic_min"
783
+ | Comonadic_to_monadic _ -> Format. fprintf ppf " comonadic_to_monadic"
784
+ | Monadic_to_comonadic_max -> Format. fprintf ppf " monadic_to_comonadic_max"
772
785
| Local_to_regional -> Format. fprintf ppf " local_to_regional"
773
786
| Regional_to_local -> Format. fprintf ppf " regional_to_local"
774
787
| Locality_as_regionality -> Format. fprintf ppf " locality_as_regionality"
@@ -814,6 +827,27 @@ module Lattices_mono = struct
814
827
815
828
let max_with dst ax a = update ax a (max dst)
816
829
830
+ let monadic_to_comonadic_min :
831
+ type a . a comonadic_with obj -> Monadic_op. t -> a comonadic_with =
832
+ fun obj (uniqueness , () ) ->
833
+ match obj with
834
+ | Comonadic_with_locality -> Locality. min, unique_to_linear uniqueness
835
+ | Comonadic_with_regionality -> Regionality. min, unique_to_linear uniqueness
836
+
837
+ let comonadic_to_monadic :
838
+ type a . a comonadic_with obj -> a comonadic_with -> Monadic_op. t =
839
+ fun obj (_ , linearity ) ->
840
+ match obj with
841
+ | Comonadic_with_locality -> linear_to_unique linearity, ()
842
+ | Comonadic_with_regionality -> linear_to_unique linearity, ()
843
+
844
+ let monadic_to_comonadic_max :
845
+ type a . a comonadic_with obj -> Monadic_op. t -> a comonadic_with =
846
+ fun obj (uniqueness , () ) ->
847
+ match obj with
848
+ | Comonadic_with_locality -> Locality. max, unique_to_linear uniqueness
849
+ | Comonadic_with_regionality -> Regionality. max, unique_to_linear uniqueness
850
+
817
851
let rec apply : type a b d. b obj -> (a, b, d) morph -> a -> b =
818
852
fun dst f a ->
819
853
match f with
@@ -830,8 +864,9 @@ module Lattices_mono = struct
830
864
| Join_with c -> join dst c a
831
865
| Imply c -> imply dst c a
832
866
| Subtract c -> subtract dst c a
833
- | Unique_to_linear -> unique_to_linear a
834
- | Linear_to_unique -> linear_to_unique a
867
+ | Monadic_to_comonadic_min -> monadic_to_comonadic_min dst a
868
+ | Comonadic_to_monadic src -> comonadic_to_monadic src a
869
+ | Monadic_to_comonadic_max -> monadic_to_comonadic_max dst a
835
870
| Local_to_regional -> local_to_regional a
836
871
| Regional_to_local -> regional_to_local a
837
872
| Locality_as_regionality -> locality_as_regionality a
@@ -878,8 +913,9 @@ module Lattices_mono = struct
878
913
match ax with
879
914
| Areality -> Some (compose dst f (Proj (src', Areality )))
880
915
| Linearity -> Some (Proj (src', Linearity )))
881
- | Unique_to_linear , Linear_to_unique -> Some Id
882
- | Linear_to_unique , Unique_to_linear -> Some Id
916
+ | Proj _ , Monadic_to_comonadic_min -> None
917
+ | Proj _ , Monadic_to_comonadic_max -> None
918
+ | Proj _ , Comonadic_to_monadic _ -> None
883
919
| Map_comonadic f , Map_comonadic g ->
884
920
let dst0 = proj_obj Areality dst in
885
921
Some (Map_comonadic (compose dst0 f g))
@@ -912,14 +948,6 @@ module Lattices_mono = struct
912
948
(compose dst
913
949
(Join_with (locality_as_regionality c))
914
950
Locality_as_regionality )
915
- | Unique_to_linear , Meet_with c ->
916
- Some (compose dst (Meet_with (unique_to_linear c)) Unique_to_linear )
917
- | Unique_to_linear , Join_with c ->
918
- Some (compose dst (Join_with (unique_to_linear c)) Unique_to_linear )
919
- | Linear_to_unique , Meet_with c ->
920
- Some (compose dst (Meet_with (linear_to_unique c)) Linear_to_unique )
921
- | Linear_to_unique , Join_with c ->
922
- Some (compose dst (Join_with (linear_to_unique c)) Linear_to_unique )
923
951
| Map_comonadic f , Join_with c ->
924
952
let dst0 = proj_obj Areality dst in
925
953
let areality, linearity = c in
@@ -955,19 +983,19 @@ module Lattices_mono = struct
955
983
| Subtract _ , _ -> None
956
984
| _ , Proj _ -> None
957
985
| Map_comonadic _ , _ -> None
986
+ | Monadic_to_comonadic_min , _ -> None
987
+ | Monadic_to_comonadic_max , _ -> None
988
+ | Comonadic_to_monadic _ , _ -> None
958
989
| ( Proj _,
959
- ( Unique_to_linear | Linear_to_unique | Local_to_regional
960
- | Regional_to_local | Locality_as_regionality | Regional_to_global
961
- | Global_to_regional ) ) ->
990
+ ( Local_to_regional | Regional_to_local | Locality_as_regionality
991
+ | Regional_to_global | Global_to_regional ) ) ->
962
992
.
963
- | ( ( Unique_to_linear | Linear_to_unique | Local_to_regional
964
- | Regional_to_local | Locality_as_regionality | Regional_to_global
965
- | Global_to_regional ),
993
+ | ( ( Local_to_regional | Regional_to_local | Locality_as_regionality
994
+ | Regional_to_global | Global_to_regional ),
966
995
Min_with _ ) ->
967
996
.
968
- | ( ( Unique_to_linear | Linear_to_unique | Local_to_regional
969
- | Regional_to_local | Locality_as_regionality | Regional_to_global
970
- | Global_to_regional ),
997
+ | ( ( Local_to_regional | Regional_to_local | Locality_as_regionality
998
+ | Regional_to_global | Global_to_regional ),
971
999
Max_with _ ) ->
972
1000
.
973
1001
@@ -992,8 +1020,8 @@ module Lattices_mono = struct
992
1020
Compose (g', f')
993
1021
| Join_with c -> Subtract c
994
1022
| Imply c -> Meet_with c
995
- | Unique_to_linear -> Linear_to_unique
996
- | Linear_to_unique -> Unique_to_linear
1023
+ | Comonadic_to_monadic _ -> Monadic_to_comonadic_min
1024
+ | Monadic_to_comonadic_max -> Comonadic_to_monadic dst
997
1025
| Global_to_regional -> Regional_to_global
998
1026
| Regional_to_global -> Locality_as_regionality
999
1027
| Locality_as_regionality -> Regional_to_local
@@ -1018,8 +1046,8 @@ module Lattices_mono = struct
1018
1046
Compose (g', f')
1019
1047
| Meet_with c -> Imply c
1020
1048
| Subtract c -> Join_with c
1021
- | Unique_to_linear -> Linear_to_unique
1022
- | Linear_to_unique -> Unique_to_linear
1049
+ | Comonadic_to_monadic _ -> Monadic_to_comonadic_max
1050
+ | Monadic_to_comonadic_min -> Comonadic_to_monadic dst
1023
1051
| Local_to_regional -> Regional_to_local
1024
1052
| Regional_to_local -> Locality_as_regionality
1025
1053
| Locality_as_regionality -> Regional_to_global
@@ -1210,12 +1238,6 @@ module Uniqueness = struct
1210
1238
let zap_to_legacy = zap_to_ceil
1211
1239
end
1212
1240
1213
- let unique_to_linear m =
1214
- S.Positive. via_antitone Linearity.Obj. obj C. Unique_to_linear m
1215
-
1216
- let linear_to_unique m =
1217
- S.Negative. via_antitone Uniqueness.Obj. obj C. Linear_to_unique m
1218
-
1219
1241
let regional_to_local m =
1220
1242
S.Positive. via_monotone Locality.Obj. obj C. Regional_to_local m
1221
1243
@@ -1225,10 +1247,6 @@ let locality_as_regionality m =
1225
1247
let regional_to_global m =
1226
1248
S.Positive. via_monotone Locality.Obj. obj C. Regional_to_global m
1227
1249
1228
- module Const = struct
1229
- let unique_to_linear a = C. unique_to_linear a
1230
- end
1231
-
1232
1250
module Comonadic_with_regionality = struct
1233
1251
module Const = C. Comonadic_with_regionality
1234
1252
@@ -1697,6 +1715,10 @@ module Value = struct
1697
1715
let monadic = Monadic. meet mo in
1698
1716
{ comonadic; monadic }
1699
1717
1718
+ let comonadic_to_monadic m =
1719
+ S.Negative. via_antitone Monadic.Obj. obj
1720
+ (Comonadic_to_monadic Comonadic.Obj. obj) m
1721
+
1700
1722
module Const = struct
1701
1723
type t = Regionality.Const .t * Linearity.Const .t * Uniqueness.Const .t
1702
1724
@@ -1935,6 +1957,10 @@ module Alloc = struct
1935
1957
let monadic = Monadic. meet mo in
1936
1958
{ comonadic; monadic }
1937
1959
1960
+ let monadic_to_comonadic_min m =
1961
+ S.Positive. via_antitone Comonadic.Obj. obj Monadic_to_comonadic_min
1962
+ (Monadic. disallow_left m)
1963
+
1938
1964
module Const = struct
1939
1965
type ('loc, 'lin, 'uni) modes =
1940
1966
{ locality : 'loc ;
@@ -2006,26 +2032,31 @@ module Alloc = struct
2006
2032
{ locality; uniqueness; linearity }
2007
2033
end
2008
2034
2035
+ let split { locality; linearity; uniqueness } =
2036
+ let monadic = uniqueness, () in
2037
+ let comonadic = locality, linearity in
2038
+ { comonadic; monadic }
2039
+
2040
+ let merge { comonadic; monadic } =
2041
+ let locality, linearity = comonadic in
2042
+ let uniqueness, () = monadic in
2043
+ { locality; linearity; uniqueness }
2044
+
2009
2045
(* * See [Alloc.close_over] for explanation. *)
2010
2046
let close_over m =
2011
- let locality = m.locality in
2012
- (* uniqueness of the returned function is not constrained *)
2013
- let uniqueness = Uniqueness.Const. min in
2014
- let linearity =
2015
- Linearity.Const. join m.linearity
2016
- (* In addition, unique argument make the returning function once.
2017
- In other words, if argument <= unique, returning function >= once.
2018
- That is, returning function >= (dual of argument) *)
2019
- (Const. unique_to_linear m.uniqueness)
2047
+ let { monadic; comonadic } = split m in
2048
+ let comonadic =
2049
+ Comonadic.Const. join comonadic
2050
+ (C. monadic_to_comonadic_min Comonadic.Obj. obj monadic)
2020
2051
in
2021
- { locality; linearity; uniqueness }
2052
+ let monadic = Monadic.Const. min in
2053
+ merge { comonadic; monadic }
2022
2054
2023
2055
(* * See [Alloc.partial_apply] for explanation. *)
2024
2056
let partial_apply m =
2025
- let locality = m.locality in
2026
- let uniqueness = Uniqueness.Const. min in
2027
- let linearity = m.linearity in
2028
- { locality; linearity; uniqueness }
2057
+ let { comonadic; _ } = split m in
2058
+ let monadic = Monadic.Const. min in
2059
+ merge { comonadic; monadic }
2029
2060
end
2030
2061
2031
2062
let of_const = Const. of_const
@@ -2054,25 +2085,23 @@ module Alloc = struct
2054
2085
C]. [comonadic] and [monadic] constutute the mode of [A], and we need to
2055
2086
give the lower bound mode of [B -> C]. *)
2056
2087
let close_over { comonadic; monadic } =
2057
- (* If [A] is [local], [B -> C] containining a pointer to [A] must
2058
- be [local] too. *)
2059
- let locality = min_with_locality (Comonadic. locality comonadic) in
2060
- (* [B -> C] is arrow type and thus crosses uniqueness *)
2061
- (* If [A] is [once], [B -> C] containing a pointer to [A] must be [once] too
2062
- *)
2063
- let linearity0 = min_with_linearity (Comonadic. linearity comonadic) in
2064
- (* Moreover, if [A] is [unique], [B -> C] must be [once]. *)
2065
- let linearity1 =
2066
- min_with_linearity (unique_to_linear (Monadic. uniqueness monadic))
2067
- in
2068
- join [locality; linearity0; linearity1]
2088
+ let comonadic = Comonadic. disallow_right comonadic in
2089
+ (* The comonadic of the returned function is constrained by the monadic of the closed argument via the dualizing morphism. *)
2090
+ let comonadic1 = monadic_to_comonadic_min monadic in
2091
+ (* It's also constrained by the comonadic of the closed argument. *)
2092
+ let comonadic = Comonadic. join [comonadic; comonadic1] in
2093
+ (* The returned function crosses all monadic axes that we know of
2094
+ (uniqueness/contention). *)
2095
+ let monadic = Monadic. disallow_right Monadic. min in
2096
+ { comonadic; monadic }
2069
2097
2070
2098
(* * Similar to above, but we are given the mode of [A -> B -> C], and need to
2071
2099
give the lower bound mode of [B -> C]. *)
2072
- let partial_apply alloc_mode =
2073
- (* [B -> C] should be always higher than [A -> B -> C] except the uniqueness
2074
- axis where it's not constrained *)
2075
- meet_with_uniqueness Unique alloc_mode
2100
+ let partial_apply { comonadic; _ } =
2101
+ (* The returned function crosses all monadic axes that we know of. *)
2102
+ let monadic = Monadic. disallow_right Monadic. min in
2103
+ let comonadic = Comonadic. disallow_right comonadic in
2104
+ { comonadic; monadic }
2076
2105
end
2077
2106
2078
2107
let alloc_as_value m =
0 commit comments