480 likes | 652 Views
第 4 章 类型化 演算的模型. PCF 语言由三部分组成 带函数类型和积类型的纯类型化 演算 自然数类型和布尔类型 不动点算子 第 2 章对代数数据类型进行了透彻的研究 第 3 章研究简单类型化 演算 本章先研究递归函数和不动点算子 然后研究类型化 演算 的 模型,因为第 3 章的模型不能解释不动点算子. 4 .1 引 言. 本章的主要内容 递归函数和不动点算子,以及 PCF 语言的编程实例 基于完全偏序集合的,带不动点算子的类型化 演算的论域理论模型 不动点归纳法,这是一种对递归定义进行推理的证明方法.
E N D
第4章 类型化演算的模型 • PCF语言由三部分组成 • 带函数类型和积类型的纯类型化演算 • 自然数类型和布尔类型 • 不动点算子 • 第2章对代数数据类型进行了透彻的研究 • 第3章研究简单类型化演算 • 本章先研究递归函数和不动点算子 • 然后研究类型化演算的模型,因为第3章的模型不能解释不动点算子
4.1 引 言 本章的主要内容 • 递归函数和不动点算子,以及PCF语言的编程实例 • 基于完全偏序集合的,带不动点算子的类型化演算的论域理论模型 • 不动点归纳法,这是一种对递归定义进行推理的证明方法
4.2 递归函数和不动点算子 4.2.1 递归函数和不动点算子 • 在类型化演算中,可以加递归定义 letrec f : = M in N • f可以出现在M中 • M的类型必须是,否则等式f = M没有意义 • 例:定义阶乘函数和计算5的阶乘 letrec f : natnat = y : nat.(if Eq? y 0 then 1 else y f (y – 1)) in f 5 把该等式看成关于f的方程:f : natnat = y : nat. if Eq? y 0 then 1 else y f (y – 1)
4.2 递归函数和不动点算子 • 从数学的观点看 • 含PCF表达式M的方程f := M是否都有解? • 若有若干个解的话,选择哪个解? • 在讨论PCF的指称语义时解决这些问题 • 从计算的观点看 • 递归函数声明有清楚的计算解释 • 因此,暂且假定每个这样的等式都有解,并在PCF中增加上述表示它的语法
4.2 递归函数和不动点算子 • 函数的不动点 若F :是类型到它自身的函数,则F的不动点是使得F (x) = x的值x : 例如,自然数上 • 平方函数的不动点有0和1 • 恒等函数有无数个不动点 • 后继函数没有不动点
4.2 递归函数和不动点算子 • 重要联系 • 递归定义f := M可以用函数f :.M来表示,因为函数f :.M的不动点正好是方程f = M的解 (f :.M)N = N,即[N/f]M = N, N是f = M的解 • 方程f = M的求解转化为找函数f :.M的不动点 例: 阶乘函数是 F f : natnat.y : nat.if Eq? y 0 then 1 else y f (y – 1) 的不动点
4.2 递归函数和不动点算子 • PCF的最后一个基本构造 fix : ( ) , 对每个类型 • fix为任何到的函数产生一个不动点 • letrec声明形式看成是let和不动点算子组合的一 种语法美化 letrec f :M in N let f : = (fixf :.M) in N • 也可用语法美化 letrec f (x :) : = M in N letrec f :x :.M in N
4.2 递归函数和不动点算子 • fix等式公理 fix = f : .f (fix f ) (fix) fix MM (fix M) (使用( ) 可得) • fix归约规则 fixf :. f (fix f ) (fix)
4.2 递归函数和不动点算子 • 继续阶乘函数的例子 使用fixnatnat,阶乘函数写成 fact fixnatnat F,其中F是表达式 F f :natnat.y:nat.if Eq? y 0 then 1 else yf (y-1) fact nfix Fn //计算fact n的前几步 F(fix F) n (f : natnat.y:nat.if Eq? y 0 then 1 else yf(y-1)) (fix F) n if Eq? n 0 then 1 else n(fix F) (n-1)
4.2 递归函数和不动点算子 • 乘运算的递归定义 • 基于加运算,并假定有前驱函数pred,它把n > 0映射到n1,并把0映射到0 • letrec mult : nat natnat =p : nat nat. if Eq? (Proj1p) 0 then 0 else (Proj2p) + multpred (Proj1p), Proj2p in mult8, 10 • 使用更多语法美化: letrec mult x : nat, y : nat: nat = if Eq? x 0 then 0 else y + mult pred x, y in mult8, 10
4.2 递归函数和不动点算子 4.2.2 有不动点算子的急切归约 考虑fix对各种归约策略的影响 • 最左归约、惰性归约、并行归约 只要在原来的公理中增加fix归约公理即可 • 急切归约 若沿用原来的fix规则,则对变元先求值的要求会导致归约不终止 引入“延迟”( delay)来暂停对递归定义函数的归约,直到有变元提供给它为止
4.2 递归函数和不动点算子 值(在急切归约中需要引入值的概念) • 若V是常量、变量、抽象或值的序对,则V是值 • delayMx:.Mx, x在M :中非自由的 公理 • (x :.M)V eager VxM V是值 • Proji(V1, V2) eagerViV1和V2是值 • fixVeagerV(delayfixV) V是值 • … … 子项规则 • 和上一章一样
4.2 递归函数和不动点算子 • 例:仅含一个平凡不动点 (fix (x : nat nat.y : nat.y)) ((z : nat.z +1)2) eager(x:nat nat.y:nat.y)(delayfix(x:nat nat. y : nat.y)) ((z : nat.z +1)2) eager(y:nat.y)((z : nat.z +1)2) eager (y:nat.y)(2+1) eager (y:nat.y)3eager 3 • 例:急切归约可能发散(无不动点) let f (x : nat) : nat = 5 in letrec g (x : nat) : nat = g (x +1) in f (g 3)
4.3 论域理论模型和不动点 4.3.1 递归定义和不动点算子 • 用fix归约的特点来启发论域的主要性质 • 以阶乘函数为例: fact fixnatnat F,其中F是表达式 F f :natnat.y:nat.if Eq? y 0 then 1 else yf (y-1) • 考虑fix F的有限步展开,用另一种方式来理解fact
4.3 论域理论模型和不动点 • fix F的有限步展开 fix[n]F描述F体的计算最多使用n次的递归计算 • fix[0]F = diverge (表示处处无定义的函数) • fix[n+1]F = F(fix[n]F) • (fix[2]F) 0 = 1,(fix[2]F)1 = 1,(fix[2]F) n对n 2没有定义 • 把函数看成二元组的集合后,fix[n1]F = (fix[n]F) {n, n},真包含所有的fix[i]F (in) • 即 {0, 0!} {0, 0!, 1, 1!} {0, 0!, 1, 1!, 2, 2!} …
4.3 论域理论模型和不动点 n( fix[n]F)和F的不动点 让fact = n( fix[n]F)是有直观计算意义的 尚不足以相信,对任意的F, n( fix[n]F)就是F的不动点 强加一些相对自然的条件到F才能保证这一点 当用集合包含对部分函数排序时, n( fix[n]F)将是F的最小不动点
4.3 论域理论模型和不动点 论域 用集合之间的包含 关系来定义部分函数 之间的偏序 在类型化演算的 论域理论模型中, 类型指称值的偏 序集合,叫做论域 阶乘函数 常函数1 {0,1,1,1,2,1} {0,1,1,1,2,2} . . . . . . . . . {0,1,1,1} . . . . . . {0,1} {0,5} . . . . . . . . .
4.3 论域理论模型和不动点 计算不终止的项 和递归相联系的一个特别问题是如何给计算不终止的项以合理解释? letrec f : nat nat = x: nat. f (x1) in f 3 延伸“自然数”论域,包含一个额外的值nat,表示类型nat上的不终止的计算 部分数值函数可看成值域为 {nat}的全函数,在该论域上nat所有的自然数 论域上的偏序可以用来刻画称之为“信息量”或“定义度”的特征
4.3 论域理论模型和不动点 4.3.2 完全偏序集合、提升和笛卡儿积 定义 偏序集合D, 有自反、反对称和传递关系 的集合D 离散序 指x y iff x y。集合有离散的偏序 上界 若D,,则子集SD的上界是元素xD,使得对任何yS都有y x
4.3 论域理论模型和不动点 定义 最小上界 S的一 个上界,它小于等于()S的任何其它上界 有向集合 在D, 中,对子集SD,若每个有限集合S0S都有上界在S中,则称子集S有向 有向集合都非空 若SD是线性序,则S一定有向 线性序 对所有的x, yS,都有x y或y x
4.3 论域理论模型和不动点 例 偏序集合{a0, b0, a1, b1, a2, b2, …},其中对任意ij 都有ai aj, bj并且bi aj, bj 两个线性序 a0a1a2…,和 b0b1b2… {ai, bi} 有上界ai+1和bi+1等, 但没有最小上界 a2 b2 a1 b1 a0 b0 ai和bi没有最小上界
4.3 论域理论模型和不动点 定义 完全偏序集合D, (简称CPO) 若每个有向集合SD都有最小上界(∨S) 例 使用离散序,任何集合都可看成CPO 任何有限偏序集合都是CPO 考虑普通算术序,自然数集合不是CPO 有理数的非平凡闭区间不是CPO,所有小于 的有理数的最小上界是无理数 若S,TD都有向,且S的每个元素都T的某个元素,那么∨S ∨T 2
4.3 论域理论模型和不动点 定义 有最小元的CPO DD, 存在元素a,使得对D的任何元素b都有a b 最小元(也叫底元)用D表示 提升集合A A {} 提升CPO D, 类似地可得到 有底元的CPO D … 0 1 2 3 4 CPON的图形表示
4.3 论域理论模型和不动点 引理4.3 若D是一个CPO,那么D是有底元的CPO 引理4.4 若D和E都是CPO并都有底元,则它们的积DE也是有底元的CPO。而且,若SDE是有向的,则∨S =∨S1, ∨S2,其中Si= ProjiS 如果D和E分别有最小元D和E,那么D,E是DE 的最小元
4.3 论域理论模型和不动点 4.3.3连续函数 CPO上的连续函数 包括了在程序设计中使用的所有普通函数 给出的是一类有不动点的函数 本节证明从一个CPO到另一个CPO的所有连续函数的集合形成一个CPO 在构造把每个类型看成一个CPO的模型时,这是最本质的一步,因为构造这样的模型时,函数类型必须解释成CPO
4.3 论域理论模型和不动点 记号 如果f : D E是函数,如果S D,用记号f(S)表示E的子集:f (S) = { f (d ) | dS} 定义 单调函数 若D=D, D和E=E, E都是CPO,且f : D E 是它们基础集合上的函数,若dd蕴涵 f(d)f (d), 则f 单调 若f单调且S有向,则f (S)有向
4.3 论域理论模型和不动点 定义 连续函数 单调,且 若对每个有向的S D,都有f (∨S) ∨f (S) 例 在实轴闭区间[x, y]上,若把[x, y]看成CPO时,则通常计算意义下的连续函数仍然连续 任何CPO上的常函数是平凡地连续的 若D是离散序,则D上每个函数都连续 从提升集合A到任何CPO的单调函数连续
4.3 论域理论模型和不动点 定义 提升函数 如果D和E都是CPO,且f :D E连续,定义 f : (D {}) (E {})如下: f(d) = if d D then f(d) else 严格函数 若f 是有底元CPO之间的函数,且f() 引理4.5 令D和E 都是CPO, 若f:DE连续, 则f:DE严格并连续
4.3 论域理论模型和不动点 CPO之间的函数集合上的偏序关系 若D = D, D和E = E, E都是CPO,对于连续函数f, g:DE,若对每个dD,都有f(d)E g(d),就说f DE g(逐点地排序) 记号 从D到E 的连续函数集写成 DEDE, DE 若S DE是函数集合,且d D,那么S(d) E是由 S (d) = {f (d) | fS} 给出的集合
f9 f10 f5 f7 f6 f8 f3 f1 f2 f4 f0 表4.2 从B到B的单调函数 f () f (true) f (false) f () f (true) f (false) f0f6falsetrue f1 true f7 truefalse f2 false f8 falsefalse f3 truef9 true truetrue f4 falsef10 falsefalsefalse f5 true true
4.3 论域理论模型和不动点 引理4.6 对任何CPO D和E,逐点排序的连续函数集DE也是一个CPO 具体说,若SDE有向,则作为其最小上界的函数f 由f(d) =∨S(d)给出。若E 有最小元,则CPODE 有最小元 DE 是一个偏序集合 若E有最小元E,则x:D.E是DE 的最小元 每个有向集合S 都有最小上界f f 是连续的,即对每个有向的S D E , 有f (∨S) ∨f (S)
4.3 论域理论模型和不动点 常用连续函数 n元函数: f :D1 … DnE 连续, 当且仅当它在每个变元上连续 配对函数:若S D和T E都有向, 则∨S, ∨T =∨{s, t | sS, tT} 射影函数:若S DE有向, 则Proji(∨S)=∨{ Proji(x) | xS} 函数应用:若S DE和T D都有向, 则∨S(∨T) = ∨{f (x) | fS, xT} 函数合成:若S DE和T EF都有向, 则(∨S) (∨T) =∨{g f | fS, gT}
4.3 论域理论模型和不动点 4.3.4 不动点和完备连续层级 完备连续层级 若有CPOAb0, 0, …, Abk, k,则取Ab0, …, Abk为基类型 A A A,由 逐坐标地定序 A 所有连续的f : A, A, ,由逐点地定序 由先前引理,每个A, 都是一个CPO 这是在CPOAb0, 0, …, Abk, k上构造的类型框架
4.3 论域理论模型和不动点 主要结论 任何若干CPO上的完备连续类型层级形成通用模型,并在所有有底元的类型上有最小不动点算子 引理4.8 若D是有底元CPO,且f :DD连续,则f 有最小不动点fixD f = ∨{f n () | n 0}。此外,映射fixD是连续的 先证∨{f n () | n 0}是不动点 再证它是最小不动点 最后证明fixD连续
4.3 论域理论模型和不动点 例 id:DD是有底元CPOD上恒等函数,计算fix id fix id = ∨{ idn (D) | n 0} = ∨{D} = D f:PNPN,f(A) = A 不在A中的最小IN,若它存在的话 很容易看出f k () = {0, …, k-1} 于是fix f = N
4.3 论域理论模型和不动点 4.3.5 PCF的CPO模型 要点 考虑PCF语言的论域理论语义APCF 提供对PCF性质的某种透彻理解 提供对PCF进行语义推理的基础 PCF等式公理系统对APCF可靠 归约系统对APCF也可靠 PCF等式证明系统对APCF不可能完备 4.4节将考虑等式公理系统的一个扩展,它基于该CPO模型,能证明项之间更多的性质
4.3 论域理论模型和不动点 APCF是N和B上的完全连续体系 PCF的类型常量解释为有底元的CPO PCF的所有类型都可以解释为有底元的CPO 常量的解释 常量0,1,2,…和true,false按通常的方式解释为提升集合N和B上的自然数和布尔值 +和Eq?解释为它们普通解释的提升版本和Eq? nat +x = x + nat = nat 条件运算的解释需仔细考虑 当M指称而N不是时,if false then M else N不应该指称
4.3 论域理论模型和不动点 不动点常量按下面定理进行解释 若D是有底元的CPO,且f :DD 连续,则f 有最小不动点 fixD f = ∨{f n() | n 0} 此外,映射fixD是连续的 结论 PCF的每个项在APCF中都有含义
4.3 论域理论模型和不动点 定理4.13 令M和N是上的PCF表达式,若 M =N :从PCF的公理可证, 则APCF满足等式 M = N : 推论4.14 若M:是良类型的PCF项,且MN,则PCF模型APCF满足等式 M = N :
4.3 论域理论模型和不动点 例 阶乘函数可以写成fact fixnatnat F,其中 Ff :natnat. y:nat. if Eq? y 0 then 1 else yf (y-1) 可以证明,APCFF是连续的 APCF fact =∨{(APCF fact)n() | n0} (APCF fact)0() = natnat 直接用项来表示相应论域中元素的名字
4.3 论域理论模型和不动点 (APCF fact)1() = y:nat. if Eq? y 0 then 1 else y ((APCF fact)0() )(y-1) = y:nat. if Eq? y 0 then 1 else y (natnat) (y-1) = y:nat. if Eq? y 0 then 1 else nat
4.3 论域理论模型和不动点 例 考虑函数F : (natnat) (natnat),其定义为 Ff :natnat. x:nat. if Eq? x 1 then 1 else f (x-2) 满足下列条件的函数g:natnat都是上面F的不动点 g(1) = 1 g(x+2) = g(x) 最小不动点是: 当x是奇数时,结果是1 当x是偶数时,计算不终止
4.4 不动点归纳 例 如果f : D D和g : D D是某个CPO D上的连续函数,则fix (f g) = f (fix (gf)) fix (f g) = ∨{( f g)i () | i 0} = ∨{, ( f g)(), ( f g f g)(), …} = ∨{f (), (f (g f ))(), (f (g f )2)(),...} = ∨{( f (g f )i )() | i 0} = f (fix (gf)) 仅使用PCF的等式证明系统不可能证明 fix (f g) = f (fix (gf))
4.4 不动点归纳 基于项的CPO解释来扩展证明系统 在CPO模型A中,近似 M N 对环境 是满足的,如果AM AN (eq) (asym) M= N : MN: MN : , N M: M = N:
MN : , N P: MP: M1 M2: , N1 N2: M1N1M2 N2: , x : M N : x : .M x : . N : 4.4 不动点归纳 (trans) M (bot) = x : . : (botf) (acong) (fcong)
MN =N : fix MN: [/x] A, , [c/x]A [F(c)/x]A [fix F/x]A 常量c不在A中 (fpind) 4.4 不动点归纳 用 A表示从一组等式和近似可以证明等式或近 似A
4.4 不动点归纳 例 证明,如果N是M的一个不动点,那么fix M N • 假定 MN N ,这就有 MNN • 令A , x : xN :,其中x在N中不是自由的 • 令不动点归纳规则中F是M 1、首先证明[/x]A N : 2、然后取[c/x]A cN :作为假设,证明 [Mc/x]A McN : 根据假设cN,由单调性,有 McMN : 因为MNN,所以 McN :
习 题 第一次:4.6,4.7,4.12 第二次:4.18,4.25 第三次: 4.30(a),4.40(b)