一、函数和语言
在本课程里,我们讲探讨这样一个问题:
计算机能解决什么问题?
问题的定义
我们知道,计算机程序有输入和输出。
我们对研究的问题范围进行限定:
输入为二进制字符串,也就是
中的元素 输出为“是”或“否”,即
中的一个元素
集合的并:
笛卡尔积:
其中
表示长度为零的字符串(即空串)
我们管这类只有一个输出,且输出为“是/yes/true”或“否/no/false”的问题叫判定性问题(decision problems)。
如果输入包含多种符号,怎么办?
如果输入有
例如,当
如果输出为多个 bits,怎么办?
将输出限制为“是、否”是一个相当严重的限制,很多我们感兴趣的问题不能简单地用“是、否”来回答。然而,理解判定性问题的可计算性常常是理解更一般问题的关键。
此外,如果输出为
函数和语言
布尔函数
一个输入都是长度为
语言
任何判定性问题都可以用语言
也就是说,对任一
类似地,任一布尔函数的集合
所有语言
一个例子
考虑这样一个语言
那么
第一个“不可计算”结果
我们感兴趣的是,计算机能解决哪些问题。在了解了语言的概念,知道了我们可以把很多问题表示为语言后,我们不由得想问:所有这些表示特定问题的语言都可由计算机进行计算吗?
我们说一个语言
字符串和语言的数量(基数)
如果一个集合只有有限个元素,则集合是有限的,否则是无穷的。
如果集合中的元素可以和正整数一一对应起来,则是可数的,否则是不可数的。例如,整数、有理数是可数的,实数是不可数的。不可数集合中元素的数量远远多于可数集合。
字符串的数量是可数的。即
为了方便理解,对二进制字符串
所有语言的组成的集合
下面我们用对角线法说明为什么所有语言组成的集合是不可数的:
0 | 1 | 00 | 01 | 10 | … | ||
|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | … | |
1 | 0 | 1 | 0 | 1 | 0 | … | |
0 | 1 | 1 | 0 | 0 | 0 | … | |
… | … | … | … | … | … | … | … |
在上表中,每行表示一个语言,每列表示一个字符串。表格中
假设所有语言组成的集合是可数的,也就是说,我们可以把语言与正整数一一对应起来。把对应到
定理:存在不可计算的语言
我们在前面已经通过语言的概念描述了判定性问题,即:我们可以用语言来表示判定性问题。通过分析字符串和语言的基数,我们可以得出本课程中的第一个结论:存在不可计算的语言。
存在不可用 Haskell(或者任何你喜欢的编程语言)计算的语言,即,存在语言
由于 Haskell 程序可以表示为二进制字符串(只需取程序代码的 Unicode 编码),所以合法的 Haskell 程序只是可数集
可计算语言的数量为可数无穷多。
遗憾的是,绝大多数语言
相关知识
在继续进行接下来的学习之前,我希望介绍一下,本课所涉及内容的应用等相关知识。本课程算是计算机科学和数学中非常基础的内容,以下方向与计算复杂度理论相关
学完本课程之后,可以继续学习哪些内容?
算法:复杂度理论在算法中有重要应用,学完本课程后可以继续学习近似算法、随机算法等内容。
密码学:计算复杂度理论是密码学的重要基础。本课程将会简单地介绍,我们为什么认为一些密码学协议是安全的。
博弈论:
类与博弈论当中的 Minimax 函数有一定关联。
需要注意的是,本课程更多地偏向理论,不包含数据结构等偏向实用的内容。
课后练习
简要说明为什么可计算语言的数量为可数无穷多。
其他
订阅课程
订阅课程后可以及时收到开课通知。
以 Outlook 为例,登录后进入日历,点“添加日历”,然后选择“从网络订阅”,粘贴链接并导入。
完成之后开启对应日历的通知功能,就可以及时收到开课提醒了!
课程讨论群
