λ 演算
通用
函数
函数即值, 函数仅单参数
函数定义
抽像 abstration: \((\lambda x.M)\)
函数调用
作用 application: \((f \space a)\)
函数归约
归约 reduction
\[\begin{array}{lcl}
((\lambda x.x)\space a) & \rightarrow & a \\
((\lambda x.x)\space (\lambda y.y)) & \rightarrow &(\lambda y.y) \\
((\lambda y.(\lambda x.y))\space a) & \rightarrow & (\lambda x.a) \\
\end{array}
\]
概念
变量
关系 \(V\) 将 \(\lambda\) 项映射为其变量集合
\[\begin{array}{lll}
V(x) &= &\{x\} \\
V(\lambda x.M) &= &\{x\} \cup V(M) \\
V(M N) &= &V(M) \cup V(N)
\end{array}
\]
自由变量
关系 \(FV\) 将 \(\lambda\) 项映射为其自由变量集合
\[\begin{array}{lll}
FV(x) &= &\{x\} \\
FV(\lambda x.M) &= &FV(M) \setminus \{x\} \\
FV(M N) &= &FV(M) \cup FV(N)
\end{array}
\]
子项
关系 \(ST\) 将 \(\lambda\) 项映射为其子项集合
\[\begin{array}{lll}
ST(x) &= &\{x\} \\
ST(\lambda x.M) &= &\{\lambda x.M\} \cup ST(M) \\
ST(M N) &= &\{M N\}\cup ST(M) \cup ST(N)
\end{array}
\]
受限
\(\lambda x.M\)
\(\lambda x\) 为绑定子 binder, 子项 \(M\) 为该绑定子的范围 scope, 变量 \(x\) 出现在 \(M\) 中, 则称受限的 bound, 否则自由的 free
项 \(\lambda x.(\lambda y.\lambda x.xy)xy\)
变量 \(x\) 第一次出现受限于内层绑定子 \(\lambda x\), 第二次出现受限于外层绑定子 \(\lambda x\)
变量 \(y\) 第一次出现受限于内层绑定子 \(\lambda y\), 第二次出现是自由的
约定
为了少写括号而不引起歧义, 约定:
-
忽略最外层括号, \((\lambda x.M)\) 写为 \(\lambda x.M\)
-
作用 application 左结合, \(MNOP\) 表示 \(((MN)O)P\)
-
作用比抽像优先级高, \(\lambda x.MN\) 表示 \(\lambda x.(MN)\) 而不是 \((\lambda x.M)N\)
-
连续 \(\lambda\) 合并, \(\lambda xyz.M\) 表示 \((\lambda x.(\lambda y.(\lambda z.M)))\)
\(((\lambda x.((\lambda z.z)\ x))\ (\lambda x.x))\) 写为 \((\lambda x.(\lambda z.z)\ x)\ \lambda x.x\)
研究对象
λ 项(λ-term)
巴克斯-诺尔范式(Backus-Naur Form, BNF) 表示 \(\lambda\)-项/表达式
\[M,\, N, \, L = x \mid (\lambda x.M) \mid (M\ N) \qquad x \in M =\aleph_0
\]
变量 \(x\)
抽像 abstration \((\lambda x.M)\)
作用 application \((M\ N)\)
- 变量 \(x\) 表示任意一个 \(\lambda\) 项
- 项 \(M\) 表示确定的一个 \(\lambda\) 项
归约关系
等价替换
关系 \(\_[\_\leftarrow\_]\) 将源表达式, 变量, 参数表达式映射为目标表达式, 变量的自由实例被替换为参数表达式, 记为 \(M[x\leftarrow N]\)
- 替换 \(M\) 中自由变量
- \(N\) 中自由变量不能被 \(M\) 中绑定子捕获(capture)
\[\begin{array}{lcl}
x[x \leftarrow M] & = & M \\
y[x \leftarrow M] & = & y \\
& &\text{where } x \neq y \\
(\lambda x.M)[x \leftarrow N] & = & (\lambda x.M) \\
(\lambda x.M)[y \leftarrow N] & = & (\lambda z.M[x \leftarrow z][y \leftarrow N]) \\ & & \text{where } x \neq y, z \notin
FV(N) \\
&&\text{and } z \notin FV(M) \setminus \{x\} \\
(M N)[x \leftarrow P] & = & (M[x \leftarrow P] N[x \leftarrow P]) \\
\end{array}
\]
\[\begin{array}{lcl}
(\lambda y.(x y))[x \leftarrow (\lambda y.y)] & = & (\lambda z.((\lambda y.y) z)) \text{ or } (\lambda y.((\lambda y.y) y)) \\
(\lambda y.(x y))[x \leftarrow (\lambda x.y)] & = & (\lambda z.((\lambda x.y) z)) \\
\end{array}
\]
归约关系 \(\alpha \ \beta \ \eta\)
\[\begin{array}{lcll}
(\lambda x.M) & \alpha & (\lambda y.M[x \leftarrow y]) & \text{where } y \notin FV(M) \\
((\lambda x.M) N) & \beta & M[x \leftarrow N] \\
(\lambda x.(M x)) & \eta & M & \text{where } x \notin FV(M) \\
\end{array}
\]
\(\alpha\) 关系重命名形参, 换参数名
\(\beta\) 关系化简归约, 函数调用
\(\eta\) 关系脱去外壳, 函数等价
归约关系 \(\mathbf n\)
归约关系 \(\mathbf{n}\) 是 \(\alpha\) \(\beta\) \(\eta\) 的并
\[\mathbf n = \alpha \cup \beta \cup \eta
\]
\(\rightarrow_{\mathbf n}\) 是 \(\mathbf n\) 的相容闭包
若 \(M \rightarrow_{\mathbf n} N\), 则对任意表达式上下文 \(C[\cdot]\), 有 \(C[M]\rightarrow_{\mathbf n} C[N]\)
例: 若 \((\lambda x.x)y \rightarrow_\beta y\), 则对上下文 \(C[\cdot]=(\cdot)z\), 有 \(((\lambda x.x)y)z \rightarrow_\beta (y)z\)
\(\twoheadrightarrow_{\mathbf n}\) 是 \(\rightarrow_{\mathbf n}\) 的自反传递闭包
自反性: 零步 \(\rightarrow_{\mathbf n}\)
传递性: 多步 \(\rightarrow_{\mathbf n}\)
\(=_{\mathbf n}\) 是 \(\twoheadrightarrow_{\mathbf n}\) 的对称闭包
\(M =_{\mathbf n}N\): 若 \(M \twoheadrightarrow_{\mathbf n} N\), 则 \(N \twoheadrightarrow_{\mathbf n} M\)
相容闭包: 扩展关系, 使其在任意上下文成立
自反传递闭包: 扩展关系, 使其满足自反性和传递性
对称闭包: 扩展关系, 使其满足对称性
\(\rightarrow^\alpha_{\mathbf n}\) \(\rightarrow^\beta_{\mathbf n}\) \(\rightarrow^\eta_{\mathbf n}\) 是 \(\alpha \ \beta \ \eta\) 的相容闭包
\(\rightarrow_\mathbf{n} = \rightarrow_\mathbf{n}^\alpha \cup \rightarrow_\mathbf{n}^\beta \cup \rightarrow_\mathbf{n}^\eta\)
归约 \((\lambda x.((\lambda z.z) x)) (\lambda x.x)\)
\[\begin{aligned}
(\lambda x.(\lambda z.z) x)) \underline{(\lambda x.x)} \quad &\rightarrow_\mathbf{n}^\alpha \quad \underline{(\lambda x.((\lambda z.z) x))} (\lambda y.y) \\
\quad &\rightarrow_\mathbf{n}^\eta \quad \underline{(\lambda z.z) (\lambda y.y)} \\
\quad &\rightarrow_\mathbf{n}^\beta \quad \lambda y.y
\end{aligned}
\]
另一种归约
\[\begin{aligned}
((\lambda x.\underline{((\lambda z.z) x)}) (\lambda x.x)) \quad &\rightarrow_\mathbf{n}^\beta \quad \underline{((\lambda x.x) (\lambda x.x))} \\
\quad &\rightarrow_\mathbf{n}^\beta \quad (\lambda x.x)
\end{aligned}
\]
宏
布尔值
\[\begin{aligned}
\text{true} &\quad \dot= \quad \lambda xy.x \\
\text{false} &\quad \dot= \quad \lambda xy.y \\
\text{if} &\quad \dot= \quad \lambda vtf.vtf
\\
\text{if} &\quad \dot= \quad \lambda x.x
\end{aligned}
\]
\[\begin{array}{lcl}
\text {if true}\ M\ N &= &(\lambda vtf.vtf)\ (\lambda xy.x)\ M\ N \\
&\rightarrow^\beta_{\mathbf n} & (\lambda tf.(\lambda xy.x) t f)\ M\ N \\
&\rightarrow^\beta_{\mathbf n} & (\lambda xy.x) \ M \ N \\
&\rightarrow^\beta_{\mathbf n} & (\lambda y.M) N \\
&\rightarrow^\beta_{\mathbf n} & M
\end{array}
\]
\[\begin{array}{lcl}
\text{if}\ \text{false}\ M\ N & = & (\lambda vtf.vtf)\ (\lambda xy.y)\ M\ N \\
&\rightarrow^\beta_{\mathbf{n}} & (\lambda tf.(\lambda xy.y)tf)\ M\ N \\
&\rightarrow^\beta_{\mathbf{n}} & (\lambda xy.y)\ M\ N \\
&\rightarrow^\beta_{\mathbf{n}} & (\lambda y.y)\ N \\
&\rightarrow^\beta_{\mathbf{n}} & N
\end{array}
\]
\[\begin{array}{lcl}
\text {if true} &= &(\lambda vtf.vtf)\ (\lambda xy.x)\\
&\rightarrow^\beta_{\mathbf n} & (\lambda tf.(\lambda xy.x) t f) \\
&\rightarrow^\beta_{\mathbf n} & (\lambda tf.(\lambda y.t) f) \\
&\rightarrow^\beta_{\mathbf n} & (\lambda tf.t) \\
&\rightarrow^\alpha_{\mathbf n} & (\lambda xy.x) \\
\end{array}
\]
\[\begin{array}{lcl}
\text{if}\ \text{false} & = & (\lambda vtf.vtf)\ (\lambda xy.y)\\
&\rightarrow^\beta_{\mathbf{n}} & (\lambda tf.(\lambda xy.y)tf)\\
&\rightarrow^\beta_{\mathbf{n}} & (\lambda tf.(\lambda y.y)f)\\
&\rightarrow^\beta_{\mathbf{n}} & (\lambda tf.f)\\
&\rightarrow^\alpha_{\mathbf{n}} & (\lambda xy.y)\\
\end{array}
\]
\(\therefore\) \((\text{if true}) =_\mathbf n \text {true},\,\) \((\text{if false}) =_\mathbf n \text {false}\)
\[\begin{array}{ccl}
\text{and} &=& \lambda ab.aba \\
\text{or} &=& \lambda ab.aab \\
\text{not}_1 &=& \lambda pab. pba \\
\text{not}_2 &=& \lambda p. p\ (\lambda ab. b)\ (\lambda ab. a) = \lambda p. p\ \text{false}\ \text{true} \\
\text{xor} &=& \lambda ab. a\ (\text{not}\ b)\ b \\
\text{if} &=& \lambda pab. pab
\end{array}
\]
\(_1\) 求值策略为应用次序
\(_2\) 求值策略为正常次序
\[\begin{array}{ccl}
\text{and}\ \text{true}\ \text{false} &=& (\lambda pq. p\ q\ p)\ \text{true}\ \text{false} = \text{true}\ \text{false}\ \text{true} = (\lambda ab. a)\ \text{false}\ \text{true} = \text{false} \\
\text{or}\ \text{true}\ \text{false} &=& (\lambda pq. p\ p\ q)\ (\lambda a b. a)\ (\lambda ab. b) = (\lambda ab. a)\ (\lambda ab. a)\ (\lambda ab. b) = (\lambda ab. a) = \text{true} \\
\text{not}_1\ \text{true} &=& (\lambda pab. p\ b\ a)(\lambda ab. a) = \lambda a b. (\lambda ab. a)\ b\ a = \lambda ab. (\lambda c. b)\ a = \lambda ab. b = \text{false} \\
\text{not}_2\ \text{true} &=& (\lambda p. p\ (\lambda ab. b)(\lambda ab. a))(\lambda ab. a) = (\lambda ab. a)(\lambda ab. b)(\lambda ab. a) = (\lambda b. (\lambda ab. b))\ (\lambda ab. a) = \lambda ab. b = \text{false}
\end{array}
\]
自然数
每个数字都接收参数 \(f\) 和 \(x\), 数字 \(n\) 将 \(f\) 作用 \(n\) 次到 \(x\) 上
\[\begin{aligned}
0 &\quad \dot= \quad \lambda f.\lambda x.x \\
1 &\quad \dot= \quad \lambda f.\lambda x.f\ x \\
2 &\quad \dot= \quad \lambda f.\lambda x.f\ (f\ x) \\
&\quad \vdots \\
n &\quad \dot= \quad \lambda f.\lambda x.f^{\circ n}\ x
\end{aligned}
\]
后继
\[\text{succ}\quad \dot=\quad \lambda n.\lambda f.\lambda x.f\ (n\ f\ x)
\]
加法
\[\text{plus}\quad \dot=\quad \lambda m.\lambda n.\lambda f.\lambda x. m\ f\ (n \ f\ x)
\]
乘法
\[\text{mult} \quad \dot= \quad \lambda m.
\lambda n.\lambda f.\lambda x. m\ (n\ f)\ x
\]
幂
\[\text{exp} \quad \dot= \quad \lambda b.\lambda n. b \ n
\]
判零
\[\text{iszero} \quad \dot= \quad \lambda n.n\ (\lambda x.\text {false})\ \text {true}
\]
前驱
\[\text{pred} \quad \dot= \quad \lambda n. \lambda f. \lambda x. n\ (\lambda g. \lambda h. h\ (g\ f))\ (\lambda u. x)\ (\lambda u. u)
\]
容器类型
二元组
二元组 \(\langle M, N \rangle\)
需要定义函数 \(\text{pair},\ \text{fst},\ \text{snd}\) 满足:
\[\begin{array}{lcl}
\text{fst}\ (\text{pair}\ M\ N) & =_{\mathbf{n}} & M \\
\text{snd}\ (\text{pair}\ M\ N) & =_{\mathbf{n}} & N
\end{array}
\]
定义:
\[\begin{array}{ccl}
\langle M, N \rangle & \dot= & \lambda z. z\ M\ N \\
\text{mkpair} & \dot= & \lambda x. \lambda y. \lambda z. z\ x\ y \\
\text{fst} & \dot= & \lambda p. p\ \text{true} \\
\text{snd} & \dot= & \lambda p. p\ \text{false}
\end{array}
\]
证明:
\[\begin{array}{lcl}
\text{mkpair}\ M\ N = (\lambda xyz.z x y)\ M\ N = \lambda z.z\ M\ N = \langle M, N \rangle\\
\text{fst}\ \langle M, N \rangle = (\lambda p.p\ \text{true})\ \langle M, N \rangle = \langle M, N \rangle\ \text{true} = (\lambda z.z\ M\ N)\ \text{true} = \text{true} \ M \ N = (\lambda xy.x) \ M \ N = M\\
\text{snd}\ \langle M, N \rangle = (\lambda p.p\ \text{false})\ \langle M, N \rangle = \langle M, N \rangle\ \text{false} = (\lambda z.z\ M\ N)\ \text{false} = \text{false} \ M \ N = (\lambda xy.y) \ M \ N = N
\end{array}
\]
多元组
\(n\)-元组 \(\langle M_1, M_2, \cdots, M_n \rangle\)
投影函数 \(\pi_i^n\)
\[\langle M_1, M_2, \cdots, M_n \rangle\ \dot=\ \lambda z.zM_1\ M_2 \cdots M_n \\
\pi_i^n\ \dot=\ \lambda p.p(\lambda x_1 x_2 \cdots x_n.x_i)
\]
列表
\[\begin{array}{lcl}
\text{cons} & \dot= & \text{pair} \\
\text{head} & \dot= & \text{first} \\
\text{tail} & \dot= & \text{second} \\
\text{nil} & \dot= & \text{false} \\
\text{isnil} & \dot= & \lambda l. l (\lambda h. \lambda t. \lambda d. \text{false}) \ \text{true}
\end{array}
\]
递归
循环依赖
\(\lambda\) 演算中函数匿名, 不能通过名称自我作用
直接调用自身会导致循环依赖, 因为函数定义时尚未完全存在
引入不动点组合子间接实现递归
自作用递归
recursion via self-application 自己作用于自己从而递归
问题背景
目标: 通过加法递归定义乘法函数 \(\text{mult}(n, m)\)
问题: 定义 \(\text{mult}\) 时, 自身尚未存在, 不能调用 \(\text{mult}(n-1,m)\)
解法一: 假定乘法函数
定义乘法函数生成器: 乘法函数作为参数, 生成乘法函数
\[\text {mkmult}_0\ \dot=\ \lambda t.\lambda n.\lambda m.\text{if}\ (\text{iszero}\ n)\ 0\ (\text{add}\ m\ (t\ (\text{sub1}\ n)\ m))
\]
参数 \(t\) 假定为乘法函数
问题
乘法函数尚未定义, 因此 \(\text {mkmult}_0\) 无法实用
解法二: 自己作用自己
\[\text {mkmult}_1\ \dot=\ \lambda t.\lambda n.\lambda m.\text{if}\ (\text{iszero}\ n)\ 0\ (\text{add}\ m\ ((t\ t)\ (\text{sub1}\ n)\ m))
\]
参数 \(t\) 假定为 \(\text {mkmult}_1\) 自己
真正的 \(\text {mult}\) 函数
\[\text {mult}\ \dot=\ (\text {mkmult}_1 \ \text {mkmult}_1)
\]
证明:
\[\begin{array}{rl}
&\text{mult}\ 0\ m \\
&= &(\text{mkmult}_1\ \text{mkmult}_1)\ 0\ m \\
&\rightarrow_{\mathbf n} &(\lambda n.\lambda m.\ \text{if}\ (\text{iszero}\ n)\ 0\ (\text{add}\ m\ ((\text{mkmult}_1\ \text{mkmult}_1)\ (\text{sub1}\ n)\ m))\ 0\ m \\
&\twoheadrightarrow_{\mathbf n} \quad &\text{if}\ (\text{iszero}\ 0)\ 0\ (\text{add}\ m\ ((\text{mkmult}_1\ \text{mkmult}_1)\ (\text{sub1}\ 0)\ m)) \\
&\twoheadrightarrow_{\mathbf n}&\text{if}\ \text{true}\ 0\ (\text{add}\ m\ ((\text{mkmult}_1\ \text{mkmult}_1)\ (\text{sub1}\ 0)\ m)) \\
&\twoheadrightarrow_{\mathbf n} &0
\end{array}
\]
\[\begin{array}{rl}
&\text{mult}\ n\ m \\
&= &(\text{mkmult}_1\ \text{mkmult}_1)\ n\ m \\
&\rightarrow_{\mathbf n} &(\lambda n.\lambda m.\ \text{if}\ (\text{iszero}\ n)\ 0\ (\text{add}\ m\ ((\text{mkmult}_1\ \text{mkmult}_1)\ (\text{sub1}\ n)\ m))\ 0\ m \\
&\twoheadrightarrow_{\mathbf n} \quad &\text{if}\ (\text{iszero}\ n)\ 0\ (\text{add}\ m\ ((\text{mkmult}_1\ \text{mkmult}_1)\ (\text{sub1}\ n)\ m)) \\
&\twoheadrightarrow_{\mathbf n}&\text{if}\ \text{false}\ 0\ (\text{add}\ m\ ((\text{mkmult}_1\ \text{mkmult}_1)\ (\text{sub1}\ n)\ m)) \\
&\twoheadrightarrow_{\mathbf n} &(\text{add}\ m\ ((\text{mkmult}_1\ \text{mkmult}_1)\ (\text{sub1}\ n)\ m)) \\
&=_{\mathbf n}&(\text{add}\ m\ (\text{mult}\ (\text{sub1}\ n)\ m))
\end{array}
\]
所以 \(\text {mult}\ \dot=\ (\text {mkmult}_1 \ \text {mkmult}_1)\) 是乘法函数
\[\begin{array}{lll}
\text{mult}\ 0\ m &\twoheadrightarrow_{\text{n}} &0 \\
\text{mult}\ n\ m &\twoheadrightarrow_{\text{n}} &(\text{add}\ m\ (\text{mult}\ (\text{sub1}\ n)\ m)) \quad \text{if}\ n \neq 0
\end{array}
\]
非自作用递归
抽象出自作用递归中的 \(mk\) 函数, 其接收类似 \(\text {mkmult}_0\) 的生成器, 返回目标函数, 比如 \(\text {mk}\ \text {mkmult}_0\) 应是乘法函数
\[mk\ \overset{?}{\dot=}\ \lambda t.t\ (\text{mk}\ t)
\]
虽然上述定义是错的, 但可用来研究 \(\text{mk}\) 函数
- \(\text{mk}\) : 接收生成器, 返回目标函数 \(f\)
- \(t\) : 生成器, 接收目标函数 \(f\), 生成目标函数 \(f\)
- \(\text{mk}\ t\) : 目标函数 \(f\)
- \(t\ (\text{mk}\ t)\) : 目标函数 \(f\)
自作用递归实现 \(\text{mk}\) :
\[\begin{aligned}
\text{mkmk}\ &\dot=\ \lambda k.\lambda t.t\ (k\ k)\ t \\
\text{mk}\ &\dot=\ (\text{mkmk}\ \text{mkmk})
\end{aligned}
\]
\[\begin{aligned}
&(\text{mk}\ \text{mkmult}_0)\ 0\ m \\
&= \quad ((\text{mkmk}\ \text{mkmk})\ \text{mkmult}_0)\ 0\ m \\
&= \quad ((\lambda k.\lambda t.t\ ((k\ k)\ t))\ \text{mkmk})\ \text{mkmult}_0\ 0\ m \\
&\rightarrow_\mathbf n \quad (\lambda t.t\ ((\text{mkmk}\ \text{mkmk})\ t)\ \text{mkmult}_0\ 0\ m \\
&\rightarrow_\mathbf n \quad \text{mkmult}_0\ ((\text{mkmk}\ \text{mkmk})\ \text{mkmult}_0)\ 0\ m \\
&\rightarrow_\mathbf n \quad (\lambda n.\lambda m.\ \text{if}\ (\text{iszero}\ n)\ 0\ (\text{add}\ m\ ((\text{mkmk}\ \text{mkmk}\ \text{mkmult}_0)\ (\text{sub1}\ n)\ m))\ 0\ m \\
&\rightarrow_\mathbf n \quad \text{if}\ (\text{iszero}\ 0)\ 0\ (\text{add}\ m\ ((\text{mkmk}\ \text{mkmk}\ \text{mkmult}_0)\ (\text{sub1}\ n)\ m)) \\
&\rightarrow_\mathbf n \quad \text{if}\ \text{true}\ 0\ (\cdots) \\
&\twoheadrightarrow_\mathbf n \quad 0
\end{aligned}
\]
\[\begin{aligned}
&(\text{mk}\ \text{mkmult}_0)\ n\ m \\
&=\ \ \ \quad ((\text{mkmk}\ \text{mkmk})\ \text{mkmult}_0)\ n\ m \\
&=\ \ \ \quad (((\lambda k.\lambda t.t\ ((k\ k)\ t))\ \text{mkmk})\ \text{mkmult}_0)\ n\ m \\
&\rightarrow_\mathbf n \quad ((\lambda t.t\ ((\text{mkmk}\ \text{mkmk})\ t)\ \text{mkmult}_0)\ n\ m \\
&\rightarrow_\mathbf n \quad (\text{mkmult}_0\ ((\text{mkmk}\ \text{mkmk})\ \text{mkmult}_0))\ n\ m \\
&\rightarrow_\mathbf n \quad (\lambda n.\lambda m.\ \text{if}\ (\text{iszero}\ n)\ 0\ (\text{add}\ m\ ((\text{mkmk}\ \text{mkmk}\ \text{mkmult}_0)\ (\text{sub1}\ n)\ m))\ n\ m \\
&\rightarrow_\mathbf n \quad \text{if}\ (\text{iszero}\ n)\ 0\ (\text{add}\ m\ ((\text {mkmk}\ \text {mkmk}\ \text {mkmult}_0)\ (\text{sub1}\ n)\ m))\\
&\twoheadrightarrow_\mathbf n \quad \text{add}\ m\ ((\text {mkmk}\ \text {mkmk}\ \text {mkmult}_0)\ (\text{sub1}\ n)\ m) \\
&=\ \ \ \quad \text{add}\ m\ ((\text{mk}\ \text{mkmult}_0)\ (\text{sub1}\ n)\ m)
\end{aligned}
\]
不动点和 Y 组合子
不动点
若 \(f(x)=x\), 则称 \(x\) 是 \(f\) 的不动点
不动点组合子 \(\text{mk}\) 能生成任何函数的不动点
\[\begin{aligned}
\text{mkmk}\ &\dot=\ \lambda k.\lambda t.t\ (k\ k)\ t \\
\text{mk}\ &\dot=\ (\text{mkmk}\ \text{mkmk})
\end{aligned}
\]
定理: \(M\ (\text{mk}\ M)\ =_\mathbf n \ (\text {mk}\ M)\ \text{for any }M\)
证明:
\[\begin{array}{lcl}
\text{mk}\ M &= &(\text{mkmk}\ \text{mkmk})\ M \\
&= &((\lambda k.\lambda t.t\ ((k\ k)\ t))\ \text{mkmk})\ M \\
&\rightarrow_{\mathbf{n}} &(\lambda t.t\ ((\text{mkmk}\ \text{mkmk})\ t)\ M \\
&\rightarrow_{\mathbf{n}} &M\ ((\text{mkmk}\ \text{mkmk})\ M) \\
&= &M\ (\text{mk}\ M)
\end{array}
\]
Y 不动点组合子
\[\text Y\ \dot=\ \lambda f.(\lambda x.f\ (x\ x)) \ (\lambda x.f\ (x\ x))
\]
证明:
\[\begin{array}{lcl}
\text{Y}\ M &= &(\lambda f.(\lambda x.f\ (x\ x)) \ (\lambda x.f\ (x\ x)))\ M \\
& \rightarrow_\mathbf n & (\lambda x.M\ (x\ x)) \ (\lambda x.M\ (x\ x)) \\
& \rightarrow_\mathbf n & M\ ((\lambda x.M\ (x\ x))\ (\lambda x.M\ (x\ x))) \\
&= & M \ (Y \ M)
\end{array}
\]
\(\lambda\) 演算定理
正常形式
正常形式: 表达式不能再通过 \(\rightarrow^\beta_\mathbf n\) \(\rightarrow^\eta_\mathbf n\) 归约
\(M\) 有正规形式 \(N\): \(M =_\mathbf n N\) 且 \(N\) 是正常形式
定理: 若 \(L=_\mathbf n M, L=_\mathbf n N\) 且 \(M\) 和 \(N\) 都是正常形式, 则 \(M =_\alpha N\)
定理
丘奇罗瑟定理 \(=_\mathbf n\) 定理: 若 \(M =_\mathbf n N\), 则存在 \(P\) 满足 \(M \twoheadrightarrow_\mathbf n P\) 和 \(N \twoheadrightarrow_\mathbf n P\)
若表达式存在正常形式, 则在 \(\alpha\) 重命名下唯一, 不同归约路径最终结果等价
\(\twoheadrightarrow_\mathbf n\) 菱形性质: 若 \(L \twoheadrightarrow_\mathbf r M\) 且 \(L \twoheadrightarrow_\mathbf r N\), 则存在 \(P\) 满足 \(M \twoheadrightarrow_\mathbf r P\) 和 \(N \twoheadrightarrow_\mathbf r P\)
并不是每个 \(\lambda\) 演算表达式都有正常形式, 如 \(\Omega\)
\[\Omega\ \dot=\ ((\lambda x.x\ x)\ (\lambda x.x\ x))
\]
即是表达式有正常形式, 也可能存在无限归约序列使其不能到达正常形式, 如
\[\begin{aligned}
(\lambda y.\lambda z.z)\ ((\lambda x.x\ x)\ (\lambda w.w\ w))\ \rightarrow_{\mathbf{n}}\ \lambda z.z
\end{aligned} \quad \text{正常形式}
\]
\[\begin{array}{ll}
(\lambda y. \lambda z. z)\ ((\lambda x. x\ x)\ (\lambda w. w\ w)) \\
\rightarrow_\mathbf{n}\ (\lambda y. \lambda z. z)\ ((\lambda w. w\ w)\ (\lambda w. w\ w)) \\
\rightarrow_\mathbf{n}\ (\lambda y. \lambda z. z)\ ((\lambda w. w\ w)\ (\lambda w. w\ w)) \\
\rightarrow_\mathbf{n}\ \ldots
\end{array}
\]
上述无限归约的原因在于求函数体不会用到的参数
归约策略
正常次序归约: 最左最外归约
\[\begin{array}{lll}
&M \rightarrow_\overline{\mathbf n} N &\text{if} &M\ \beta\ N \\
&M \rightarrow_\overline{\mathbf n} N \quad &\text{if} & M \ \eta\ N \\
&(M\ N) \rightarrow_\overline{\mathbf n} (M'\ N) &\text{if} & M \rightarrow_\overline{\mathbf n} M' \\
&&\text{and} &\forall L, (M\ N)\ \not\beta \ L \text{ and } (M\ N)\ \not\eta\ L \\
&(M\ N) \rightarrow_\overline{\mathbf n} (M\ N') &\text{if} & N \rightarrow_\overline{\mathbf n} N' \\
&&\text{and} &M \text{ is in normal form} \\
&&\text{and} &\forall L, (M\ N)\ \not\beta\ L \text{ and } (M\ N)\ \not\eta\ L
\end{array}
\]
关系 \(\rightarrow_\overline{\mathbf n}\) 是正常次序归约关系, 并确保找到正常形式(若存在)
正常次序归约也叫传名调用, 惰性求值, 最左最外
问题: 效率低
定理: \(M\) 有正常形式 \(N\) 当且仅当 \(M \twoheadrightarrow_\overline{\mathbf n} N\)
应用次序归约: 最左最内归约
Applicative order, 严格求值
参考
Programming Languages and Lambda Calculi
维基百科-邱奇数
函数式程序设计 邓玉欣