1 lambda演算
λ演算(lambda calculus)是一套用于研究函数定义、函数应用和递归的形式系统。它由阿隆佐·邱奇Alonzo Church和他的学生斯蒂芬·科尔·克莱尼在20世纪30年代发明的。
λ演算可以被称为最小的通用程序设计语言。它包括一条变换规则(变量替换)和一条函数定义方式。
λ演算表达了两个计算机计算中最基本的概念“代入”和“置换”。“代入”我们一般理解为函数调用,或者是用实参代替函数中的形参;“置换”我们一般理解为变量换名规则。“代入”就是用lambda演算中的β-归约概念。而“替换”就是lambda演算中的α-变换。
在 lambda 演算中有许多方式都可以定义自然数,但最常见的还是邱奇数 。
邱奇编码是把数据和运算符嵌入到lambda演算内的一种方式,它是使用lambda符号的自然数的表示法。这种方法得名于阿隆佐·邱奇,他首先以这种方法把数据编码到lambda演算中。
Church数是在Church编码下的自然数的表示法。表示自然数n的高阶函数是把任何其他函数 f 映射到它的n重函数复合
的函数。
在λ演算中,计算系统用函数的嵌套次数来计数。
·lambda演算中的数字n就是一个把函数 f 作为参数并以 f 的n次幂为返回值的函数。
2 图灵机
图灵机被公认为现代计算机的原型,这台机器可以读入一系列的零和一,这些数字代表了解决某一问题所需要的步骤,按这个步骤走下去,就可以解决某一特定的问题。这种观念在当时是具有革命性意义的,因为即使在50年代的时候,大部分的计算机还只能解决某一特定问题,不是通用的,而图灵机从理论上却是通用机。在图灵看来,这台机器只用保留一些最简单的指令,一个复杂的工作只用把它分解为这几个最简单的操作就可以实现了,在当时他能够具有这样的思想确实是很了不起的。他相信有一个算法可以解决大部分问题,而困难的部分则是如何确定最简单的指令集,怎么样的指令集才是最少的,而且又能顶用,还有一个难点是如何将复杂问题分解为这些指令的问题。
图灵机由一个控制器P、一个读写头W/R和一条存储带M组成,如下图:
其中,存储带是一个无限长的带子,带子上划分为许多单元格,每个格子里包含一个来自有限字母表的符号。控制器包含了一套控制规则(程序)和一个状态寄存器,控制规则根据当前机器所处状态,以及当前读/写头所指的格子上的符号,来确定读/写头下一步动作,并改变状态存储器的值,令机器进入一个新的状态。存储带可以左右移动,并且通过读/写头对存储带上的符号进行修改或读出。
图灵机的工作过程是:存储带移动一格,就把“1”变成“0”,或者把“0”变成“1”,或者不变。“0”和“1”代表在解决某个数学特定问题中的运算步骤。
它工作的时候是这样的:从读写头在纸带上读出一个方格的信息,并且根据它当前的内部状态开始对程序进行查表,然后得出一个输出动作,也就是是否往纸带上写信息,还是移动读写头到下一个方格。程序也会告诉它下一时刻内部状态转移到哪一个。
具体的程序就是一个列表,也叫做规则表,是这样的:
当前内部状态s输入数值i输出动作o下一时刻的内部状态s'
q01前移q1
q10往纸带上写qn
q20后移qy
简单说完成加法的图灵机的输入字符集是0、1和+。带字符集是0、1、+、=、还有空白符。
图灵机可计算一切直觉上能行可计算的函数。
λ演算之通用在于,任何一个可计算函数都能用这种形式来表达和求值。
因而,λ演算的计算能力是等价于图灵机的。