当前位置: 首页 > news >正文

16 - Metatheory of subtyping

Subtyping 提到的规则并不适合实现,原因在于 T-SUB 和 S-Trans 规则推导中的项 \(t\) 没有任何约束的元变量(没有对形状作出限制)。

image

这意味着对于任意一个项 \(t\),无法确定在什么时机使用什么规则做类型推导。

image

S-Trans 的另一个问题是,\(U\) 的搜索空间近乎无穷大。解决所有这些问题的方法是:用两种新的关系,算法子类型关系 algorithmic subtyping 和算法类型关系 algorithmic typing,来替换普通的子类型和类型关系。然后证明这种替换是正确的。

类型检查器 type checker 会调用子类型检查器 subtype checker 判断 \((S, T)\) 是否满足 \(\mapsto S <: T\),即 \(S\)\(T\) 是否满足算法子类型关系。算法子类型关系中省略了 S-Trans 和 S-Refl 规则。

关于 record 的 width,depth 和 permutation 规则被合并成一个规则 S-RCD:

image

image

引理:证明 S-RCD 和原先的三个规则是等价的

image

引理:证明 S-REFL 和 S-TRANS 在只包含函数类型和 record 类型的子类型系统中是不必要的

image

证明 1 :

对 S 的类型进行归纳:

  • Top:通过 S-Top 自然成立

  • 函数类型:通过 S-ARROW 规则对 \(T_1\)\(T_2\) 做归纳

  • record:通过 S-RCD 自然成立

证明 2:

对推导过程进行归纳,考虑最后一条被应用的规则:

  • 不是 S-TRANS:对剩余的规则继续归纳

  • 是 S-TRANS:那么存在 \(S <: U\)\(U <: T\) 两个子推导,同时讨论这两个子推导的最后一条规则:

  • 任意一个规则 + S-Top 或者 S-Top + 任意一个规则可以直接替换成 S-Top

  • S-Arrow + S-Arrow:参考 https://roife.github.io/posts/tapl-16/

image

其余的情况类似。

image
image

算法子类型规则和原先的子类型规则是等价的。

image

通过上面的算法子类型规则,可以构造出一个子类型检查算法:

image

这个算法是可判定的。

image

前面一半可以从“算法子类型规则和原先的子类型规则是等价的”验证;至于后面一半,可以从算法中观察到,函数的参数规模在逐渐减小,因此不可能存在无限调用序列。

上面的工作消除了 S-REFL 和 S-TRANS,类型关系中 T-SUB 的处理也很麻烦,也需要以同样的方式把类型关系变成语法驱动的。和消除 S-TRANS 的思路类似,在消除 S-TRANS 规则的时候,我们把 S-TRANS 在推导树的位置往上提升,直到基类型 base types。T-SUB 的位置可以在推导树上下推,比如:

  • T-SUB + T-ABS:

image

image

  • T-SUB + T-APP:

T-SUB 出现在左部子推导:

image

根据上面的算法子类型关系,\(S_{11} \rightarrow S_{12} <: T_{11} \rightarrow T_{12}\) 的上一条推导规则不会是 S-REFL 或者 S_TRANS,只能是 S-ARROW:

image

改写得到:

image

T-SUB 出现在右部子推导:

image

image

  • T-SUB + T-SUB:

image

可以把任意的类型推导重写为:T-SUB 出现在 T-APP 的右子推导的末尾,或者在整个推导的末尾。如果简单删除整个推导末尾的 T-SUB 并不会有什么影响,反而使得项 \(t\) 得到了一个最小的类型,这样就只剩下 T-APP 处的 T-SUB 了,那么可以用一个新的函数应用的项上的类型规则取代 T-SUB:

image

image

同样地,算法类型关系是 sound 和 complete 的。

对于具有多个结果分支的表达式需要有一些额外的机制,比如对于算术表达式 if:

image

因为要求这个 if 表达式具有一致的类型,因为要求两个分支的最小公共超类型,即 \(\{x: Bool\}\),这称为两个类型的 join:

image

image

image

引入 Bot 类型需要对算法类型关系做一点扩展:

image

image

http://www.rkmt.cn/news/659.html

相关文章:

  • 国产项目管理工具崛起:Gitee如何以本土优势赋能企业研发效能
  • 项目调度管理系统(源码+文档+讲解+演示)
  • OB-Oracle百亿级数据存储方案
  • ZeroGPU Spaces 加速实践:PyTorch 提前编译全解析
  • 基于yolo12对目标物体进行自动裁剪和模糊打码
  • 2025.9.9数学课
  • 【Git】在更新项目时“将传入更改合并到当前分支“和”在传入更改上变基当前分支“有什么区别
  • 国内开发者如何选择代码管理平台?Gitee、GitHub等主流工具深度解析
  • 【Git】常见的 commit type 及用法
  • 【IEEE出版】第六届机器学习与计算机应用国际学术会议
  • 跨网文件摆渡软件如何选择?企业数字化转型的关键决策指南!
  • Avalonia 学习笔记02. Fonts and Animations(字体和动画) (转载)
  • 【IEEE出版】第九届电气、机械与计算机工程国际学术会议(ICEMCE 2025)
  • 英语_阅读_useful resources_待读
  • 第五届现代教育技术与社会科学国际学术会议(ICMETSS 2025)
  • 梅剑华:人工智能与因果推断——兼论奇点问题(哈哈,Why框架就是)
  • 真行!Claude 全面封禁中国。。
  • 质量QE的关键四个角色(DQE、SQE、PQE和CQE)
  • 剑指offer-28、数组中出现次数超过⼀半的数字
  • Redis是如何高效管理有限内存的?
  • PB9的数据窗口中文说明
  • PyPI包名的命名规则与pip的兼容性机制——为什么pip install sCIKit.-_LEarN也能成功
  • 一种简单粗暴的网页代理模式
  • 直播App源码功能大揭秘:主播PK、连麦互动与邀请奖励的技术与魅力
  • 这款开源调研系统越来越“懂事”了
  • qoj7511 Planar Graph
  • 30条顶级APT与蓝队攻防单行命令:网络战场终极对决
  • CF2138D
  • QBot - *--_
  • 222