指称语义学讲义
前言
我们的目的在于介绍domain论和指称语义, 并展示其是如何为推理程序行为提供数学基础的.
推荐书目
Winskel, G. (1993). The Formal Semantics of Programming Languages. MIT Press. 这是一本操作语义和指称语义的极好导论. 就本课程而言, 相关的章节是5, 8, 9, 10 (第1节和第2节), 以及11. [译注: 有中文译本, 名为程序设计语言的形式语义.]
Tennent, R. D. (1991). Semantics of Programming Languages. Prentice-Hall. 部分I和II与本讲义有关.
深入阅读
Gunter, C. A. (1992). Semantics of Programming Languages. Structures and Techniques. MIT Press. 这是一本研究生水平的教材, 包含有诸多本讲义未能涵盖的材料. 就讲义本身而言, 相关的章节是第1章, 第2章, 以及第4到6章.
Streicher, T. (2006). Domain-Theoretic Foundations of Functional Programming. World Scientific Publishing Co. ISBN 981-270-142-7 一本关于本讲义后半部分所涉及的PCF语言的研究生水平教材.
第1章 引论
幻灯片1提示了给出编程语言的形式语义的几种方法. 操作性方法于Part IB课程Semantics of Programming Languages 中介绍, 而公理性方法在Part II课程Hoare Logic 中刻画. 本课程讲义给出了指称性方法的一些技巧的简要导引. 指称语义学的目的之一在于以尽可能抽象且实现无关的方式描述编程语言的构造: 通过这种方法, 我们有可能获得对于某些概念的洞察, 而这些概念构成了编程语言以及其间关系的基础, 甚至有时还能理解在语言设计中实现这些概念的新方式. 当然, 验证指称性描述可以被实现是重要的. 换言之, 即将指称语义和操作语义联系起来: 我们将在之后刻画如何施行此事.
形式语义的风格
操作的. 程序片段的意义基于程序执行过程中其可以施行的计算步骤 定义.
公理的. 程序片段的意义间接地通过程序性质的某种逻辑的公理和规则 定义.
指称的. 关心给出编程语言的数学模型 . 程序片段的意义抽象地定义为某种适当数学结构的元素.
幻灯片1
指称语义的特征性质
每个程序片段P 被赋予一个指称 ⟦ P ⟧ , 这是一个数学对象, 其代表了P 对于完整程序的意义的贡献.
一个程序片段的意义只由其子片段决定, 或者说指称语义是可复合的 .
幻灯片2
第1.1节 指称语义的基本例子
考虑基本的编程语言IMP− , 其相当于带有控制结构的算术和布尔表达式, 而这里的控制结构是由赋值, 顺序, 条件刻画的, 见幻灯片3.
指称语义的基本例子 (I):
IMP− 的句法
算术表达式:
A ∈ Aexp
⩴
n _
| L |
A + A
| …
其中n 是整数, 而L ∈ 𝕃 , 𝕃 是给定的位置 的集合.
布尔表达式:
B ∈ Bexp
⩴
true | false |
A = A
|
¬ B
| …
命令:
C ∈ Comm
⩴
skip |
L ≔ A
|
C ; C
|
if B then C else C
幻灯片3
为了给出一个编程语言的指称语义 , 我们需要赋予每种程序片段的句法范畴以一个解释的domain (domain of interpretation), 然后复合性地描述各种形成程序片段 (phrase-forming) 的构造所对应的语义函数. 对于IMP− , 幻灯片4到10给出了其指称语义, 并且这个语义也很容易在SML中实现.
指称语义的基本例子 (II)
语义函数
A :
Aexp →
(
State → ℤ
)
B :
Bexp →
(
State → 𝔹
)
C :
Comm →
(
State ⇀ State
)
其中
ℤ
=
{
… ,
− 1
, 0 , 1 , …
}
𝔹
=
{
true , false
}
State
=
(
𝕃 → ℤ
)
幻灯片4
指称语义的基本例子 (III)
语义函数A
A ⁡
⟦
n _
⟧
=
λ
s ∈ State
. n
A ⁡
⟦ L ⟧
=
λ
s ∈ State
.
s ⁡
( L )
A ⁡
⟦
A 1
+
A 2
⟧
=
λ
s ∈ State
.
A ⁡
⟦
A 1
⟧
⁡
( s )
+
A ⁡
⟦
A 2
⟧
⁡
( s )
幻灯片5
指称语义的基本例子 (IV)
语义函数B
B ⁡
⟦ true ⟧
=
λ
s ∈ State
. true
B ⁡
⟦ false ⟧
=
λ
s ∈ State
. false
B ⁡
⟦
A 1
=
A 2
⟧
=
λ
s ∈ State
.
eq ⁡
(
A ⁡
⟦
A 1
⟧
⁡
( s )
,
A ⁡
⟦
A 2
⟧
⁡
( s )
)
其中
eq ⁡
(
a ,
a ′
)
=
{
true
, 如果
a =
a ′
false
, 如果
a ≠
a ′
B ⁡
⟦
¬ B
⟧
=
λ
s ∈ State
.
¬
(
B ⁡
⟦ B ⟧
⁡
( s )
)
幻灯片6
指称语义的基本例子 (V)
语义函数C
⟦ skip ⟧
=
λ
s ∈ State
. s
注记: 从现在开始, 语义函数的名字都将省略.
幻灯片7
可复合性一例
给定部分函数⟦ C ⟧ , ⟦ C ′ ⟧ : State ⇀ State 以及函数⟦ B ⟧ : State → { true , false } , 我们可以定义
⟦
if B then C else
C ′
⟧
=
λ
s ∈ State
.
if ⁡
(
⟦ B ⟧
⁡
( s )
,
⟦ C ⟧
⁡
( s )
,
⟦
C ′
⟧
⁡
( s )
)
其中
if ⁡
(
b , x ,
x ′
)
=
{
x
, 如果
b = true
x ′
, 如果
b = false
幻灯片8
指称语义的基本例子 (VI)
语义函数C
⟦
L ≔ A
⟧
=
λ
s ∈ State
.
λ
l ∈ 𝕃
.
if ⁡
(
l = L
,
⟦ A ⟧
⁡
( s )
,
s ⁡
( l )
)
幻灯片9
顺序复合的指称语义
两个命令的顺序复合C ; C ′ 的指称为
⟦
C ;
C ′
⟧
=
⟦
C ′
⟧
∘
⟦ C ⟧
=
λ
s ∈ State
.
⟦
C ′
⟧
⁡
(
⟦ C ⟧
⁡
( s )
)
这实际上就是命令的指称 (即部分函数⟦ C ⟧ , ⟦ C ′ ⟧ : State ⇀ State ) 的复合而已.
与之相对的是, 顺序复合的操作语义为
C ,
s ⇓
s ′
C ′
,
s ′
⇓
s ″
C ;
C ′
,
s ⇓
s ″
幻灯片10
第1.2节 例子: 作为不动点的while 循环
幻灯片2所提及的可复合性 的要求是相当tough的. 我们用以赋予程序片段指称的数学对象必须足够丰富, 因为需要支持建模所讨论编程语言的一切形成程序片段的构造. 某些形成程序片段的构造是容易处理的, 而其他一些可能就不那么容易了. 例如, 牵涉状态改变命令的条件表达式 [译注: 更准确地说, 应该是条件命令] 可以基于应用相应的分支函数于立即子表达式的指称给出其指称语义: 见幻灯片8. 类似地, 命令的顺序复合的指称语义可由从状态到状态的部分函数的复合操作得到, 如幻灯片10.
现在我们来考虑基本编程语言IMP的指称语义, 其扩展了IMP− 以while 循环:
C ∈ Comm
⩴
… |
while B do C
然而, 这种循环构造并不容易以可复合的方式解释!
while 循环的转换语义为
〈
while B do C
, s
〉
→
〈
if B then
C ;
(
while B do C
)
else skip
, s
〉
这暗示了其作为从状态到状态的部分函数的指称应该满足
⟦
while B do C
⟧
=
⟦
if B then
C ;
(
while B do C
)
else skip
⟧
我们应该注意到这不能直接用来定义⟦ while B do C ⟧ , 因为右边恰恰包含有一个我们想要定义其指称的子片段. 使用顺序复合和if 的指称语义, 以及skip 的指称为恒等函数λ s ∈ State . s 的事实, 上面这条等式是在说⟦ while B do C ⟧ 应该是幻灯片11中给出的不动点方程 的一个解.
⟦ while B do C ⟧ 的不动点性质
⟦
while B do C
⟧
=
f
⟦ B ⟧
,
⟦ C ⟧
⁡
(
⟦
while B do C
⟧
)
其中, 对于每个
b : State → { true , false } 和
c : State ⇀ State , 我们定义
f
b , c
:
(
State ⇀ State
)
→
(
State ⇀ State
)
为
f
b , c
=
λ
w ∈
(
State ⇀ State
)
.
λ
s ∈ State
.
if ⁡
(
b ⁡
( s )
,
w ⁡
(
c ⁡
( s )
)
, s
)
为什么w = f ⟦ B ⟧ , ⟦ C ⟧ ⁡ ( w ) 有解?
若此方程具有多解, 那么选取哪一个作为⟦ while B do C ⟧ 呢?
幻灯片11
在赋予带有递归特性的编程语言以指称语义时, 这样的不动点方程经常出现. 自Dana Scott于60年代晚期的先驱性研究始, 一种被称为domain论 的数学理论建立起来以提供一种背景环境, 其中我们不仅总是可以找到因指称语义而生的不动点方程的解, 而且还能选出在某种适切意义下最小的解, 而这实际上保证了指称语义和操作语义之间的协调配合. 关键的想法在于考虑用作指称的数学对象之间的一种偏序, 此偏序表达了这样的事实, 一个对象由另一个对象近似 , 或者说比另一个对象携带了更多的信息 , 或者说比另一个对象更加良定 . 然后, 不动点方程的最小解可以被构造为对于解的近似升链的极限. 在下一章里, 这些想法将会变得从数学角度来说更加精确和一般, 但是目前先让我们具体地阐明该如何运用此想法解决幻灯片11中的特定问题.
为了确定起见, 让我们考虑以下特定的while 循环
while
X > 0
do
(
Y ≔
X ⁎ Y
;
X ≔
X − 1
)
其中X 和Y 是两个不同的整数存储位置 (变量), 而位置的集合𝕃 = { X , Y } .
在这种情形之下, 我们可以就取状态为赋值[ X ↦ x , Y ↦ y ] , 其中x , y ∈ ℤ , 这记录了位置X 和Y 的当前内容. 因此, State = ( 𝕃 → ℤ ) .
我们正在试着将这个while 循环的指称定义为一个部分函数
w :
State ⇀ State
其应该是幻灯片11上的不动点方程
w =
f
⟦
X > 0
⟧
,
⟦
Y ≔
X ⁎ Y
;
X ≔
X − 1
⟧
⁡
( w )
的一个解.
对于特定的布尔表达式B = ( X > 0 ) 和命令C = ( Y ≔ X ⁎ Y ; X ≔ X − 1 ) , 函数f ⟦ B ⟧ , ⟦ C ⟧ 恰好与幻灯片12上定义的函数f 相同.
⟦ while X > 0 do ( Y ≔ X ⁎ Y ; X ≔ X − 1 ) ⟧
令
State
= def
(
𝕃 → ℤ
)
D
= def
(
State ⇀ State
)
对于
⟦ while X > 0 do ( Y ≔ X ⁎ Y ; X ≔ X − 1 ) ⟧ ∈ D , 我们寻求
w = f ⁡ ( w ) 的一个最小的解, 其中
f : D → D 被定义为
f ⁡
( w )
⁡
(
[
X ↦ x
,
Y ↦ y
]
)
=
{
[
X ↦ x
,
Y ↦ y
]
, 如果
x ≤ 0
w ⁡
(
[
X ↦
x − 1
,
Y ↦
x ⁎ y
]
)
, 如果
x > 0
幻灯片12
D 上的偏序
D 上的偏序⊑ :w ⊑ w ′ 当且仅当对于每个s ∈ State , 如果w 在s 上有定义, 那么w ′ 也在s 上有定义, 并且w ⁡ ( s ) = w ′ ⁡ ( s ) . 另外一种描述是, w 的图包含于w ′ 的图.
最小元⊥ ∈ D w.r.t. ⊑ :⊥ 即全然未定义的部分函数, 或者说图为空的部分函数, 其满足对于每个w ∈ D , ⊥ ⊑ w .
幻灯片13
考虑幻灯片13上给出的D = ( State ⇀ State ) 的元素之间的偏序⊑ . 注意到⊑ 实际上就是前文所提及的"信息序"的具体化身: 如果w ⊑ w ′ , 那么w ′ 在w 有定义的地方都保持和w 的一致, 但是它可能在其他一些参数上也有定义. 我们还应该注意到的是, D 包含一个相对于此偏序的最小元: 对于全然未定义的部分函数, 我们将其记作⊥ , 它满足对于任意的w ∈ D 都有⊥ ⊑ w .
自⊥ 开始, 我们反复应用函数f 以构造一个部分函数的序列w 0 , w 1 , w 2 , … :
w 0
= def
⊥
;
w
n + 1
= def
f ⁡
(
w n
)
.
使用幻灯片12上的f 的定义, 我们发现
w 1
⁡
[
X ↦ x
,
Y ↦ y
]
=
f ⁡
( ⊥ )
⁡
[
X ↦ x
,
Y ↦ y
]
=
{
[
X ↦ x
,
Y ↦ y
]
, 如果
x ≤ 0
undefined
, 如果
x ≥ 1
w 2
⁡
[
X ↦ x
,
Y ↦ y
]
=
f ⁡
(
w 1
)
⁡
[
X ↦ x
,
Y ↦ y
]
=
{
[
X ↦ x
,
Y ↦ y
]
, 如果
x ≤ 0
[
X ↦ 0
,
Y ↦ y
]
, 如果
x = 1
undefined
, 如果
x ≥ 2
w 3
⁡
[
X ↦ x
,
Y ↦ y
]
=
f ⁡
(
w 2
)
⁡
[
X ↦ x
,
Y ↦ y
]
=
{
[
X ↦ x
,
Y ↦ y
]
, 如果
x ≤ 0
[
X ↦ 0
,
Y ↦ y
]
, 如果
x = 1
[
X ↦ 0
,
Y ↦
2 ⁎ y
]
, 如果
x = 2
undefined
, 如果
x ≥ 3
w 4
⁡
[
X ↦ x
,
Y ↦ y
]
=
f ⁡
(
w 3
)
⁡
[
X ↦ x
,
Y ↦ y
]
=
{
[
X ↦ x
,
Y ↦ y
]
, 如果
x ≤ 0
[
X ↦ 0
,
Y ↦ y
]
, 如果
x = 1
[
X ↦ 0
,
Y ↦
2 ⁎ y
]
, 如果
x = 2
[
X ↦ 0
,
Y ↦
6 ⁎ y
]
, 如果
x = 3
undefined
, 如果
x ≥ 4
并且, 在n ≥ 1 的一般情况下, 我们有
w n
⁡
[
X ↦ x
,
Y ↦ y
]
=
{
[
X ↦ x
,
Y ↦ y
]
, 如果
x ≤ 0
[
X ↦ 0
,
Y ↦
(
! x
)
⁎ y
]
, 如果
0 < x < n
undefined
, 如果
x ≥ n
其中! x 是x 的阶乘.
因此, 我们得到了一个部分函数的递增序列
w 0
⊑
w 1
⊑
w 2
⊑ … ⊑
w n
⊑ …
所有这些部分函数之并是元素w ∞ ∈ D , 其为
w ∞
⁡
[
X ↦ x
,
Y ↦ y
]
=
{
[
X ↦ x
,
Y ↦ y
]
, 如果
x ≤ 0
[
X ↦ 0
,
Y ↦
(
! x
)
⁎ y
]
, 如果
x > 0
注意到w ∞ 是f 的一个不动点, 因为对于每个[ X ↦ x , Y ↦ y ] , 我们有
f ⁡
(
w ∞
)
⁡
[
X ↦ x
,
Y ↦ y
]
=
{
[
X ↦ x
,
Y ↦ y
]
, 如果
x ≤ 0
w ∞
⁡
[
X ↦
x − 1
,
Y ↦
x ⁎ y
]
, 如果
x > 0
(根据 f 的定义)
=
{
[
X ↦ x
,
Y ↦ y
]
, 如果
x ≤ 0
[
X ↦ 0
,
Y ↦
1 ⁎ y
]
, 如果
x = 1
[
X ↦ 0
,
Y ↦
!
(
x − 1
)
⁎ x ⁎ y
]
, 如果
x > 1
(根据
w ∞
的定义)
=
w ∞
⁡
[
X ↦ x
,
Y ↦ y
]
实际上, 我们可以表明w ∞ 是f 的最小 不动点, 意即对于任意的w ∈ D , 有
w =
f ⁡
( w )
⇒
w ∞
⊑ w
.
我们取这个最小不动点w ∞ 作为
while
X > 0
do
(
Y ≔
X ⁎ Y
;
X ≔
X − 1
)
的指称, 其构造方式是下一章要证明的Tarski不动点定理的一个实例. 我们也应该注意到, w ∞ 的确就是命令while X > 0 do ( Y ≔ X ⁎ Y ; X ≔ X − 1 ) 的结构操作语义所给出的从状态到状态的函数, 见Part IB课程Semantics of Programming Languages .
第1.3节 练习
练习1. 在SML中实现IMP− 的指称语义.
练习2. 考虑幻灯片11上定义的函数
f
b , c
:
(
State ⇀ State
)
→
(
State ⇀ State
)
根据n 上的归纳证明
f
b , c
n
⁡
( ⊥ )
=
λ
s ∈ State
.
{
c k
⁡
( s )
, 如果存在
0 ≤ k < n
满足对于每个
0 ≤ i < k
有
b ⁡
(
c i
⁡
( s )
)
= true
而
b ⁡
(
c k
⁡
( s )
)
= false
undefined
, 如果对于每个
0 ≤ i < n
有
b ⁡
(
c i
⁡
( s )
)
= true
令w b , c : State ⇀ State 是由
w
b , c
= def
λ
s ∈ State
.
{
c k
⁡
( s )
, 如果存在
k ≥ 0
满足对于每个
0 ≤ i < k
有
b ⁡
(
c i
⁡
( s )
)
= true
而
b ⁡
(
c k
⁡
( s )
)
= false
undefined
, 如果对于每个
i ≥ 0
有
b ⁡
(
c i
⁡
( s )
)
= true
定义的部分函数, 证明w b , c 满足不动点方程
w
b , c
=
f
b , c
⁡
(
w
b , c
)
.
对于b = ⟦ true ⟧ = λ s ∈ State . true 和c = ⟦ skip ⟧ = λ s ∈ State . s , 描述函数f b , c . 什么样的从状态到状态的部分函数是f b , c 的不动点呢? 相对于⊑ 的最小不动点是什么呢? 这个最小不动点和while true do skip 的操作语义所确定的从状态到状态的部分函数是一致的吗?
练习3. 说明幻灯片13上的关系⊑ 的确是一个偏序, 而且⊥ 是最小元.
练习4. 证明w ∞ 的确是f 的最小不动点. 更一般地, 根据幻灯片13和练习2的定义, 证明对于任意的w ∈ ( State ⇀ State ) , 有
w =
f
b , c
⁡
( w )
⇒
w
b , c
⊑ w
.
第2章 最小不动点
本章介绍了被称为domain论 的数学理论, 其为构造各种编程语言特性的指称语义中所用到的最小不动点提供了一个一般性的框架. 该理论是由Dana Scott提出的.
第2.1节 偏序集和单调函数
论点
所有计算的domain都是带有最小元的偏序集.
所有可计算函数都是单调的.
幻灯片14
第2.1.1小节 偏序集
domain论使用满足特定完备性质的偏序集. 我们在幻灯片15中回顾了偏序 的定义. D 被称为偏序集( D , ⊑ ) 的基础集(underlying set) . 大部分时候, 我们只以基础集的名字引用偏序集, 而以相同的符号⊑ 代表不同偏序集的偏序.
偏序集
集合
D 上的二元关系
⊑ 是一个偏序, 当且仅当它是
自反的: ∀ d ∈ D . d ⊑ d ;
传递的: ∀ d , d ′ , d ″ ∈ D . d ⊑ d ′ ⊑ d ″ ⇒ d ⊑ d ″ ;
反对称的: ∀ d , d ′ ∈ D . d ⊑ d ′ ⊑ d ⇒ d = d ′ .
序对
( D , ⊑ ) 被称为一个
偏序集 .
幻灯片15
偏序集公理: 规则形式
x ⊑ x
x ⊑ y
y ⊑ z
x ⊑ z
x ⊑ y
y ⊑ x
x = y
幻灯片16
部分函数的domain, X ⇀ Y
基础集: 由所有定义域dom ⁡ ( f ) ⊆ X 且取值于Y 的部分函数f 构成.
偏序: f ⊑ g 当且仅当dom ⁡ ( f ) ⊆ dom ⁡ ( g ) 且∀ x ∈ dom ⁡ ( f ) . f ⁡ ( x ) = g ⁡ ( x ) , 或者说graph ⁡ ( f ) ⊆ graph ⁡ ( g ) .
幻灯片17
例子1. 从集合X 到集合Y 的所有部分函数构成的集合( X ⇀ Y ) 可以看成是一个偏序集, 如幻灯片17那样. 前一章里, 我们取这个domain在X = Y = State (某个状态集合) 情形下的实例作为命令的指称集.
第2.1.2小节 单调函数
幻灯片18中给出了偏序集之间的单调映射的概念.
单调性
两个偏序集之间的函数
f : D → E 是
单调的 , 如果
∀
d ,
d ′
∈ D
.
d ⊑
d ′
⇒
f ⁡
( d )
⊑
f ⁡
(
d ′
)
.
x ⊑ y
f ⁡
( x )
⊑
f ⁡
( y )
( f 单调)
幻灯片18
例子2. 给定偏序集D 和E , 显然常函数λ d ∈ D . e : D → E 是单调的.
例子3. 当D 是部分函数的domain ( State ⇀ State ) (见幻灯片17) 时, 幻灯片11上定义的与while 循环的指称语义有关的函数f b , c : D → D 是一个单调函数. 我们将其验证留作练习.
第2.2节 最小元和前不动点 (pre-fixed point)
定义1. 设D 是一个偏序集, S 是D 的一个子集, d ∈ S 被称为S 的最小 元, 如果其满足
∀
x ∈ S
.
d ⊑ x
.
注意到因为⊑ 是反对称的, 所以S 至多拥有一个最小元. 我们也应该注意到, 有的偏序集是没有最小元的. 例如, 带有通常偏序的ℤ .
函数f : D → D 的一个不动点 , 根据定义, 是满足f ⁡ ( d ) = d 的一个元素d ∈ D . 如果D 是一个偏序集, 我们可以考虑一个更弱的概念, 即前不动点 , 见幻灯片19.
前不动点
令
D 是一个偏序集而
f : D → D 是一个函数.
一个元素
d ∈ D 是
f 的一个
前不动点 , 如果其满足
f ⁡ ( d ) ⊑ d .
f 的
最小前不动点 , 如果存在的话, 记作
fix ⁡
( f )
.
因此, 最小前不动点由以下两条性质(唯一地)刻画:
(lpf1): f ⁡ ( fix ⁡ ( f ) ) ⊑ fix ⁡ ( f ) ;
(lpf2): ∀ d ∈ D . f ⁡ ( d ) ⊑ d ⇒ fix ⁡ ( f ) ⊑ d .
幻灯片19
证明原理
f ⁡
(
fix ⁡
( f )
)
⊑
fix ⁡
( f )
令D 是一个偏序集, f : D → D 是一个带有最小前不动点fix ⁡ ( f ) ∈ D 的函数. 对于任意的x ∈ D , 为了证明fix ⁡ ( f ) ⊑ x , 只需要证明f ⁡ ( x ) ⊑ x .
f ⁡
( x )
⊑ x
fix ⁡
( f )
⊑ x
幻灯片20
命题2. 设D 是一个偏序集而f : D → D 是一个带有最小前不动点fix ⁡ ( f ) 的函数. 只要f 是单调的, 那么fix ⁡ ( f ) 实际上就是f 的一个不动点, 因此也是f 的最小不动点.
证明. 因为
fix ⁡ ( f ) 是
f 的前不动点, 所以
f ⁡ ( fix ⁡ ( f ) ) ⊑ fix ⁡ ( f ) . 如果
f 是单调的, 那么
f ⁡
(
f ⁡
(
fix ⁡
( f )
)
)
⊑
f ⁡
(
fix ⁡
( f )
)
.
换言之,
f ⁡ ( fix ⁡ ( f ) ) 也是
f 的一个前不动点. 但是, 鉴于
fix ⁡ ( f ) 是最小的前不动点, 我们可以推出
fix ⁡
( f )
⊑
f ⁡
(
fix ⁡
( f )
)
.
根据偏序的反对称性, 我们可以断言
fix ⁡
( f )
=
f ⁡
(
fix ⁡
( f )
)
即
fix ⁡ ( f ) 是
f 的一个不动点. 而且, 考虑到偏序的自反性, 不动点也是前不动点. 对于任意的
d ∈ D 满足
d = f ⁡ ( d ) , 我们有
fix ⁡ ( f ) ⊑ d . 换言之,
fix ⁡ ( f ) 是
f 的最小不动点.
◻
第2.3节 完全偏序 (cpo) 和连续函数
论点*
所有计算的domain都是带有最小元的完全偏序.
所有可计算函数都是连续的.
幻灯片21
第2.3.1小节 domain
定义1.
若存在, 我们将偏序集D 的最小元记为⊥ D . 若D 在上下文中是已知的, 写成⊥ 就可以了. 因此, ⊥ 由性质
∀
d ∈ D
.
⊥ ⊑ d
唯一确定. 偏序集的最小元有时也被称为其底(bottom) 元素.
偏序集D 中的一个可数的升链 是由D 的元素构成的一个序列满足
d 0
⊑
d 1
⊑
d 2
⊑ …
这样的链的一个上界 是任意满足∀ n ∈ ℕ . d n ⊑ d 的d ∈ D . 若链的最小上界(lub) 存在, 我们将其记为
⨆
n ≥ 0
d n
.
因此, 根据定义:
∀ m ∈ ℕ . d m ⊑ ⨆ n ≥ 0 d n .
对于任意的d ∈ D , 如果∀ m ∈ ℕ . d m ⊑ d , 那么⨆ n ≥ 0 d n ⊑ d .
cpo和domain
一个
链完备偏序集(chain-complete poset) , 或者说缩写为
cpo , 是一个偏序集
( D , ⊑ ) 满足其中的每个链
d 0 ⊑ d 1 ⊑ d 2 ⊑ … 都具有最小上界
⨆ n ≥ 0 d n :
(lub1): ∀ m ≥ 0 . d m ⊑ ⨆ n ≥ 0 d n ;
(lub2): ∀ d ∈ D . ( ∀ m ≥ 0 . d m ⊑ d ) ⇒ ⨆ n ≥ 0 d n ⊑ d .
一个
domain 是一个带有最小元
⊥ 的cpo:
∀
d ∈ D
.
⊥ ⊑ d
.
幻灯片22
最小元和最小上界的定义: 规则形式
⊥ ⊑ x
x i
⊑
⨆
n ≥ 0
x n
(
i ≥ 0
而
〈
x n
〉
是一个链)
∀
m ≥ 0
.
x m
⊑ x
⨆
n ≥ 0
x n
⊑ x
(
〈
x n
〉
是一个链)
幻灯片23
本讲义里我们关心的是具有特定完备性质的偏序集, 见幻灯片22. 读者应该注意的是, 在有关的指称语义的文献中, 术语"domain"的含义是相当宽泛的: 存在各种各样的domain, 它们可能具有各种各样的序论性质, 而不仅仅是满足链完备性质和拥有最小元.
例子3. 从集合X 到集合Y 的所有部分函数的集合( X ⇀ Y ) 上可以赋予一个偏序成为domain, 见幻灯片24. 在第1.2节, 我们使用了X = Y = State 的特殊情形作为命令的指称集. 我们应该注意到, 声称是链f 0 ⊑ f 1 ⊑ f 2 ⊑ … 的最小上界的f 的确是一个良定的部分函数, 因为在有定义的地方, 每个f n 的值都是一致的. 至于验证f 的确是偏序集( X ⇀ Y , ⊑ ) 中的f 0 ⊑ f 1 ⊑ f 2 ⊑ … 的最小上界, 我们将其留给读者作为练习.
部分函数的domain, X ⇀ Y
基础集: 由所有满足以下条件的部分函数
f 构成, 其定义域
dom ⁡ ( f ) ⊆ X 而取值于
Y .
偏序: f ⊑ g 当且仅当
dom ⁡ ( f ) ⊆ dom ⁡ ( g ) 且
∀ x ∈ dom ⁡ ( f ) . f ⁡ ( x ) = g ⁡ ( x ) , 或者说
graph ⁡ ( f ) ⊆ graph ⁡ ( g ) .
链的最小上界: 链
f 0 ⊑ f 1 ⊑ f 2 ⊑ … 的最小上界是部分函数
f , 其
dom ⁡ ( f ) = ⋃ n ≥ 0 dom ⁡ ( f n ) 而
f ⁡
( x )
=
{
f n
⁡
( x )
, 如果存在某个
n ∈ ℕ
使得
x ∈
dom ⁡
(
f n
)
undefined
, 否则的话
最小元素: ⊥ 是全然未定义的部分函数.
幻灯片24
例子4. 对于任意的偏序集
( D , ⊑ ) 而言, 如果
D 是有限的, 那么该偏序集是一个cpo. 这是因为, 在这样的偏序集中, 任何链都将终至恒常, 因而拥有最小上界. 当然, 有限的偏序集也不一定拥有最小元, 即不是一个domain. 例如, 考虑以下Hasse图所描述的偏序集.
一个偏序集的
Hasse图 是一个有向图, 其顶点是偏序集的基础集的元素, 而从顶点
x 到顶点
y 有一条边当且仅当
x ≠ y 且
∀ z . ( x ⊑ z & z ⊑ y ) ⇒ ( z = x ∨ z = y ) .
"扁平自然数集"ℕ ⊥ :
0
1
2
⋯
n
n + 1
⋯
⊥
"垂直自然数集"Ω :
ω
n + 1
n
2
1
0
⋮
⋮
图1
图1展示两个非常简单但却无限的domain, 而以下是两个并非cpo的偏序集的例子.
例子5. 装备有通常偏序≤ 的自然数集ℕ = { 0 , 1 , 2 , … } 不是一个cpo, 因为链0 ≤ 1 ≤ 2 ≤ … 在ℕ 中没有上界.
例子6. 考虑上图的第二个例子的一种修改版本, 其中我们为ℕ 添加了两个不同的上界ω 1 ≠ ω 2 . 换言之, 我们考虑的是D = def ℕ ∪ { ω 1 , ω 2 } , 而其上的偏序⊑ 为
d ⊑
d ′
⇔ def
{
d ≤
d ′
, 如果
d ,
d ′
∈ ℕ
d ∈ ℕ
∨
d =
d ′
, 如果
d ′
∈
{
ω 1
,
ω 2
}
然后, D 中的链0 ⊑ 1 ⊑ 2 ⊑ … 拥有两个上界, 即ω 1 和ω 2 , 但是没有最小的上界, 因为ω 1 和ω 2 不可比较. 因此, ( D , ⊑ ) 不是一个cpo.
链的最小上界的一些性质
设
D 是一个cpo.
对于任意的d ∈ D , ⨆ n ≥ 0 d = d .
对于D 中的每个链d 0 ⊑ d 1 ⊑ … ⊑ d n ⊑ … , 我们有
⨆
n ≥ 0
d n
=
⨆
n ≥ 0
d
N + n
对于任意的N ∈ ℕ 成立.
幻灯片25
链的最小上界的一些性质 (续)
对于D 中的两条链d 0 ⊑ d 1 ⊑ … ⊑ d n ⊑ … 和e 0 ⊑ e 1 ⊑ … ⊑ e n ⊑ … , 如果对于每个n ∈ ℕ 有d n ⊑ e n , 那么
⨆
n ≥ 0
d n
⊑
⨆
n ≥ 0
e n
.
∀
n ∈ 0
.
x n
⊑
y n
⨆
n ≥ 0
x n
⊑
⨆
n ≥ 0
y n
(
〈
x n
〉
和
〈
y n
〉
俱是链)
幻灯片26
双链的对角化
引理. 令D 是一个cpo, 设双下标索引的元素d m , n ∈ D (其中m , n ≥ 0 ) 构成的族满足
m ≤
m ′
&
n ≤
n ′
⇒
d
m , n
⊑
d
m ′
,
n ′
那么我们有
⨆
n ≥ 0
d
0 , n
⊑
⨆
n ≥ 0
d
1 , n
⊑
⨆
n ≥ 0
d
2 , n
⊑ …
以及
⨆
m ≥ 0
d
m , 0
⊑
⨆
m ≥ 0
d
m , 1
⊑
⨆
m ≥ 0
d
m , 2
⊑ …
而且
⨆
m ≥ 0
(
⨆
n ≥ 0
d
m , n
)
=
⨆
k ≥ 0
d
k , k
=
⨆
n ≥ 0
(
⨆
m ≥ 0
d
m , n
)
.
幻灯片27
证明. 我们利用了定义链的最小上界的性质, 即幻灯片22上的(lub1)和(lub2). 首先, 注意到如果
m ≤ m ′ , 那么
d
m , n
⊑
d
m ′
, n
⊑
⨆
n ′
≥ 0
d
m ′
,
n ′
对于每个
n ≥ 0 成立. 因此,
⨆ n ≥ 0 d m , n ⊑ ⨆ n ′ ≥ 0 d m ′ , n ′ . 于是, 我们的确可以得到一条由最小上界构成的链
⨆
n ≥ 0
d
0 , n
⊑
⨆
n ≥ 0
d
1 , n
⊑
⨆
n ≥ 0
d
2 , n
⊑ …
并且我们可以构造其最小上界
⨆ m ≥ 0 ⨆ n ≥ 0 d m , n . 运用两次(lub1), 我们有
d
k , k
⊑
⨆
n ≥ 0
d
k , n
⊑
⨆
m ≥ 0
⨆
n ≥ 0
d
m , n
对于每个
k ≥ 0 成立, 那么根据(lub2)可以得到
⨆
k ≥ 0
d
k , k
⊑
⨆
m ≥ 0
⨆
n ≥ 0
d
m , n
反过来, 对于每个
m , n ≥ 0 , 我们注意到
d
m , n
⊑
d
max ⁡
(
m , n
)
,
max ⁡
(
m , n
)
⊑
⨆
k ≥ 0
d
k , k
因而再应用两次(lub2)就可以推出
⨆
m ≥ 0
⨆
n ≥ 0
d
m , n
⊑
⨆
k ≥ 0
d
k , k
根据
⊑ 的反对称性, 我们就得出了想要的等式. 剩余的结果也可按照相同的论证手法得到, 只需要交换
m 和
n 的角色.
◻
第2.3.2小节 连续函数
连续性和严格性
如果D 和E 是cpo, 函数f 是连续的 当且仅当
f 是单调的;
f 保持链的最小上界, 即对于D 中的每条链d 0 ⊑ d 1 ⊑ … , 我们有
f ⁡
(
⨆
n ≥ 0
d n
)
=
⨆
n ≥ 0
f ⁡
(
d n
)
.
如果D 和E 都拥有最小元, 那么称函数f 是严格的 , 如果f ⁡ ( ⊥ ) = ⊥ .
幻灯片28
例子8. 给定cpo D 和E , 对于每个e ∈ E 而言, 常函数λ d ∈ D . e : D → E 是连续的.
例子9. 当D 是部分函数的domain ( State ⇀ State ) 时 (见幻灯片24), 定义于幻灯片11的与while 循环的指称语义有关的函数f b , c : D → D 是一个连续函数. 我们将其验证留作练习.
例子10. 令Ω 是垂直自然数的domain, 那么由
f ⁡
( x )
=
{
0
, 如果
x ∈ ℕ
ω
, 如果
x = ω
定义的函数f : Ω → Ω 既是单调的也是严格的, 但是并非连续, 因为
f ⁡
(
⨆
n ≥ 0
n
)
=
f ⁡
( ω )
= ω
然而
⨆
n ≥ 0
f ⁡
( n )
=
⨆
n ≥ 0
0
= 0
第2.4节 Tarski不动点定理
Tarski不动点定理
令
f : D → D 是domain
D 上的一个连续函数, 那么
f 具有最小前不动点, 由
fix ⁡
( f )
=
⨆
n ≥ 0
f n
⁡
( ⊥ )
给出.
于是, fix ⁡ ( f ) 也是f 的不动点, 因而是f 的最小不动点 .
幻灯片29
幻灯片29给出了关于domain上的连续函数的关键结果, 其允许我们赋予牵涉递归特性的程序以指称语义. 幻灯片上所用的记号f n ⁡ ( ⊥ ) 是递归定义的:
f 0
⁡
( ⊥ )
= def
⊥
;
f
n + 1
⁡
( ⊥ )
= def
f ⁡
(
f n
⁡
( ⊥ )
)
.
注意到既然∀ d ∈ D . ⊥ ⊑ d , 我们有f 0 ⁡ ( ⊥ ) = ⊥ ⊑ f 1 ⁡ ( ⊥ ) ; 而根据单调性, 又可以推出
f n
⁡
( ⊥ )
⊑
f
n + 1
⁡
( ⊥ )
⇒
f
n + 1
⁡
( ⊥ )
=
f ⁡
(
f n
⁡
( ⊥ )
)
⊑
f ⁡
(
f
n + 1
⁡
( ⊥ )
)
=
f
n + 2
⁡
( ⊥ )
.
因此, 通过对于n ∈ ℕ 进行归纳, 我们可以得到
∀
n ∈ ℕ
.
f n
⁡
( ⊥ )
⊑
f
n + 1
⁡
( ⊥ )
.
换言之, 元素f n ⁡ ( ⊥ ) 构成了D 中的一条链. 所以说, 既然D 是cpo, 那么幻灯片29上用到的⨆ n ≥ 0 f n ⁡ ( ⊥ ) 的确是有意义的.
证明. 首先我们注意到
f ⁡
(
fix ⁡
( f )
)
=
f ⁡
(
⨆
n ≥ 0
f n
⁡
( ⊥ )
)
=
⨆
n ≥ 0
f ⁡
(
f n
⁡
( ⊥ )
)
根据 f 的连续性
=
⨆
n ≥ 0
f
n + 1
⁡
( ⊥ )
根据函数的幂次的定义
=
⨆
n ≥ 0
f n
⁡
( ⊥ )
根据第2.3节的评注2
=
fix ⁡
( f )
因此,
fix ⁡ ( f ) 的确是
f 的一个不动点, 当然也就满足幻灯片19上的条件(lpf1). 为了验证(lpf2), 即前不动点的最小性, 我们设
d ∈ D 满足
f ⁡ ( d ) ⊑ d , 那么既然
⊥ 在
D 是最小的, 可以得到
f 0
⁡
( ⊥ )
= ⊥
⊑ d
并且
f n
⁡
( ⊥ )
⊑ d
⇒
f
n + 1
⁡
( ⊥ )
=
f ⁡
(
f n
⁡
( ⊥ )
)
⊑
f ⁡
( d )
⊑ d
根据归纳, 我们可以推出
∀ n ∈ ℕ . f n ⁡ ( ⊥ ) ⊑ d . 换言之,
d 是链的一个上界, 所以它大于等于最小上界, 即
fix ⁡
( f )
=
⨆
n ≥ 0
f n
⁡
( ⊥ )
⊑ d
这就是我们想要的(lpf2)了.
◻
例子1. 定义于幻灯片11上的函数f ⟦ B ⟧ , ⟦ C ⟧ 是domain ( State ⇀ State ) 上的一个连续函数, 因而我们可以应用Tarski不动点定理, 将⟦ while B do C ⟧ 定义为fix ⁡ ( f ⟦ B ⟧ , ⟦ C ⟧ ) . 实际上, 第1.2节中我们构造部分函数w ∞ 的方法不过就是不动点定理的一个实例而已.
⟦ while B do C ⟧
⟦
while B do C
⟧
=
fix ⁡
(
f
⟦ B ⟧
,
⟦ C ⟧
)
=
⨆
n ≥ 0
f
⟦ B ⟧
,
⟦ C ⟧
n
⁡
( ⊥ )
=
λ
s ∈ State
.
{
⟦ C ⟧
k
⁡
( s )
, 如果存在
k ≥ 0
满足对于每个
0 ≤ i < k
有
⟦ B ⟧
⁡
(
⟦ C ⟧
i
⁡
( s )
)
= true
而
⟦ B ⟧
⁡
(
⟦ C ⟧
k
⁡
( s )
)
= false
undefined
, 如果对于每个
i ≥ 0
有
⟦ B ⟧
⁡
(
⟦ C ⟧
i
⁡
( s )
)
= true
幻灯片30
第2.5节 练习
练习1. 验证幻灯片24上的断言.
练习2. 证明幻灯片25和27中的声明.
练习3. 验证例子9中f b , c 是连续函数的断言. 何时f b , c 是严格的?
第3章 domain上的构造
本节我们将给出诸多构造domain和连续函数的方式, 实际上专注于PCF编程语言的指称语义所需的构造, PCF是本讲义的后半部分的研究对象. 注意到为了描述一个cpo, 我们必须先定义 一个装备有某二元关系的集合, 然后证明
这个关系是一个偏序;
对于这个偏序集中所有的链, 其最小上界存在.
另外, 为了使得cpo成为一个domain, 我们还需要说明
存在最小的元素.
注意到既然链的最小上界以及最小元若存在则唯一, 那么cpo和domain完全由其基础集和偏序决定. [译注: 意味不明.] 之后我们将给出各种各样构造cpo和domain的方法, 而将验证i, ii, iii成立的任务留作练习.
第3.1节 扁平domain
为了模拟PCF的基本类型 (ground type) nat 和bool , 我们将使用幻灯片31给出的扁平domain 的概念.
离散cpo和扁平domain
对于任意的集合
X , 相等关系
x ⊑
x ′
⇔ def
x =
x ′
使得
( X , ⊑ ) 成为一个cpo, 其被称为以
X 为基础集的
离散 cpo.
令
X ⊥ = def X ∪ { ⊥ } , 其中
⊥ 是某个不在
X 中的元素, 那么
d ⊑
d ′
⇔ def
(
d =
d ′
)
∨
(
d = ⊥
)
使得
( X ⊥ , ⊑ ) 成为一个以
⊥ 为最小元的domain, 其被称为由
X 确定的
扁平 domain.
幻灯片31
自然数的扁平domain ℕ ⊥ , 上一章的图1中我们就已描绘过其图像. 至于布尔值的扁平domain 𝔹 ⊥ , 其Hasse图为
true
false
⊥
以下牵涉扁平domain的连续函数实例对于PCF的指称语义而言也是必要的, 我们将其验证留给读者作为练习.
命题1. 令f : X ⇀ Y 是两个集合之间的部分函数, 那么
f ⊥
⁡
( d )
= def
{
f ⁡
( d )
, 如果
d ∈ X
且 f 定义于 d
⊥
, 如果
d ∈ X
而 f 在 d 上没有定义
⊥
, 如果
d = ⊥
定义了相应扁平domain之间的连续函数f ⊥ : X ⊥ → Y ⊥ .
第3.2节 domain的积
cpo和domain的二元积
两个cpo
( D 1 , ⊑ 1 ) 和
( D 2 , ⊑ 2 ) 之
积 的基础集为
D 1
×
D 2
=
{
(
d 1
,
d 2
)
|
d 1
∈
D 1
&
d 2
∈
D 2
}
而其上的偏序
⊑ 定义如下
(
d 1
,
d 2
)
⊑
(
d 1 ′
,
d 2 ′
)
⇔ def
d 1
⊑ 1
d 1 ′
&
d 2
⊑ 2
d 2 ′
链的最小上界可以按照分量进行计算:
⨆
n ≥ 0
(
d
1 , n
,
d
2 , n
)
=
(
⨆
i ≥ 0
d
1 , i
,
⨆
j ≥ 0
d
2 , j
)
若
( D 1 , ⊑ 1 ) 和
( D 2 , ⊑ 2 ) 都是domain, 那么
( D 1 × D 2 , ⊑ ) 也是一个domain, 并且
⊥
D 1
×
D 2
=
(
⊥
D 1
,
⊥
D 2
)
幻灯片32
命题1. 投影和配对. 令D 1 和D 2 是cpo, 那么投影
π 1
:
D 1
×
D 2
→
D 1
,
(
d 1
,
d 2
)
↦
d 1
和
π 2
:
D 1
×
D 2
→
D 2
,
(
d 1
,
d 2
)
↦
d 2
是连续函数. 如果f 1 : D → D 1 和f 2 : D → D 2 是连续函数, 其中D 是一个cpo, 那么
〈
f 1
,
f 2
〉
:
D →
D 1
×
D 2
,
d ↦
(
f 1
⁡
( d )
,
f 2
⁡
( d )
)
是连续的.
证明. 这些函数的连续性可由幻灯片32上对于
D 1 × D 2 中的链的最小上界的刻画直接推出.
◻
命题2. 对于每个domain D , 函数
if :
𝔹 ⊥
×
(
D × D
)
→ D
,
(
x ,
(
d ,
d ′
)
)
↦
{
d
, 如果
x = true
d ′
, 如果
x = false
⊥ D
, 如果
x = ⊥
是连续的.
我们将会需要以下更一般的积构造.
定义3. 依赖积. 给定集合
I , 设对于每个
i ∈ I 我们有一个cpo
( D i , ⊑ i ) , 那么这个cpo族之
积 为
基础集是集合D i 的I 重笛卡尔积∏ i ∈ I D i , 其由所有这样的函数p 构成, p 定义在I 上, 而p 在每个i ∈ I 处的值p ⁡ ( i ) ∈ D i ;
偏序⊑ 为
p ⊑
p ′
⇔ def
∀
i ∈ I
.
p ⁡
( i )
⊑ i
p ′
⁡
( i )
.
就和二元积的情况一样,
( ∏ i ∈ I D i , ⊑ ) 中的链的最小上界也可以逐分量计算: 如果
p 0 ⊑ p 1 ⊑ p 2 ⊑ … 是积cpo中的一个链, 那么其最小上界是将每个
i ∈ I 映射至
D i 中的链
p 0 ⁡ ( i ) ⊑ p 1 ⁡ ( i ) ⊑ p 2 ⁡ ( i ) ⊑ … 的最小上界的函数, 即
(
⨆
n ≥ 0
p n
)
⁡
( i )
=
⨆
n ≥ 0
p n
⁡
( i )
,
i ∈ I
.
而且, 对于每个
i ∈ I , 第
i 投影函数
π i
:
∏
j ∈ I
D j
→
D i
,
p ↦
p ⁡
( i )
是连续的. 如果每个
D i 都是domain, 那么它们的积也是domain, 并且其最小元是将每个
i ∈ I 映射至
D i 的最小元的函数.
两个参数的连续函数
命题. 令D , E , F 是cpo, 那么函数f : D × E → F 是单调的当且仅当其对于每个参数分别都是单调的:
∀
d ,
d ′
∈ D
,
e ∈ E
.
d ⊑
d ′
⇒
f ⁡
(
d , e
)
⊑
f ⁡
(
d ′
, e
)
∀
d ∈ D
,
e ,
e ′
∈ E
.
e ⊑
e ′
⇒
f ⁡
(
d , e
)
⊑
f ⁡
(
d ,
e ′
)
而且, 其是连续的当且仅当其对于每个参数分别都是连续的 [译注: 在单调的基础之上, 也就是对于每个参数分别都是保持链的最小上界的]:
f ⁡
(
⨆
n ≥ 0
d n
, e
)
=
⨆
n ≥ 0
f ⁡
(
d n
, e
)
f ⁡
(
d ,
⨆
n ≥ 0
e n
)
=
⨆
n ≥ 0
f ⁡
(
d ,
e n
)
幻灯片33
两个参数的连续函数: 推导规则
在f 单调的情况下, 我们有
x ⊑
x ′
y ⊑
y ′
f ⁡
(
x , y
)
⊑
f ⁡
(
x ′
,
y ′
)
在f 连续的情况下, 我们有
f ⁡
(
⨆
m ≥ 0
x m
,
⨆
n ≥ 0
y n
)
=
⨆
k ≥ 0
f ⁡
(
x k
,
y k
)
幻灯片34
证明. "仅当"的方向是直接的, 其证明依赖于简单的观察, 即
d ⊑ d ′ ⇒ ( d , e ) ⊑ ( d ′ , e ) 和
( ⨆ n ≥ 0 d n , e ) = ⨆ n ≥ 0 ( d n , e ) , 以及它们之于右参数的对偶版本. 对于"当"的方向, 首先设
f 对于每个参数分别都是单调的, 那么如果
D × E 中有
( d , e ) ⊑ ( d ′ , e ′ ) , 根据二元积的定义, 我们可以推出
D 中有
d ⊑ d ′ 而
E 中有
e ⊑ e ′ , 因此
f ⁡
(
d , e
)
⊑
f ⁡
(
d ′
, e
)
根据对于第一个参数的单调性
⊑
f ⁡
(
d ′
,
e ′
)
根据对于第二个参数的单调性
于是,
f ⁡ ( d , e ) ⊑ f ⁡ ( d ′ , e ′ ) , 即
f 是单调函数.
现在设
f 对于每个参数分别都是连续的, 那么如果
( d 0 , e 0 ) ⊑ ( d 1 , e 1 ) ⊑ ( d 2 , e 2 ) ⊑ … 是二元积中的一个链, 我们有
f ⁡
(
⨆
n ≥ 0
(
d n
,
e n
)
)
=
f ⁡
(
⨆
i ≥ 0
d i
,
⨆
j ≥ 0
e j
)
见幻灯片32
=
⨆
i ≥ 0
f ⁡
(
d i
,
⨆
j ≥ 0
e j
)
根据对于第一个参数的连续性
=
⨆
i ≥ 0
⨆
j ≥ 0
f ⁡
(
d i
,
e j
)
根据对于第二个参数的连续性
=
⨆
n ≥ 0
f ⁡
(
d n
,
e n
)
根据幻灯片27上的引理
而这就说明了
f 的连续性.
◻
第3.3节 函数domain
两个cpo/domain之间的所有连续函数的集合可以赋予一个偏序而成为一个cpo/domain, 见幻灯片35. 有时我们也用术语"指数cpo/domain (exponential cpo/domain)"而不是"函数cpo/domain".
函数cpo和domain
给定cpo
( D , ⊑ D ) 和
( E , ⊑ E ) , 函数cpo
( D → E , ⊑ ) 的基础集为 [译注: 以下符号有点过载]
(
D → E
)
= def
{
f :
D → E
|
f 连续
}
而偏序为
f ⊑
f ′
⇔ def
∀
d ∈ D
.
f ⁡
( d )
⊑ E
f ′
⁡
( d )
推导规则:
f
⊑
(
D → E
)
g
x
⊑ D
y
f ⁡
( x )
⊑ E
g ⁡
( y )
幻灯片35
函数cpo和domain (续)
链的最小上界可以逐参数计算:
⨆
n ≥ 0
f n
=
λ
d ∈ D
.
⨆
n ≥ 0
f n
⁡
( d )
推导规则:
(
⨆
n ≥ 0
f n
)
⁡
(
⨆
n ≥ 0
x n
)
=
⨆
k ≥ 0
f k
⁡
(
x k
)
如果
D 和
E 还是domain, 那么
D → E 也成为一个domain, 并且最小元为
⊥
D → E
:
D → E
,
d ↦
⊥ E
.
幻灯片36
证明. 我们应该证明函数的链
⨆ n ≥ 0 f n 的最小上界是连续的. 这个证明使用了幻灯片27的
互换律 (interchange law) . 对于
D 中的一个链
d 0 ⊑ d 1 ⊑ d 2 ⊑ … , 我们有
(
⨆
n ≥ 0
f n
)
⁡
(
⨆
m ≥ 0
d m
)
=
⨆
n ≥ 0
f n
⁡
(
⨆
m ≥ 0
d m
)
⨆
n ≥ 0
f n
的定义
=
⨆
n ≥ 0
(
⨆
m ≥ 0
f n
⁡
(
d m
)
)
每个
f n
的连续性
=
⨆
m ≥ 0
(
⨆
n ≥ 0
f n
⁡
(
d m
)
)
互换律
=
⨆
m ≥ 0
(
(
⨆
n ≥ 0
f n
)
⁡
(
d m
)
)
⨆
n ≥ 0
f n
的定义
◻
命题1. 求值和Curry化. 给定cpo D 和E , 函数
ev :
(
D → E
)
× D
→ E
,
(
f , d
)
↦
f ⁡
( d )
是连续的. 给定任意的连续函数f : D ′ × D → E (其中D ′ 是一个cpo), 对于每个d ′ ∈ D ′ , 函数d ∈ D ↦ f ⁡ ( d ′ , d ) 都是连续的, 因而确定了函数cpo D → E 中的一个元素. 我们将其记为cur ⁡ ( f ) ⁡ ( d ′ ) , 那么
cur ⁡
( f )
:
D ′
→
(
D → E
)
,
d ′
↦
λ
d ∈ D
.
f ⁡
(
d ′
, d
)
是一个连续函数. [原注: Curry化 这个名字是为了纪念逻辑学家H. B. Curry, 一位组合子逻辑和lambda演算先驱.]
证明. 对于
ev 的连续性, 注意到
ev ⁡
(
⨆
n ≥ 0
(
f n
,
d n
)
)
=
ev ⁡
(
⨆
i ≥ 0
f i
,
⨆
j ≥ 0
d j
)
积的最小上界是逐分量计算的
=
(
⨆
i ≥ 0
f i
)
⁡
(
⨆
j ≥ 0
d j
)
根据 ev 的定义
=
⨆
i ≥ 0
f i
⁡
(
⨆
j ≥ 0
d j
)
函数cpo中的最小上界是逐参数计算的
=
⨆
i ≥ 0
⨆
j ≥ 0
f i
⁡
(
d j
)
根据每个
f i
的连续性
=
⨆
n ≥ 0
f n
⁡
(
d n
)
根据幻灯片27的引理
=
⨆
n ≥ 0
ev ⁡
(
f n
,
d n
)
根据 ev 的定义
每个
cur ⁡ ( f ) ⁡ ( d ′ ) 以及然后
cur ⁡ ( f ) 的连续性可以由
D 1 × D 2 中的链的最小上界可以逐分量计算这一事实立即推出.
◻
复合的连续性
对于cpo
D , E , F , 复合函数
∘ :
(
(
E → F
)
×
(
D → E
)
)
→
(
D → F
)
是连续的, 其定义为对于
f ∈ ( D → E ) 和
g ∈ ( E → F ) ,
g ∘ f
=
λ
d ∈ D
.
g ⁡
(
f ⁡
( d )
)
.
幻灯片37
不动点算子的连续性
令
D 是一个domain.
根据Tarski不动点定理, 我们知道每个连续函数
f ∈ ( D → D ) 都拥有一个最小不动点
fix ⁡ ( f ) ∈ D .
命题. 函数
fix :
(
D → D
)
→ D
是连续的.
幻灯片38
证明. 我们必须首先证明
fix : ( D → D ) → D 是一个单调函数. 设
f 1 ⊑ f 2 是函数domain中的两个元素. 我们需要证明的是
fix ⁡ ( f 1 ) ⊑ fix ⁡ ( f 2 ) , 不过
f 1
⁡
(
fix ⁡
(
f 2
)
)
⊑
f 2
⁡
(
fix ⁡
(
f 2
)
)
鉴于
f 1
⊑
f 2
⊑
fix ⁡
(
f 2
)
根据
fix ⁡
(
f 2
)
的(lpf1)
于是,
fix ⁡ ( f 2 ) 是
f 1 的一个前不动点, 因而根据
fix ⁡ ( f 1 ) 的(lpf2)我们有
fix ⁡ ( f 1 ) ⊑ fix ⁡ ( f 2 ) , 这也正是我们想要的. [译注: 作者这里将lpf均误作lfp, 而lfp在书中并没有出现过, 证明的剩余部分也都写错了. 另外, 读者应该回忆一下, 根据之前的命题, 此时最小前不动点和最小不动点均存在且相等.]
现在我们将注意力转向证明链的最小上界的保持, 设
D → D 中有
f 0 ⊑ f 1 ⊑ f 2 ⊑ … . 根据第2章第3节的评注7, 我们只需要证明
fix ⁡
(
⨆
n ≥ 0
f n
)
⊑
⨆
n ≥ 0
fix ⁡
(
f n
)
而根据最小前不动点的(lpf2), 证明
⨆ n ≥ 0 fix ⁡ ( f n ) 是
⨆ n ≥ 0 f n 的一个前不动点就足够了. [译注: 即最小前不动点小于其他的前不动点.] 这是因为:
(
⨆
m ≥ 0
f m
)
⁡
(
⨆
n ≥ 0
fix ⁡
(
f n
)
)
=
⨆
m ≥ 0
f m
⁡
(
⨆
n ≥ 0
fix ⁡
(
f n
)
)
函数链的最小上界可以逐参数计算
=
⨆
m ≥ 0
⨆
n ≥ 0
f m
⁡
(
fix ⁡
(
f n
)
)
鉴于每个
f m
都是连续的
=
⨆
k ≥ 0
f k
⁡
(
fix ⁡
(
f k
)
)
根据幻灯片27的引理
⊑
⨆
k ≥ 0
fix ⁡
(
f k
)
根据每个
f k
的(lpf1)
[译注: 这里根据幻灯片27的引理需要用到之前证明的单调性, 另外最后一步这里的
⊑ 实际上更确切地说是
= , 因为
fix 是不动点算子, 不过这个证明的所有地方作者都把最小不动点当作最小前不动点使用.]
◻
第3.4节 练习
练习1. 验证本章未经证明的构造, 证明本章未经证明的命题.
练习2. 令
X 和
Y 是集合而
X ⊥ 和
Y ⊥ 是对应的扁平domain, 如幻灯片31. 证明一个函数
f : X ⊥ → Y ⊥ 是连续的当且仅当以下条件之一成立:
f 是严格的, 即f ⁡ ( ⊥ ) = ⊥ ;
f 是常函数, 即∀ x ∈ X . f ⁡ ( x ) = f ⁡ ( ⊥ ) .
练习3. 令{ ⊤ } 是一个单元素集合, 而{ ⊤ } ⊥ 是相对应的扁平domain. 令Ω 是图1所描绘的垂直自然数 的domain. 证明函数domain ( Ω → { ⊤ } ⊥ ) 和Ω 之间存在一个双射.
练习4. 证明幻灯片37的内容.
第4章 Scott归纳
第4.1节 链封闭子集和可容许子集
在第2章的时候我们看到一个domain D 上的一个连续函数f : D → D 的最小不动点可以表达为自D 的最小元素⊥ 起反复应用f 所得到的链的最小上界: fix ⁡ ( f ) = ⨆ n ≥ 0 f n ⁡ ( ⊥ ) . 这种构造允许我们使用特定方式证明fix ⁡ ( f ) 的性质, 只要 这个性质满足幻灯片39中的条件, 证明方式为使用数学归纳法表明对于每个n 而言f n ⁡ ( ⊥ ) 具有该性质. 或许将这种对于数学归纳法的使用方式打包以隐藏fix ⁡ ( f ) 作为某个链的不动点的显式构造也是方便的, 见幻灯片40. 为了澄清幻灯片40的陈述, 注意到f 0 ⁡ ( ⊥ ) = ⊥ ∈ S , 此为基本步骤 ; 而f n ⁡ ( ⊥ ) ∈ S 可以推出f n + 1 ⁡ ( ⊥ ) = f ⁡ ( f n ⁡ ( ⊥ ) ) ∈ S , 此为归纳步骤 ; 因此, 根据n 上的归纳, 我们有∀ n ≥ 0 . f n ⁡ ( ⊥ ) ∈ S . 最后, 根据S 的链封闭性, fix ⁡ ( f ) = ⨆ n ≥ 0 f n ⁡ ( ⊥ ) ∈ S , 这正是我们所要的.
链封闭子集和可容许子集
令
D 是一个cpo. 一个子集
S ⊆ D 被称为是
链封闭的 当且仅当对于
D 中所有的链
d 0 ⊑ d 1 ⊑ d 2 ⊑ … , 有
(
∀
n ≥ 0
.
d n
∈ S
)
⇒
(
⨆
n ≥ 0
d n
)
∈ S
如果
D 是一个domain,
S ⊆ D 被称为是
可容许的 当且仅当其是
D 的一个链封闭子集且
⊥ ∈ S .
元素
d ∈ D 的一个性质
Φ ⁡ ( d ) 被称为是
链封闭的 当且仅当
{ d ∈ D | Φ ⁡ ( d ) } 是
D 的一个链封闭子集, 类似地还可以定义可容许性质.
幻灯片39
例子1. 考虑图1所描绘的
垂直自然数 的domain
Ω , 那么
Ω 的任意有限 子集都是链封闭的;
{ 0 , 2 , 4 , 6 , … } 不是Ω 的一个链封闭子集;
{ 0 , 2 , 4 , 6 , … } ∪ { ω } 是Ω 的一个链封闭子集, 当然其也是一个可容许子集.
Scott的不动点归纳原理
令
f : D → D 是domain
D 上的一个连续函数.
对于任意的可容许子集
S ⊆ D , 为了证明
f 的最小不动点在
S 之中, 即
fix ⁡
( f )
∈ S
实际上证明
∀
d ∈ D
.
d ∈ S
⇒
f ⁡
( d )
∈ S
就足够了.
幻灯片40
在实际情况下应用Scott的不动点归纳原理的难点在于识别出一个适切的可容许子集S , 即寻找一个具有合适强度的归纳假设 .
第4.2节 例子
例子1. 设D 是一个domain而f : ( D × ( D × D ) ) → D 是一个连续函数. 令g : ( D × D ) → ( D × D ) 是由
g ⁡
(
d 1
,
d 2
)
= def
(
f ⁡
(
d 1
,
(
d 1
,
d 2
)
)
,
f ⁡
(
d 1
,
(
d 2
,
d 2
)
)
)
, 其中
d 1
,
d 2
∈ D
定义的连续函数. 那么, u 1 = u 2 , 其中( u 1 , u 2 ) = def fix ⁡ ( g ) . (注意到之所以g 是连续的, 是因为我们可以将其表达为复合, 投影和配对, 因而可以应用第3章第2节的命题1和幻灯片37: g = 〈 f ∘ 〈 π 1 , 〈 π 1 , π 2 〉 〉 , f ∘ 〈 π 1 , 〈 π 2 , π 2 〉 〉 〉 .)
证明. 我们想要证明的是
fix ⁡ ( g ) ∈ Δ , 其中
Δ
= def
{
(
d 1
,
d 2
)
∈
D × D
|
d 1
=
d 2
}
.
不难看出
Δ 是积domain
D × D 的一个可容许子集. 因此, 根据Scott不动点归纳原理, 我们只需要检验
∀
(
d 1
,
d 2
)
∈
D × D
.
(
d 1
,
d 2
)
∈ Δ
⇒
g ⁡
(
d 1
,
d 2
)
∈ Δ
其等价于
∀
(
d 1
,
d 2
)
∈
D × D
.
d 1
=
d 2
⇒
f ⁡
(
d 1
,
d 1
,
d 2
)
=
f ⁡
(
d 1
,
d 2
,
d 2
)
这显然为真.
◻
接下来的例子表明Scott归纳原理对于证明关于程序的(指称版本的)部分正确性(partial correctness) 断言来说很有用, 即具有形式如果程序终止, 那么对于结果来说这个那个的性质成立 的断言. 与之形成对比的是, 完全 正确性断言指的是程序的确会终止且对于结果来说这个那个的性质成立 . 鉴于Scott归纳只能应用于这样的性质Φ , 其满足Φ ⁡ ( ⊥ ) 成立, 所以说它对于证明完全正确性不是很有用.
例子2. 令f : D → D 是幻灯片12上定义的连续函数, 其最小不动点是命令
while
X > 0
do
(
Y ≔
X ⁎ Y
;
X ≔
X − 1
)
的指称. 我们将会使用Scott归纳证明
∀
x , y
≥ 0
.
fix ⁡
( f )
⁡
[
X ↦ x
,
Y ↦ y
]
↓
⇒
fix ⁡
( f )
⁡
[
X ↦ x
,
Y ↦ y
]
=
[
X ↦ 0
,
Y ↦
(
! x
)
⁎ y
]
其中
第4.3节 构建链封闭子集
Scott归纳的威力依赖于我们有许多链封闭子集储备能用. 幸运的是, 我们可以根据构造方式来保证许多子集是链封闭的.
第4.3.1小节 基本关系
令D 是一个cpo. D × D 的子集
{
(
x , y
)
∈
D × D
|
x ⊑ y
}
和
{
(
x , y
)
∈
D × D
|
x = y
}
都是链封闭的 (为什么?). 换言之, D × D 上的性质 (或者说谓词) x ⊑ y 和x = y 都确定了链封闭集合.
例子I: 最小前不动点性质
令
D 是一个domain而
f : D → D 是一个连续函数, 那么
∀
d ∈ D
.
f ⁡
( d )
⊑ d
⟹
fix ⁡
( f )
⊑ d
.
以下是使用Scott归纳的证明.
证明. 令
d ∈ D 是
f 的一个前不动点, 那么
x ∈
↓ ⁡
( d )
⟹
x ⊑ d
⟹
f ⁡
( x )
⊑
f ⁡
( d )
⟹
f ⁡
( x )
⊑ d
⟹
f ⁡
( x )
∈
↓ ⁡
( d )
因此, 我们有
fix ⁡
( f )
∈
↓ ⁡
( d )
.
◻
幻灯片41
第4.3.2小节 逆像和替换
令f : D → E 是cpo D 和E 之间的一个连续函数. 设S 是E 的一个链封闭子集, 那么逆像
f
− 1
⁡
( S )
=
{
x ∈ D
|
f ⁡
( x )
∈ S
}
是D 的一个链封闭子集 (为什么?).
设子集S 由E 上的性质P 所定义, 即
S =
{
y ∈ E
|
P ⁡
( y )
}
那么
f
− 1
⁡
( S )
=
{
x ∈ D
|
P ⁡
(
f ⁡
( x )
)
}
也就是说, 若E 上的性质P ⁡ ( y ) 确定了E 的一个链封闭子集, 而f : D → E 是一个连续函数, 那么D 上的性质P ⁡ ( f ⁡ ( x ) ) 确定了D 的一个链封闭子集.
例子II
令
D 是一个domain而
f , g : D → D 是连续函数并且满足
f ∘ g ⊑ g ∘ f , 那么
f ⁡
( ⊥ )
⊑
g ⁡
( ⊥ )
⟹
fix ⁡
( f )
⊑
fix ⁡
( g )
.
以下是使用Scott归纳的证明.
证明. 考虑
D 的可容许性质
Φ ⁡
( x )
≡
(
f ⁡
( x )
⊑
g ⁡
( x )
)
鉴于
f ⁡
( x )
⊑
g ⁡
( x )
⇒
g ⁡
(
f ⁡
( x )
)
⊑
g ⁡
(
g ⁡
( x )
)
⇒
f ⁡
(
g ⁡
( x )
)
⊑
g ⁡
(
g ⁡
( x )
)
我们有
f ⁡
(
fix ⁡
( g )
)
⊑
g ⁡
(
fix ⁡
( g )
)
.
◻
幻灯片42
第4.3.3小节 逻辑运算
令D 是一个cpo. 令S ⊆ D 和T ⊆ D 是D 的链封闭子集. 那么, 我们有
S ∪ T
和
S ∩ T
都是链封闭子集 (为什么?). 若是基于性质的语言, 若P ⁡ ( x ) 和Q ⁡ ( x ) 都确定了D 的链封闭子集, 那么
P ⁡
( x )
或者
Q ⁡
( x )
,
P ⁡
( x )
&
Q ⁡
( x )
也是如此.
如果S i , i ∈ I 是由集合I 索引的D 的一个链封闭子集的族, 那么⋂ i ∈ I S i 是D 的一个链封闭子集 (为什么?).
因此, 如果一个性质P ⁡ ( x , y ) 确定了D × E 的一个链封闭子集, 那么性质∀ x ∈ D . P ⁡ ( x , y ) 确定了E 的一个链封闭子集. 这是因为
{
y ∈ E
|
∀
x ∈ D
.
P ⁡
(
x , y
)
}
=
⋂
d ∈ D
{
y ∈ E
|
P ⁡
(
d , y
)
}
=
⋂
d ∈ D
f d
− 1
⁡
{
(
x , y
)
∈
D × E
|
P ⁡
(
x , y
)
}
其中f d : E → D × E 是连续函数, 定义为对于每个d ∈ D , f d ⁡ ( y ) = ( d , y ) .
实际上, 若称形式为f ⁡ ( x 1 , ⋯ , x k ) ⊑ g ⁡ ( x 1 , ⋯ , x l ) 或f ⁡ ( x 1 , ⋯ , x k ) = g ⁡ ( x 1 , ⋯ , x l ) 的性质为基本性质 (其中f 和g 为连续函数), 那么对于由基本性质的合取与析取构成的东西进行其中一些变量的全称量化, 那么就会确定非量化的变量所对应的积cpo的一个链封闭子集.
不过, 注意到链封闭子集的无限并不必然是链封闭的; 有限子集总是链完备的, 但是其任意的并不是. 因此, 一般情况下我们不能使用存在量化构造链封闭子集.
第4.4节 练习
练习1.
第5章 PCF
语言PCF (Programming Computable Functions, 编程可计算函数) 是一个简单的函数式编程语言, 其经常用作指称语义和操作语义的理论建立中的示例语言, 也包括这两种语义之间的关系的理论. 其句法是由Dana Scott于大约1969年引入的, 作为Logic of Computable Functions (可计算函数逻辑) 的一部分, 其也在具有高度影响力的论文Plotkin (1977) 里作为一种编程语言被研究.
本章将给出我们在这个讲义里所使用的PCF的某个特定版本的句法和操作语义. 而在第6章中我们将看到如何使用domain和连续函数来赋予它一个指称语义.
第5.1节 项和类型
PCF语言的类型 , 表达式 , 项 在幻灯片43中定义.
PCF句法
类型
τ ⩴
nat | bool |
τ → τ
表达式
M
⩴
0 |
succ ⁡
( M )
|
pred ⁡
( M )
|
true | false |
zero ⁡
( M )
|
x |
if M then M else M
|
fn
x : τ
. M
|
M ⁡ M
|
fix ⁡
( M )
其中
x ∈ 𝕍 , 一个
变量 无限集合.
技术细节: 我们在绑定变量的
α 变换的意义下将表达式视为等同的, 而绑定变量是由
fn 表达式构造子创建的: 根据定义一个PCF
项 是一个表达式的
α 等价类.
幻灯片43
各种句法形式的意义如下.
第6章 PCF的指称语义
第7章 将指称语义和操作语义联系起来
第8章 完全抽象