[来自 Lambda Calculus]
`M N` 表示将函数 `M` 作用于参数 `N`. 多个 λ 表达式连写的时候, 按从左到右的次序进行运算: 如 `P Q R = (P Q) R`.
`lambda x.M` 表示一个函数 `f`, 且 `f x` 的结果是 `M`.
Free variable | Bound variable |
---|---|
`bb(FV)(x) = {x}` | `bb(BV)(x) = O/` |
`bb(FV)(MN) = bb(FV)(M) uu bb(FV)(N)` | `bb(BV)(MN) = bb(BV)(M) uu bb(BV)(N)` |
`bb(FV)(lambda x.M) = bb(FV)(M) - {x}` | `bb(BV)(lambda x.M) = bb(BV)(M) uu {x}` |
约束变量的替换, α 代换 (α-convertion) 是指将 `M` 中所有形如 `lambda x.A` 的子表达式替换为 `lambda y.(A|_(x=y))`. 可以类比微积分中的换元 `int f(x) dx = int f(y) dy`.
函数的应用, β 代换 (β-convertion) 是指在保持 `N` 中自由变量的前提下, 将表达式 `(lambda x.M)N` 变为 `M|_(x=N)`. 记作 `(lambda x.M)N |>_beta M|_(x=N)`. 记号 `|>_beta` 表示左边的表达式经过有限次 (含 0 次) β 代换可以得到右边的表达式. 在上下文明确时, 下标 `beta` 可以省略.
β 代换可以进行的前提是, `N` 中原有的自由变量在代换后仍保持自由. 如, 表达式 `lambda x.lambda y.(x y)` 不能直接作用于参数 `2y`, 因为将 `x` 替换为 `2y` 会使得 `y` 成为约束变量. 但是, 我们可以先进行 α 代换, 将 `y` 换为 `z`, 再进行 β 代换: `lambda x.lambda y.(x y)(2y)` `|>_alpha lambda x.lambda z.(x z)(2y)` `|>_beta lambda z.(2y z)`.
若一个表达式无法进行任何 β 代换, 则说它是一个 β 标准形. 事实上, 如果 `M, M'` 是同一个表达式的两个 β 标准形, 则 `M` 可以通过 α 代换变为 `M'`.
名称 | 表达式 | 说明 |
---|---|---|
`bb I` | `lambda x.x` | 恒等函数 |
`bb K` | `lambda x.lambda y.x` | `bb K M` 是一个常数函数: 对任意 `x` 有 `bb K M x |>_beta M` |
`bb S` | `lambda x.lambda y.lambda z.(x z)(y z)` | Schöfinkel 证明了所有函数都可以只用 `bb K` 和 `bb S` 表达 |
`bb Omega` | `(lambda x.(x x))(lambda x.(x x))` | `bb Omega |>_beta bb Omega` |
η 代换