是(A-> B)/ \(C-> D)<:(A / \ C)->(B / \ D)吗?

时间:2020-04-16 01:13:24

标签: subtype type-theory

(A-> B)/ \(C-> D)是(A / \ C)->(B / \ D)的子类型吗?

仅出于->变数的考虑,似乎不应该这样做,但我找不到很好的反例。

如果是,该如何得出呢?

如果没有,反例是什么?

(为澄清起见,我在这里使用/ \作为交集。)

1 个答案:

答案 0 :(得分:2)

这些类型属于子类型关系,正是由于 的逆差。联合将是A和C的超类型,因此将违反协变性。

调用函数的子类型化规则,这在域类型中是相反的:

T→U <:T'→U'iff T'<:T和U <:U'

对于相交类型,您还对箭头类型有一个分配规则:

(T→U)∧(T→V)= T→(U∧V)

当然,我们对交点类型有通常的消除规则:

T∧U <:T
T∧U <:U

将这四个规则放在一起,您可以轻松得出您要询问的子类型:

(A→B)∧(C→D)
<:(通过逆和左消除)
((A∧C)→B)∧(C→D)
<:(通过矛盾和权利消除)
((A∧C)→B)∧((A∧C)→D)
<:(按分布)
(A∧C)→(B∧D)

FWIW,具有联合类型,您还具有双重分配规则:

(U→T)∨(V→T)=(U∨V)→T

这样,您可以类似地得出:

(A→B)∨(C→D)<:(A∨C)→(B∨D)