Lecture1
第一部分:计算理论概述
1.1 计算理论的目的
- 目标:开发与现实世界计算机相关的正式数学模型,用以解释计算的能力与局限性。
- 历史背景:
- 1930年代,艾伦·图灵(Alan Turing)研究了一种抽象机器,即图灵机(Turing Machine),用以破解由Enigma生成的代码。
- 1940年代和1950年代,出现了较为简单的机器模型,如有限自动机(Finite Automata)。
- 1950年代末,乔姆斯基(Noam Chomsky)开始研究形式文法(Formal Grammar)。
- 1969年,斯蒂芬·库克(Stephen Cook)定义了“难解问题”(NP-hard)。
1.2 计算的定义与问题
- 计算:计算是指可以通过数学公式定义的算法来解决问题。
- 核心问题:计算机能解决的是什么类型的问题?哪些问题是不可解的?
- 计算模型:
- 有限自动机:用于处理文本、编译器和硬件设计。
- 上下文无关文法:用于定义编程语言,涉及人工智能的领域。
- 图灵机:作为“真实”计算机的抽象模型,像个人电脑一样工作。
1.3 课程的重要性
- 本课程探讨计算机的基本能力与局限性,是计算机科学的核心内容。
- 理论方面:与编程语言设计、编译器、字符串搜索、模式匹配、计算机安全、人工智能等领域息息相关。
- 实践方面:该理论简化了复杂的计算机模型,使其成为简单的数学模型,帮助学生更好地理解计算机。
- 通过该课程可以提升问题解决能力,包括如何思考、证明、论证、解决问题、表达以及抽象。
1.4 符号表示法
- 语言符号表示法:形式语言用于精确定义语言、构建编译器、检查字符串是否属于特定语言,以及比较不同语言的描述是否一致。
- 分析工具:主要包括分析自然语言和编程语言的工具,帮助识别有效的句子或程序。
1.5 形式语言与文法
- 语言:由符号的集合和操作规则构成,是表达想法、事实和概念的系统。
- 字母表(Alphabet):有限、非空的符号集。
- 字符串(String):符号的有限序列。
- 语言(Language):由字母表构成的符号串的集合,遵循特定的语法规则。
示例
2.2 字符串操作
2.3 闭包运算
2.4 文法
2.5 文法的应用
2.6 语法树(Parse Tree)
示例
3.2 自动机的类型
例子:
2. 非确定性有限自动机(Nondeterministic Finite Automaton, NFA)示例
假设有一个 NFA 来识别包含子串 ab
的字符串,字母表为 {a, b}
。NFA 允许从一个状态有多种状态转换,并且可以从某些状态没有输入符号(即空移动)。
例子:
3. 图灵机(Turing Machine, TM)示例
假设有一个简单的图灵机,它执行两个二进制数字的加法(例如,输入 101 + 011
)。
工作过程:
例子:
3.3 自动机的组成部分
3.4 自动机的工作原理
3.5 图灵机的特点
3.6 自动机的应用
3.7 自动机模型之间的关系
示例
4.2 关系与函数(Relation and Function)
4.3 图(Graph)
4.4 证明技巧(Proof Techniques)
示例
- 字母表:∑ = {a, b}
- 字符串
第二部分:形式语言与文法
2.1 形式语言的定义
-
形式语言:由符号构成的字符串集合,按照特定的语法规则生成。形式语言广泛用于计算机科学、语言学和数学领域,来定义和分析语言的结构。
-
字母表(Alphabet):有限的符号集合,通常表示为 ∑。
- 例子:∑ = {a, b},则 abab, aaaabbba 是 ∑ 上的字符串。
-
字符串(String):由字母表中的符号组成的有限序列。
- 空字符串:没有任何符号的字符串,记作 ϵ。
- |ϵ| = 0
- ϵw = wϵ = w
-
|𝑤 1 𝑤 2| = | 𝑤 1| + | 𝑤2|
-
w = 𝑎 1 𝑎 2 … 𝑎 𝑛w 𝑅 = 𝑎 𝑛 … 𝑎 2 𝑎 1(reverse)A palindrome is a string w satisfying w = wR.
-
语言的表示方法:
- 语言 L 是字母表 ∑ 上字符串的集合。形式语言就是这些集合的子集。
-
串联(Concatenation):将两个字符串合并为一个字符串。
- 例子:若 w = ab, v = cd,则 wv = abcd。
-
逆序(Reverse):字符串符号顺序反转。
- 例子:w = abcd,w⁻¹ = dcba。
-
子串(Substring):一个字符串包含在另一个字符串中。
- 例子:若 w = abcd,则 ab 是 w 的前缀(prefix),cd 是 w 的后缀(suffix)。
-
长度(Length):字符串中符号的数量,记作 |w|。
- 例子:w = abcd,|w| = 4。
- 星闭包(star closure):字母表 ∑ 上的所有字符串的集合,包括空字符串,记作 ∑*。
- 例子:若 ∑ = {a, b},则 ∑* 包含空字符串 ϵ,单个字符 a, b,及其组合如 aa, ab, ba, bb 等。
- 正闭包(Positive Closure):字母表 ∑ 上所有非空字符串的集合,记作 ∑⁺。
- 文法:一组用于生成语言的规则。
- 例子:形式文法可以生成编程语言、数据库查询语言和文件格式。
- 编程语言的编译阶段:
- 词法分析(Lexical Analysis):将字符序列分割为标记,如变量名、操作符等。
- 语法分析(Parsing):识别标记之间的关系,构建语法树(Parse Tree)。
- 代码生成(Code Generation):将源代码的中间表示转换为可执行的机器代码。
- 代码优化(Code Optimization):提高程序运行效率,减少资源消耗。
- 语法树:描述字符串的语法结构,反映语言中的句法规则。
- 字符串操作:若 ∑ = {a, b},则可以生成字符串 ab, aba, abba 等。通过定义规则,可以生成不同的语言,如 L = {w ∈ ∑* : w 是回文}。
- :abab, aaaabbba
Mathematical preliminaries(数学初探)
-
第三部分:自动机理论(Automata Theory)
3.1 自动机的定义
- 自动机(Automaton):是一种抽象的计算模型,用来模拟计算机的操作。它接受输入、经过状态转换并生成输出。
- 自动机理论研究各种计算模型的定义和性质,主要关注不同模型的计算能力。
-
有限自动机(Finite Automata, FA):用于处理简单的模式匹配问题,常应用于文本处理、编译器设计和硬件设计。
- 确定性有限自动机(Deterministic Finite Automaton, DFA):在每个状态下,针对给定输入有且仅有一个可能的状态转换。
- 非确定性有限自动机(Nondeterministic Finite Automaton, NFA):在某些状态下,针对给定输入可能存在多个状态转换。
-
上下文无关文法的自动机(Context-Free Grammar Automaton):用于定义编程语言和某些人工智能应用的结构。
-
图灵机(Turing Machine, TM):是最强大的计算模型之一,可以模拟任何现实中的计算机。图灵机由无限长的带子、一个读写头和一组状态构成,用来模拟实际计算机的操作。
-
1. 确定性有限自动机(Deterministic Finite Automaton, DFA)示例
假设有一个 DFA 来识别包含偶数个
a
的字符串,字母表为{a, b}
。它有两个状态,分别代表“偶数个a
”和“奇数个a
”,如下: - 状态集:Q = {q₀, q₁}
- 输入字母表:Σ = {a, b}
- 初始状态:q₀(代表偶数个
a
) - 接受状态:F = {q₀}(表示偶数个
a
的情况) - 状态转换函数:
- 如果当前状态是 q₀ 且输入是
a
,转换到 q₁(奇数个a
)。 - 如果当前状态是 q₀ 且输入是
b
,保持在 q₀。 - 如果当前状态是 q₁ 且输入是
a
,转换到 q₀(偶数个a
)。 - 如果当前状态是 q₁ 且输入是
b
,保持在 q₁。
- 如果当前状态是 q₀ 且输入是
- 输入字符串:
abba
。- 初始状态:q₀
- 读取
a
:从 q₀ 转到 q₁(奇数个a
) - 读取
b
:保持在 q₁ - 读取
b
:保持在 q₁ - 读取
a
:从 q₁ 转到 q₀(偶数个a
) - 最终状态:q₀(接受状态,字符串被接受)
- 状态集:Q = {q₀, q₁, q₂}
- 输入字母表:Σ = {a, b}
- 初始状态:q₀
- 接受状态:F = {q₂}
- 状态转换函数:
- 在 q₀:当输入
a
时,可以移动到 q₁。 - 在 q₁:当输入
b
时,可以移动到 q₂。 - 在 q₂:无论输入什么都保持在 q₂。
- 在 q₀:当输入
- 输入字符串:
aab
。- 初始状态:q₀
- 读取第一个
a
:从 q₀ 可以移动到 q₁ - 读取第二个
a
:保持在 q₁ - 读取
b
:从 q₁ 移动到 q₂(接受状态,字符串被接受)
- 状态集:Q = {q₀, q₁, q_accept}
- 输入字母表:Σ = {0, 1, +, _}(
_
表示空格) - 初始状态:q₀
- 接受状态:F = {q_accept}
- 带子内容:
101+011_
(加号用于分隔两个数) - 图灵机从初始状态 q₀ 开始,从左到右扫描带子。
- 每次读取一个符号,根据状态转换表移动到不同的状态,写下相应的符号,或向左/右移动带子。
- 当遇到加号时,图灵机会开始执行加法操作,从最低位向高位进行处理,处理完成后,带子上会显示加法结果,并移动到接受状态 q_accept。
- 输入:
101+011
(相当于 5 + 3)。 - 输出:带子最终显示
1000_
,即结果为 8。 - 状态集(Set of States, Q):自动机的所有可能状态的集合。
- 输入字母表(Input Alphabet, Σ):允许的输入符号集。
- 初始状态(Initial State, q₀):自动机的开始状态。
- 状态转换函数(Transition Function, δ):根据当前状态和输入符号,决定自动机转移到哪个状态。
- 接受状态集(Set of Accepting States, F):当自动机到达这些状态时,认为输入被接受。
- 自动机通过从输入字母表中读取符号,根据状态转换函数决定状态转移,直到输入符号处理完毕。如果最后自动机处于接受状态,输入被接受。
- 图灵机可以模拟任何算法,并且可以处理比有限自动机更多的问题。它不仅限于有限的状态数,还可以进行更复杂的操作,因此被视为最通用的计算模型。
- 有限自动机:常用于模式匹配,如正则表达式匹配、字符串搜索、编译器的词法分析等。
- 上下文无关文法自动机:应用于编译器设计中的语法分析阶段,帮助解析编程语言的语法结构。
- 图灵机:是计算理论的基础,用于定义计算的可行性和复杂性问题。
- 不同的自动机模型有不同的计算能力:
- 有限自动机可以处理正则语言(Regular Languages),即结构较为简单的语言。
- 上下文无关文法自动机可以处理上下文无关语言(Context-Free Languages),如编程语言的语法。
- 图灵机能够处理递归可枚举语言(Recursively Enumerable Languages),涵盖了更复杂的语言。
- 有限自动机示例:用于识别某种模式的字符串,例如检测某段文本中是否包含“101”的模式。
- 图灵机示例:模拟加法运算,将两个数字输入带子中,通过状态转换最终得出其和。
-
第四部分:数学预备知识
在理解计算理论及自动机之前,需要具备一些基本的数学概念,这部分涵盖了集合、关系与函数、图以及常见的证明技巧。
4.1 集合(Set)
-
集合的定义:集合是一些定义明确对象的无序组合。
- 例子:所有奥运会金牌得主的集合,所有偶数的集合。
-
子集:如果集合 A 的所有元素也属于集合 B,那么 A 是 B 的子集,记作 A⊆BA \subseteq BA⊆B。
- 例子:偶数的集合是自然数集合的子集。
-
幂集:集合 B 的幂集是 B 的所有子集构成的集合,记作 P(B)P(B)P(B)。
- 例子:如果 B={1,2}B = \{1, 2\}B={1,2},则 P(B)={∅,{1},{2},{1,2}}P(B) = \{\emptyset, \{1\}, \{2\}, \{1, 2\}\}P(B)={∅,{1},{2},{1,2}}。
-
集合运算:
- 并集:A∪B={x:x∈A 或 x∈B}A \cup B = \{x : x \in A \text{ 或 } x \in B\}A∪B={x:x∈A 或 x∈B}。
- 交集:A∩B={x:x∈A 且 x∈B}A \cap B = \{x : x \in A \text{ 且 } x \in B\}A∩B={x:x∈A 且 x∈B}。
- 差集:A∖B={x:x∈A 且 x∉B}A \setminus B = \{x : x \in A \text{ 且 } x \notin B\}A∖B={x:x∈A 且 x∈/B}。
- 笛卡尔积:A×B={(x,y):x∈A 且 y∈B}A \times B = \{(x, y) : x \in A \text{ 且 } y \in B\}A×B={(x,y):x∈A 且 y∈B}。
-
二元关系:给定两个集合 A 和 B,A 与 B 之间的二元关系是它们的笛卡尔积的一个子集,即 R⊆A×BR \subseteq A \times BR⊆A×B。
- 例子:如果 A 是学生的集合,B 是课程的集合,那么学生选课的关系可以表示为 A 和 B 之间的二元关系。
-
函数:函数 f:A→Bf: A \to Bf:A→B 是 A 到 B 的一个二元关系,每个 A 中的元素最多与 B 中的一个元素关联。
- 例子:f(x)=x2f(x) = x^2f(x)=x2,将每个自然数映射到它的平方。
-
单射(Injective):如果 f(a1)≠f(a2)f(a_1) \neq f(a_2)f(a1)=f(a2) 对于任何 a1≠a2a_1 \neq a_2a1=a2,则称函数为单射。
-
满射(Surjective):如果 B 中的每个元素都是 A 中某个元素的像,即 f(A)=Bf(A) = Bf(A)=B,则称函数为满射。
-
双射(Bijective):如果函数既是单射又是满射,则称其为双射,表示 A 中的每个元素与 B 中的唯一元素对应。
-
图的定义:图 G=(V,E)G = (V, E)G=(V,E) 是由顶点集 VVV 和边集 EEE 组成的,其中每条边连接两个不同的顶点。
- 例子:社交网络中的用户可以被表示为顶点,用户之间的好友关系可以表示为边。
-
顶点的度数:顶点 v 的度数是与 v 相连的边的数量,记作 deg(v)deg(v)deg(v)。
-
路径:图中的路径是顶点之间通过边连接的顶点序列。如果路径的起点和终点是同一个顶点,则称为环。
-
连通图:如果任意两个顶点之间都有路径相连,则称该图为连通图。
-
命题(Proposition):一个陈述句,其真假值明确。
-
定理(Theorem):一个为真的命题,通常需要通过证明来验证其正确性。
-
证明的类型:
-
直接证明(Direct Proof):通过直接推理,从已知的假设出发推导出结论。
- 例子:证明偶数的平方仍然是偶数。
-
构造性证明(Constructive Proof):通过构造一个实例或方法来证明某一数学对象的存在性。
-
非构造性证明(Non-constructive Proof):通过反证法或其他方式证明对象的存在,但不直接构造该对象。
-
反证法(Proof by Contradiction):假设命题为假,通过推理得出矛盾,从而证明原命题为真。
- 例子:证明根号 2 是无理数。
-
数学归纳法(Proof by Induction):证明一个命题对所有自然数都成立。
- 例子:证明 1+2+3+...+n=n(n+1)21 + 2 + 3 + ... + n = \frac{n(n+1)}{2}1+2+3+...+n=2n(n+1)。
-
-
集合操作示例:
- A={1,2,3}A = \{1, 2, 3\}A={1,2,3}, B={2,3,4}B = \{2, 3, 4\}B={2,3,4}
- A∪B={1,2,3,4}A \cup B = \{1, 2, 3, 4\}A∪B={1,2,3,4}
- A∩B={2,3}A \cap B = \{2, 3\}A∩B={2,3}
-
函数示例:
- f(x)=2x+1f(x) = 2x + 1f(x)=2x+1,其中 f:R→Rf: \mathbb{R} \to \mathbb{R}f:R→R,这是一个单射但非满射的函数。
第五部分:复杂性理论(Complexity Theory)
5.1 复杂性理论的基本问题
复杂性理论主要研究什么使得一些问题在计算上是“困难的”,而另一些问题是“容易的”。我们通过评估解决问题所需的计算资源来定义计算的难度,例如时间和空间(内存)的消耗。
5.2 时间复杂性和空间复杂性
- 时间复杂性(Time Complexity):表示算法在输入大小 nnn 增长时所需的时间量。常用大 O 表示法来表示时间复杂度,例如 O(n)O(n)O(n)、O(n2)O(n^2)O(n2) 等。
- 空间复杂性(Space Complexity):表示算法在运行过程中所需的内存空间量,类似于时间复杂度,空间复杂度也使用大 O 表示法。
例子:
- 线性搜索:查找数组中的一个元素。时间复杂度是 O(n)O(n)O(n),因为在最坏情况下需要遍历整个数组。
- 冒泡排序:排序算法,其中相邻的元素不断交换位置。时间复杂度是 O(n2)O(n^2)O(n2),因为需要进行双重嵌套的循环。
5.3 问题的分类
根据问题解决的难易程度,问题可以分为以下几类:
-
P 类问题:可以在多项式时间内(即 O(nk)O(n^k)O(nk),其中 kkk 是常数)解决的问题。这些问题通常被认为是“容易的”或“高效可解的”。
- 例子:排序问题、图中的最短路径问题。
-
NP 类问题:给定问题的解后,可以在多项式时间内验证其正确性的问题,但不一定能够在多项式时间内找到解。
- 例子:旅行商问题(TSP),给定一条路径后可以很快验证其是否为最优路径,但找到最优解需要尝试所有可能的路径组合。
-
NP 完全问题(NP-Complete):NP 类中的一组问题,如果能找到一个 NP 完全问题的多项式时间解法,那么所有 NP 类问题都可以在多项式时间内解决。
- 例子:旅行商问题(TSP)、顶点覆盖问题、SAT(可满足性问题)。
-
NP 困难问题(NP-Hard):比 NP 完全问题更难的问题,即使不在 NP 类中,它们也与 NP 完全问题相关。如果某个 NP 困难问题有多项式时间解法,则所有 NP 完全问题也可以多项式时间解决。
5.4 P vs NP 问题
- P vs NP 问题是计算复杂性理论中的一个著名未解问题,询问是否每个能在多项式时间内验证的解都能在多项式时间内找到。
- 简单来说,问题是:P 是否等于 NP?
- 如果 P = NP,则每个可以快速验证的解也可以快速找到。
- 如果 P ≠ NP,那么存在某些问题是可以快速验证但无法快速找到解的。
5.5 复杂性类之间的关系
- P 类问题是 NP 类问题的子集,因为如果一个问题能在多项式时间内解决,显然它的解也能在多项式时间内验证。
- 但目前尚不清楚 P 和 NP 是否完全相等,P vs NP 问题的答案仍然是一个悬而未决的谜题。
5.6 计算复杂性的重要性
计算复杂性理论有助于理解现实中的许多问题:
- 在设计算法时,了解问题的复杂性可以帮助我们选择合适的算法,避免在不可行的方向上浪费时间。
- 它也有助于分析计算机系统的效率和优化,例如图灵机模型可以帮助我们理解现实中的计算机系统如何在资源受限的情况下进行工作。
示例
-
P 类问题示例:最短路径问题。对于一个有向图,找到从一个顶点到另一个顶点的最短路径可以通过 Dijkstra 算法在多项式时间内解决,时间复杂度为 O(V2)O(V^2)O(V2),其中 VVV 是顶点的数量。
-
NP 完全问题示例:旅行商问题(TSP)。在 TSP 中,找到一条访问所有城市且总距离最短的路径是 NP 完全问题。虽然验证一条给定路径是否最优可以在多项式时间内完成,但找到该路径的最优解需要尝试所有可能的路径组合,其计算量为指数级的。
第六部分:可计算性理论(Computability Theory)
6.1 可计算性理论的核心问题
可计算性理论的核心问题是:哪些问题可以通过算法解决,哪些问题是不可解的?
- 这个领域旨在定义和分类那些能够通过算法解决的“可计算问题”和那些无法通过任何算法解决的“不可计算问题”。
6.2 计算模型
为了研究可计算性理论,数学家们引入了一些抽象的计算模型来描述计算过程。最著名的模型是图灵机(Turing Machine),它为分析问题的可计算性提供了一个通用的框架。
图灵机模型:
- 图灵机由一个无限长的带子(存储数据的地方)、一个读写头(进行数据操作的设备)、一组有限的状态和一组状态转换规则组成。
- 图灵机是通用的,因为它可以模拟所有其他合理的计算模型。即使是现代计算机,也可以被看作是图灵机的物理实现。
6.3 可计算问题的定义
- 可计算问题:如果某个问题存在图灵机或其他等价的计算模型可以通过有限的步骤解决,那么该问题是可计算的。也就是说,它存在一个有效的算法来解决。
- 不可计算问题:如果不存在任何算法能够在有限的步骤内解决问题,那么该问题是不可计算的。
例子:
- 可计算问题:加法、排序、寻找最短路径等,都是可计算的,因为存在相应的算法能够在有限步骤内解决这些问题。
- 不可计算问题:停机问题(Halting Problem)是著名的不可计算问题。
6.4 停机问题(Halting Problem)
停机问题是可计算性理论中最著名的问题之一。
- 问题描述:给定任意一个程序和输入,确定该程序是否会在有限的时间内停止运行,还是会无限循环。
- 结论:图灵机无法解决停机问题,即没有通用算法能够判断所有程序在给定输入下是否会停机。
- 证明:由艾伦·图灵提出的归谬法(Proof by Contradiction)证明了停机问题的不可解性。假设存在一个能解决停机问题的程序,图灵构造了一个反例来显示这种假设会导致矛盾。
6.5 可计算性类
可计算性理论将问题分为多个类别:
- 可判定问题(Decidable Problems):可以通过算法在有限时间内解决的问题。即存在一台图灵机可以对每个输入在有限时间内给出正确的答案。
- 例子:加法运算、字符串匹配等。
- 半可判定问题(Semi-decidable Problems):也称为部分可解问题,这类问题只在答案为“是”的情况下能够在有限时间内确定结果。如果答案是“否”,算法可能永远不会停止。
- 例子:停机问题的变种,即当程序确实停机时可以检测到,但无法判断它是否会无限循环。
- 不可判定问题(Undecidable Problems):无论是答案为“是”还是“否”,都不存在算法能在有限时间内确定问题的解。这类问题是不可解的。
- 例子:停机问题。
6.6 归约与不可判定性
在证明一个问题是不可解时,常用的技术之一是归约法(Reduction)。
- 归约的基本思想:如果一个已知不可解的问题可以归约为另一个问题,那么该问题也是不可解的。
- 例如,如果我们能够把停机问题归约到某个新问题,并证明解决该新问题就意味着解决停机问题,那么该新问题也是不可解的。
6.7 计算性理论的实际意义
虽然计算性理论探讨的是抽象数学问题,但它对现实世界的计算也有重要的影响。
- 算法的极限:计算性理论告诉我们某些问题是无法通过任何算法解决的,从而帮助我们识别问题的“不可解性”。
- 程序验证:在编写复杂程序时,理论可以帮助我们理解程序的正确性验证是否可行,例如,完全验证一个程序不会进入死循环是不可解的。
示例
-
可判定问题示例:一个简单的求和算法可以在有限时间内判断两个数之和,因而它是一个可判定问题。
-
不可判定问题示例:停机问题,即没有任何通用算法能够判断一个程序是否会停机,因而是不可判定的。
第七部分:上下文无关语言与自动机高级话题
7.1 上下文无关语言(Context-Free Language, CFL)
上下文无关语言是形式语言的一种,能够通过上下文无关文法生成。上下文无关文法是一种生成规则,它定义了语言中符号序列的结构,而生成规则与符号的上下文无关。
定义:
- 上下文无关文法(Context-Free Grammar, CFG):由四元组 G=(V,Σ,P,S)G = (V, \Sigma, P, S)G=(V,Σ,P,S) 组成:
- VVV:非终结符集合。
- Σ\SigmaΣ:终结符集合,即字母表。
- PPP:生成规则集合,每个规则形式为 A→αA \to \alphaA→α,其中 AAA 是非终结符,α\alphaα 是终结符或非终结符的字符串。
- SSS:开始符号。
示例:
- 考虑文法 GGG 的规则:
- S→aSb ∣ ϵS \to aSb \,|\, \epsilonS→aSb∣ϵ
- 该文法生成的语言是所有由相同数量的字符
a
和b
组成的字符串,例如:ϵ\epsilonϵ、ab
、aabb
等。
7.2 上下文无关语言与推导树
- 推导树(Parse Tree):推导树是上下文无关文法生成语言过程中使用的一种树形结构,用来表示文法规则的应用顺序。
- 每个节点表示文法中的一个非终结符或终结符,根节点是开始符号,叶子节点是终结符。通过从根节点到叶子节点的路径,可以生成一个字符串。
示例:
- 对于规则 S→aSb ∣ ϵS \to aSb \,|\, \epsilonS→aSb∣ϵ,推导树可以表示出生成的字符串,例如:
- S→aSb→aaSbb→aabbbS \to aSb \to aaSbb \to aabbbS→aSb→aaSbb→aabbb。
7.3 上下文无关语言的应用
上下文无关语言广泛应用于编译器设计,尤其是语法分析(Parsing)阶段。
- 编译器通过上下文无关文法来解析源代码,将代码分解为语法结构,如表达式、语句等,并构建相应的语法树。
- 例子:编程语言的语法大多使用上下文无关文法,例如 Java、C++ 等。
7.4 上下文无关语言与自动机
上下文无关语言可以通过下推自动机(Pushdown Automaton, PDA)来识别。下推自动机是一种比有限自动机更强的计算模型,因为它配备了一个栈,可以用来存储额外的中间信息。
下推自动机的组成:
- 状态集 QQQ。
- 输入字母表 Σ\SigmaΣ。
- 栈字母表 Γ\GammaΓ。
- 初始状态 q0q_0q0。
- 接受状态集 FFF。
- 转移函数 δ\deltaδ:定义了当前状态、当前输入符号、当前栈顶符号下的状态转移和栈操作。
7.5 上下文无关语言与有限自动机的比较
- 有限自动机(Finite Automata, FA):只能处理正则语言,无法记住复杂的上下文信息。
- 例子:有限自动机可以识别由固定模式组成的字符串,如正则表达式
ab*
(所有以a
开头并跟随任意数量的b
的字符串)。
- 例子:有限自动机可以识别由固定模式组成的字符串,如正则表达式
- 下推自动机:比有限自动机更强,可以处理上下文无关语言,因为栈可以记住递归模式中的配对信息。
- 例子:下推自动机可以识别所有由
n
个a
和n
个b
组成的字符串,如a^n b^n
(上下文无关语言)。
- 例子:下推自动机可以识别所有由
7.6 上下文无关语言的局限性
虽然上下文无关语言比正则语言更强,但它们仍然有一些局限性。例如,它们无法处理某些需要更多内存或复杂关系的语言。
- 例子:语言 L={anbncn:n≥1}L = \{a^n b^n c^n : n \geq 1\}L={anbncn:n≥1} 无法通过下推自动机识别,因为栈只能存储一组配对信息,无法处理三组配对。
7.7 图灵机与上下文无关语言
- 图灵机可以识别比上下文无关语言更复杂的语言。图灵机拥有无限长的带子,因此可以模拟复杂的计算过程,能够处理递归可枚举语言。
- 下推自动机有栈的限制,而图灵机的带子可以无限扩展,因此它可以存储和处理比下推自动机更多的信息。
示例
- 有限自动机示例:用于识别正则语言,如所有以
a
开头并跟随若干个b
的字符串。- 字符串
abb
会被接受,而ba
不会被接受。
- 字符串
- 下推自动机示例:用于识别上下文无关语言,如
a^n b^n
,即a
和b
的数量相等的字符串。- 字符串
aabb
会被接受,而aaab
不会被接受。
- 字符串
总结
- 上下文无关语言由上下文无关文法生成,可以通过下推自动机识别,常用于编程语言和编译器设计中。
- 下推自动机比有限自动机更强,但仍然有限制;而图灵机则是最强大的计算模型,可以处理更加复杂的问题。
第八部分:证明技巧与理论推理
8.1 证明的类型
数学证明是推理的重要工具,用于验证命题的正确性。证明的基本类型包括:
-
直接证明(Direct Proof)
- 方法:从已知事实或假设出发,通过一系列推理直接得出结论。
- 应用场景:当可以从命题的定义或性质中推导出结论时使用。
- 例子:证明偶数的平方仍然是偶数。
- 假设 nnn 是偶数,则 n=2kn = 2kn=2k,其中 kkk 为整数。
- n2=(2k)2=4k2=2(2k2)n^2 = (2k)^2 = 4k^2 = 2(2k^2)n2=(2k)2=4k2=2(2k2),因此 n2n^2n2 也是偶数。
-
构造性证明(Constructive Proof)
- 方法:通过构造一个具体的例子来证明某个数学对象的存在性。
- 应用场景:当需要证明某个对象确实存在时使用。
- 例子:证明存在无穷多个质数。
- 通过构造一个新数 p1p2…pn+1p_1 p_2 \dots p_n + 1p1p2…pn+1,其中 p1,p2,…,pnp_1, p_2, \dots, p_np1,p2,…,pn 是已有的质数,可以证明质数是无穷的,因为新数不是已有质数的倍数。
-
非构造性证明(Non-constructive Proof)
- 方法:通过逻辑推理证明某个对象的存在性,但不提供构造该对象的具体方法。
- 例子:证明在一条无限长的直线上,必定存在两个点的距离为有理数。
-
反证法(Proof by Contradiction)
- 方法:通过假设命题为假,并推导出矛盾,从而证明原命题为真。
- 应用场景:当直接证明很困难或不可能时,反证法是常用的策略。
- 例子:证明 2\sqrt{2}2 是无理数。
- 假设 2\sqrt{2}2 是有理数,可以写作 2=ab\sqrt{2} = \frac{a}{b}2=ba(其中 aaa 和 bbb 是互质整数),通过推导出矛盾得出结论。
-
数学归纳法(Proof by Induction)
- 方法:用于证明命题对所有自然数 nnn 成立。通过证明基础情形 P(0)P(0)P(0) 和归纳步骤 P(k)→P(k+1)P(k) \to P(k+1)P(k)→P(k+1),可以得出命题对所有 nnn 成立。
- 应用场景:当命题与自然数 nnn 的变化有关时,数学归纳法是强有力的工具。
- 例子:证明 1+2+⋯+n=n(n+1)21 + 2 + \dots + n = \frac{n(n+1)}{2}1+2+⋯+n=2n(n+1)。
- 基础情形:当 n=1n = 1n=1 时,1=1(1+1)21 = \frac{1(1+1)}{2}1=21(1+1) 成立。
- 归纳步骤:假设对 n=kn = kn=k 成立,则对 n=k+1n = k+1n=k+1 成立。
8.2 反证法详细解释
反证法是通过假设命题为假,并从中推导出矛盾来证明原命题的方法。它是一种非常常见的证明技巧,尤其适用于证明“不存在”或“唯一性”等命题。
例子:证明没有最大的质数
- 假设反命题:假设存在一个最大的质数 ppp。
- 构造反例:考虑数 p1p2…pn+1p_1 p_2 \dots p_n + 1p1p2…pn+1,其中 p1,p2,…,pnp_1, p_2, \dots, p_np1,p2,…,pn 是所有质数的乘积。
- 推导矛盾:这个新数不是任何已知质数的倍数,因此它是质数或可以被质数整除,这与假设存在最大质数相矛盾。
- 结论:因此,假设有误,质数是无穷多的。
8.3 数学归纳法详细解释
数学归纳法是证明关于自然数 nnn 的命题的一种方法。它分为两个步骤:
- 基础情形:证明命题在 n=1n = 1n=1(或 n=0n = 0n=0)的情况下成立。
- 归纳步骤:假设命题在 n=kn = kn=k 时成立,证明它在 n=k+1n = k + 1n=k+1 时也成立。
例子:证明 1+2+⋯+n=n(n+1)21 + 2 + \dots + n = \frac{n(n+1)}{2}1+2+⋯+n=2n(n+1)
- 基础情形:当 n=1n = 1n=1 时,1=1(1+1)21 = \frac{1(1+1)}{2}1=21(1+1),成立。
- 归纳假设:假设当 n=kn = kn=k 时,1+2+⋯+k=k(k+1)21 + 2 + \dots + k = \frac{k(k+1)}{2}1+2+⋯+k=2k(k+1)。
- 归纳步骤:证明 n=k+1n = k+1n=k+1 时的命题: 1+2+⋯+(k+1)=k(k+1)2+(k+1)=(k+1)(k+2)21 + 2 + \dots + (k+1) = \frac{k(k+1)}{2} + (k+1) = \frac{(k+1)(k+2)}{2}1+2+⋯+(k+1)=2k(k+1)+(k+1)=2(k+1)(k+2) 归纳步骤成立,因此命题对所有 nnn 成立。
8.4 证明技巧的应用
证明技巧在很多数学和计算理论问题中扮演重要角色,特别是在分析算法的正确性、可计算性理论、复杂性理论等方面。通过证明,可以保证算法的正确性和健壮性。
示例
- 直接证明:证明偶数的加法结果仍然是偶数。
- 假设 a=2ma = 2ma=2m 和 b=2nb = 2nb=2n,则 a+b=2m+2n=2(m+n)a + b = 2m + 2n = 2(m+n)a+b=2m+2n=2(m+n),因此 a+ba + ba+b 也是偶数。
- 归纳法证明:证明 1+2+⋯+n=n(n+1)21 + 2 + \dots + n = \frac{n(n+1)}{2}1+2+⋯+n=2n(n+1)。
- 通过基础情形和归纳步骤可以证明该等式对所有自然数 nnn 都成立。