Lambda演算(一)
写于软工一学完Lambda演算的一个星期多后,感觉对这个东西依然晕晕的,查了一些资料之后借此随笔来梳理一下,加深理解。
Lambda 演算
Definition
1. \(\lambda\) 项
\(\lambda\) 项是 \(\lambda\) 演算中最基本的概念,可以递归地定义:
- 变量
假设我么有一个无穷字符串集合,其元素称为变量。例如:x 是一个变量。变量可以是一个字母或者一个字符串,表示一个参数(形参)或者一个值(实参)。
- 原子
每一个变量都是一个 \(\lambda\) 项。
- 抽象
若 M 是一个 \(\lambda\) 项,那么,\(\lambda\) x.M是一个 \(\lambda\) 项。简单来说可以看作生成了一个匿名的函数,有形参 x。
- 应用
若 M,N都是 \(\lambda\) 项,则 (MN) 也是一个 \(\lambda\) 项。简单来说可以看作把实参 N 代入函数 M。
注意:函数的输入也可以是函数。
2. 符号约定
我们按一下符号约定使用符号:
- 用大写字母如 M, N 表示任意 \(\lambda\) 项,用小写字母和希腊字母如 \(x,y,\phi\) 表示变量。
- 对于括号,有以下省略约定:
- \(\lambda\) 项最外层的括号可以直接省略。如 (\(\lambda x.x\)) 可以省略为\(\lambda x.x\).
- 左结合的应用型 \(\lambda\) 项,括号可以省略。如 (((MN)P)Q) 可以省略为 MNPQ.
- 抽象型的 \(\lambda\) 项 \(\lambda \phi.(xy)\) 可以省略为 \(\lambda \phi.xy\) 即默认情况下 \(\phi\) 的管辖范围尽量长。
3. 自由变量与绑定变量
不受约束的变量是自由变量,如 \(\lambda x.xyz\) 中 x 是约束变量,y,z 是自由变量,这和数理逻辑里的概念是一样的。如果一个项没有自由变量,则它是一个组合子。
4. 柯里化
某些时候我们需要表达多元的函数,比如 \(f(x,y) \equiv xy\),但是 \(\lambda\) 函数只能接受一个参数,注意到 \(\lambda\) 函数的输入也可以是函数,因此这时我们可以使用柯里化,分层地定义,如\(\lambda x y.xy \equiv \lambda x.(\lambda y.yx)\),在内层函数中 x 可视作常量。
演算公理系统
1. \(\alpha\) 变换
类似数理逻辑里面的改名规则,\(\lambda x.(\lambda y.xy) \equiv \lambda a.(\lambda b.ab)\)
2. \(\beta\) 规约
其实就是用实参替换函数里的形参。如:\((\lambda x.(2x)) y \equiv 2y\),以及\((\lambda x.\lambda y.x-y)7\quad2 \equiv (\lambda y.7-y)2 \equiv (\lambda x.x -2)7 \equiv 5\)
Practice

阶段总结
到此,我们基本建立了 \(\lambda\) 演算的大厦,它包括三条定义:原子,抽象,应用,和两条规则,\(\alpha\) 变换和\(\beta\) 规约,以及约定了一些符号使用。

浙公网安备 33010602011771号