Lambda 演算

文 / 李博(光宇广贞)

       惭愧!头一次认识 Lambda 表达式还是因为 C# 3.0。几年后接触到了函数式语言方知 Lambda 表达式的渊源。Lambda 表达式是“Lambda-Calculus”,即 “Λ-演算”的关键概念。由 Λ-演算发展出的理论,成为计算机科学与技术诞生和发展的基础。

Λ-演算之概念、定义、公理、命题

定义一:Λ-项集建立在一个无限变量集 V = { v, v', v'', … } 上。数学关系如下:

       BNF 下表示为:

Capture2

约定一:

  1. 设 x, y, z, … 为任意变量;M, N, L, … 为任意 λ-项,最外层括号可被去掉。
  2. M ≡ N 表示 M 与 N 相同或彼此可通过重命名受限变量(Bound Vars)互相转化。
  3. FM1…Mn ≡ (…((FM1)M2)…Mn) 且 λx1…xn.M ≡ λx1(λx2(…(λxn(M))…))。

       (2)条中“受限变量”即指出现在 λ-term 中受 λ 符号约束的变量;相对地说“自由变量”即指不受 λ 符号约束的变量。比如 xy(λx.x) 式中,括号内的 x 为受限变量,而括号外的 x 和 y 均为自由变量;括号内外两个 x 是不同的,显然,括号形成了一个“闭包(Closure)”(见下文 α-归约)。注意(3)条中第二个恒等式的“.”号为前后两个 λ-项的分隔。(3)条解释了左结合和右结合规则。(3)条第二个恒等式左侧式即为 C++、C# 等 IP 语言引入的 Lambda 表达式,右侧式即为函数咖喱》。

补充一(α-归约):λx.M = λy.M[x:=y], y 不出现在 M 内。

       α-归约表述了受限变量替换的规则,即受限变量不得与同闭包内的自由变量重名。

定义二:M 的自由变量(Free Var),写作 FV(M),定义如下:

Lambda 演算_第1张图片

       第三个式子解释了 M 中的自由变量一旦出现在 {x} 集中则为受限变量,也即在 λ 域(Scope)内的变量为受限变量。

定义三:若 FV(M) = ∅,则 M 为封闭 λ-项(Closed λ-term)或联合体(Combinator)。封闭 λ-项集记作 Λ°。

定义四:将 M 中的自由变量 x 替换成 N 记作 M[x:=N],相关的定义式如下:

Lambda 演算_第2张图片

       好了,准备工作完成,下面推出 λ-演算公理(β-归约)

       对于所有 M, N ∈ Λ,有

(λx.M)N = M[x:=N]

       该公理又称 β-归约,该规则表达的是“函数(闭包)是如何作用在参数(N)上”的概念。式中的 = 号表示“最小等价”关系,也即该关系中去掉任何一个映射都将破坏等价关系;且该等价关系满足自反、交换、传递性及运算稳定性(篇末注 1);且为 λ-演算证明的等价关系如 M = N 可记为 λ├M=N。该 β-归约即为 C++、C# 等语言引入的 Lambda 表达式或称为 Lambda 函数的定义式和使用方式的理论基础。

引理一:λ├(λx1…xn.M)X1…Xn = M[x1:=X1]…[xn:=Xn]

       引理一便是多参数的 Lambda 表达式的代入法,是对 β-归约的补充。

不动点定理(FixedPoint Theorem):

1、∀F ∃X FX = X

       此式相当于对于所有 F ∈ Λ 总有 X ∈ Λ 有 λ├ FX = X

2、存在不动点联合体(Fixed Point Combinator):

Y ≡ λf.(λx.f(xx))(λx.f(xx))

       有

∀F F(YF) = YF

       证明见篇末注 2。

       使用邱奇编码可将数值计算整合进 Lambda 演算中来。

定义五:当 F ∈ Λ 且 n ∈ N 时,有如下归纳(inductive)定义:

Capture5

       如是,自然数 n 可由邱奇数(Church numerals)Cn 表示,其定义为:

    Lambda 演算及其发展出的邱奇编码是邱奇-图灵论题的理论基础,而后者发展出了计算机科学与技术,使人类发明了计算机。

篇末注:

  1. 运算稳定性见《Introduce to Lambda Calculus》11 页 2.7 定义之 ξ 变换。
  2. 证明见《Introduce to Lambda Calculus》12 页 2.12 定理之证明。 

       所属分类:F#.net计算机技术杂文

你可能感兴趣的:(c,工作,C#,语言,lambda)