图灵机(转自wiki)
图灵机(英语:Turing machine),又称确定型图灵机,是英国数学家艾伦·图灵于1936年提出的一种抽象计算模型,其更抽象的意义为一种数学逻辑机,可以看作等价于任何有限逻辑数学过程的终极强大逻辑机器。
图灵的基本思想
图灵的基本思想是用机器来模拟人们用纸笔进行数学运算的过程,他把这样的过程看作下列两种简单的动作:
- 在纸上写上或擦除某个符号;
- 把注意力从纸的一个位置移动到另一个位置;
而在每个阶段,人要决定下一步的动作,依赖于(a)此人当前所关注的纸上某个位置的符号和(b)此人当前思维的状态。
在某些模型中,纸带移动,而未用到的纸带真正是“空白”的。要进行的指令(q4
)展示在扫描到方格之上(由Kleene(1952)p.375绘制)。
在某些模型中,读写头沿着固定的纸带移动。要进行的指令(q1
)展示在读写头内。在这种模型中“空白”的纸带是全部为0的。有阴影的方格,包括读写头扫描到的空白,标记了1,1,B的那些方格,和读写头符号,构成了系统状态。(由Minsky(1967)p.121绘制)
为了模拟人的这种运算过程,图灵构造出一台假想的机器,该机器由以下几个部分组成:
- 一条无限长的纸带TAPE。纸带被划分为一个接一个的小格子,每个格子上包含一个来自有限字母表的符号,字母表中有一个特殊的符号{\displaystyle \square }表示空白。纸带上的格子从左到右依次被编号为0, 1, 2, ...,纸带的右端可以无限伸展。
- 一个读写头HEAD。该读写头可以在纸带上左右移动,它能读出当前所指的格子上的符号,并能改变当前格子上的符号。
- 一套控制规则TABLE。它根据当前机器所处的状态以及当前读写头所指的格子上的符号来确定读写头下一步的动作,并改变状态寄存器的值,令机器进入一个新的状态。
- 一个状态寄存器。它用来保存图灵机当前所处的状态。图灵机的所有可能状态的数目是有限的,并且有一个特殊的状态,称为停机状态。参见停机问题。
注意这个机器的每一部分都是有限的,但它有一个潜在的无限长的纸带,因此这种机器只是一个理想的设备。图灵认为这样的一台机器就能模拟人类所能进行的任何计算过程。
图灵机的正式定义
一台图灵机是一个七元有序组{\displaystyle (Q,\Sigma ,\Gamma ,\delta ,q_{0},q_{accept},q_{reject})},其中{\displaystyle Q,\Sigma ,\Gamma }都是有限集合,且满足
- {\displaystyle Q}是非空有穷状态集合;
- {\displaystyle \Sigma }是非空有穷输入字母表,其中不包含特殊的空白符{\displaystyle \square };
- {\displaystyle \Gamma }是非空有穷带字母表且{\displaystyle \Sigma \subset \Gamma };
- {\displaystyle q_{reject}\in \Gamma -\Sigma }为空白符;
- {\displaystyle \delta :Q\times \Gamma \to Q\times \Gamma \times \{L,R\}}是转移函数,其中{\displaystyle L,R}表示读写头是向左移还是向右移;
- {\displaystyle q_{0}\in Q}是起始状态;
- {\displaystyle q_{accept}\in Q}是接受状态。{\displaystyle q_{reject}\in Q}是拒绝状态,且{\displaystyle q_{reject}\neq q_{accept}}。
图灵机{\displaystyle M=(Q,\Sigma ,\Gamma ,\delta ,q_{0},q_{accept},q_{reject})}将以如下方式运作:
开始的时候将输入符号串 {\displaystyle \omega =\omega _{0}\omega _{1}\ldots \omega _{n-1}\in \Sigma ^{*}} 从左到右依此填在纸带的第{\displaystyle 0,1,\ldots ,n-1}号格子上,其他格子保持空白(即填以空白符{\displaystyle \square })。 {\displaystyle M}的读写头指向第0号格子, {\displaystyle M}处于状态{\displaystyle q_{0}}。机器开始运行后,按照转移函数{\displaystyle \delta }所描述的规则进行计算。例如,若当前机器的状态为{\displaystyle q},读写头所指的格子中的符号为{\displaystyle x},设{\displaystyle \delta (q,x)=(q',x',L)},则机器进入新状态{\displaystyle q'},将读写头所指的格子中的符号改为{\displaystyle x'},然后将读写头向左移动一个格子。若在某一时刻,读写头所指的是第0号格子,但根据转移函数它下一步将继续向左移,这时它停在原地不动。换句话说,读写头始终不移出纸带的左边界。若在某个时刻{\displaystyle M}根据转移函数进入了状态{\displaystyle q_{accept}},则它立刻停机并接受输入的字符串; 若在某个时刻{\displaystyle M}根据转移函数进入了状态{\displaystyle q_{reject}},则它立刻停机并拒绝输入的字符串。
注意,转移函数{\displaystyle \delta }是一个部分函数,换句话说对于某些{\displaystyle q},{\displaystyle x},{\displaystyle \delta (q,x)}可能没有定义,如果在运行中遇到下一个操作没有定义的情况,机器将立刻停机。
图灵机的基本术语
设{\displaystyle M=(Q,\Sigma ,\Gamma ,\delta ,q_{0},q_{accept},q_{reject})}是一台图灵机,
- {\displaystyle M}的带描述(tape description)是一个函数{\displaystyle F:\mathbb {N} \to \Gamma },其中{\displaystyle F(i)}表示{\displaystyle M}的带上第{\displaystyle i}个格子中的符号;
- {\displaystyle M}的格局(configuration)是一个三元组{\displaystyle (F,q,e)},其中{\displaystyle F:\mathbb {N} \to \Gamma }是当前的带描述,{\displaystyle q\in Q}是当前的状态,{\displaystyle e\in \mathbb {N} }是当前读写头所处的位置;
- 设{\displaystyle C_{1}=(F_{1},q_{1},e_{1})}, {\displaystyle C_{2}=(F_{2},q_{2},e_{2})}是{\displaystyle M}的格局,设{\displaystyle \delta (q_{1},F_{1}(e_{1}))=(q,x,d)},若满足{\displaystyle q_{2}=q},
{\displaystyle e_{2}={\begin{cases}e_{1}-1&d=L\\e_{1}+1&d=R\end{cases}}}
以及
{\displaystyle F_{2}(i)={\begin{cases}F_{1}(i)&i\neq e_{1}\\x&i=e_{1}\end{cases}}}
则称{\displaystyle M}从格局{\displaystyle C_{1}} 产生格局{\displaystyle C_{2}},记作{\displaystyle C_{1}\to _{M}C_{2}}。
- 设{\displaystyle C=(F,q,e)}为{\displaystyle M}的格局,若{\displaystyle q=q_{accept}}则称{\displaystyle C}为接受格局;若{\displaystyle q=q_{reject}}则称{\displaystyle C}为拒绝格局;接受格局和拒绝格局统称为停机格局。
设{\displaystyle M}是一台图灵机,将字符串 {\displaystyle \omega =\omega _{0}\omega _{1}\ldots \omega _{n-1}} 作为其输入,若存在格局序列{\displaystyle C_{1},C_{2},\ldots ,C_{k}},使得
- {\displaystyle C_{1}}是{\displaystyle M}在输入{\displaystyle \omega }上的起始格局,即{\displaystyle C_{1}=(F,q_{0},0)},其中
{\displaystyle F_{1}(i)={\begin{cases}\omega _{i}&0\leq i\leq n-1\\\square &{\mbox{otherwise}}\end{cases}}}
- {\displaystyle C_{i}\to _{M}C_{i+1}},其中{\displaystyle i=1,2,\ldots ,k-1};
- {\displaystyle C_{k}}是接受格局。
则称{\displaystyle M} 接受字符串{\displaystyle \omega },且{\displaystyle C_{1},C_{2},\ldots ,C_{k}}称为图灵机{\displaystyle M}在输入{\displaystyle \omega }上的接受计算历史。同理,若{\displaystyle C_{k}}是拒绝格局,则称{\displaystyle M} 拒绝{\displaystyle \omega },且{\displaystyle C_{1},C_{2},\ldots ,C_{k}}称为图灵机{\displaystyle M}在输入{\displaystyle \omega }上的拒绝计算历史。{\displaystyle M}所接受的所有字符串的集合称为{\displaystyle M}的语言,记作{\displaystyle L(M)}。
图灵机的例子
设{\displaystyle M=(\{0,1,10,11\},\{0,1\},\{0,1,\square \},\delta ,0,,)}和{\displaystyle \delta :\{0,1,10,11\}\times \{0,1\}\to \{0,1,10,11\}\times \{0,1\}\times \{R,L,E,S\}}. 比如做一个以1的个数表示数值的加法运算,在磁带上的数据是0000001110110000,就是3+2的意思。程序{\displaystyle \delta }如下:
- 0,0 -> 0,0R
- 0,1 -> 1,1R
- 1,0 -> 10,1R
- 1,1 -> 1,1R
- 10,0 -> 11,0L
- 10,1 -> 10,1R
- 11,0 -> E
- 11,1 -> 0,0S
第一行程序0,0->0,0R意思就是如果机器读到0,就将其变成0,状态变为0,读写头向右移动一格. R就是向右移动一格,L就是向左移一格,E是错误,S是停机. xx,y -> aa,b中xx是当前状态, y是当前格子的值, aa是程序下一步的状态, b是当前格的修改值。
虽然这里给出与上面不同形式的定义,但两者是等价的,这里的定义能完成的工作并不比上面的定义多。
步数 | 状态 | 磁带 | 步数 | 状态 | 磁带 | |
---|---|---|---|---|---|---|
1 | 0 | 0000001110110000 | 9 | 1 | 0000001110110000 | |
2 | 0 | 0000001110110000 | 10 | 1 | 0000001110110000 | |
3 | 0 | 0000001110110000 | 11 | 10 | 0000001111110000 | |
4 | 0 | 0000001110110000 | 12 | 10 | 0000001111110000 | |
5 | 0 | 0000001110110000 | 13 | 10 | 0000001111110000 | |
6 | 0 | 0000001110110000 | 14 | 11 | 0000001111110000 | |
7 | 0 | 0000001110110000 | 15 | 0 | 0000001111100000(停机) | |
8 | 1 | 0000001110110000 | -- 停机 -- |
通用图灵机
对于任意一个图灵机,因为它的描述是有限的,因此我们总可以用某种方式将其编码为字符串。我们用{\displaystyle \langle M\rangle }表示图灵机{\displaystyle M}的编码。
我们可以构造出一个特殊的图灵机,它接受任意一个图灵机{\displaystyle M}的编码{\displaystyle \langle M\rangle },然后模拟{\displaystyle M}的运作,这样的图灵机称为通用图灵机(Universal Turing Machine)。现代电子计算机其实就是这样一种通用图灵机,它能接受一段描述其他图灵机的程序,并运行程序实现该程序所描述的算法。
图灵机的变体
图灵机有很多变种,但可以证明这些变种的计算能力都是等价的,即它们识别同样的语言类。证明两个计算模型{\displaystyle A}和{\displaystyle B}的计算能力等价的基本思想是:用{\displaystyle A}和{\displaystyle B}相互模拟,若{\displaystyle A}可模拟{\displaystyle B}且{\displaystyle B}可模拟{\displaystyle A},显然他们的计算能力等价。注意这里我们暂时不考虑计算的效率,只考虑计算的理论上“可行性”。
首先我们可以发现,改变图灵机的带字母表并不会改变其计算能力。例如我们可以限制图灵机的带字母表为{\displaystyle \{0,1\}},这并不会改变图灵机的计算能力,因为我们显然可以用带字母表为{\displaystyle \{0,1\}}的图灵机模拟带字母表为任意有限集合{\displaystyle \Gamma }的图灵机。
另一个要注意的是,如果我们允许图灵机的纸带两端都可以无限伸展,这并不能增加图灵机的计算能力,因为我们显然可以用只有纸带一端能无限伸展的图灵机来模拟这种纸带两端都可以无限伸展的图灵机。
如果我们允许图灵机的读写头在某一步保持原地不动,那也不会增加其计算能力,因为我们可以用向左移动一次再向右移动一次来代替在原地不动。
其它的常见图灵机变种包括:
图灵可计算性
其它等价的计算模型
除了图灵机以外,人们还发明了很多其它的计算模型。包括:
然而这些模型无一例外地都和图灵机的计算能力等价,因此邱奇,图灵和哥德尔 提出了著名的邱奇-图灵论题:一切直觉上能计算的函数都可用图灵机计算,反之亦然。
参考文献
- Turing, A., On Computable Numbers, With an Application to the Entscheidungsproblem, Proceedings of the London Mathematical Society, Series 2, Volume 42, 1936; reprinted in M. David(ed.), The Undecidable, Hewlett, NY: Raven Press, 1965;
- Michael Sipser, Introduction to the Theory of Computation, PWS Publishing, 1997. ISBN 0-534-94728-X
外部链接
- Visual Turing, a Turing machine interactive simulator/IDE(free software for Windows)。
- Suzanne Brittons Turing Machine Simulator(java applet)。
- C++ Simulator of a Nondeterministic and Deterministic Turing Machine(free software)。
- Citations from CiteSeer
- 顾森讲解图灵机
|
|
图灵机(转自wiki)的更多相关文章
- scratch写的图灵机
大多数人对于scratch不感冒,因为觉得这是孩子玩的.的确,积木的方式不适合专业程序员写代码,然而别小看scratch,怎么说,它也是图灵完备的.而且,过程支持递归,虽然带不了返回值. 虽然计算速度 ...
- 烂泥:wiki系统confluence5.6.6安装、中文、破解及迁移
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb confluence是一个专业的企业知识管理与协同软件,可以用于构建企业wiki.通过它 ...
- Wiki安装(PHP +Sqlite+Cache)
前期准备 PHP http://windows.php.net/download WinCache Extension for PHP URL:http://sourceforge.net/pro ...
- Confluence Wiki -- 页面限制
Confluence Wiki 中 [页面设置] 应该如何理解? 当一个用户有这个权限后,这个用户可以对一个页面做限制,可以限制这个页面不能被其他用户浏览或编辑: 反之,如果没有这个权限,那么这个用户 ...
- working with fitnesse wiki pages
fitnesse提供一个简单易用的wiki创建一个web页面用于测试.测试页面有一个button,允许所有的测试在这个页面运行,因此任何人在任何时间都可以去这个页面点击这个按钮,查看测试是否通过.fi ...
- Wiki设置
在Wiki安装完成后,就wiki会提示下载LocalSettings.php文件,这是wiki的设置文件,当我们要对wiki进行设置的时候,就需要用到这个文件. 下面对常用的操作设置做简要讲解: —— ...
- Wiki安装
我们推荐使用Mediawiki. MediaWiki是基于php环境的,所以如果需要使用该类wiki,就要先部署php的环境. wiki下载: https://www.mediawiki.org/wi ...
- Wiki介绍
Wiki是一种高效的知识管理系统. 我们可以使用wiki构建自己的个人知识管理系统.
- iosOpenDev-install 失败官方wiki无法解决看这里(尝试有效)
https://github.com/kokoabim/iOSOpenDev/wiki/Troubleshoot http://blog.csdn.net/bluesky_03/article/det ...
随机推荐
- hiho一下 第四十九周 欧拉路
http://hihocoder.com/contest/hiho49/problem/1 给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,该条路称为欧拉路. 一个无向图存在欧拉路当且仅当 ...
- 常用的delphi 第三方控件
Devexpress VCL 这个基本上覆盖了系统界面及数据库展示的方方面面,是做桌面系统必备的一套控件,目前的版本是2011.2.3, 支持win32 及win64. AutoUpgrader 这个 ...
- Layui图标
layui 图标 layui 的所有图标全部采用字体形式,取材于阿里巴巴矢量图标库(iconfont).因此你可以把一个 icon 看作是一个普通的文字,这意味着你直接用 css 控制文字属性,如 c ...
- MongoDB小结23 - 索引简介
MongoDB中的索引,可以看作是书的目录. 想象一下给你一本没有目录的书,然后让你去查询指定内容,我只想说,我不是电脑,我很蛋疼! 让你翻没有目录的书,就跟让电脑查询没有索引的集合一样,从头查询到尾 ...
- laravel email markdown
laravel 邮件使用markdown php artisan make:mail lessonPublished --markdown="emails.published" 这 ...
- jquery datatable显示隐藏子表
<table id="parentTable"> <thead> <tr> <th> ...
- CSS (二)解析CSS盒子
话说.一写博客还有些莫名的兴奋感-- 这几天一直挤时间忙于赶牛腩视频,迟到的CSS盒子.请谅解. CSS盒子,一開始听起来还有点高大上的赶脚. 后来了解之后,发现事实上非常easy理解.从功能上讲非常 ...
- nodejs v8引擎c++编译版本号升级教程
原GCC版本号:4.4.7. 目标:升级GCC到4.8.2.以支持C++11. yum install gcc-c++ 获取GCC 4.8.2包:wget http://gcc.skazkaforyo ...
- jmeter实现Http接口测试介绍
构建一个测试页面 页面功能测试说到底就是模拟用户浏览点击页面的全过程,很多的测试工具都可以对该过程进行录制后模拟用户操作,而压力测试就是将这个过程在单位时间内重复成千上万次,看检测应用的高可用,接下来 ...
- MongDB应用
题外话 工作3年,了解的技术颇多,但都是一知半解,了解不是很透澈.用过的技术,就像猴子搬过的包谷,搬一个丢一个.几年风雨,真有点一缕清风过,片叶不沾身的味道. 为强化知识点,提升文档及学习能力,我把以 ...