Lecture 6. Undecidability 不可判定性
函数知识回顾(CS172 笔记摘录)
函数的定义域,值域,像,到达域(domain,range,image,codomain)
- 定义域:略
- 值域:略
- 像:是值域的一个子集,这个子集包含由函数 映射来的一些元素。注意像并不是函数的值。函数的值是值域当中的某个元素,而函数的像是至于当中的某个子集。
- 到达域,又称对应域,与值域不同。值域是到达域的一个子集。满射函数的值域与到达域是相等的。
函数的单射,满射,双射(injective,surjective,bijective)
- 单射,是指,像中的每一个元素,都是由定义域中唯一的一个元素映射来的:
- 满射,是指,像中的每一个元素,都能被定义域中的元素映射得到:
- 双射,是指,既是单射,又是满射。即双射的两个集合,元素个数一定相等。
- 在 CS355FZ 当中,有时候说 单射是 one to one,满射是 onto,双射 correspondence。
偏函数(partial function)
大概就是,定义域当中有的元素没有映射出去。
如果进一步限制约束偏函数的定义域,那么就会变成 total function(翻译过来可能是全函数)
比如,阶乘函数 的定义域如果是整数集,那么它就是一个偏函数,因为 不知道。
无限集的大小
定义:当集合 和集合 之间存在一个双射关系 ,则称集合 和集合 具有相同规模(same size)。非形式化的讲,就是可以将两个集合当中的元素两两配对。
自然数集 ,整数集 。这两个集合之间存在双射,因为存在函数:
定义:与自然数集 之间存在双射关系的函数,以及所有的有限集,称为可数集。所以整数集 是 可数(countable) 的。
更大的无限集?(摘自 CS172 笔记)
注意 CS172 当中的集合 是包含 的,不过影响不大。
考虑集合 。
这个集合,铺成正方形,每一行每一列都是无限个…但是如果从左上角开始,斜着计数,就可以列出这种形式:…看起来依然是可以数出来的吼
那么如何计算这个集合 的势?
不妨定义函数 。由于 和 都是质数,由唯一分解定理得知, 是双射的,即每个 都能通过 映射到某个整数,而那个整数也只能分解成 的形式。于是, 就与 的一个无限子集建立了双射关系。而 的无限子集的势也是 。故, 的势还是 ,这个集合是可数集。
扩展一步,如果是 ,甚至是更多维数,依然是可数的。二维的,用前两个质数,三维的就用前三个, 维的就用前 个质数,就好了。比如, 就可以映射到 。
再拓展一下,对于有理数集 以及正有理数集 ,也都是可数集。因为有理数 可以与 双射,这就回到了刚才的二维问题。
对角化方法
CS355 的课本当中,给出了另一种证明集合 可数的方法:从左上角开始,画一条斜着的线,不断地把这条线往右下方移动。每次碰到线的数字,都加入集合当中(忽略约分后已存在的数字)。这样,每划到一个有理数,就增加一个计数器,而计数器的值是整数,所以正有理数集也是可数的。
注意英文单词对角线:diagonal。如果考试考了,要记得拼写。
事实上可以把这种对角化方法想象成二维坐标系。分子分母分别是横纵坐标。

然而,实数集 不是可数集。
用对角化方法证明: 不可数
首先假设 可数,那么就一定存在一个 的双射关系。
假设 的前几项如下表:
只要我能够找到一个实数 一定不在这个 的表格里面,就能够证明 不可数了。这个 很好找。
- 对于 ,小数点后第 位数字是 ,那我就令 的小数点后第 位数字不是
- 对于 ,小数点后第 位数字是 ,那我就令 的小数点后第 位数字不是
- 对于 ,小数点后第 位数字是 ,那我就令 的小数点后第 位数字不是
- …
- 那么,对于 ,不管 取值是多少,我都让 的第 位与 不同,那么这个 就一定不会在这个表格里面。所以,这个 无法与 的某个元素双射。于是, 不可数。
推论
- 令 表示所有的语言,那么 不可数。因为 与 等势。回顾:语言是 当中的一个元素,即 的每一个子集都是一个语言。用一个无限长的二进制串表示 当中的第 个元素是否包含在这个语言(子集)当中。那么这些二进制串就与语言形成双射。像之前证明 不可数一样(小数点后有无限个数字),同理可以证明 。不过, 是可数的。因为 ,所以 。
- 令 表示所有的图灵机,那么 是可数的。因为 。而 是可数的,所以它的子集也是可数的。至于说为什么 可数,是因为 ,能一个一个的列出来,所以是可数集。
- 存在不可判定的语言。因为语言比图灵机多(因为 )。
用对角化方法证明:语言 不可判定
用反证法。先假设 是可判定的,也就是存在一台判定器 判定它:$$H(\langle M, w\rangle)= \begin{cases}\text {接受} & \text { 若 } M \text { 接受 } w \ \text {拒绝} & \text { 若 } M \text { 拒绝 } w \end{cases}$$。
然后再构造一个新的图灵机 ,$$D(\langle M\rangle)= \begin{cases}\text {接受} & \text { 若 } M \text { 拒绝 }\langle M\rangle \ \text {拒绝} & \text { 若 } M \text { 接受 }\langle M\rangle\end{cases}$$。
然而由于 是随便的一个图灵机,所以 可以替换成 作为 的输入:$$D(\langle D\rangle)= \begin{cases}\text {接受} & \text { 若 } D \text { 拒绝 }\langle D\rangle \ \text {拒绝} & \text { 若 } D \text { 接受 }\langle D \rangle\end{cases}$$。
观察这个式子: 拒绝 的条件下,反而要让 接受输入 ,这是一个矛盾。因此,图灵机 是不存在的。所以不存在能够判定语言 的图灵机。所以语言 是不可判定的。
为什么说这种证明是使用了对角化方法?因为可以用这张图来描述证明过程。

当 在这里面,对角线上的 的就会产生矛盾,因为这个位置的值要与这一列上下划线标注的值相反,于是他就要跟自己相反~这…听起来就是个怪怪的矛盾。
由于队列自动机可以模拟图灵机,所以还可以推出:语言 也是不可判定的。
图灵不可识别语言
定义一个语言如果是图灵可识别的语言的补集,那么这个语言是 补图灵可识别的(co-T-recognizable)。
定理:语言 是可判定的,当且仅当 与 都是图灵可识别的,即 既是图灵可识别的,也是补图灵可识别的。 正方向比较简单,下面考虑反方向的证明思路:构建图灵机 分别识别 ,再构建一个图灵机 判定 。 对于输入 ,并行的在 上运行 ,直到其中一个进入接受状态。如果 进入了接受状态就接受,如果 进入了接受状态就拒绝。因为对于任意一个串,要么在 里面,要么就在 里面,所以 和 当中一定会有一个接受,于是 就会停机。意味着 不会永远运行下去,是一个判定器。所以 是可判定的。
推论: 是图灵不可识别语言。因为 可识别但不可判定。

封闭性
推论:图灵可识别语言,在补运算下不封闭。 事实上,图灵可识别语言,除了补运算,全都封闭(并、连接、星号、交)。
- 交:构建一个图灵机,含有两个子图灵机,当两个子图灵机都接受,才接受
- 并:构建一个图灵机,含有两个子图灵机,当两个子图灵机有一个接受,就接受
- 连接:非确定性的枚举所有的位置( 个分割点),把串分成前后两部分,如果有一种枚举方案,两部分都接受了,就接受
- 星号:类似连接运算,只是连接的方案更多罢
特殊的,对于可判定语言,在并交补连星五种运算下,全都是封闭的。
详细证明可以参考这份 公开幻灯片。