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

2023-10-23 08:40

本文主要是介绍分享本周所学——停机问题与可计算性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        大家好,欢迎来到《分享本周所学》第七期。本人是一名人工智能初学者,刚刚大一。大一学校里学的课程主要还是偏理论方面的,我感兴趣的人工智能方面的课程到大二才会开,所以目前只能自己瞎搞搞研究,最近在做点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://www.chinasem.cn/article/266742

相关文章

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

Python中处理NaN值的技巧分享

《Python中处理NaN值的技巧分享》在数据科学和数据分析领域,NaN(NotaNumber)是一个常见的概念,它表示一个缺失或未定义的数值,在Python中,尤其是在使用pandas库处理数据时,... 目录NaN 值的来源和影响使用 pandas 的 isna()和 isnull()函数直接比较 Na

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,