一个好的证明【proof】需要有7个特性:
- 正确【correct】
- 完备【complete】
- 清晰【clear】证明需要清晰,这样人们才理解发生了什么
- 简洁【brief】抓住关键点,这样人们才不会被细节整崩溃
- 优雅【elegant】这是数学家对美的概念
- 组织有序/井井有条【well organized】例如,使用引理【lemmas】的方式与编写代码时应使用子例程【subroutines】的方式相同,有助于使其清晰
- 有序【inorder】自顶向下进行证明,从事实出发,不要反其道行之
我们学习证明的原因,是因为我们需要证明程序【program】是否按照我们的预期执行。
问题:找到一个移动顺序,完成从
A | B | C |
D | E | F |
H | G |
到
A | B | C |
D | E | F |
G | H |
的转化。
定理【theorem】:没有这样的合法移动的顺序,来使得全部单词有序。
我们需要使用被称为 invariant 的东西来证明该定理,它是计算机科学中一个非常强大且常用的概念,正如我们将看到的,它与归纳【induction】密切相关。
为了证明你的系统永远不会达到一个特定的特殊状态,我们只需要证明,在初始状态下,存在一些称为不变量【invariant】的性质/属性【property】,并且随着每次移动,这些不变量【invariant】均保持不变,但是,它在特定的特殊状态下是不存在的。
这个 idea 是这样的,如果你得到这个称为不变量【inariant】的神奇性质/属性【property】,并且它在开始时持有,并且在每一步都仍然持有,那么唯一的状态
你可以达到必须有属性,是不变的。如果特殊状态没有那个属性,你就无法达到它。
它的思想是,如果你得到这个称为不变量【inariant】的神奇性质/属性【property】,他在初始时成立,在每一步中仍然成立,那么在你抵达终态时,它依然要成立,即必须具有该性质/属性【property】。如果在特殊状态下不具备该性质/属性【property】,那么你将永远不肯呢个抵达该状态。
我们来分析九宫格中的不变量【inariant】性质/属性【property】。
Lemma 1 : 行移动【row move】不会改变其中项【items】的顺序
Proof : 很明显,在行移动【row move】中,我们将一个项【item】从一个单元格移动到相邻单元格(例如 i - 1 或者 i + 1),没有其他的移动了,因此关于项【item】的顺序可以被保持下来。
但是在九宫格中不仅存在行移动【row move】,还存在列移动【column move】。
列移动【column move】回改变项【item】的顺序!!!
Lemma 2 : 所以一个列移动会改变一个项【item】与前两个或后两个项【item】的顺序,这意味着其相对顺序发生了变化。
Proof : 在列移动中,我们将单元格 i 中的某项 i 移动到单元格中的空白单元格(例如 i - 3,i + 3)。
当一个项【item】移动三个位置时,它会改变与另外两个项【item】的相对顺序。你甚至可以写下它们是什么,它们可以是 i - 1,i - 2,或者是 i + 1,i + 2,这些家伙的顺序被改变了。
So 在行移动中,顺序不变。在列移动中,两个字母/项【item】的序对【pair】的顺序发生翻转。
Definition :一对字母或者项【item】,我们称其为 L1 和 L2——如果 L1 在字母表中位于 L2 之前,但 L1 在九宫格拼图中出现在 L2 之后,则它们形成一个反转【inversion】,也称为反转对【inversion pair】。
例如,让我们看看在下面这种情况下我们有多少反转【inversion】?
A | B | C |
F | D | G |
E | H |
共计3组:
- (D,F)
- (E,F)
- (E,G)
Lemma 3 : 在移动过程中,。反转的总数只会增加 2 个,或者减少 2 个,或者保持不变。
Proof :
在行移动中,反转保持不变;
在列移动中,2 个序对【pair】改变了顺序
- case 1,两个序对均有序 => 反转的数量增加 2
- case 2,两个序对均反转 => 反转的数量减少 2
- case 3,一个序对有序,一个序对无序列 => 序列的数量不变
推论【Corollary】:在移动过程中,反转的数量的奇偶性不会改变。
证明【Proof】:加 2 或者减 2,并不会影响奇偶性。
好了,现在我们准备好声明不变量【invariant】了。
Lemma 4 : 在从下面的九宫格拼图可达的任何状态下
A | B | C |
D | E | F |
H | G |
反转【inversion】的奇偶行总是奇数。
证明方法是使用归纳法。不变量证明总是用归纳法。
Proof : 归纳假设【inductive hypothesis】——这在使用不变量的证明中非常典型——是这样的,P(n)表示从起始状态开始的任意 n 次移动,我们从
A | B | C |
D | E | F |
H | G |
这个起始状态开始,其反转【inversion】数量的奇偶行总是奇数。
Base case:n = 0 ,即我们没有做任何移动,我们的初始状态下,反转【inversion】数量 = 1 => 奇偶性为奇数,满足我们的假设。因此 P(0) 满足。
Inductive step:我们需要证明,对于 n >= 0,P(n) => P(n+1)
我们需要考虑任意顺序的 n+1 次移动,我们将这些移动标记为 ...
现在,通过归纳假设【I.P.】 P(n),我们知道在前 n 次移动之后,奇偶性仍是奇数
即, ...
的奇偶性是奇数
然后,在推论【Corollary】中,我们知道,任何的移动均不会改变奇偶性
因此 ...
的奇偶性仍然是奇数,而这就是 P(n+1),证明完成
推论【Corollary】通常是其他事物的简单结果。推论有一个非常短的证明。通常当你看到推论时,他经常可以在 10 页内证明完成。
引理【lemma】是用来做更大事情的工具,通常是用于证明其他定理或其他引理。
现在证明变得很简单,因为我们已经完成了所有这些引理【lemma】和推论【Corollary】。
现在我们要讲定理【theorem】了,这是最后一件事,我们真正追求的东西。这点很重要。
事实上,定理【theorem】已经呼之欲出了,即我们没有办法通过移动改变 G 和 H 的顺序!!
我们接下来对该定理进行证明~~
Proof
在目标状态下的反转【invertion】的数量的奇偶性,是偶数,及没有乱序存在,全部有序。
通过lemma 4,我们知道,从初始状态,我们永远无法达到该目标状态,因为其初始的状态下的奇偶性是奇数。
证明结束。
实际上,这个谜题在 1880 年代后期非常流行。
现在,我想可能你明白为什么不变量【invariant】很重要了。
但是说有一天,你正在构建运行核反应堆的软件。现在,有一种你真的想避免的状态——崩溃。
你想要能够证明,在核反应堆程序中,发生的任何一系列动作中,你永远不会达到崩溃状态。
那么你会使用不变量来证明这一点。
或者,如果您正在为航空公司构建软件,您希望永远不会达到崩溃状态。
或者,如果您正在制造辐射设备,您永远不想陷入让患者受煎熬的状态。
所以这是一个重要的概念。
所以在今天剩下的时间里,我们将讨论一种不同的归纳【induction】,称为强归纳【strong induction】。它与普通的归纳非常相似,但在解决某些问题时使用起来更容易一些。
现在,就像常规归纳一样,强归纳可以用一个公理【axiom】来表达。
因此,让我向您展示强归纳公理。
强归纳公理【strong induction axiom】
let P(n) be any predicate
if P(0) -- base case to be true
and ∀ n,(P(0) ∧ P(1) ∧ P(2) ...∧ P(n)) => P(n+1) is true
Then ∀ n P(n) is always true
我们发现,强归纳和普通归纳的唯一区别就是这部分---(P(0) ∧ P(1) ∧ P(2) ...∧ P(n))
在普通归纳中,你只需要证明 P(n) => P(n+1)
在强归纳中,你需要证明(P(0) ∧ P(1) ∧ P(2) ...∧ P(n))这些所有事实一起,蕴含出 P(n+1)
注:(P(0) ∧ P(1) ∧ P(2) ...∧ P(n))指的是P(0) 为真 and P(1) 为真 and P(2) 为真 and P(n) 为真
为了证明蕴含,我们假定(P(0) ∧ P(1) ∧ P(2) ...∧ P(n)) 均为真,在普通归纳中,我们只要假定P(n) 为真即可。
你需要假定更多~~因此他是一种更强的证明技术。
事实上,任何用强归纳法能证明的,用普通归纳法也能证明。只是可能更难。所以你不能用它(强归纳)来证明更多,但它可以使你的证明更容易。
栗子 1 拆垛游戏。
定理【theorem】:对于拆垛游戏的所有策略,最终会产生相同的分数(我们用S(n)表示)。
Ex:S(8) = 28
Proof:通过强归纳【strong induction】
任何类型的归纳证明的下一步是什么?
predicate!!!
所以对于归纳假设,谓词是什么呢?谓词就是我们的定理,即在所有策略下,分数均相同
base case
当 n = 1时,S(1) = 0,按照规则,我们无法做任何的移动,因此得分为0
inductive step
在这里,我们假定【assume】P(1) P(2) P(3) ... P(n) ,来证明P(n+1)
所以,我们从 n+1 个块开始,我们可以以某种方式拆分它,
比如 n + 1 可以拆分为 k 和 n + 1 - k,其中 1 <= k <= n