rholang 学习(一) Lambda演算 Lambda Calculus
本文属作者原创,转载请注明出处:
rholang 学习(一) Lambda演算 Lambda Calculus
本系列目录
rholang 学习(一) Lambda演算 Lambda Calculus
rholang学习(二) pi 演算 Pi Calculus
rholang学习(三) rholang
0. 参考文献
http://liujiacai.net/blog/2014/10/12/lambda-calculus-introduction/
https://emengjzs.github.io/2017/02/07/Lambda-Calculus/
http://www.cs.columbia.edu/~sedwards/classes/2012/w4115-fall/lambda.pdf
http://www.cs.cornell.edu/courses/cs312/2008sp/recitations/rec26.html
http://jwodder.freeshell.org/lambda.html
1.什么是Lambda Calculus
Lambda Calculus 简单来说就是一种非常简洁的数学符号系统,但是又是有和图灵机等价的计算能力。
简洁性:Lambda Calculus只有三个语法和两个操作。语法负责生成lambda语言,操作负责计算。
1.1 lambda calculus语法:
$E = x | (\lambda x.M) | (M\_N)$
其中第一个\(x\) 是变量;\(\lambda x.M\)是函数定义,\(x\)是函数的传入变量(确切的说是形参),比如\(\lambda x.x+2\)表示函数\(f(x) = x+2\)。这里用点号.将\(\lambda x\)和\(M\)隔开,而不是空格,是为了不和下面的函数调用冲突。\((M\_ N)\)是函数调用,相当于\(M(N)\)。\(M\_ N\)用空格隔开, 为了显示出空格,本文中用下划线代替空格。注意,N 本身也可以是一个函数体,其代表函数的返回值。比如 \(x+2 \_ x+3\) 相当于将\(x+3\)这个函数的返回值作为\(x+2\)的输入,即\((x+3)+2\)
这里有人要问了,常量(上面的\(2,3\))和加号也在Lambda Calculus里面吗?回答是否定的。这里只是为了易于理解才暂时引入这些符号,实际上通过Lambda Calculus的三个语法,我们可以构建加法和常数,后面会提到。
1.2 lambda的两个操作:
(1) 变量替换,防止变量名冲突。$\alpha\, conversion: (\lambda x.M[x]) = (\lambda y.M[y])$
(2)规约,计算结果。
$\beta\, reduction: ((\lambda x.M)\_E) = (M[x:=E])$
注意的是,函数声明时,函数体尽可能的向右扩展。比如
$\lambda x.x\lambda y.x\_y = \lambda x.(x (\lambda y.(x\_y)))$
函数规约时,应从左到右
$F\_G\_H = (F\_G)\_H$
2. 例子
例1$\lambda x.\lambda y.y = \lambda x.x\_\lambda y.y$
相当于函数\(f(x,y)=y\)。
例2 η-变换:
$\lambda x.(f\_x)$
将\(x\)替换成 \(f\_ x\),相当于\(f(x)\)
例3
$\lambda x.\lambda y.\lambda z\_x\_y\_z = x\_y\_z$
这里 \(x, y, z\) 可以是lambda item,见下面的if else语句
例4
$\lambda x.\lambda y.x^2+y\_2\_3\\ = \lambda x.x^2+2\_3\\ = 3^3+2\\ = 11$
注意函数定义要向右扩
$\lambda x.\lambda y.x^2+y\_2\_3 = \lambda x.(\lambda y.x^2+y\_2)\_3$
例5
$(((\lambda x.\lambda y.(y\_x))(((((\lambda x.\lambda y.(y\_x))(((\lambda x.x)\_12)))) (\lambda\_x.x))))(\lambda\_x.x))\\ = (((\lambda x.(\lambda y.(y\_x)))(((\lambda x_0.(\lambda x_1.(x_1\_x_0)))((\lambda x_2.x_2)\_12))(\lambda x_3.x_3)))(\lambda\_x_4.x_4))\\ = ((\lambda y.(y(((\lambda x_0.(\lambda x_1.(x_1\_x_0)))((\lambda x_2.x_2)\_12))(\lambda x_3.x_3))))(\lambda x_4.x_4))\\ = ((\lambda x_4.x_4)(((\lambda x_0.(\lambda x_1.(x_1\_x_0)))((\lambda x_2.x_2)\_12))(\lambda x_3.x_3)))\\ = (((\lambda x_0.(\lambda x_1.(x_1\_x_0)))((\lambda x_2.x_2)\_12))(\lambda x_3.x_3))\\ = ((\lambda x_1.(x_1((\lambda x_2.x_2)\_12)))(\lambda x_3.x_3))\\ = ((\lambda x_3.x_3)((\lambda x_2.x_2)\_12))\\ = ((\lambda x_2.x_2)\_12)\\ = 12$
例6 复合函数 $fg(x) = f(g(x))$
$\lambda fg.\lambda x.f\_(g\_x) = \lambda x.f\_(g\_x)$
将\(f(x)\)中的\(x\)替换成\(g\_x\).
比如\(f(x)=x^2, g(x)=x+2\),
$\lambda x.x^2\_(\lambda x.x+2\_x) =(\lambda x.x+2\_x)^2 = (x+2)^2$
例7 IF ELSE 语句 定义常量
$TRUE = \lambda x.\lambda y.x\\ FALSE= \lambda x.\lambda y.y\\ IF\,TRUE\,t\,ELSE\,f = \lambda b.\lambda t.\lambda f.b\_t\_f$
比如 IF TRUE 1 ELSE 0可以表达成
$\lambda b.\lambda t.\lambda f.TRUE\_1\_0\\ = TRUE\_1\_0\\ = \lambda x.\lambda y.x\_1\_0\\ = \lambda y.1\_0\\ = 1$
例8 逻辑运算
$and = \lambda p.\lambda q.p\_q\_p\\ or = \lambda p.\lambda q.p\_p\_q\\ not = \lambda p.\lambda a.\lambda b.p\_b\_a$
例如
$and\_TRUE\_FALSE\\ =(\lambda p.\lambda q.p\_q\_p)\_TRUE\_FALSE\\ =(\lambda q.TRUE\_q\_TRUE)\_FALSE\\ =TRUE\_FALSE\_TRUE\\ =\lambda x.\lambda y.x\_FALSE\_TRUE\\ =\lambda y.FALSE\_TRUE\\ =FALSE$
再如
$not\_TRUE\\ = (\lambda p.\lambda a.\lambda b.p\_b\_a)\_TRUE\\ = \lambda a.\lambda b.TRUE\_b\_a\\ =\lambda a.\lambda b.(TRUE\_b\_a)\\ =\lambda a.\lambda b.b\\ =FALSE$
例9 数字
$0 = \lambda f.\lambda x.x \\ 1 = \lambda f.\lambda x.f\_x\\ 2 = \lambda f.\lambda x.f\_(f\_x)\\ 3 = \lambda f.\lambda x.f\_(f\_(f\_x))$
为什么要这么定义呢?看下面的例子例10 数字加法 定义
$plus = \lambda m.\lambda n.\lambda f.\lambda x.m\_f\_((n\_f)\_x)$
比如
$plus\_3\_2\\ = \lambda m.\lambda n.\lambda f.\lambda x.m_f\_((n\_f)\_x)\_ 3\_2\\ = \lambda f.\lambda x.3\_f\_((2\_f)\_x)\\ = (3\_f)\_((2\_f)\_x)\\ = \lambda f.\lambda x.f\_(f\_(f\_x))\_f\_((2\_f)\_x) \quad\quad\quad这里3\_F\_X规约,F=f,X=(2\_f)\_x\\ = \lambda f.\lambda x.f\_(f\_(f\_(2\_f)\_x))\\ = \lambda f.\lambda x.f\_(f\_(f\_(f\_(f\_x))))\\ = 5$
例11 数字乘法 定义
$mult = \lambda m.\lambda n.\lambda f.m\_(n\_f)$
比如
$mult\_2\_3\\ = \lambda m.\lambda n.\lambda f.m\_(n\_f)\_2\_3\\ = \lambda f.2\_(3\_f)\\ = \lambda f.2\_(\lambda f.\lambda x.f\_(f\_(f\_x))\_f)\\ = \lambda f.2\_(\lambda x.f\_(f\_(f\_x))) (f=f代入)\\ = \lambda f.2\_(\lambda y.f\_(f\_(f\_y))) \quad\quad\quad用2\_F=\lambda x.F\_(F\_x)展开,其中 F=(\lambda y.f\_(f\_(f\_x)))\\ = \lambda f.\lambda x.(\lambda y.f\_(f\_(f\_x)))_(\lambda y.f\_(f\_(f\_y))\_x)\\ = \lambda f.\lambda x.(\lambda y.f\_(f\_(f\_y)))\_(f\_(f\_(f\_x)))\\ = \lambda f.\lambda x.(f\_(f\_(f\_(f\_(f\_(f\_x))))) \quad\quad\quad用y=(f\_(f\_(f\_x)))代入\\ = 6$
例12 pair
$mkpair\_x\_y = \lambda b.(b\_x\_y)\\ fst\_p = p\_TRUE\\ snd\_p = p\_TRUE$
比如
$fst\_(mkpair\_x\_y) \\ = (mkpair\_x\_y)\_TRUE\\ = TRUE\_x\_y\\ = x$
例13 等于0
$isZero\_N = N\_(\lambda.x\_FALSE)\_TRUE$
比如
$isZero\_0 \\ = 0\_(\lambda.x\_FALSE)\_TRUE\\ = 0\_TRUE\_FALSE\\ = \lambda f.\lambda x.x\_TRUE\_FALSE\\ =\lambda f.TRUE\_FALSE =TRUE$
$isZero\_1 \\ = 1\_TRUE\_FALSE\\ = (\lambda f.\lambda x.f\_x)\_TRUE\_FALSE\\ = (\lambda x.TRUE\_x)\_FALSE\\ =TRUE\_FALSE\\ =\lambda x.\lambda y.x\_FALSE\\ =FALSE$
3. 递归
例14 不动点 Y combinator$Y = \lambda f.(\lambda x.f\_(x\_x))\_(\lambda x.f\_(x\_x))$
$Y\_g\\ = \lambda f.(\lambda x.f\_(x\_x))\_(\lambda x.f\_(x\_x))\_g\\ = (\lambda x.g\_(x\_x))\_(\lambda x.g\_(x\_x))\quad\quad\quad将f用g替换\\ = g\_((\lambda x.g\_(x\_x))\_(\lambda x.g\_(x\_x)))\quad\quad\quad将x用(\lambda x.g\_(x\_x))替换\\ =g\_(Y\_g) \quad\quad\quad用第三行的Y\_g替换$
因此就有,对于任意的函数g, \(Y\_g\)实现了对g的递归调用:
$Y\_g = g\_(Y\_g) = g\_(g\_(Y\_g))$
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步