【笔记】可计算理论
下接 复杂性理论
计算模型
Def. 确定图灵机 (Deterministic Turing Machine, DTM)
7 元组,记作 ,其中
- 是有穷状态集合
- 是有穷输入符号集合
- 是有穷带上符号集,
- 是图灵机的起始状态
- 是停机(接受)状态集合
- 是空字符
- 是形如 的转移函数
例如, 定义动作:当机器处于状态 ,并且带头指向格子内容为 时,执行:将 改成 ,进入状态 ,带头左移一格
停机,当且仅当 进入接收状态,或者找不到可用的转移规则
图灵机计算过程的瞬时描述 (ID),形如:,表示:
- 图灵机的当前状态是
- 图灵机带上的内容为
- 图灵机的带头正在扫描
瞬时描述的移动,即图灵机的一步计算,表示为 ;多次移动(多步计算)可以表示为
Def. 图灵机 的语言( 识别的语言)
给定图灵机 和字符串 ,如果存在 的瞬时描述序列 ,满足如下条件,则称 接受 :
- 是 初始状态的瞬时描述,为
- 是 的某个接受状态
接受的字符串集合称为 的语言,或 识别的语言,记作
显然,若 ,则 要么停机且拒绝,要么永远不停机
图灵机有很多变种,它们彼此等价(所谓等价,指两者识别相同的语言类,或者证明它们可以互相模拟)
例如,我们可以令带头动作变为 ,但它不能比原本的图灵机更好,因为我们可以简单地用 模拟 ;
我们再介绍几个变种:
- 多带图灵机:它有 个带,各自具有读写头;开始时我们的输入放在第一个带上,其他带是空白的,转移函数为
显然,这 个带子可以视为在一个带子上用某个指定分隔符隔开的 个段;并且我们可以用一个技巧描述这个带上各段当前所指字符:只需为字符 引入 即可,毕竟我们的字符集是有限的;于是我们可以用单带模拟多带,从而两者是等价的
单带图灵机模拟多带图灵机时间代价:平方级别 - 非确定图灵机:转移函数形如 ;而字符串 被接受当且仅当存在转移序列使得
在之后关于“可计算性”的讨论中,我们将“问题”视为一种“语言”,将“算法”视为一种“图灵机”,从而我们考虑的是“某个图灵机之于某个语言”
这是因为,我们总能将问题的输入对象进行编码(下文用 表示),并尝试在其上运行一个能识别它的图灵机(或者不存在、或者不停机)
算法又何以成为图灵机?我们直接认为,我们对算法的直观概念,等价于图灵机算法(丘奇-图灵论题),它的一个常见表述是:
丘奇-图灵论题
每个有效计算都可以由一台图灵机完成。
可计算理论 Theory of Computability
识别/判定
注意到图灵机语言的定义,并没有讨论永不停机的情况,从应用的角度,不停机就不是算法了;因此我们基于“识别”,引入不停机的条件,进一步提出“判定”概念
Def. 图灵机 的语言( 识别的语言)
接受的字符串集合称为 的语言,或 识别的语言,记作
Def. 图灵机 的语言( 判定的语言)
如果图灵机 是始终停机的(称为判定器),那么也称 为图灵机 判定的语言
进一步地,我们用图灵机的识别/判定行为,定义语言种类
Def. 图灵可识别语言 (Turing‐Recognizable Language)
如果存在图灵机 识别语言 ,那么 是一个图灵可识别语言 Turing-recognizable
Def. 图灵可判定语言 (Turing‐Decidable Language)
如果存在图灵机 判定语言 ,那么 是一个图灵可判定语言 Turing-decidable
Th. 判定 识别
如果图灵机 判定 ,那么 一定识别
如果语言 是图灵可判定的,那么 一定是图灵可识别的
现在我们回到所谓“可计算”上:对于某个问题,它具有无穷个实例 instance,而我们关注的是这个问题是否有算法。
而现在,我们将问题视作语言 language,将实例视作字符串 string,那么,这个问题能否计算,就转化为是否存在一个(某种)图灵机能判定这个语言
当然,所谓 “给定一个(某种)图灵机,能否判定一个语言” 本身也是一个问题,也能用语言描述,因此我们引入一般的表达形式:
我们用 表示编码,它只需要我们事先约定即可,关于它的细节一般不再赘述,下文同理
Def. 问题 语言
考虑一个问题:“检测对于一个特定的图灵机 和一个给定的串 ,命题 是否成立”
对它,先将所有成立的二元组 的编码的集合视作语言 :
从而,证明命题 成立,等价于证明 ,从而我们用语言 等价描述了上述的问题
例如,可以令命题为 为 “ 接受 ”;进而,要证明该命题可计算(即 M 判定 w 可以在有限时间得出该命题是否成立;这和 判定 还是有区别的),等价于证明 是可判定的
此外,图灵机就是算法,图灵机可以调用图灵机(实现方法为模拟被调用图灵机的运行),这个思路需要多加强调
例如,现在有一个问题:“给定一个 DFA 和一个串 ,判断 是否接受 ”
现在考虑语言
那么:
- 该问题判断 “ 是否接受 ”,等价于判断 是否属于 ;
- 要证明该问题是可解的,等价于证明 是可判定的(证明只需设计图灵机 在 上模拟 运行即可,这个图灵机就是这个问题的算法)
我们再为可识别/可判定介绍等价概念:递归可枚举的、递归的
Def. 枚举图灵机
枚举图灵机 (enumerator) 是一个多带图灵机:
- 初始状态,工作带为空,即无输入
- 有一条特殊输出带,带头只能右移,在输出带上顺序打印有穷长度的字符串,字符串的数目可能是无穷的,字符串可以重复打印
例如,可以按照如下方式工作:- 运行中进入一个特殊的状态 ,该状态将工作带上的内容复制到输出带上,利用 字符分隔
- 复制后,机器返回常规状态继续运行
- 枚举图灵机 的语言 ,也称为 枚举
实际上,枚举图灵机 和图灵机 可以互相模拟;分类讨论:
- 与一般图灵机(非判定器)相互模拟的枚举图灵机,它不能按字典序输出字符串(否则存在判定器判定它的语言,原因见下):
- 若有 枚举 ,则构造 ,对于输入 :运行 ,并将其每次的输出与 比较,若匹配则接受,否则继续(显然若 ,则 无法停机)
- 若有 识别 ,则构造 ,按字典序依次枚举 的所有字符串 ;如果我们简单地依次对每个字符串运行 ,那要是 不停机了怎么办呢?我们可以限制 的运行次数,让其强行停机——迭代,每次对前 个字符串 ,依次送入 且分别至多运行 步,若某个字符串被接受则输出——此时每个 会被输出无穷次(当然,输出前扫一遍之前的输出,可以令只输出一次)
- 与判定器相互模拟的枚举图灵机,它可以按字典序输出字符串:
- 若有 枚举 ,则构造 同上,此时由于 按字典序输出,则 只需多加判断字典序大小并及时退出,故必定能停机
- 若有 识别 ,则构造 ,按字典序依次枚举 的所有字符串 ,并依次对每个字符串运行 ,且 必定停机
根据上述方法,我们又证明了两组等价关系:
Def. 递归可枚举语言 (recursively enumerable, r.e.)
如果存在枚举图灵机 满足 ,那么 是递归可枚举语言
Th. 递归可枚举 图灵可识别
语言 是递归可枚举的,当且仅当 是图灵可识别的
Def. 递归语言 (recursive)
如果存在枚举图灵机 满足 ,并且 以字母序打印 ,则称 是递归语言
Th. 递归 图灵可判定
语言 是递归的,当且仅当 是图灵可判定的
因此,从问题看,有等价关系:可计算 可判定 递归语言
现在让我们回到可判定、可识别语言上,我们考虑一下运算封闭性:
Th. 可判定(可识别)语言的运算封闭性
已知语言 和 是可判定(可识别)的,则如下语言是可判定(可识别)的:
- ,
- 关于补操作 :
- 可判定语言对补操作封闭
- 可识别语言对补操作不封闭(无法停机无法对应构造使得对该字符串停机)
但是倘若 均为可识别,则 均为可判定,证明显然,只需同时运行 ,至少有一个停机;事实上有定理:
Th. 图灵可判定等价条件
语言 是图灵可判定的,当且仅当 及其补语言 均是图灵可识别的
总结一下,现在我们根据可识别、可判定,对一个语言 做出如下分类:
- 和 都是图灵可识别的,即都是图灵可判定的
- 是图灵可识别的, 不是图灵可识别的
- 是图灵可识别的, 不是图灵可识别的
- 和 都不是图灵可识别的
对这些类别,接下来我们分别讨论
不可识别
首先,是否存在不可识别语言呢?
从计数可以证明是存在的:语言的个数为 ,是不可数的( 可数);而可以对图灵机进行编码,使得每个图灵机至少与一个 01 串对应,故图灵机可列,等价于自然数,是可数的;因此语言数量远多于图灵机数量,一定存在某个语言不对应任何一个图灵机,证毕
另外,介绍一种图灵机编码方式(编码只是到 的一种映射罢了)
以 为例:
记
则 编码为
假设图灵机 有 条转移规则,则将 编码为
显然,每个图灵机对应有限个 01 串,每个 01 串不一定是一个合法图灵机
既然存在,那么又如何证明一个语言的不可识别呢?可以考虑对角化方法,或者归于某个已知不可识别语言的可识别性
给出一个不可识别语言的例子:
Def. 对角化语言
表示按字典序第 个字符串 编码的图灵机,又即 ;若 不是合法的编码,则 (一种编码方法很容易存在不合法的编码)
对角化语言定义为
Th. 对角化语言 不可识别(进而不可判定)
证明
显然,不合法编码的存在使得 非空,现在我们来证明 不可识别
重温经典:对角化方法
假设存在 能够判定 ,那么当我们考察 时,会发现假设 ,则 ,矛盾;假设 ,则 ,又矛盾,故原假设不成立
之所以叫做“对角线语言”,是因为以下图为例,两个取反的序列会在右下角相撞:
证明其他一些问题不可识别,可以尝试对角线方法;或者反证法,假设其可识别,从而通过将一些已知不可识别语言的识别任务交给这个代证语言,得到矛盾
Exercise. 令 表示第 个字符串, 为对应编码的图灵机,证明语言 是非递归可枚举的(图灵可识别的)
(提示:考虑 是否递归可枚举)
可以证明 是不可识别的,因为假设 识别该语言,则 ,都矛盾
接下来证明 不可识别,假设可识别且图灵机 识别之,则可证明 也可识别,因为只需对于输入的 ,判断 即可,故矛盾,故得证
或者利用定理: 可判定当且仅当 可识别的;从而要证明 不可识别,可以考虑证明 不可判定、 可识别
不可判定
那么,是否存在可识别但不可判定的语言呢?如何证明不可判定呢?
先介绍几个基本问题。 是一个很重要的问题,后面也 turns out 是个重要模板的组成部分
Def. 图灵机接受问题
Th. 是图灵可识别的
证明很简单,构造“通用图灵机” 为一个能够模拟图灵机运行的图灵机:对于输入 (任何可以表示的方法,不要总想着 01 编码),执行:
- 检查 的合法性
- 在 上模拟 运行(只需多带记录 的当前状态和转移即可)
- 若 接受 ,则 接受
若 拒绝 ,则 拒绝;不停机不做定义后文中我们提到“模拟 在 上运行”,都是指这个实现方式。于是 识别 ;显然 不足以判定 ,实际上 不可判定,即图灵机接受问题不可计算
Th. 不是图灵可判定的
Co. 不是图灵可识别的
采用对角线法证明:
假设图灵机 判定 ,对于输入 , 总能停机,且输出 为根据 是否接受 也输出接受与否
接下来构造图灵机 ,并认为其输入的字符串为图灵机编码 ,调用 并且总是输出和 相反的结果:
由于编码可列,图灵机是可列的,将其列成 - 的矩阵,并考虑 和 的真值,它们在右下角相撞:因此产生矛盾, 不存在,从而得证
Def. 图灵机停机问题
Th. 是图灵可识别的
Th. 不是图灵可判定的
Co. 不是图灵可识别的
证明。显然是可识别的;现在证明不可判定:假设 判定 ,即 能判定 是否停机;
那我们可以构造图灵机完成对 的判定:给定 ,先调用 判断是否停机,如果不停机则不接受;否则模拟 ,从而给出结果;这与 不可判定矛盾,故得证
如上所示,将待证明的可判定性归于 的可判定性,是一个常见的证明方法;下文再举几例:
Def.
Th. 不是图灵可判定的
Co. 是图灵可识别的, 不是图灵可识别的
乍一看, 拒绝所有字符串,似乎是个非常直白的问题;但是从算法的角度,我们找不到一个判定器,能够判断一个图灵机是否是拒绝所有非空字符串的
证明:假设存在 判定 ;构造图灵机判定 ,给定 :
考虑在 上运行 ,如果接受,则 ;否则只能说明 ;
现在考虑构造修改图灵机 ,先判断输入是否为 ,否则拒绝,是则调用 ,于是 ;现在我们在 上运行 ,如果接受,说明 ;如果拒绝,说明
从而构造出 ,矛盾!从而得证
这就把矛盾卡出来了,总结来说,是因为考虑 ,而 ,所以判断 就能说明问题了
这又一次提示我们,可以将我们手头有的东西归于 的功能
快速再给几个例子,接下来请额外注意下面这些解法的共同点:
Exercise. 换种方法证明 不是图灵可判定的
证明,假设存在 判定 ;构造图灵机判定 ,给定 :
构造图灵机 ,为对于任意输入 , 都模拟 在 上运行,若接受则拒绝,否则接受
则 ,故运行 即可判定 ,与 不可判定矛盾,故得证
Exercise. 不是图灵可判定的
,而我们要判断 ;
对给定 :
令 ,为对任意 ,总是模拟 在 上运行,并返回模拟结果,即 ,这一步是利用 的能力直接预知了模拟结果
而
则构造图灵机 :在 上运行 ,并返回结果即可;故矛盾这个证明告诉我们直接通过 “返回模拟结果/返回运行结果” 可以建立判定式之间的相等联系,就如 deeppink 颜色式子所示
Exercise. 不是图灵可判定的
这个的证明和 差不多,限制一下某个正则语言即可:
,为先判断是否为 ,再模拟 并返回运行结果,则
则
可见这里是把 作为条件加入的,这不失为一种模板,后面规约中会进行总结
Exercise. 不是图灵可判定的
,为先判定是否为 ,再模拟 并返回运行结果,则
则
Exercise. 不是图灵可判定的(即若 ,则 )
则 (这里我认为 ,所以这么设计)
Exercise. 不是图灵可识别的
可以考虑证明 不可判定、 可识别,前者上题已经证了,考虑证明 可识别。构造图灵机 ,对于输入 ,按字典序枚举字符串 ,在 上分别运行 ,若结果不同则接受。可见 识别 ,得证
再小提一句,之所以这个方法不能用在 上,是因为我们无法定义什么时候接受(接受状态)——在 上分别运行 ,若结果相同,我们还得继续运行下去
这个小问题让我想到,如果一开始我们对图灵机的定义里,把“接受状态”改为“拒绝状态”,是不是会有一类问题的结论变成补集了呢?
映射规约
上述问题都具有一个相同的过程:将一个问题归于另一个问题,这提示我们,问题彼此之间是否具有某种可以“归约”的关系?
归约(reduction)支持将问题按计算难度分层(排序)。例如,问题 可以归约到问题 ,记作 ,直观表示 不会比 更困难
Def. 可计算函数(Computable functions)
函数 被称作是可计算的,若存在图灵机 使得 , 在 上停机且输出带上是
其实就是存在图灵机能有限时间计算出
Def. ,映射规约(Mapping reduction)
令 和 是两个语言, 被称作可映射归约到 ,记作 ,若存在可计算函数 ,使得 有
这里的函数 被称作从问题 到 的映射归约
映射规约具有如下性质,从而映射规约是个很有用的方法/方向:
Th. 的性质
- 若 ,则:
- 若 可判定,则 可判定
若 不可判定,则 不可判定(逆否命题) - 若 可识别,则 可识别
若 不可识别,则 不可识别(逆否命题)
- 若 可判定,则 可判定
例如:
,则 ,故映射规约 是映射规约,从而 ,所以 是不可识别的
又比如,,则 是映射规约,从而 ,所以 是不可判定的
反过来,,其中 定义为对任意输入,都模拟 在 上运行,接受则接受,否则拒绝(如上文提到),则
Remark. 模板
- 要证明语言 不可识别,可以考虑证明 ,即证明
- 要证明语言 不可判定,可以考虑证明
因此,很多问题都可以归于证明 (无论是利用取补或者逆否),大概证明思路都是
这个 先让自己限定在满足 条件(的某个子集)内;然后模拟 在 上运行,若 则实现这个条件,否则不实现
这样的话, 以 为唯一条件、以满足 的条件,于是
Exercise. 不可判定
证明,考虑 ,也就是要构造映射规约 ,使得 ,如何令 停机以 为唯一条件?很简单,对任意 ,都令 先模拟 在 上运行,若接受则直接停机,否则就进入一个永不停机的状态,这样就完成证明了
还记得我们之前怎么证明的吗?我们利用 造出了一个判定 的玩意,从而导出矛盾。这两个证明应该还是有区别的
利用这个方法,我们可以证明这样一个语言——本身和补集都是不可识别的:
Th. 不是图灵可识别的
Th. 不是图灵可识别的
证明 :可以考虑证明 ,取补 ,这就是经典结构了。取 ,如何让 呢?令 也就是拒绝所有输入, 接受当且仅当模拟 在 上运行且接受,这样就得到了
证明 :可以考虑证明 ,取补 ,这和上面不是一样嘛,让 接受所有输入就行了
下面再介绍一个更一般的规约:图灵归约
Def. 神谕图灵机(Oracle Turing machine)
一个图灵机变种,可以查询某个语言判定问题的结果是 或者 , 表示可以查询语言 的 oracle 图灵机,即判定
Def. ,图灵规约(Turing reduction)
令 和 是两个语言, 被称作可图灵归约到 ,记作 ,若存在 Oracle 图灵机 判定
Th.
证明,按照如下方式构造 :对于查询 ,利用映射规约 ,计算 并在 上查询 ,返回查询的结果
莱斯定理(Rice's theorem)
现在让我们回过头观察这些不可判定问题,为什么很多情况它们的证明如此相似(比如那个模板)?
本质上,这是“图灵机识别语言”的性质,我们从一些更上层的角度观察
介绍莱斯定理(Rice's theorem),它表明任何图灵机识别语言的非平凡性质都是不可判定的
Def. 图灵机识别语言的非平凡性质(Nontrivial properties)
是图灵机识别语言的非平凡性质,或者说是具备某个性质的语言集合,当且仅当
- 存在图灵机 使得
- 存在图灵机 使得
它的等价形式为:
- 存在某个图灵可识别的语言
- 存在某个图灵可识别的语言
显然,非平凡性质 的补集 依然是非平凡性质
例如,我们上面讨论的语言都是具有非平凡性质的
Th. 莱斯定理(Rice's theorem)
令 是图灵可识别语言的任意一个非平凡性质,并且语言 ,那么 是不可判定的
能有如此结论真是 amazing 啊!这样的话,我们试证不可判定,只需考虑证明性质非平凡就行了
证明其实就是我们上面发现的模板,咱也属于是站在巨人肩膀上发现风景了
试证明 ,回顾模板分析一下:目标就是构造使得 ,意味着某个图灵机 ,它以 为条件、接受满足条件 的输入
考虑构造个例 ,使得 ,显然 接受的输入都满足
那么考虑令 在输入 上,以 为条件运行 ,若 接受则接受,具体为两步过程:先模拟 在 上运行,若接受则模拟 在 上运行,若接受则接受;其他情况拒绝或者不停机
当然,还有个大前提是判定的是 ,如果输入不是 的合法形式呢?当然这时我们也绝不能让 ,不妨假设 不包含空语言 (否则令 ,依然是非平凡性质),然后让此时 ,其中 即可综上,我们构造的 如下:
- 若 不是 的合法形式,则
- 则 形如 ,则 ,其中: 对于输入 ,先模拟 在 上运行,若接受则模拟 在 上运行,若接受则接受;其他情况则拒绝或者不停机
于是 ,,得证
给一些课后习题:
Exercise. 证明 不可识别
这个我们之前证明过,这里利用规约再证一次(当然,用 Rise 更轻松):
可证明 ,则
对于 ,构造图灵机 ,对于输入 ,先判定是否为 ,不是则拒绝,若是则模拟 在 上运行,若接受则接受,否则拒绝;则:
故 是映射规约,从而 ,得证
Exercise. 。
(1) 利用 Rice 定理证明 不可判定;
(2) 证明 非递归可枚举(提示:利用归约技术);
(3) 证明 非递归可枚举(提示:利用归约技术)。
(1) 仅有起始节点且无转移,则 必定停机; 仅有起始节点且有每个符号到自己的转移,没有接受节点,则 必定不停机。则 “在所有输入上均停机” 是图灵机识别语言非平凡性质,得证
(2) 可证明 ,则 。对于 ,构造图灵机 ,对于输入 ,模拟 在 上运行,若接受则运行 ,否则停机。则
故 是映射规约,从而 ,得证
(3) 同 (2),令 为:对于输入 ,模拟 在 上运行,若接受则停机,否则运行
其他问题
后面就是一些其他问题了
Def. 波斯特对应问题(Post correspondence problem)
给定两个序列
询问是否存在有限下标序列 ,使得
Th. 波斯特对应问题 是不可判定的。
证明为建立一个修改后的波斯特问题 ,然后证明 ,还差两天考试了在此省略
Th. 文法相关问题
如下问题都是不可判定的:
- 给定文法 ,是否
- 给定文法 和字符串 ,是否
- 给定文法 ,是否
- 给定文法 和 ,是否
- 给定字符串 ,是否存在一个特定的文法 使得
Th. 上下文无关文法相关问题
如下问题都是可判定的:
- 给定上下文无关文法 ,是否
- 给定上下文无关文法 和字符串 ,是否
- 给定上下文无关文法 ,是否
如下问题都是不可判定的:
- 给定上下文无关文法 ,是否
- 给定上下文无关文法 和 ,是否
- 给定下推自动机 和 ,是否接受相同语言
- 给定下推自动机 ,计算一个等价的下推自动机 ,使得 的状态最少
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现