题意:
关于邱奇-图灵论题的一点思考
这道题起源于计算机科学史上一个非常著名的问题——邱奇-图灵论题,这个论题是可计算性理论的基石,关于它的思考与证明几乎贯穿了整个计算机科学史,涵盖了数学、算法理论、数学逻辑学甚至哲学上的广大深刻内容,直至今日还不断有讨论的声音。今天因为这题去详细了解了一下邱奇-图灵论题,切实的感觉到了这个问题的伟大和影响深远之处。
邱奇-图灵论题的观点表明,任何算法都可以由一台图灵机来执行,即以任何编程语言编写的算法都可以被翻译(编译?)成一台图灵机,反之亦然,因此任何一种编程语言都足够用来有效的表达任何算法。
邱奇-图灵论题最早来源于阿兰·图灵和阿隆佐·邱奇关于判定性问题能否被解决的证明,当时邱奇首先利用递归函数和“可定义”函数来形式化地描述了有效可计算性,紧接着图灵证明了“判定性问题”是不可解的(不可解问题最著名的一个例子是停机问题,详解我或许会写一篇博客?),根据邱奇对有效可计算性的描述,图灵又证明了图灵机所描述的是同一集合的函数(即任意语言集合)。
对这一论题的观点进行延伸,可以得出一个结论:数学和逻辑学中的所有有效运算方法均可以用一台图灵机来表示和演算,通常这些方法需要满足:
1.由有限多的精确指令组成,每一条指令都可以由有限多的符号来描述;
2.每个方法都会在有限步骤内产生结果;(关于这一条的争议貌似跟NP完备性问题有关……请不要问我)
3.该方法的执行不需要人类的智慧理解,即只需要按照给出的指令计算即可得出结果;
其中一个范例可以参考自递归的欧几里得算法。
在图灵之后,陆续有许多科学家也提出了不同的描述有效计算的机制,但所有这些体系都已经被证明是图灵完全的,即在计算和证明上和图灵机是几乎等价的,所以普遍认为邱奇-图灵论题是正确的。但是一个严重的漏洞是该论题并没有被严谨证明,只是无法找到一个图灵机不允许的有效算法,却没能证明不存在这样的算法。因此可以说“有效可计算性”这个词的定义也是不严谨的,而现在的数学家们大都对这个问题避而不谈,改用另一个定义良好的词——“图灵可计算性”来描述可计算性。笔者认为这样在问题定义还不清晰的基础上去频繁使用是非常“危险”的,因为定义的一点破绽可能会导致整个计算机科学体系的崩塌(参见第二,第三次数学危机)。
在哲学方面,邱奇-图灵论题的意义非常深刻,涉及到宇宙的本质和超计算的可能性。
1.广义的邱奇-图灵论题认为宇宙是一台图灵机,可以存储无限精度的实数,如果这样定义,则宇宙中不存在实数,只存在可计算数;由上,如果该定义为真,则在物理上对非递归函数的计算是不可能的;
2.宇宙不是一台图灵机,则物理定律都不是图灵可计算的,但在此基础上建立“超计算机”并不是不可能的;
3.宇宙是一台(量子)超计算机,则可以通过物理设备来控制这一特征来计算非递归函数,即量子力学中的事件都是图灵可计算的,由量子比特构成的系统都是图灵完备的,甚至有人认为人的心智就是量子演算的结果;
抛去哲学上的问题不谈,笔者认为邱奇-图灵论题最伟大的地方在于辨清了计算,图灵机和编程语言的关系,把计算机科学和其它科学领域划清了界限,对“算法”本身给出了精确的定义,以及对于“有效运算”和可计算性的探讨,令人对“计算机”这一概念有更充分的理解。可以说整个计算机科学的理论根基都是由这一论题发展起来的,现在我们写的每一行代码与其都有不可或缺的联系。
(部分摘自百度百科)
一些资料:
https://www.zhihu.com/question/21579465/answer/106995708
https://wenku.baidu.com/view/b1bb8eade009581b6ad9eb41.html
https://www.cnblogs.com/zhangzefei/p/9743546.html
题解:
其实这题跟邱奇图灵论题并没有什么关系……就当我上面那么长一段在胡扯吧
其实$\lambda-$演算可以看成是现在所有编程语言的前身,甚至早于汇编语言和01机器码;
以个人的理解,$\lambda-$演算中的所有变量都既可以是一个值也可以是一个函数(表达)式,而所有函数式和变量加起来就是组成了表达式,广义的来说,现在python和C++中的lambda隐式表达式都是$\lambda-$演算中的表达式的延伸。
那么题目中的三种表达式形式分别可以理解为:
1.$a$:表示一个变量的值或其代表的表达式;
2.$\lambda x.N$:表示(定义或调用)一个函数$f(x)$,返回将$x=(x的实际值)$代入表达式N(实际上也可以是一个单独的变量,只不过调用了它所代表的表达式)的结果;从另一个角度来说,形如$\lambda x.\lambda y.N$的表达式可以看作接受两个参数$x,y$的函数;
3.$F~A$:将$A$作为$F$的参数代入求值,即调用函数$f(A)$。
下面的一大段例子可以省略,只需要知道$\lambda-$演算是默认左结合的,即在不加括号的情况下会按照从左到右的顺序依次将右侧的表达式代入左侧求值,且参数不同而形式相同的函数被认为是等价的(同名的)。
测试点1:
$true=\lambda x.\lambda y.x$
$false=\lambda x.\lambda y.y$
由题面可知$f x=N\Leftrightarrow f=\lambda x.N$,稍微推一下即可,这是整个$lambda-$演算系统中最重要的定义。
测试点2:
非常抱歉,以下都鸽了