
▶
name:第七部分:综合实例:验证乘法程序
scene1 title:一个更复杂的例子:乘法程序
scene1 content:现在,我们将运用之前学到的所有知识,来验证一个计算两个整数乘积的程序。这个程序包含了条件判断和循环,是一个很好的综合练习。
scene2 title:验证策略:分段与组合
scene2 content:我们的策略是将整个程序分解为四个逻辑片段S1, S2, S3, S4。然后,我们逐一证明每个片段的正确性,最后使用组合规则将它们串联起来,证明整个程序的正确性。
scene3 title:验证S1:处理负数
scene3 content:第一段S1是一个if-else语句,它计算n的绝对值并存入变量a。我们可以证明,在S1执行后,断言 q: 'a = |n|' 成立。这与我们之前验证if-then-else的例子类似。
scene4 title:验证S2:初始化
scene4 content:第二段S2是初始化语句,k:=0, x:=0。在S2执行后,我们可以得到新的断言 r: 'q ∧ (k=0) ∧ (x=0)' 成立。
scene5 title:验证S3:核心循环
scene5 content:第三段S3是while循环。我们需要找到它的循环不变量。这里的循环不变量是 v: 'x = m*k ∧ k ≤ a'。我们需要证明v确实是不变量,并且循环会终止。
scene6 title:证明S3的循环不变量和终止性
scene6 content:首先,在循环开始前,k=0, x=0,满足x=m*k。其次,在循环体内,x增加m,k增加1,不变量关系'x=m*k'得以维持。最后,因为k从0开始每次加1,它最终会等于a,导致循环终止。
scene7 title:S3循环结束后的状态
scene7 content:根据迭代规则,当循环结束时,循环条件k<a为假,且不变量v为真。这意味着 k=a 且 x=m*k,所以我们得到 x = m*a。结合之前的a=|n|,我们得到 x = m*|n|。
scene8 title:验证S4:最终结果调整
scene8 content:第四段S4根据n的符号来确定最终结果。如果n<0,product=-x;否则product=x。我们可以证明,无论哪种情况,最终的product都等于m*n。
scene9 title:最终结论:组合所有证明
scene9 content:我们已经证明了从p{S1}q, q{S2}r, r{S3}s, 到s{S4}t的每一步都是正确的。根据组合规则,我们可以得出最终结论 p{S}t,即整个程序对于任意整数输入m和n,都能正确计算出它们的乘积m*n。课程到此结束,谢谢大家!

▶
name:第三部分:使用归纳法证明递归算法的正确性
scene1 title:归纳法与递归算法
scene1 content:数学归纳法和强归纳法是证明递归算法正确性的有力工具。因为递归算法的结构天然地与归纳法的证明结构相匹配。
scene2 title:实例:计算幂的递归算法
scene2 content:我们来看一个计算a的n次幂的递归算法。当n=0时,返回1;否则,返回a乘以power(a, n-1)的结果。我们要证明这个算法对于所有非负整数n都能正确计算出a的n次方。
scene3 title:建立证明框架
scene3 content:我们使用对指数n的归纳法来证明。设P(n)为命题:函数power(a, n)能正确返回a的n次方。
scene4 title:基础步骤:证明P(0)
scene4 content:基础步骤是证明P(0)为真。根据算法定义,当n=0时,函数直接返回1。而任何非零实数a的0次方都等于1。因此,P(0)成立。
scene5 title:归纳步骤:归纳假设P(k)
scene5 content:我们的归纳假设是:对于某个非负整数k,P(k)为真。也就是说,我们假设power(a, k)能够正确地返回a的k次方。
scene6 title:归纳步骤:证明P(k+1)
scene6 content:现在我们需要证明P(k+1)也为真。根据算法,power(a, k+1)会返回 a * power(a, k)。根据我们的归纳假设,power(a, k)的结果是a的k次方。所以,整个表达式的结果是 a * a^k,也就是a^(k+1)。
scene7 title:结论
scene7 content:我们已经证明了基础步骤和归纳步骤都成立。因此,通过数学归纳法,我们得出结论:这个递归算法对于所有非负整数n和非零实数a,都能正确地计算出a的n次方。