1.04k likes | 1.14k Views
第 3 章 简单类型化 演算. 函数式程序设计语言 PCF 由三部分组成 代数数据类型:自然数类型和布尔类型等 带函数和积等类型的纯类型化 演算 不动点算子 第 2 章对代数数据类型进行了透彻的研究 本章研究简单类型化 演算 第 4 章研究不动点算子. 3 .1 引 言. 本章的系统是以后各章研究的所有其它演算的核心 抽象可用来定义新的函数,而代数数据类型只涉及到所声明的一阶函数的应用 在类型化 演算的指称语义中需要考虑函数类型的解释. 3 .1 引 言. 演算的历史
E N D
第3章 简单类型化演算 • 函数式程序设计语言PCF由三部分组成 • 代数数据类型:自然数类型和布尔类型等 • 带函数和积等类型的纯类型化演算 • 不动点算子 • 第2章对代数数据类型进行了透彻的研究 • 本章研究简单类型化演算 • 第4章研究不动点算子
3.1 引 言 • 本章的系统是以后各章研究的所有其它演算的核心 • 抽象可用来定义新的函数,而代数数据类型只涉及到所声明的一阶函数的应用 • 在类型化演算的指称语义中需要考虑函数类型的解释
3.1 引 言 • 演算的历史 • Church在20世纪30年代研究的定义可计算函数的一种形式体系 • Kleene在1936年证明,可定义的所有自然数函数正好是所有的递归函数 • Turing在1937年证明,可定义的数值函数正好是Turing机可计算的函数 • 演算一直影响着程序设计语言的研究
3.1 引 言 • 演算和程序设计语言 • 20世纪50年代,无类型演算明显影响了Lisp语言的研究 • 20世纪60年代认识到,程序设计语言的语义可以通过使用拓展的演算给出 • 现代的观点认为,类型化演算引导对程序设计语言进行更加涉及本质的分析 让类型化演算的类型对应到程序设计语言中的类型,就可以忠实地为类型化程序设计语言的能力和局限性建模
3.1 引 言 本章的主要内容 • 提出使用定型公理和推理规则的上下文有关语法 • 讨论类型化演算的等式证明系统(公理语义)和归约系统(操作语义) • 讨论类型化演算的通用模型(指称语义)及可靠性和完备性定理 • 介绍PCF语言(递归函数留待下一章)及其公理语义和操作语义
3.2 类型和项 3.2.1类型的语法 • 简单类型化演算的类型表达式文法 ::= b | null | unit | | | b:类型常量 null:初始类型 unit:终结类型 和、积与函数类型 类型表达式中不含类型变量 • 用、和来命名所讨论的演算
3.2 类型和项 3.2.2 上下文有关语法 不存在上下文无关文法,它正好产生良类型的项 用一种基于逻辑的形式系统来定义类型语言 用公理和推理规则来同时定义表达式及其类型 定型公理 c : 推理规则 定型断言 M : , 其中 {x1 :1 , …, xk:k } M1:1 … Mk:k N: 1 M1:1 … kMk:k N:
3.2 类型和项 3.2.3 项的语法 一个基调 B, C包含 一个集合B,其元素叫做基本类型或类型常量 形式为c的项常量集合C,其中是B上的类型表达式 多类代数的基调 S, F 的基调很容易变换成基调 B, C 令B就等于S 若F有f :s1 … sk s,则在C中包含项常量 f : s1… sk s
3.2 类型和项 项的语法及类型按如下方式描述 首先用BNF定义类型表达式的语法(3.2.1节) 然后用定型公理和定型规则同时定义上的项和它们的类型(良形的项就是良类型的项) 良形(well-formed)和良类型(well-typed) 良形的项x + 3在x是整型时才是良类型的 定型公理 c (cst) x x (var)
3.2 类型和项 定型规则 (add var) ( Intro) (Elim) 定型断言的证明叫做定型推导 M: , x : M: , x : M: ( x : . M) : M: N : MN:
3.2 类型和项 例 y: (x:.x)y: 是一个需要用到所有这些定型规则的项 从定型公理x:x:开始 根据( Intro) 规则,得到 x:. x : 再由(add var),得到y: x:. x : 由公理y:y: 最后,由( Elim)规则可知 y: (x:. x)y:是良类型的
3.2 类型和项 引理3.1 如果M:,那么M中的每个自由变量都出现在中 引理3.2 如果M:,且包含M中所有的自由变量,那么M: 引理3.3 如果M:,并且y不出现在中,那么[y/x] [y/x]M:
3.2 类型和项 引理3.4 如果1,x:M:和2N:都是项,且12是良形的类型指派,那么代换实例12 [N/x]M:是良形项 证明 基于对定型断言1,x:M: 的证明的归纳
3.2 类型和项 3.2.4 有积与和及相关类型的项 1、笛卡儿积(把扩展到, ) ( Intro) (Elim)1 (Elim)2 M: N: M, N : M: Proj1, M: M: Proj2, M:
3.2 类型和项 积的另一种表示 对所有的类型和,存在项常量 Pair, : ( ) Proj1, : ( ) Proj2, : ( ) M, N, 看成Pair, M N的语法美化 两种表示的主要区别 第二种表示:Pair、Proj1和Proj2都是项 第一种表示:x:.y:.Pair x y、x: .Proj1x和x: .Proj2x 才是良形的项
3.2 类型和项 2、和 (+ Intro)1 (+ Intro)2 (+ Elim) M: Inleft, M : + M: Inright, M: + M: + N: P: Case, , M N P :
3.2 类型和项 初始类型和终结类型 与终结类型unit有关的唯一的项 : unit (unit Intro) 终结类型也叫做单位类型 C语言的void类型就是单位类型,因为该类型的 表达式没有能够引起兴趣的值(而不是没有值) 与初始类型null有关的项形式 Zero : null (null Elim) 若null类型有元素, 函数Zero给出使用方式
3.2 类型和项 有了单位类型与和类型后,bool类型可省略 bool类型可以定义成 boolunit + unit true和false可以定义成 true Inleft false Inright if … then … else可以定义成 if M then N else P Caseunit, unit, M (K, unit N) (K, unit P) 其中K, unit x:.y:unit.x
3.2 类型和项 多元函数和高阶函数之间的关系 Curry,f :.x:.y:.f x, y addp:nat nat.(Proj1p) + (Proj2p) Curry(add) (f:nat natnat.x:nat.y:nat.f x, y) add = x:nat.y:nat.add x, y x:nat.y:nat.(p:nat nat. (Proj1p) + (Proj2p)) x, y = x:nat.y:nat.Proj1x, y + Proj2x, y = x:nat.y:nat.x + y
3.2 类型和项 3.2.5 定型算法 给定, M, , M:是否为可证明的定型断言 给定,M,判定是否存在一个,使得 M:可证 基调上预备项 M ::= c | x | MM | x:.M 该文法可以从定型公理和推理规则得到 类型检查的输入是符合该文法的预备项
3.2 类型和项 类型检查算法 TC(, c) = 若 c: 是该基调的一个常量 fail 否则 TC(, x) = 若 x: 否则 fail TC(, MN) = 若TC(, M) = 且 TC(, N) = 否则 fail TC(, x:.M) = 若TC((x:.M , x:), M) = 否则 fail
3.2 类型和项 命题3.5 算法TC(, M)终止且得到类型,当且仅当定型断言 M:是可推导的 若对于和M,不存在可推导的定型断言,则算法停机,报告失败
3.3 证明系统 3.3.1 等式和理论 等式 泛代数:M N [],只有平凡的永真等式 类型化演算: M N ,有非平凡的永真等式,和代数不同的是,等式包含类型,它用于等式证明系统 代数系统中和类型有关的规则(作为副条件) P , Q Termss(, ) M = N , x : s P = Q P/xM= Q/xN
3.3 证明系统 3.3.1 等式和理论 等式 泛代数:M N [],只有平凡的永真等式 类型化演算: M N ,有非平凡的永真等式,和代数不同的是,等式包含类型,它用于等式证明系统 等式的另一种表示方式是 x1:1… xk:k.M N 若某个类型为空,则该等式无意义地成立
3.3 证明系统 公理和推理规则 (add var) M = M : (ref) (sym) (trans) M = N: , x : M = N: M = N: N = M: M = N: N = P: M = P:
3.3 证明系统 公理和推理规则 () () x.M = y.[y/x]M : , 其中y FV(M) () (x.M)N =[N/x]M : () x.(Mx)=M : , 其中x FV(M) () , x:M = N: x:.M = x:.N: M1= M2 : N1= N2 : M1 N1= M2 N2 :
3.3 证明系统 引理3.6如果 M = N :并且包含M和N中所有的自由变量,那么 M = N: 基调的类型化理论 项之间的包含上述公理的一组良类型的等式,并且封闭于上述推理规则 E M = N: 表示:等式 M = N:是从公理和E的等式可证 E的理论Th(E)是指:从公理和E的等式可证的等式集合
3.3 证明系统 代数和简单类型化演算之间的联系 在类型化上可以增加代数公理,任何代数等式可以看成等式 任何一个代数证明可以在中执行 代数证明规则(subst)不在中,但可以证明它是的导出规则 P, Q Termss(, ) M = N , x : s P =Q P/xM= Q/xN
3.3 证明系统 命题3.8 令E 是代数基调上代数项之间的一组等式,令E 是单个这样的等式。若在代数证明系统中有EE, 则把E的等式和E都看成是基调上项之间的等 式,在证明系统中也有E E 命题3.9(守恒性) 令E是代数基调上代数项之间的等式集合,并令E 是单个这样的等式。当把E的等式和E都看成是基 调上项之间的等式时,若在证明系统中有 E E,则在该代数证明系统中也有E E
3.3 证明系统 命题3.10 存在有类型化演算理论E及没有x自由出现的项M和N,使得 E, x:M = N : 但是E M = N : 表明等式中变量情况会影响可证明性
3.3 证明系统 积类型 Proj1M, N = M : (proj1) Proj2M, N = N : (proj2) Proj1M, Proj2M = M : (sp) 和类型 Case, , (Inleft, M) N P = N M : (case)1 Case, , (Inright, M) N P = P M : (case)2 Case, , M (N Inleft, ) (N Inright, ) = N M : + (case)3 仅N:( +) ( +)时,(case)3的项才是良形的
3.3 证明系统 终结类型 M = : unit 对每个类型,存在唯一的函数One : unit 可以把One写成x:. 初始类型 M Zero : null 对任何类型,存在唯一的函数Zero : null
3.3 证明系统 简单类型化演算版本之间的联系 逻辑系统或语言L2在L1上守恒,如果 L2包含L1,并且 对L1的任意一组公式F和任意一个公式F,若在L2的证明系统中有 F F,则在L1的证明系统中也有F F 在上守恒
3.3 证明系统 3.3.2 归约规则 归约规则 (x:.M)N NxM ()red x:.Mx M, xFV(M) ()red 引理3.11 如果 M :并且M N,那么 N : 合流性和强范式化 预备项上的规则并不合流 x :.(y :.y)x的范式有两个:x :.x和y :.y
3.3 证明系统 在类型化项上的可变换关系 M N 当且仅当存在项M0, …, Mk 且 Mi (0 i k),使得 M M0 M1 … Mk N 就纯, 归约来说,对每个i,所做假设Mi不是必要的 推论3.12 等式 M N 从的公理可以证明,当且仅当 M N ,当且仅当存在某个项P,使得M P并且N P
3.3 证明系统 小结 带积、和、unit及null类型的类型化演算的归约公理都可以由从左向右定向相应的等式公理得到 对简单类型化演算的所有版本,强范式化都成立,但是合流性却难以捉摸
3.3 证明系统 3.3.3有其它规则的归约 每个代数基调都可以看成一个基调 代数项集可以看成是项的一个子集,并且 代数重写规则可以应用到项 一些结论 若代数基调的代数重写系统R合流并终止,那么对上的项,R,归约合流并终止 若R合流并左线性,那么对上项,R,,fix归约是合流的
3.4 通用模型、可靠性和完备性 模型概述 对于一个逻辑系统来说,模型提供一种机制,它给出每个良形表达式的数学含义,以确定该逻辑中的任何公式是否为真 对于使用变量的逻辑系统,通常把给变量指派值(称为环境)从模型的一般概念中分离 代数规范的模型是代数(类似的还有一阶逻辑) 把类别解释为集合 把函数符号解释为函数 为代数项中变量指派值后,就可计算项的解释
3.4 通用模型、可靠性和完备性 3.4.1 通用模型和项的含义 类型化演算的模型类似于一个代数 每个类型需要一个值集 每个常量符号解释到对应值集中的特定元素 还必须使应用表达式和抽象表达式有意义 假定A是类型的值集,则要求A为从A到A的一个函数集合 每个可定义的函数必须处于适当的值集中
3.4 通用模型、可靠性和完备性 3.4.1 通用模型和项的含义 类型化演算的模型论比代数规范的模型论要复杂得多 上述简单扩展不能适应有不动点算子的情况(好在本章暂不关心) 本章将采用比上述简单扩展的适应性更广一点的“通用模型”,它由三部分组成: (1)类型化的应用结构 (2)作为模型的外延性条件 (3)作为模型的环境条件
3.4 通用模型、可靠性和完备性 3.4.2应用结构、外延性和框架 基调上的类型化应用结构A: {A}, {App, }, Const 对其中每对和,假定满足下列条件: A是一个集合 App, 是映射App, : A A A Const是从的项常量到所有A并集的成员的映射,使得若c:,则Const(c) A 引入App, 映射的目的是给A 以宽松的解释
3.4 通用模型、可靠性和完备性 满足下列条件的应用结构是外延的 对任意的f, gA,若对所有的dA,都有 App f d = App g d,则f = g 函数外延性:若对任意x有f(x)=g(x) ,则f和g相等 可以用直接具有外延性的模型定义来代替应用结构 类型框架是一个应用结构 {A}, {App, }, Const 满足A (A)且App, f d = f (d) 类型框架可简写成{A}, Const,甚至{A} A
3.4 通用模型、可靠性和完备性 例 一组基类型上完备的集合论函数层级(full set-theoretic function hierarchy) A= {A}, Const,其中A 包含从A到A的所有集合论函数 引理3.13 一个应用结构A是外延的当且仅当存在同构的类型框架B A
3.4 通用模型、可靠性和完备性 3.4.3 环境条件 环境 下的良型项 M:的含义AM 由对定型推导子句进行归纳来定义 A c: = Const(c) Ax: x: = (x) A, x: M: = A M: A MN: = App, A M: A N: A x:.M: = 唯一的fA ,使得dA.App f d = A, x: M: [x d] 若定义了全函数A,则说A满足环境条件
3.4 通用模型、可靠性和完备性 通用模型 满足外延性和环境两条件的类型化应用结构 外延性条件等价于 一个函数类型的解释必须是某个函数集合 环境条件保证 有足够多的元素,使得每个可定义的函数都在这个模型中 若无环境条件,使得dA.App f d = A, x: M: [x d] 的 f A 可能不存在 外延性保证,若存在则唯一
3.4 通用模型、可靠性和完备性 3.4.4 类型可靠性和等式可靠性 两个证明系统:分别证明定型断言和等式 引理3.17(类型可靠性) 令A是基调的任意通用模型,M:是可证明的定型断言,并且 是A的一个环境,那么 A M : A 良类型的项不包含类型错误
3.4 通用模型、可靠性和完备性 等式可靠性 引理3.20(代换引理) 令, x: M : 和 N : 都是项, ,且d = N:,则 [Nx]M : = , x: M : [x d] 可满足性 若 A M : = A N :,就说通用模型A和环境 满足等式 M = N :,写成 A, M = N :
3.4 通用模型、可靠性和完备性 定理3.21(可靠性) 对任何类型化的等式集合E,若 E M = N :, 则任何满足E的通用模型也满足 M = N :, 写成 E M = N :
3.4 通用模型、可靠性和完备性 3.4.5 没有空类型的通用模型的完备性 多类代数中有两个完备性定理 一般情况下的演绎完备性 空类别被略去时的最小模型完备性 演算 没有空类型时的最小模型完备性(本小节) 不扩展证明系统的话,通用模型没有演绎完备性(下一小节,课堂不介绍) 考虑更一般的范畴模型的话,对给定的证明系统,有直截了当的最小模型完备性
3.4 通用模型、可靠性和完备性 非空类型的推理规则 x在M和N中没有自由出现 (nonempty) 定理3.22 令E是封闭于(nonempty)规则的任意理论。 那么,存在一个通用模型A,它没有任何A = , 并且它正好满足E的等式 , x: M =N: M = N :