分享本周所学——停机问题与可计算性

article/2025/8/29 5:15:04

        大家好,欢迎来到《分享本周所学》第七期。本人是一名人工智能初学者,刚刚大一。大一学校里学的课程主要还是偏理论方面的,我感兴趣的人工智能方面的课程到大二才会开,所以目前只能自己瞎搞搞研究,最近在做点AI作曲之类的项目。最近学校在学关于停机问题的一些分析。停机问题是个挺经典的问题,我觉得还挺有意思的,就想和大家分享一下。

        读懂这篇文章需要你知道任意一个语言的基本语法并了解循环结构。

目录

啥是停机问题啊

1. 停机问题的定义

2. 停机问题的分析

3. 停机问题的意义与重要性

4. 我个人对于停机问题的思考


上期文章链接:

分享本周所学——概率论:贝叶斯更新详解

本期封面:


啥是停机问题啊

        不知道大家有没有遇到过这样的问题:编程的时候写一个while循环,然后忘了在循环里面给循环变量赋值了,结果导致程序陷入死循环了,永远都停不下来。这个时候我们一般需要手动让程序停下来。我在刚接触编程那会老是犯这种错误。停机问题就和这种程序进入死循环的情况有很大的关联。

1. 停机问题的定义

        为了解决程序可能陷入死循环的问题,我们希望存在一个能够判断程序是否会进入死循环的程序。我们定义这个用来判断一个程序是否会进入死循环的程序为程序P。对于任意程序p和输入i而言,P(p,i)可能返回两个结果:true和false。如果返回结果为true,代表如果在运行程序p时将i作为输入,那么程序p会陷入死循环;如果为false,则代表p不会陷入死循环。

        现在我们定义另一个程序P^+。假设有一个程序p可以接收一个程序作为输入,那么它就可以将自己作为自己的输入(这在现实中是可行的,比如Pascal的编译器可以用Pascal来书写)。对于这样的一个程序p,我们调用P(p,p)。如果P(p,p)为true,那么P^+(p)会强制终止程序执行;如果P(p,p)为false,P^+(p)会执行一个死循环。P+可以用以下代码来表示:  

# P_plus.py
import sysdef P(p, i):# 判断将i输入程序p是否会导致死循环passif __name__ == '__main__':# 读取程序pif P(p, p):sys.exit()while True:continue
// P_plus.cpp
bool P(char* p, char* i) {// 判断将i输入程序p是否会导致死循环
}int main() {// 读取程序pif (P(p, p))return 0;while (true)continue;
}

        那现在问题来了,如果将P^+输入P^+,会发生什么呢?也就是说,P^+ \left ( P^+ \right )会得到什么运行结果?

2. 停机问题的分析

        想要知道P^+ \left ( P^+ \right )的执行结果,我们需要先知道P \left ( P^+ , P^+ \right )的执行结果。我们假设P \left ( P^+ , P^+ \right )为true,也就是说,P^+ \left ( P^+ \right )会导致P^+陷入死循环。这时,我们会强制终止运行,这样一来,P^+就不会陷入死循环了,这与上面说到的P^+ \left ( P^+ \right )导致P^+陷入死循环矛盾。

        如果我们假设P \left ( P^+ , P^+ \right )为false,也就是P^+ \left ( P^+ \right )不会导致P^+陷入死循环,那么P^+就会执行一个死循环,这与上面说的P^+ \left ( P^+ \right )不会导致P^+陷入死循环矛盾。

        因此,无论如果,这个程序在运行过程中都会产生自相矛盾的结果,那么我们就可以得到一个结论:程序P,也就是判断一个程序是否进入死循环的程序,是不存在的。

3. 停机问题的意义与重要性

        停机问题给人的感觉就像一个程序员版的理发师悖论。那这个问题除了好玩之外,能不能说明什么问题呢?

        我认为停机问题说明的最主要的问题就是,计算机并不是无所不能的。自从上世纪40、50年代,人们用错综的电子管和磁带编织成世界上最初的一批计算机开始,人类的计算机技术就在以极快的速度不断发展。如果有一天,极为精巧的电路设计和皮米甚至飞米级别的制造工艺使得计算机的储存空间和运算速度达到几乎无限,到那时,计算机能解决宇宙中的一切问题吗?答案是否定的,停机问题就是一个很好的反例。

        这也引入了计算机领域一个很重要的概念——可计算性。一个问题是否是“可计算的”,取决于它能否用计算机来解决。我们这里讨论的停机问题,就是一个不可计算的问题。

4. 我个人对于停机问题的思考

        以下纯属个人有感而发,而且纯属瞎想,不想看的话可以跳过(指直接去结尾给我点赞)。

        我们来思考这样一个问题:人类是否能够判断一个程序是否会陷入死循环?

        这个问题似乎让停机问题变得更加哲学了。稍微思考一下,人类似乎可以判断一个程序是否会陷入死循环。对于一些简单的程序,比如C++中的“while (true) continue;”,我们一眼就看出来这必然是个死循环。对于稍微复杂一点的程序,我们稍微研究分析一下,也能给出一个正确的结论。

        但是人类是怎么思考的呢?人类的思考是通过人脑中的几百亿个神经元互相连接,通过几十种神经递质传递信息来完成的。然而,每一个神经元的运作方式都是固定的,现代的神经科学也已经对单个神经元的运作方式有了比较透彻的了解。那么,我们是不是也可以推断,大脑中的几百亿个神经元互相连接,它们作为一个整体的运作方式也是固定的?换句话说,我们人类的运作方式,是不是也是固定的?如果真是这样,那么人类是不是和计算机没有区别?

        我们甚至也可以把人类看作一种程序,我们接收的输入来自自然环境,比如光线、声波以及我们接触和摄入的各种物质,而我们的大脑会根据一个固定的机制对这些输入作出回应。

        再回到刚才的问题。假设我们把“人类判断一个程序是否会陷入死循环”这一过程称为过程P,把人类在阅读一个程序时接收到的一系列视觉信号称为p,把被判断的程序接收到的输入称为i,那么P(p,i)是有解的吗?

        这就交给各位来思考了。


http://chatgpt.dhexx.cn/article/sFXUnbJb.shtml

相关文章

停机问题--The Halting Problem

http://www.juniata.edu/faculty/rhodes/intro/theory2.htm 看停机问题时,觉得它跟我国的“以子之矛攻子之盾”的想法很相似 也跟C语言的struct内不能包含自身很相似 停机问题描述:是否存在这样的一段代码H,这段代码H以任意的代码P作为输入&…

优雅停机方案

springboot优雅停机 概述线上重启面临的问题常见问题解决方案思路 优雅停机相关知识Linux中断ShutdownHookSpringCloud对优雅停机的处理机制SpringBoot ApplicationContext生命周期Spring Bean生命周期服务注册生命周期Ribbon自动重试服务发现的心跳检测Ribbon负载均衡 tomcat的…

多中间件优雅停机问题处理

事情是这样的,小明是一个工作五年的老程序员,半秃着的头已经彰显了他深不可测的技术实力。 这一天,小明收到了领导给过来的一个需求。 领导对小明说:“小明啊,你工作五年了,这个需求我交给你一个人负责很是…

图灵机停机问题的不可判定性

Turing Machine Halting Problem 停机问题:指判断任意一个程序是否能在有限的时间之内结束运行的问题。图灵机停机问题是不可判定的,意思即是不存在一个图灵机能够判定任意图灵机对于任意输入是否停机。 证明一: 参考链接:Turin…

服务优雅停机

优雅停机 ​ 什么是优雅停机 ​ 优雅停机指的是Java项目在停机时需要做好断后工作。如果直接使用kill -9 方式暴力的将项目停掉,可能会导致正常处理的请求、定时任务、RMI、注销注册中心等出现数据不一致问题。 ​ 如何解决优雅停机呢?大致需要解决如…

停机问题的理解

关于停机问题维基百科给出的定义是: 停机问题(halting problem)是逻辑数学中可计算性理论的一个问题。通俗的说,停机问题就是判断任意一个程序是否会在有限的时间之内结束运行的问题。该问题等价于如下的判定问题:给…

静态变量的使用

静态变量:即类中的静态变量 类变量被其他方法使用 不管是被自己类的方法使用,还是被其他类的方法使用 都可以直接使用,不需要实例化对象即可使用。通过类名调用。 (遵守访问修饰符) 类变量只能通过类方法初始化。 普通变量被其他方法使用 …

类变量/静态变量

类变量 引入类变量 案例引出类变量: 有几个小孩在玩游戏,不时会有其他的小孩加入一起玩。怎么统计一共有多少小孩在玩? 按照现有的知识,可以设计一个小孩类,定义一个加入的方法。然后在主程序类的main方法中&#xf…

变量、常量、静态变量、静态常量

1、变量 在JAVA中我们通过三个元素来描述变量:变量类型,变量名以及变量值。 String love“imooc”; 变量类型 变量名 值(其中String具有不可变性,重新赋值后会生成新的String对象,love变量名这实际是指向对象地址的引用…

类中静态变量

不能在类声明中 初始化静态变量,这是因为声明描述了如何分配内存,但并未实际分配内存。 对于静态类成员,无论这个类的对象有多少个,静态成员都只有一个 对于静态类成员,可以在类声明之外使用单独的语句来进行初始化。…

静态变量和实例变量的区别

静态变量和实例变量的区别 大家好,我是酷酷的韩~ 1.在语法定义上的区别: 静态变量前要加static关键字,而实例变量前则不加。 2.在程序运行时的区别: (1)实例变量属于某个对象的属性,必须创建了实例对象,其中的实例…

JAVA静态变量是什么

java静态变量是什么-Java基础-PHP中文网 在java中,静态变量指的是被static修饰的类的变量;静态变量被所有类实例对象所共享,在内存中只有一个副本,当且仅当在类初次加载时会被初始化。 本教程操作环境:windows7系统、j…

静态变量与动态变量

0.静态存储与动态存储 1)静态存储变量通常是在变量定义时就分定存储单元并一直保持不变,直至整个程序结束。静态变量,全局动态变量都是静态存储 2)动态存储变量是在程序执行过程中,使用它时才分配存储单元&#xff0…

C++之static,静态变量

目录 1.为什么要用静态变量 2.全局变量 3.静态局部变量 4.静态数据成员的空间开辟 5.静态数据成员 6.释放 7.总结 1.内存: 2.初始化: 3.最大的优点: 4.指针: 5.释放时机: 1.为什么要用静态变量 前面我们定义…

C++静态变量

静态变量(Static Variables)是在程序运行期间保持其存在和值的变量,不会随着函数的调用而销毁和重新创建。静态变量在内存中分配一次,并且在整个程序的生命周期中保持存在。 在 C 中,静态变量可以声明在函数内部、类内…

win10显示rpc服务器不可用,win10系统RpC服务器不可用的详细办法

win10系统使用久了,好多网友反馈说win10系统RpC服务器不可用的问题,非常不方便。有什么办法可以永久解决win10系统RpC服务器不可用的问题,面对win10系统RpC服务器不可用的图文步骤非常简单,只需要1、使用netsh interface ip add 添…

w7系统显示rpc服务器不可用,教你win7系统rpc服务器不可用怎么办

用户在使用电脑进行时间同步,安装打印机或者其它的操作的时候可能会遇到同样一个问题,那就是提示“RPC服务器不可用”,很多朋友可能对于RPC并不了解,更不知道如何解决,下面,小编就来跟大家讲解rpc服务器不可…

计算机无法登陆提示rpc服务器不可用,电脑rpc服务器不可用,教你电脑rpc服务器不可用怎么解决...

有网友表示进入磁盘管理对磁盘进行分区、更改盘符或压缩卷等操作的时候出现“RPC服务器不可用”的报错,rpc服务器不可用怎么办?很多朋友可能对于RPC并不了解,下面小编教你电脑rpc服务器不可用怎么解决吧。 rpc服务器不可用怎么办 打开“运行”窗口&…

rpc服务器不可用自动重启,rpc服务器不可用_详细解决方法,彻底修复

通过测试证明,“rpc服务器不可用”可能是由于中了冲击波和震荡波导致。 虽然这个是很老的病毒,但还是有小部分用户没有对系统没有进行升级导致出现“rpc服务不可用”情况。 电脑遭到冲击波可能会出现以下症状: 1、系统资源紧张,应用程序运行速度异常。 2、Word、Excel、Pow…

rpc服务器不可用桌面图标消失,rpc服务器不可用,教您rpc服务器不可用怎么办

有网友表示进入磁盘管理对磁盘进行分区、更改盘符或压缩卷等操作的时候出现“RPC服务器不可用”的报错,通常我们在安装打印机或者虚拟磁盘时,将出现此提示。下面,小编给大家介绍rpc服务器不可用的处理技巧。 用户在使用电脑进行时间同步&…