Credit
- 授课教师: 梁红瑾
- 上课时间:2025秋
- 主要是分成
lambda calculus和semantics两部分
Lambda Calculus
之前就听说过不少,SICP课上还被Church Numeral折磨过
定义
(Terms)M,N ::= x ∣λx.M ∣ M N
规则
- λ延伸到括号的最右方 λx. M N意思是λx. (M N)
- 函数应用是左结合 M N P意思是(M N) P
自由和约束变量
- λx.(x+y)相等于λz.(z+y), x是绑定变量(bound variables)
- 但自由变量的名字很重要
- fv(M)是M中自由变量的集合
- fv(x)=defx
- fv(λx.M)=deffv(M)−x
- fv(M N)=deffv(M)∪fv(N)
- α等价: λx.M=λy.M[y/x] y是新变量
化简规则
- β化简: (λx.M)N→M[N/x]
- 替换规则
- x[N/x]=defN
- y[N/x]=defy
- (MP)[N/x]=def(M[N/x])(P[N/x])
- (λx.M)[N/x]=defλx.M
- (λy.M)[N/x]=defλy.(M[N/x]),if y∈/fv(N)
- (λy.M)[N/x]=defλz.(M[z/y][N/x]),if y∈fv(N) and z fresh
合流性
Terms可以以任何顺序化简,如果有最终结果的话,其唯一确定。
- β−redex 类似(λx.M)N形式的term
- β−normal form 不含β−redex的term
- 合流性理论:
- 对于所有的M,M1,M2,如果M→∗M1且M→∗M2,那么存在M′使得M1→∗M′且M2→∗M′
- Normal−order reduction:最外层的最左边的redex(有点像lazy evaluation)
- (λu.λv.v)((λx.x x)(λx.x x))→λv.v
- Applicative−order reduction:最内层的最左边的redex(有点像eager evaluation)
- (λu.λv.v)((λx.x x)(λx.x x))→(λu.λv.v)((λx.x x)(λx.x x))...
求值和化简
- 化简可以在lambda函数体内化简,但是求值不在lambda函数体内化简
- 下图中evaluation会停在第三个后


- 范式(canonical form)意思是不能再求值的form, 但可能范式内部(lambda内部)可以继续化简
对于常用值的编码
- True=defλx.λy.x
- False=defλx.λy.y
- True是取第一个, False是取第二个,因此在此上面进行的运算也是根据这个性质进行的
- 0=defλf.λx.x
- n=defλf.λx.fn x
- n是运算n次
不动子
- F=λf.λn.if (n=0) then 1 else n⋅f(n−1). 则fact=F fact
- 图灵不动子
- A = λx.λy.y(x x y), Θ=AA
- Curry不动子
- Y=λf.(λx.f(x x))(λx.f(x x))
Simply-Typed Lambda Calculus
定义
- (Types)τ,σ::=T∣σ→τ
- Γ⊢M:τ. Γ中有所有的自由变量定义
Soundness
- 对于任何M,M′,τ如果⋅⊢M:τ且M→∗M′那么⋅⊢M′:τ并且要么M′∈Values或者∃M′′.M′→M′′
- Preservation: M,M' and τ, 如果⋅⊢M:τ且M→M′那么⋅⊢M′:τ
- Progress:如果⋅⊢M:τ那么要么M∈Values或者∃M′.M→M′
Not Complete
- 这个类型系统可能会拒绝不会出错的程序
- 有完善类型的term永远会终止
Curry-Howard同构
- 如果把基础类型看成命题,函数类型看成蕴含,乘积类型看成and,那么构造性命题逻辑和类型系统同构!
- 测试类型是否非空:(对应的term是否closed)
- 排中律:在命题逻辑中,一个命题要么真要么假,因此命题p∨(p→q)永远为真。
- 但是STLC不支持这一点,它要求必须确定或两边到底哪个为真。因此如果需要用到它,则必须把它作为一个明显的假设
操作语义
我们希望探寻语句究竟怎么算
定义
- (States)σ∈Var→Values
- (IntExp)e::=n∣x∣e+e∣e−e∣...
- (Comm)c::=skip∣x:=e∣c;c∣if b then c else c∣while b do c
- 注意while的小步语义不要丢失b
小步语义的性质
- 对于所有c,σ,c′,σ′,c′′,σ′′, 如果(c,σ)→(c′,σ′)并且(c,σ)→(c′′,σ′′), 那么(c′,σ′)=(c′′,σ′′) 确定性
- 对于所有c,σ,c′,σ′,c′′,σ′′, 如果(c,σ)→∗(c′,σ′)并且(c,σ)→∗(c′′,σ′′), 那么存在c′′′,σ′′′使得(c′,σ′)→∗(c′′′,σ′′′)and(c′′,σ′′)→∗(c′′′,σ′′′) 合流性
- (e,σ)和(b,σ)是normalizing的(最终会到达一个normal form),但(c,σ)不一定
拓展
- 直接对表达式求值

- 我们不希望把局部变量暴露给σ因此对于局部变量定义

- 仍然包裹局部变量定义,但执行一步
- 添加堆
- Contextual Semantics
- 我们考虑用
[]指代下一步要算的redex即原子操作,
- E::=[]∣E+e∣E−e∣n+E∣n−E
- x:=1+[ ] NOT while false do x:=1+[ ] (不该出现)

大步语义
- 直接得知最后的结果
- (c,σ)⇓σ′;(e,σ)⇓n
- For all e,σ,n,n′, 如果(e,σ)⇓n且(e,σ)⇓n′那么n=n′ 确定性
- 对于所有e,σ存在n使得(e,σ)⇓n 整体性Totality
- (e,σ)⌊n⌋ iff. (e,σ)→∗(n,σ)和小步语义等价
霍尔逻辑
定义
- 偏正确性定义: {p}c{q}
- 全正确性定义: [p]c[q] (偏正确性+一定终止)
核心规则
- AS: {p[e/x]}x:=e{p}
- 增强前条件、减弱后条件
- 循环不变式:
- {i∧b}c{i}
- 有时候需要增强
loop invarient来证明循环后的内容
- 循环变量:
- [i∧b∧(e=x0)]c[i∧(e<x0)] i∧b⇒e≥0
- 递减且有界
- 在应用顺序规则的时候,需要先标注出二者之间的条件(assertation)
Soundness and completeness
- 注意∣−和∣=的区别,∣−是在某个公理系统中可以推导出来的,∣=代表在某个配置下是真的
- Soundness: 如果∣−p那么∣=p
- Completeness: 如果∣=p那么∣−p
- 我们可以证明Soundness: 如果∣−{p}c{q}那么∣={p}c{q}
- 但是霍尔逻辑并不complete:

- 如果complete的话,那么任意语义为真的命题都能被证明(与哥德尔不完备定理冲突)
- ∣={true}c{false} 当且仅当c不停止才成立,然而c是否停止是不可判定的
- 因此提出
Relative Completeness相对完备,如果我们把所有语义为真的命题作为已知条件,那么completeness成立