Considering examples like
mu a. Top -> (mu b. B1)
<:
mu a. Top -> (mu b. B2)
(but not mu a. a -> (mu b. B1))
<:
mu a. a -> (mu b. B2)
We might based our reasoning on the left:
given
A1 [a- |-> {a : A1}]
& A2 [a- |-> {a : A2}]
& A3 [a- |-> {a : A3}]
<<
B1 & B2 [a- |-> {a : B}]
we can case on whether
A1 [a- |-> {a : A1 & A2 & A3}]
& A2 [a- |-> {a : A1 & A2 & A3}]
& A3 [a- |-> {a : A1 & A2 & A3}]
is a subtype of
B1 & B2 [a- |-> {a : B}]
B = mu a. a -> (mu b. (
b -> Int &
b -> Bool
))
[ a. {a : ..... } -> [ b.
{b : b -> Int & b -> Bool} -> Int
& {b : b -> Int & b -> Bool} -> Bool
]
]
A can be:
-- refl
mu a. a -> (mu b. (b -> Int & b -> Bool))
-- mu a. a -> XXX & mu a. a -> XXX
...
-- mu a. Top -> XXX
mu a. Top -> (mu b. (b -> Int & b -> Bool))
mu a. Top -> (mu b. (Top -> Int & b -> Bool))
mu a. Top -> ((mu b. b -> Int) & (mu b. b -> Bool)))
-- mu a. Top -> XXX & mu a. Top -> XXX
(mu a. Top -> (mu b. b -> Int)) & (mu a. Top -> (mu b. b -> Bool))
(mu a. Top -> (mu b. b -> Int)) & (mu a. Top -> (mu b. Top -> Bool))
For this left type, no mu-split of the right type can satisfy being a supertype of A1/A2
[a. Top -> [b. {b : b -> Int } -> Int ] ]
& [a. Top -> [b. {b : b -> Bool } -> Bool ] ]
==
[a. Top -> [b.
{b : b -> Int } -> Int
& {b : b -> Bool } -> Bool
]
]
<<
[a. {a. .... } -> [b.
{b : b -> Int } -> Int
& {b : b -> Bool } -> Bool
]
]
[a. A1 [{a : A1}/a-] ] & [a. A2 [{a : A2}/a-] ] << [a. B [{a: B}/a-]]
==
[a. A1 [{a : A1}/a-] & A2 [{a : A2}/a-] ]
(1) when a is not in fv_neg(A1) and fv_neg(A2)
== [a. A1 [{a : A1 & A2 }/a-] & A2 [{a : A1 & A2}/a-] ]
== [a. (A1 & A2) [ {a : A1 & A2} /a- ] ] << [a. B [{a: B}/a-]] OK
[a. A1 [{a : A1}/a-] & A2 [{a : A2}/a-] ] << [a. B [{a: B}/a-]]
(2) when a is in fv_neg(A1)
which implies a negative reflexive comparison in A1 with B,
we know A1 & A2 << B << A1
(2.1) when a is in fv_neg(A1), a is not in fv_neg(A2)
e.g. A1 & A2 << B << A1 can be:
(a -> Int) & (Top -> a) << (a -> Int) & (Bool -> a) << (a -> Int)?
we want to argue:
mu a. a -> Int
& mu a. Top -> a
<:
mu a. a -> Int
& mu a. Bool -> a <--- How to find? based on a not in fv_neg(A2)
<:
mu a. ( a -> Int ) & ( Bool -> a )
or even more complex:
e.g. A1 & A2 << B << A1 can be:
a -> [b. {b : b -> Bool} -> Bool]
& Top -> [b. {b : b -> Int} -> Int ]
<< a -> [b. {b : b -> Bool} -> Bool]
& a -> [b. {b : b -> Int} -> Int ]
<< a -> [b. ({b : b -> Bool} -> Bool) & ({b : b -> Int} -> Int) ]
(but not
a -> [b. ({b : b -> Bool & b -> Int} -> Bool)
& ({b : b -> Bool & b -> Int} -> Int) ]
as it will break the [B << A1] constraint
)
<< a -> [b. {b : b -> Bool} -> Bool]