创业日记day641 图灵停机问题
让计算机执行一个“寻常的”程序,比如计算 1+2+3+…… 这么一直加到比如说 10000,只要计算机的内存足够大,只要你给的最后一个数是有限的,只要你愿意等待足够长的时间,它就终有算完、停机、输出一个结果的时候。
但是有些程序,却是永远都不会停机的。比如你可以让计算机一直循环执行下面这个命令:在屏幕上打印“你好”
那么你就会看到计算机不断地打印“你好”这两个字。你要是不主动杀死这个程序,它就不会停机,它陷入了“死锁”。“死锁”是程序员的噩梦,有时候写程序说不定哪里没设计好,程序一运行起来就陷入了死锁。
所以程序员就有一个美梦。有没有一个什么软件工具,能够直接看一眼我写的程序,就自动判断它会不会出现死锁呢?
这就是“图灵停机问题”。也就是说,有没有这样一个程序,它的输入是任何一段代码和这段代码的输入参数,而它的输出则是这段代码所代表的程序,在那个参数之下运行起来之后会不会自动停机 —— 如果判断会停机,就输出“1”;如果判断不会停机、会死锁,就输出“0”。
想要做到这一点,这个判断程序必须只读、而不能去执行那段代码 —— 因为如果执行,而那段代码又真的不停机的话,计算机就会陷入死锁,这个判断程序就不能输出“0”了。换句话说,这个判断程序得能像一个高水平程序员一样,看一眼你写的代码就知道其中有没有死锁。如果有这么一个判断程序,岂不就是一个绝佳的 debug 工具吗?
而图灵告诉你别做梦了,不存在的。
在理论上就不可能存在那样的判断程序。这是一个不可计算的问题。
为什么呢?证明非常简单,反证法。以下为了行文方便我不得不使用一点编程语言
我们假设存在这么一个判断程序,称为 Halt(p, I)。其中 p 是 Halt 要判断是否停机的代码,I 是程序 p 的输入。
也就是说,如果程序 p 运行输入值 I 的时候会停机,那么 Halt(p,I) = 1;否则,Halt(p,I) = 0.
好,那么我们构造下面这么一个新程序 [1],称之为 Z:
Program (x)
If Halt(x, x) then
永远循环
Else 停机
End.
我解释一下。Z 的输入,是任意的一段字符串 x。x 可以是一段程序的代码,也可以是一段程序的输入。Z 的规则是,如果 Halt(x,x) 是 1,则 Z 就永远循环下去,不停机;如果 Halt(x,x) 是 0,则 Z 就停机。
那么请问,像这样的一个程序 Z,如果把它的代码自身,作为它的输入,会怎样呢?它会停机吗?
如果会停机,那就意味着 Halt(Z,Z) = 1,对吧?可是你带入 Z 的规则之中,这时候 Z 就应该不停机。反过来说,如果 Z 不会停机,那么 Halt(Z,Z) = 0,带入规则之后 Z 又会停机!悖论!
所以 Halt 这样的程序,根本就不可能存在。证明完毕。
这个证明是否让你想起了我们讲逻辑思维的时候说过的“理发师悖论”。Z 就是那个“只给不给自己理发的人理发的理发师”。这个悖论的关键点就在于,一段代码,既是可执行的程序,又可以作为输入的字符串。所以我理解,这个矛盾的根源在于,写代码和判断代码,都是能用语言描述的行为。
让计算机执行一个“寻常的”程序,比如计算 1+2+3+…… 这么一直加到比如说 10000,只要计算机的内存足够大,只要你给的最后一个数是有限的,只要你愿意等待足够长的时间,它就终有算完、停机、输出一个结果的时候。
但是有些程序,却是永远都不会停机的。比如你可以让计算机一直循环执行下面这个命令:在屏幕上打印“你好”
那么你就会看到计算机不断地打印“你好”这两个字。你要是不主动杀死这个程序,它就不会停机,它陷入了“死锁”。“死锁”是程序员的噩梦,有时候写程序说不定哪里没设计好,程序一运行起来就陷入了死锁。
所以程序员就有一个美梦。有没有一个什么软件工具,能够直接看一眼我写的程序,就自动判断它会不会出现死锁呢?
这就是“图灵停机问题”。也就是说,有没有这样一个程序,它的输入是任何一段代码和这段代码的输入参数,而它的输出则是这段代码所代表的程序,在那个参数之下运行起来之后会不会自动停机 —— 如果判断会停机,就输出“1”;如果判断不会停机、会死锁,就输出“0”。
想要做到这一点,这个判断程序必须只读、而不能去执行那段代码 —— 因为如果执行,而那段代码又真的不停机的话,计算机就会陷入死锁,这个判断程序就不能输出“0”了。换句话说,这个判断程序得能像一个高水平程序员一样,看一眼你写的代码就知道其中有没有死锁。如果有这么一个判断程序,岂不就是一个绝佳的 debug 工具吗?
而图灵告诉你别做梦了,不存在的。
在理论上就不可能存在那样的判断程序。这是一个不可计算的问题。
为什么呢?证明非常简单,反证法。以下为了行文方便我不得不使用一点编程语言
我们假设存在这么一个判断程序,称为 Halt(p, I)。其中 p 是 Halt 要判断是否停机的代码,I 是程序 p 的输入。
也就是说,如果程序 p 运行输入值 I 的时候会停机,那么 Halt(p,I) = 1;否则,Halt(p,I) = 0.
好,那么我们构造下面这么一个新程序 [1],称之为 Z:
Program (x)
If Halt(x, x) then
永远循环
Else 停机
End.
我解释一下。Z 的输入,是任意的一段字符串 x。x 可以是一段程序的代码,也可以是一段程序的输入。Z 的规则是,如果 Halt(x,x) 是 1,则 Z 就永远循环下去,不停机;如果 Halt(x,x) 是 0,则 Z 就停机。
那么请问,像这样的一个程序 Z,如果把它的代码自身,作为它的输入,会怎样呢?它会停机吗?
如果会停机,那就意味着 Halt(Z,Z) = 1,对吧?可是你带入 Z 的规则之中,这时候 Z 就应该不停机。反过来说,如果 Z 不会停机,那么 Halt(Z,Z) = 0,带入规则之后 Z 又会停机!悖论!
所以 Halt 这样的程序,根本就不可能存在。证明完毕。
这个证明是否让你想起了我们讲逻辑思维的时候说过的“理发师悖论”。Z 就是那个“只给不给自己理发的人理发的理发师”。这个悖论的关键点就在于,一段代码,既是可执行的程序,又可以作为输入的字符串。所以我理解,这个矛盾的根源在于,写代码和判断代码,都是能用语言描述的行为。
【Irpin死于炮击的一家人更多信息】硅谷正在热炒此事,因为有分部在硅谷的创业企业SE Ranking公司证实,其中那名女子是他们43岁的首席会计师 Tatiana Perebeinis ,及她 9 岁的女儿 Alise 和 18 岁的儿子 Nikita。丈夫Sergii Perebeinis 还在抢救(更正:这男子是同行的28岁的Anatoly,最初被误认为她丈夫。其实她丈夫在顿涅茨克,正试图赶往基辅料理后事,并发FB说“他们夺走了一切”,两条狗也一死一截肢)。她们在沿着双方承诺的“绿色通道”试图撤离小镇时被炮击身亡。她回Irpin看生病的母亲,没能早走。
照片细看其实衣服是破损的,羽绒服外露的浅色羽绒可能就是穿孔,连拉杆箱的杆子都断裂了,而一些黑点似乎是破片杀伤的痕迹,加上冬天衣服厚,看到的流出的血迹不多吧。
其实乌克兰人创办的IT企业很多,比如著名在线语法工具Grammarly创始人就是乌克兰人。乌程序员Serhiy Storchaka是Python最主要的贡献者之一。所以有个玩笑:“为何东欧出程序员?你想想冬天又冷又漫长,可不躲屋子里编程么!”#乌克兰局势# #关注俄乌局势最新进展# #微博新知博主#
照片细看其实衣服是破损的,羽绒服外露的浅色羽绒可能就是穿孔,连拉杆箱的杆子都断裂了,而一些黑点似乎是破片杀伤的痕迹,加上冬天衣服厚,看到的流出的血迹不多吧。
其实乌克兰人创办的IT企业很多,比如著名在线语法工具Grammarly创始人就是乌克兰人。乌程序员Serhiy Storchaka是Python最主要的贡献者之一。所以有个玩笑:“为何东欧出程序员?你想想冬天又冷又漫长,可不躲屋子里编程么!”#乌克兰局势# #关注俄乌局势最新进展# #微博新知博主#
一台电脑,24小时,一套零代码开发工具,会产生怎样的化学反应?
餐饮门店经理可以做一套餐饮ERP,税务所CEO可以做一套税务管理系统,程序员甚至能做出一个前后端同步的网站。 无论是开发者还是非开发者,都有无限可能!
普华永道与明道云联合主办的「企业级零代码黑客马拉松大赛」正式启动:https://t.cn/A66GXEpp欢迎各行各业的工作者发挥创造力和技术能力,用零代码产出风采各异的作品,赢取“苹果全家桶”!
餐饮门店经理可以做一套餐饮ERP,税务所CEO可以做一套税务管理系统,程序员甚至能做出一个前后端同步的网站。 无论是开发者还是非开发者,都有无限可能!
普华永道与明道云联合主办的「企业级零代码黑客马拉松大赛」正式启动:https://t.cn/A66GXEpp欢迎各行各业的工作者发挥创造力和技术能力,用零代码产出风采各异的作品,赢取“苹果全家桶”!
✋热门推荐