λ 演算

λ 演算

通用

函数

函数即值, 函数仅单参数

函数定义

抽像 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]\)

  1. 替换 \(M\) 中自由变量
  2. \(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

维基百科-邱奇数

函数式程序设计 邓玉欣

posted @ 2025-05-03 12:46  (.)$(.)  阅读(7)  评论(0)    收藏  举报