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))$


4. 小结

事实上,lambda calculus还可以推出其他数学的运算符,比如减法和除法,还有大于小于等等,也可以构造负数、有理数和实数。

http://jwodder.freeshell.org/lambda.html

列出了常用的操作运算。 lambda calculus与图灵机是等价的(Turing Complete)
posted @ 2018-03-07 11:24  qxred  阅读(1264)  评论(0编辑  收藏  举报