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\) 表示变量。
  • 对于括号,有以下省略约定:
  1. \(\lambda\) 项最外层的括号可以直接省略。如 (\(\lambda x.x\)) 可以省略为\(\lambda x.x\).
  2. 左结合的应用型 \(\lambda\) 项,括号可以省略。如 (((MN)P)Q) 可以省略为 MNPQ.
  3. 抽象型的 \(\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\) 规约,以及约定了一些符号使用。

posted @ 2021-03-30 23:24  今天AC了吗  阅读(233)  评论(0)    收藏  举报