不可解问题之停机问题(Undecidable Problem Halting Problem)
计算机技术已运用到人类生活的方方面面,帮助人类解决各种问题。可你是否有想过,计算机是否能为人类解决所有问题呢?
假如你是一个程序猿,你已编写过很多程序。有些程序一下子就能出结果,有些程序则好久都没有显示结果。你不知道这些程序到底最终是否会显示结果。你突然灵光一现---“能不能设计一个程序,用于检测任意程序最终会停止运行还是会无限运行下去”。这样,你就不用为了得到程序的结果而等很久,有时甚至还无法确定到底是不是程序本身出现了问题,导致程序无限循环。
说干就干,你为这一想法设计的思路如下:
定义一个all_mighty_program,其输入参数是需测试的程序本身和其输入
如果该程序最终停止运行,返回True
如果该程序最终无法停止运行,则返回False
然后你根据此写了一段伪代码(pseudocode):
def all_mighty_program (code, code_input):
if code (code_input) halts:
return True
else:
return False
那么有没有什么测试程序能使上面的这段伪代码失效呢?为此,你需要进行反证。
首先,需测试的程序有两种可能性:
1,该程序最终会返回某值
2,该程序会无限循环下去
对于第一种可能性:在某个条件下,该程序最终会返回某值,也就是说该程序最终会停止运行。
需要把这个条件设计成与上面的伪代码相反。既然上面的伪代码是测试程序最终停止运行返回True,那么把条件设计成:当上面的伪代码返回False时,测试程序最终会停止。
同样,对于第二种可能性:在某个条件下,该程序会无限循环下去,也就是说该程序最终会无限运行下去。
需要把这个条件设计成与上面的伪代码相反。既然上面的伪代码是测试程序最终无法停止运行返回False,那么把条件设计成:当上面的伪代码返回True时,测试程序最终会无限循环下去。
写成伪代码如下:
def code (code_input):
if all_mighty_program (code, code_input) is False:
return True
else:
loop forever
由此可以看出,这两段伪代码的逻辑是矛盾的。当all_mighty_program (code, code_input)是False时(也就是code会无限循环下去时),code (code_input)是返回True值的(也就是code最终会停止运行)。
停机问题(Halting Probelm)是决定任意程序最终是会停止运行还是会无限运行下去的问题。
Alan Turing在1963年就证明,没有这样一个通用的算法存在,此算法在所有可能的输入参数下可以解决停机问题。
不可解问题之停机问题(Undecidable Problem Halting Problem)的更多相关文章
- The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online -C:Halting Problem(模拟)
C Halting Problem In computability theory, the halting problem is the problem of determining, from a ...
- Halting Problem
Halting Problem: 传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4049 总结一个小规律:题目中给的 ...
- lightoj 1102 - Problem Makes Problem
1102 - Problem Makes Problem As I am fond of making easier problems, I discovered a problem. Actuall ...
- light oj 1102 - Problem Makes Problem组合数学(隔板法)
1102 - Problem Makes Problem As I am fond of making easier problems, I discovered a problem. Actuall ...
- 停机问题(英语:halting problem)是逻辑数学中可计算性理论的一个问题。通俗地说,停机问题就是判断任意一个程序是否能在有限的时间之内结束运行的问题。该问题等价于如下的判定问题:是否存在一个程序P,对于任意输入的程序w,能够判断w会在有限时间内结束或者死循环。
htps://baike.baidu.com/item/停机问题/4131067?fr=aladdin 理发师悖论:村子里有个理发师,这个理发师有条原则是,对于村里所有人,当且仅当这个人不自己理发,理 ...
- (light oj 1102) Problem Makes Problem (组合数 + 乘法逆元)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1102 As I am fond of making easier problems, ...
- LightOJ - 1102 - Problem Makes Problem(组合数)
链接: https://vjudge.net/problem/LightOJ-1102 题意: As I am fond of making easier problems, I discovered ...
- P与NP问题详解
P,NP,NPC问题,这或许是众多OIer最大的误区之一. 本文就为大家详细讲解如上三个问题. 前序: 你会经常看到网上出现“这怎么做,这不是NP问题吗”.“这个只有搜了,这已经被证明是NP问题了”之 ...
- NP问题/NP完全问题(NP-complete problem)如何判断是否是NP完全问题
在算法复杂度分析的过程中,人们常常用特定的函数来描述目标算法,随着变量n的增长,时间或者空间消耗的增长曲线,近而进一步分析算法的可行性(有效性). 引入了Big-O,Big-Ω,来描述目标算法的上限. ...
随机推荐
- 二十二:制作app的时候超出部分不能滑动
给需要滑动的区域写以下样式(父级是浏览器) position: absolute; left: 0; right: 0; bottom: 0; top: 0; overflow-x: hidden; ...
- 通过this()调用有参构造方法
使用原因:在通过无参构造方法实例化对象时,如果有属性可以设置默认值,可通过在无参构造方法中使用this()调用有参构造方法实现. this()需要写在无参构造方法的第一行! 例子:在没有给出小猫的名字 ...
- python获取当前日期时间
转载自:https://www.cnblogs.com/wenBlog/p/6023742.html 在Python里如何获取当前的日期和时间呢?在Python语言里,我们可以通过调用什么模块或者类函 ...
- Innodb 实现高并发、redo/undo MVCC原理
一.并发控制 因为并发情况下有可能出现不同线程对同一资源进行变动,所以必须要对并发进行控制以保证数据的同一与安全. 可以参考CPython解释器中的GIL全局解释器锁,所以说python中没有 ...
- JS_左边栏菜单
需求: 要求实现左边栏菜单点击一下就弹开,其他的隐藏.再点击一下就隐藏. 最多只能有一个菜单的详细内容会显示出来. 三个菜单实现联动效果. 代码如下: 1 <!DOCTYPE html> ...
- python_format格式化输出、while else、逻辑运算符、编码初识
1.格式化输出 .%d %s 格式化输出:% 占位符,d 表示替换整型数,s表示要替换字符串. name = input('请输入名字:') age = input('请输入年龄:') sex = ...
- Python3练习题求1000以内所有3和5的倍数的总和
sum = 0 for i in range(1,1000): if i%3 == 0 or i%5 == 0: sum += i print(sum)
- oracle小记:dba_data_files
今天给表空间扩展的时候,使用了dba_data_files进行查询.查阅了网上的资料. 该系统系统中含有以下字段 每个字段的含义如下:
- array_filter、array_walk、array_map的区别
<?php $arr=array( 1,2,3,4,5,6 ); function filter($var){ if($var%2==0) return true; } $data=array_ ...
- [官网]CREATE EXTENSION PostGreSQL 创建函数的方法
CREATE EXTENSION https://www.postgresql.org/docs/current/sql-createextension.html CREATE EXTENSION — ...