图灵机:在没有计算机的时候,我们如何谈论计算?
1950年10月,一篇题为“机器能思考吗”的论文横空出世。这篇论文中提出了一个令人细思极恐的测试,即在测试者与被测试者(一个真人和一台机器)隔开的情况下,通过通讯装置向被测试者随意提问,并让测试者猜测与自己对话的对方到底是真人还是机器。
在多次测试后,如果机器能平均让每个参与者做出超过30%的误判,那么这台机器就通过了测试,并被认为具有人类智能。
人们第一次意识到机器人可能具备人类智能,便是从此开始。这个测试便是令千万科幻爱好者津津乐道的图灵测试。这篇文章也为作者Alan Turing(艾伦·图灵)赢得了「人工智能之父」的桂冠。
而人工智能之路,或者说计算机发展史的源头,是一篇图灵在24岁时发表的论文。在这篇论文中,他给「可计算性」下了一个严格的数学定义,并提出著名的「图灵机(Turing Machine)」的设想。图灵机不是一种具体的机器,而是一种思想模型,可制造一种十分简单但运算能力极强的计算装置,用来计算所有能想象得到的可计算函数。
因为图灵发明了图灵机,于是时不时便有人跳出来宣称图灵其实「发明了计算机」。然而,图灵机与实际计算机器的设计并不相同。图灵机甚至不是机器的抽象模型。事实证明(有图灵言论为证),图灵机是一个人在桌上的纸张上书写的模型。那么,图灵为什么要发明图灵机,而图灵机又将引领我们去向何方?
1 图灵的论文 “论可计算数”
解答这些疑问的最好办法是把课本放到一边,打开论文。如今,借阅一本1936年的期刊不需要填写借阅卡,也不需要等上一个小时让图书管理员从藏书室取来,我们只需要手捧一杯麦芽威士忌,在家里轻松访问谷歌即可。我们要寻找的那篇图灵论文如下:
论文地址:https://www.cs.virginia.edu/~robins/Turing_Paper_1936.pdf
论文中有一些错误,但瑕不掩瑜。正如Joel David Hamkins所说,图灵将可计算实数(computable real numbers)定义为具有可计算的十进制展开数,这实际上是行不通的,不过修正并不困难。
图灵在标题中就说明了这篇论文的写作意图:“论可计算数及其在「判定问题」中的应用 ”。其中“Entscheidungsproblem(判定问题)”询问是否存在一种有效技术来决定给定的一阶逻辑公式有效,即在所有解释中为真。
图灵将他的想法展开如下:
我们可以把一个正在计算实数的人比作一台只能满足有限数量条件q1,q2,... qR...的机器。这台机器中有一条长长的“纸带”穿过,纸带被分成很多个部分,这种一块一块的部分我们将其称为方块(square),每个方块都能承载一个“符号”...一些写下的符号会形成被计算的实数的十进制的数字序列,而其他的符号则只是“帮助记忆”的粗略笔记。这些粗略的笔记是可以擦掉的。我的论点是,这种在纸带上滑来滑去,滑到某个符号并对这个符号进行相应处理的运算方式,其中包括了所有用于数字计算的运算。
……
“可计算数”简单说来就是,其十进制的表达用有限的手段可计算的实数。按照我的定义,如果一个数的十进制的表达能被机器写下来,那么这个数就是可计算的。
图灵后续进行了定义和证明,这是一篇典型的数学论文,而不是典型的工程论文,在这种文章里读者想看到讨论如何实现文中所描述的某种机制。从图灵的标题和文章中我们可以看出,图灵主要关心的是一个实数到无限位小数的计算。
这篇论文还有许多其他重要贡献:
- 通用图灵机,以及以数字形式为机器编码的想法
- 如此编码的机器的停机问题,以及对角化的不可判定性
写罢这篇论文,图灵打开了理论计算科学领域的大门。
2 通用图灵机
我们不能确定是什么让图灵产生了通用图灵机(UTM)的想法,但一旦他想到了,他可能会认为通用图灵机的存在是显而易见的。因为图灵机的目的就是模拟一个在办公桌上工作的职员,而图灵机的操作和文员行为一样——根据机器状态和磁带符号,根据给定的转换规则列表执行这个或那个操作——显然需要一个图灵机来执行这样的例行任务。图灵的论文对于构造的细节有些粗略,但似乎没有人介意。
而如今,我们有了已经被设计得淋漓尽致的通用图灵机。几十年前,在剑桥大学,Ken Moody 博士编写了一个通用明斯基注册机:
链接:http://www.igblan.free-online.co.uk/igblan/ca/minsky.html
这样的机器有有限的寄存器,每个寄存器可以存储任意大的非负整数。它有一个有限程序,由三种不同类型的标记指令组成:
- 递增寄存器R并跳到标签L,或R+→L
- 测试/递减寄存器R并跳转到标签L0/L1,或L0↞R−→L1
- 中断。
这样的机器比图灵机更容易编程,尽管它们仍然不像真正的计算机。
Moody在N和N×N之间使用了标准的双射,将整数列表打包成单个整数。他编写了一个小型寄存器机器的小库,用于执行堆栈上推和从堆栈弹出等操作,并创建了一个让人想起真实处理器的获取-执行周期的设计。整个过程可见以下几张幻灯片。下图是机器本身:
下图则是机器的整体结构。(这两张图的作者都是剑桥大学理论计算科学教授Andrew Pitts。)
出人意料的是,这个机器的结构真简单!
3 停机问题
停顿问题显然是不可决定的。否则,许多数学上的猜想都会难以解决,比如费马大定理:只要写一个程序,搜索x, y, z, n>2,使,并问它是否终止。然而,停机的不可判定性必须被严格地表达和证明。
与大众看法相反,图灵的论文并没有讨论停机问题,而是讨论了一个与停机问题相关的特性,他称之为“循环性”(circularity)。如果图灵机「只写下有限数量的第一种符号」(即0和1),它就是循环性的。我想,循环性之所以重要,是因为图灵特别喜欢把实数近似为无限的二进制字符串。物理学家Christopher Strachey在1965年给《计算机杂志(Computer Journal)》的一封信中声称,图灵告诉他一个关于停机问题不可判定性的证明。
4 图灵和Maurice Wilkes
2009年9月,David P. Anderson采访了Maurice Wilkes,他对图灵的看法却与大众恰恰相反:
David P. Anderson:你认为图灵1936年发表的判定问题论文的重要性何在?
Maurice Wilkes:我觉得一个工程师会把存储程序(stored program)的想法当成类似三位一体的重要理论,并会说:"这绝对是一流的,就应该按这办法做"。
那篇论文中的思想与我所说的没有任何具有实际意义的区别。他能发表那篇论文已经很幸运了, 我的意思是阿隆佐·邱奇(Alonzo Church)用其他方法得到了同样的结果。
文章地址:https://cacm.acm.org/magazines/2009/9/38898-an-interview-with-maurice-wilkes/fulltext
需要注意的是,在接受采访时,Maurice Wilkes已经96岁高龄了,他本人是著名的计算机先驱,EDSAC(Electronic Delay Storage Automatic Calculator,即电子延迟存储自动计算器)之父。在他这段奇怪的回答中,可以看出他对图灵崇高地位的嫉妒。这两个人显然合不来!我们也看到了Maurice Wilkes对理论的不屑:尽管把机器编码为数字是对存储程序计算机的预期,但图灵的工作是纯粹的数学,没有任何工程意义。图灵对实际的计算机工程很感兴趣,但他多次试图参与到真正的工程里,却屡屡受挫。
而那些关于邱奇的言论又是如何评价的呢?
5 图灵和邱奇在普林斯顿
在图灵做研究的时候,许多研究人员关注的是“有效可计算性”的想法。此处我推荐读者看看邱奇的《初等数论的一个不可解问题》(见下图)。
论文链接:https://www.jstor.org/stable/2371045?origin=crossref
老实说,这篇论文读起来很吃力,但它能带我们身临其境。本文给出了一个λ-演算的定义,一个递归函数的定义(在Kleene(克莱尼)/Gödel(哥德尔)意义上),以及λ-演算中范式的存在性和等价性的一些不可判定结果。邱奇和克莱尼已经证明了λ可定义函数和递归函数的等价性;而当图灵在普林斯顿的时候,λ可定义函数和图灵可计算函数之间的等价性也得到了证明,于是我们便得到了邱奇-图灵论题,这个论题的指的是有效可计算的函数恰恰是那些数学上等价类中的函数。
6 邱奇-图灵论题正确吗?
正如人们常说的那样,我们无法证明这个论题正确与否,因为「有效可计算」不是一个精确的概念。我们可以把图灵可计算函数看作是一个颇为包容的类,因为其包括了许多在宇宙生命周期内无法计算的函数。借助Ackermann函数,我们可以很容易地得到范例。
Ackermann函数的现代形式如下:
文章链接:https://lawrencecpaulson.github.io/2022/02/09/Ackermann-example.html
如果你定义f(n)=A(n,n),就不能指望计算出偶数f(4)。g(n)=A(4,n)尽管是原始递归,但几乎无法计算。
尽管在20世纪30年代之前都还没有数字计算机,但有效可计算性的概念已为数学家所熟知。有效性的概念在希腊几何的直线结构和圆规结构中就早已出现,有效性也是判定问题和希尔伯特第十问题的组成部分。与哥德尔的递归函数和邱奇的λ微积分相比,图灵的概念的天才之处在于其显然是正确的。哥德尔自己也不确定他的递归函数是否抓住了计算的思想,我们也不清楚邱奇的想法是否正确。唯有图灵的想法简单而自然。图灵的想法与其他模型在可证明性上是等价的,并为所有这些模型提供了合理解释。他在1937年发表的论文《可计算性和λ-可定义性》中指出了这一事实。
本文旨在证明作者提出的可计算函数与邱奇的λ-可定义函数以及由埃尔布朗和哥德尔所提出的并由克莱尼发展的一般递归函数是相同的。这几个相同的函数都证明了每个X-定义函数都是可计算的,并且每个可计算函数都是一般递归的。
注意,图灵写的是「可计算的」,而我们要写「图灵可计算的」。
以上是图灵机:在没有计算机的时候,我们如何谈论计算?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

通用矩阵乘法(GeneralMatrixMultiplication,GEMM)是许多应用程序和算法中至关重要的一部分,也是评估计算机硬件性能的重要指标之一。通过深入研究和优化GEMM的实现,可以帮助我们更好地理解高性能计算以及软硬件系统之间的关系。在计算机科学中,对GEMM进行有效的优化可以提高计算速度并节省资源,这对于提高计算机系统的整体性能至关重要。深入了解GEMM的工作原理和优化方法,有助于我们更好地利用现代计算硬件的潜力,并为各种复杂计算任务提供更高效的解决方案。通过对GEMM性能的优

WORD是一个强大的文字处理器,我们可以利用word进行各种文字的编辑,在Excel表格当中,我们已经熟练掌握了加减乘数的运算方法,那么如果需要在Word表格里,计算数值的加减乘数,该如何操作呢,难道只能用计算器计算吗?答案当然是否定的,WORD也同样可以完成。今天小编就来教大家如何在Word文档的表格当中,运用公式计算加减乘除等基本运算,一起来学习一下吧。那么,今天就让小编具体演示一下,WORD文档怎么计算加减乘除?第一步:打开一个WORD,单击工具栏【插入】下的【表格】,在下拉菜单当中插入一

如何使用Python的count()函数计算列表中某个元素的数量,需要具体代码示例Python作为一种强大且易学的编程语言,提供了许多内置函数来处理不同的数据结构。其中之一就是count()函数,它可以用来计算列表中某个元素的数量。在本文中,我们将详细介绍如何使用count()函数,并提供具体的代码示例。count()函数是Python的内置函数,用于计算某

简介使用行列式计算三角形面积的Java程序是一个简洁高效的程序,可以根据给定三个顶点的坐标来计算三角形的面积。该程序对于学习或使用几何的任何人都非常有用,因为它演示了如何在Java中使用基本算术和代数计算,以及如何使用Scanner类读取用户输入。程序提示用户输入三角形三个点的坐标,然后将其读入并用于计算坐标矩阵的行列式。使用行列式的绝对值来确保面积始终为正,然后使用公式计算三角形的面积并显示给用户。该程序可以轻松修改以接受不同格式的输入或执行附加计算,使其成为几何计算的多功能工具。决定因素行列

给定两个字符串str_1和str_2。目标是使用递归过程计算字符串str1中子字符串str2的出现次数。递归函数是在其定义中调用自身的函数。如果str1是"Iknowthatyouknowthatiknow",str2是"know"出现次数为-3让我们通过示例来理解。例如输入str1="TPisTPareTPamTP",str2="TP";输出Countofoccurrencesofasubstringrecursi

在C#中,有一个Math类库,其中包含许多数学函数。其中包括计算幂次方的函数Math.Pow,它可以帮助我们计算指定数的幂。Math.Pow函数的用法非常简单,只需要指定底数和指数就可以了。其语法如下:Math.Pow(base,exponent);其中base表示底数,exponent表示指数。该函数返回double类型的结果,即幂次方的计算结果。下面让

一种受欢迎的通用编程语言是Python。它被应用于各种行业,包括桌面应用程序、网页开发和机器学习。幸运的是,Python具有简单易懂的语法,适合初学者使用。在本文中,我们将使用Python来计算矩阵的右对角线之和。什么是矩阵?在数学中,我们使用一个矩形排列或矩阵,用于描述一个数学对象或其属性,它是一个包含数字、符号或表达式的矩形数组或表格,这些数字、符号或表达式按行和列排列。例如−234512367574因此,这是一个有3行4列的矩阵,表示为3*4矩阵。现在,矩阵中有两条对角线,即主对角线和次对

我们将演示如何使用Java程序计算总分和百分比。总分是指所有可用分数的总和,而术语百分比是指计算分数除以总分并乘以所得的数字100。percentage_of_marks=(obtained_marks/total_marks)×100示例1这是一个Java程序,用于演示如何计算总分和百分比。//JavaProgramtodemonstratehowisTotalmarksandPercentagescalculatedimportjava.io.*;publicclassTotalMarks_
