第9章 类型推断 类型推断是把无类型的或“部分类型化的”项变换成良类型项的一般问题 它通过推导未给出的类型信息来完成这个变换

Slides:



Advertisements
Similar presentations
第五节 函数的微分 一、微分的定义 二、微分的几何意义 三、基本初等函数的微分公式与微分运算 法则 四、微分形式不变性 五、微分在近似计算中的应用 六、小结.
Advertisements

2.8 函数的微分 1 微分的定义 2 微分的几何意义 3 微分公式与微分运算法则 4 微分在近似计算中的应用.
一、会求多元复合函数一阶偏导数 多元复合函数的求导公式 学习要求: 二、了解全微分形式的不变性.
§4.2 第一换元积分法 课件制作 秦立春 引 例 第一换元积分法. §4.2 第一换元积分法 课件制作 秦立春 以上三式说明:积分公式中积分变可以是任意的字母公式仍然成立.
2.5 函数的微分 一、问题的提出 二、微分的定义 三、可微的条件 四、微分的几何意义 五、微分的求法 六、小结.
全微分 教学目的:全微分的有关概念和意义 教学重点:全微分的计算和应用 教学难点:全微分应用于近似计算.
第三节 微分 3.1 、微分的概念 3.2 、微分的计算 3.3 、微分的应用. 一、问题的提出 实例 : 正方形金属薄片受热后面积的改变量.
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
§3.4 空间直线的方程.
湛 江 文 化 五(3)班 中队.
第五章 二次型. 第五章 二次型 知识点1---二次型及其矩阵表示 二次型的基本概念 1. 线性变换与合同矩阵 2.
证券交易模拟 第2讲 交易规则与盘面术语.
《高等数学》(理学) 常数项级数的概念 袁安锋
常用逻辑用语复习课 李娟.
第五章 预测分析 学习目标:掌握定性和定量两类预测分析方法的特征;熟练掌握平滑指数法和修正的时间序列回归法的应用;重点掌握目标利润的预测方法。熟悉成本预测和资金需用量预测的主要方法;了解预测分析的概念、特点、基本程序及其主要内容;一般了解销售预测的各种方法的特点及其适用范围 重、难点:1、销售的定量分析.
例题 教学目的: 微积分基本公式 教学重点: 牛顿----莱布尼兹公式 教学难点: 变上限积分的性质与应用.
一、原函数与不定积分 二、不定积分的几何意义 三、基本积分公式及积分法则 四、牛顿—莱布尼兹公式 五、小结
第四章 函数的积分学 第六节 微积分的基本公式 一、变上限定积分 二、微积分的基本公式.
§5.3 定积分的换元法 和分部积分法 一、 定积分的换元法 二、 定积分的分部积分法 三、 小结、作业.
第四章 一元函数的积分 §4.1 不定积分的概念与性质 §4.2 换元积分法 §4.3 分部积分法 §4.4 有理函数的积分
定积分习题课.
不确定度的传递与合成 间接测量结果不确定度的评估
第三节 格林公式及其应用(2) 一、曲线积分与路径无关的定义 二、曲线积分与路径无关的条件 三、二元函数的全微分的求积 四、小结.
§5 微分及其应用 一、微分的概念 实例:正方形金属薄片受热后面积的改变量..
第二章 导数与微分 第二节 函数的微分法 一、导数的四则运算 二、复合函数的微分法.
第三章 导数与微分 习 题 课 主要内容 典型例题.
2-7、函数的微分 教学要求 教学要点.
§5 微分及其应用 一、微分的概念 实例:正方形金属薄片受热后面积的改变量..
程序的形式验证 - 简介 中国科学院软件研究所 张文辉 1.
第5章 §5.3 定积分的积分法 换元积分法 不定积分 分部积分法 换元积分法 定积分 分部积分法.
§3.7 热力学基本方程及麦克斯韦关系式 热力学状态函数 H, A, G 组合辅助函数 U, H → 能量计算
第五章 类 型 检 查 本章内容 语法 分析 器 类型 检查 中间 代码 生成 语法树 表示 记号流 静态检查中最典型的部分 — 类型检查:
第8章 依赖类型 本章内容 带依赖类型的演算,包括依赖积与依赖和
管理信息结构SMI.
元素替换法 ——行列式按行(列)展开(推论)
§2 求导法则 2.1 求导数的四则运算法则 下面分三部分加以证明, 并同时给出相应的推论和例题 .
第3章 简单类型化演算 函数式程序设计语言PCF由三部分组成 第2章对代数数据类型进行了透彻的研究 本章研究简单类型化演算
《编译原理与技术》 期末复习 计算机科学与技术学院 郑启龙 李 诚 25/12/2018.
第4章 非线性规划 4.5 约束最优化方法 2019/4/6 山东大学 软件学院.
数列.
Partial Differential Equations §2 Separation of variables
§4 谓词演算的性质 谓词逻辑Pred(Y)。 是Y上的关于类型 {F,→,x|xX}的自由代数 赋值 形式证明
$9 泛型基础.
第7章 多态性 本章和下一章介绍类型论的一些概念,它们是程序设计语言的多态性和数据抽象的基础 这些概念与下面的语言概念有关
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
离散数学─归纳与递归 南京大学计算机科学与技术系
复习.
正切函数的图象和性质 周期函数定义: 一般地,对于函数 (x),如果存在一个非零常数T,使得当x取定义域内的每一个值时,都有
定理21.9(可满足性定理)设A是P(Y)的协调子集,则存在P(Y)的解释域U和项解释,使得赋值函数v(A){1}。
第九节 赋值运算符和赋值表达式.
第16讲 相似矩阵与方阵的对角化 主要内容: 1.相似矩阵 2. 方阵的对角化.
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
1.设A和B是集合,证明:A=B当且仅当A∩B=A∪B
第一节 不定积分的概念与性质 一、原函数与不定积分的概念 二、不定积分的几何意义 三、基本积分表 四、不定积分的性质 五、小结 思考题.
第三章 函数的微分学 第二节 导数的四则运算法则 一、导数的四则运算 二、偏导数的求法.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
学习任务三 偏导数 结合一元函数的导数学习二元函数的偏导数是非常有用的. 要求了解二元函数的偏导数的定义, 掌握二元函数偏导数的计算.
第15讲 特征值与特征向量的性质 主要内容:特征值与特征向量的性质.
第二节 函数的极限 一、函数极限的定义 二、函数极限的性质 三、小结 思考题.
正弦、余弦函数的性质 华容一中 伍立华 2017年2月24日.
定义21.17:设P1=P(Y1)和P2=P(Y2),其个体变元与个体常元分别为X1,C1和 X2,C2,并且或者C1=或者C2。一个半同态映射(,):(P1,X1∪C1)→(P2,X2∪C2)是一对映射: P1→P2; : X1∪C1→X2∪C2,它们联合实现了映射p(x,c)→(p)((x),
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
第三节 数量积 向量积 混合积 一、向量的数量积 二、向量的向量积 三、向量的混合积 四、小结 思考题.
《偏微分方程》第一章 绪论 第一章 绪论 1.1.
§4.5 最大公因式的矩阵求法( Ⅱ ).
编译原理实践 6.程序设计语言PL/0.
第二次课后作业答案 函数式编程和逻辑式编程
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
Cfc Zeilberger 算法 陈焕林 陈永川 付梅 臧经涛 2009年7月29日.
Presentation transcript:

第9章 类型推断 类型推断是把无类型的或“部分类型化的”项变换成良类型项的一般问题 它通过推导未给出的类型信息来完成这个变换 第9章 类型推断 类型推断是把无类型的或“部分类型化的”项变换成良类型项的一般问题 它通过推导未给出的类型信息来完成这个变换 类型推断兼有两方面的优点 编译时完成类型检查 不需要程序中过分的类型信息

第9章 类型推断 本章的主要内容 类型推断的一般框架 加了类型变量后的类型推断 带多态声明的, , let的类型推断算法 第9章 类型推断 本章的主要内容 类型推断的一般框架 基于从类型化语言到无类型语言的“擦除”函数 加了类型变量后的类型推断 包括主定型和合一问题 带多态声明的, , let的类型推断算法

9.1 引 言 例 在多态语言中,类型推断尤其有用,因为多态项涉及约束变量的类型、类型抽象和类型作用 给出完整类型信息的PCF表达式 9.1 引 言 例 给出完整类型信息的PCF表达式 D =def let dbl: (nat  nat)  nat  nat = f : nat  nat.x: nat. f (f x) in dbl (x: nat. x + 2 ) 4 忽略类型信息的PCF表达式 D =def let dbl = f.x. f (f x) in dbl (x: x + 2 ) 4 在多态语言中,类型推断尤其有用,因为多态项涉及约束变量的类型、类型抽象和类型作用

9.1 引 言 通过选择从一种类型语言L到某种其它语言L的擦除函数Erase来确定类型推断问题 9.1 引 言 通过选择从一种类型语言L到某种其它语言L的擦除函数Erase来确定类型推断问题 L是一种相对应的“无类型”语言,或者是部分类型信息或类型运算未给出 例 从到无类型项的擦除函数删掉约束的类型指示 Erase(c) = c Erase(x:. M) = x. Erase(M) Erase(x) = x Erase(M N) = Erase(M) Erase(N) 无类型项具有形式 U ::= c | x | x.U | UU

9.1 引 言 例 , 的擦除函数 保持类型抽象和约束项变量的类型说明,但是擦除了类型作用 9.1 引 言 例 , 的擦除函数 保持类型抽象和约束项变量的类型说明,但是擦除了类型作用 Erase(c) = c Erase(x:. M) = x. Erase(M) Erase(x) = x Erase(M N) = Erase(M) Erase(N) Erase(t. M) = t.Erase(M) Erase(M ) = Erase(M) 作为擦除结果的, 程序的语法由文法 M ::= c | x | x:.M | MN | t.M 允许多态函数作用到非多态变元而没有中间的类型作用

9.1 引 言 语言L和擦除函数Erase: L  L的类型推断问题是: 对给定的表达式UL,找出L的类型化项 9.1 引 言 语言L和擦除函数Erase: L  L的类型推断问题是: 对给定的表达式UL,找出L的类型化项  M:,使得Erase(M) = U 一般来说,可能有无数多的方式用来将类型信息插入项 可以给f.x.f (f x)以形式为( )   的任何类型

9.1 引 言 例 若擦除的结果是 (t.x:t.x) (t.x:t.x) 这两个函数表达式必须作用到某个类型变元 9.1 引 言 例 若擦除的结果是 (t.x:t.x) (t.x:t.x) 这两个函数表达式必须作用到某个类型变元 原来的项必定有下面的形式 ((t.x:t.x)1) ((t.x:t.x)2) 1 和2只要满足1 22就可以了 原来的项应该是 ((t.x:t.x) t  t) ((t.x:t.x) t)

9.1 引 言 类型推断的另一种观点是 定型是由一组推理规则给出 合式公式的语法和证明规则给出一个逻辑系统 9.1 引 言 类型推断的另一种观点是 定型是由一组推理规则给出 合式公式的语法和证明规则给出一个逻辑系统 类型推断算法正好是一个公理理论的判定过程 决定一个合式公式是否可证明 判定过程是回答是或不是,而类型推断算法必须构造类型化的项

9.1 引 言 类型推断和类型检查 类型检查看成是用语法制导的方式,根据上下文有关的定型条件判定项是否为良类型的项的过程 9.1 引 言 类型推断和类型检查 类型检查看成是用语法制导的方式,根据上下文有关的定型条件判定项是否为良类型的项的过程  x:.M :  把对带无类型的定型判定问题叫做类型推断  x.M : 

9.2 带类型变量的类型推断 9.2.1 语言t 考虑语言t的类型推断 语言t t的定型公理和推理规则同的相同 类型由下面文法定义  ::= b | t |    项由下面文法定义 M ::= c | x | x: .M | M M t的定型公理和推理规则同的相同 限制:项常量的类型一定不含类型变量

9.2 带类型变量的类型推断 命题 令 M是任意的良类型t项。如果由类型化项上的和归约有M N,那么由无类型项上的同样归约有Erase(M)  Erase(N)。反过来,如果由无类型的归约有Erase(M)  V,那么存在一个类型化项  N,使得M N且Erase(N)  V。 M  M1  . . .  Mk Erase(M)  Erase(M1)  . . .  Erase(Mk)

9.2 带类型变量的类型推断 事实 一个无类型项U,只有不存在从它开始的无类型归约的无穷序列时,它才可能被类型化 例 (x.xx) (x.xx) 推论1 如果U不是强范式的,那么就不存在可推导的定型 M:,使得Erase(M) = U 推论2 如果U是不可类型化的,那么由t的主语归约性质,知道没有一个能归约到U的项是可类型化的 M  M1  . . .  Mk Erase(M)  Erase(M1)  . . .  Erase(Mk)

9.2 带类型变量的类型推断 9.2.2 代换、实例与合一 事实 在t的类型推断中,可推导的定型断言封闭于代换 类型代换 类型代换S作用到类型表达式 S是把中的每个变量t用S (t)代替 类型代换S作用到类型指派 S  = {x: S | x:   } 类型代换S作用到t项 结果S M同M的区别仅在约束变元的类型

9.2 带类型变量的类型推断 实例 引理 如果定型断言 M:是可推导的,那么它的每个实例S   SM:S也是可推导的 定型断言 M:是 M:的实例,如果存在类型代 换S使得   S , M = S M并且 = S 引理 如果定型断言 M:是可推导的,那么它的每个实例S   SM:S也是可推导的

9.2 带类型变量的类型推断 合一算法 合一 例 如果E是类型表达式之间的一个等式集合,如果对每 个等式 =  E都有S  S,那么类型代换S合一E 例 E = {s = t  v, t = v  w} S = {t, v  w, s, (v  w)  v} 代换结果{(v  w)  v = (v  w)  v, v  w = v  w} S合一E

9.2 带类型变量的类型推断 最一般的合一代换 如果存在某个代换T使得R = TS,那么S比R更一般 最一般代换是使E的每个等式经代换后左右两边语法上一样的最简单的方式

9.2 带类型变量的类型推断 例 E = {s = t  v, t = v  w} 最一般的合一代换S = {t, v  w, s, (v  w)  v} 代换结果{(v  w)  v = (v  w)  v, v  w = v  w} 另一个合一代换S = {t, (w  w)  w, s, ((w  w)  w)  (w  w), v, w  w} 代换结果 {((w  w)  w)(w  w)=(w  w)  w(w  w), (w  w)  w = (w  w)  w}

9.2 带类型变量的类型推断 引理 令E是类型表达式之间的任意等式集合。存在一个算法Unify,使得如果E是可合一的,那么Unify(E)计算得出一个最一般的合一代换.如果E不可合一,那么Unify(E)失败 如果和都是类型指派,那么合一可以用来找出最一般的代换S,使得S  S 是合式的 直接合一所有等式 = 的集合就可以了,其中x:  并且x:  

9.2 带类型变量的类型推断 递归算法Unify 1. Unify() =  2. Unify(E  {b1 = b2}) = if b1  b2 then fail else Unify(E) 3. Unify(E  {t = }) = if (t  ) then Unify(E) else if t occurs in  then fail else Unify([/t]E) [/t] 4. Unify(E {1 2 = 1 2}) = Unify(E {1 = 1 2 = 2})

9.2 带类型变量的类型推断 9.2.3 主定型算法 显式定型 主显式定型(简称主定型) 如果U是一个无类型项,能够使得Erase(M) = U的合式的类型化项 M:是U的一个显式定型 主显式定型(简称主定型) 如果U的每个显式定型都是 M:的一个实例,那么  M:是U的主定型

9.2 带类型变量的类型推断 t主定型算法PT 1. PT(c) =  c:, 其中是c的类型, 它不含类型变量 2. PT(x) = {x : t} x : t 3. PT(x.U) = let  M: = PT(U) in if x:   (对某个) then - { x:  x:. M:  else  x:s. M:s  其中s是新的类型变量

9.2 带类型变量的类型推断 t主定型算法PT PT(UV) = let  M: = PT(U)  N: = PT(V) 其中类型变量重新命名以 区别于PT(U)中的变量 S = Unify({ =  | x:  并且 x:  }  { =  t}),其中t是新类型变量 in S   S  S (MN) : St

9.2 带类型变量的类型推断 例 计算x.y.xy的主定型 PT(xy) = let x:r x:r = PT(x) y:s y:s = PT(y) S = Unify({r = s  t}) in {x : Sr}  {y : Ss} xy:St PT(xy) = {x: s  t, y:s} xy: t PT(x.y.xy) =  x: s  t.y:s.xy: (s t ) s  t

9.2 带类型变量的类型推断 例 算法PT为什么对x.xx会失败 PT(xx) = let x:r x:r = PT(x) x:s x:s = PT(x) S = Unify({r = s}  { r = s  t}) in {x : Sr}  {x : Ss} xx:St

9.2 带类型变量的类型推断 定理 如果PT (U) =  M:,那么Erase (M) = U,并且 M:的每个实例是可证明的 定理 如果 M:是可证明的定型断言,并且Erase (M) = U,那么PT (U)一定成功,并产生一个定型断言,使得 M:是它的一个实例

9.2 带类型变量的类型推断 9.2.4 隐式定型 历史上,许多类型推断问题都被公式化为对无类型项使用证明规则进行证明的问题 这些证明系统通常称为隐式定型系统,因为一个项的类型不是由项的语法显式地给定的 此时,类型推断本质上是一个公理理论的判定问题

9.2 带类型变量的类型推断 隐式定型证明系统  c: c是类型的常量,中无类型变量 (cst) x: x: (var) (abs) (app) (add var) , x :  U :   (x.U) :    U :    V:   UV :   U :  , x :  U :  x不在中

9.2 带类型变量的类型推断 引理 如果 M:是良类型的项,那么 |--C  Erase(M) . 反过来, 如果|--C  U , 那么存在类型化的项 M:,使得Erase(M)=U

9.2 带类型变量的类型推断 9.2.5 定型和合一的等价 类型推断和合一是算法地等价的 每个类型推断问题产生一个合一问题 每个合一问题出现在某个项的类型推断中

9.2 带类型变量的类型推断 另一个类型推断算法 本质上是从定型到合一的归约 TE(c, t) = {t = }, 其中是c的类型,中无自由变量 TE(x, t) = {t = tx}, 其中tx 是x的类型 TE(U V, t) = TE(U, r) TE(V, s) {r = s t} 其中r,s都是新的类型变量 TE(x.U, t) = TE(U, s) {t = tx s} 其中s是新的类型变量 如果U是无类型项,t是类型变量,并且E = TE(U, t),那么U的每个定型是S U U: St的一个实例(对某个使E能够合一的最一般合一代换 S)

习 题 第一次:9.2