目录

  • 循环不变式(量)
    • 定义
    • 定理
  • 示例
  • 参考资料

循环不变式(量)

定义

循环不变量:S是一个语句,已知循环

while C do
E

当此循环满足以下条件,即:在任何循环开始前,语句S和C都为真,而且在循环结束后,S仍为真,那么S就是循环不变量。

定理

循环不变量定理:已知一个循环和循环条件的guard condition G。命 I(n) 为循环不变式。如果下面四个条件为真,那么此循环是正确的:

  1. Basic property: the pre-condition implies I(0)
  2. Induction property: for all ints k = 0, if guard and I(k) are true before the iteration, then I(k+1) is true after.
  3. Eventual falsity of the guard: after a finite number of iterations, G becomes false.
  4. Correctness of post-conditons: if N is the first place where G is false, and I(N) is true, then post-condition holds.

翻译:

  1. 基本属性:先验条件即 I(0)。
  2. 归纳属性:对于所有的整数 k = 0,如果守卫条件和 I(k) 都在迭代前成立,那么 I(k+1) 在迭代后也成立。
  3. 最终守卫条件不成立:经过有限的迭代次数后,守卫条件 G 不成立。
  4. 后验条件的正确性:如果 N 是第一个导致守卫条件 G 不成立的整数,且 I(N) 成立,那么后验条件也成立。

示例

guard condition G 是指在循环前对循环变量的检查,例如:while( i < n) 中的 i <= n

以求数组中最大值为例子:

Max(A[1],...A[n])m = A[1]
i = 1
while(i <= n) do if A[i] > m then
m = A[i]
end if
i = i + 1
end whilereturn m

循环前的先验条件为数组的第一个元素 m = A[1] 而且 i = 1。循环的后验条件是m是数组A中最大的元素。那么现在的循环不变量就是I(i): m是数组A中前 i 个元素的最大值。The guard condition condition G is i <=n.

通过在i上的推导来证明这个循环的正确性。首先,注意n是个固定的整数,而且 i 的初始值比n小,且每次循环n都增加,在某一点的时候 i <=n 为假。这在n-1次循环之后总会发生。

现在来证明循环不变量。首先,I(1)是真的,因为A[1] = m,所以在数组中只有一个元素,所以此时A[1]肯定是最大的。

为了进行推导,我们假设m是A[1]…A[i]中的最大值,这个假设为I(i),我们要证明的是在一次循环之后,I(i+1)将会成立。

考虑两种情况:

  1. A[i+1]>m,在这种情况下,A[i+1]比先前A中的元素都大,通过传递性,m=A[i+1]也是A[1]…A[i+1]中最大的元素。
  2. A[i+1]<m,此时,m的值不变。

两种情况下,A[i+1] 都是 A[i]……A[i+1] 中的最大元素,故得证。

参考资料

[ORIGIN] 循环不变量(Loop invariant)

[VALUED] 从快速排序看循环不变量

[VALUED] 循环/递归算法正确性证明里如何选择「循环不变量」?

[VALUED] 循环不变性(loop invariant)-证明算法的正确性的一种方法

[VALUED] Loop Invariant Condition with Examples

[VALUED] Loop invariants | cs.cornell.edu

循环不变式 Loop Invariant相关推荐

  1. loop invariant

    http://www.doc88.com/p-9661504502550.html p,q都是断言 R就是循环不变式 - By their role with respect to the postc ...

  2. 循环不变量(loop invariant)的理解

    在计算机科学中,循环不变量(loop invariant),是一组在循环体内.每次迭代均保持为真的某种性质,通常被用来证明程序或算法的正确性. 理解循环不变量这个概念对我们理解算法过程,和解决算法问题 ...

  3. 循环不变式(loop invariant)

    循环不变式是一种条件式(必须满足的条件,对循环而言是保持不变的,无论循环执行了多少次),循环语句没执行一次,就要求中间的结果必须符合不变式的要求. (1)进入循环语句时,不变式必须成立: (2)循环语 ...

  4. java 里的 循环不变式 百度百科,循环不变式

    熟练掌握数学归纳法的思路对于程序员来说是相当重要的.例如,要在程序中编写循环处理(loop) 时数学归纳法是非常有用的. 在编写循环时,找到让每次循环都成立的逻辑表达式很重要.这种逻辑表达式称为循环不 ...

  5. linux内核形式化验证,聪明人的笨功夫 -- MesaTEE安全形式化验证实践

    各类TEE(例如TPM和Intel SGX)提供了强大的可信计算硬件基础,但他们并不直接保证软件的安全性.诸如缓冲区溢出等内存安全问题为攻击者提供了侵入TEE的可乘之机.因此,软件内存安全保护极其重要 ...

  6. invariant 释义

    Effective Java 的 item 2 的 Builder 模式可以在 Builder 的 build 中检查参数是否符合约束条件,原文和中文版译文是这样的: Like a construct ...

  7. 循环控制-链表反转(与创建链表)

    0.目录 1.循环控制 2.Java代码实现 2.1 创建链表和递归反转实现 2.2 循环反转思路 2.3 链表反转的实现 2.4 测试用例 2.5 循环控制-创建链表 1.循环控制 循环书写方法: ...

  8. 算法入门章——引出贯穿《算法导论》全书的算法分析和设计框架

    刚刚认真学习了第二章,习题还未做.现在趁热打铁,先来凭空总结和回忆一下整个过程. 本章主要线索:通过引入两个算法,从插入排序分析和设计排序算法,引出了整本书后续各章节的算法设计和分析的框架.这个框架归 ...

  9. 英语单词大小序 c语言,C语言中的英语单词

    Electronic numerical integrator and computer  电子数字积分器和计算机 Patch panel 配线板 Von Neumann architecture 冯 ...

最新文章

  1. docker(3)docker下的centos7下安装jdk
  2. 基于分布式的短文本命题实体识别之----人名识别(python实现)
  3. favicon支持的图片格式
  4. STM32分类及命名方法
  5. PushYourself
  6. size_t和ssie_t的区别
  7. maven-settings.xml的那些事
  8. 工作274:ele-图标使用
  9. 因kuaipan等PPA造成的Duplicate sources.list entry 错误
  10. 【华为云技术分享】云小课 | 搬迁本地数据至OBS,多种方式任你选
  11. cookie知识,小应用:记住用户名;记录用户浏览记录
  12. 行测题中逻辑判断题的规律
  13. Lucene学习总结之一:全文检索的基本原理
  14. 在pfSense上使用pfBlockerNG(DNSBL)来阻止广告
  15. frp客户端进行windows远程桌面连接
  16. php 微信开发实战pdf,微信开发实战之模块化的实例详解
  17. 用于商用微处理器的快速位收集、位分散和位置换指令(一)
  18. c语言*p1 什么意思,p1什么意思_p1,意思_词汇大全意思全集
  19. Oracle应用之to_char(参数,'FM990.00')函数
  20. 军用杀手机器人,人类的救星还是魔鬼?

热门文章

  1. Zookeeper节点个数设置
  2. 联想a668t各种root方法汇集
  3. Zotero:文献管理神器五分钟学会
  4. 把字节数B转换为KB,MB,GB的方法
  5. 动态秘钥分发(基于PKI)的方案论文详读
  6. 笔记本显示网络电缆被拔出怎么解决_笔记本提示网络电缆被拔出,我在自己的位置上显示网络电缆被拔出,但? 爱问知识人...
  7. 菜鸟进阶高手, 推荐 7 个 Python 上手实战项目
  8. 计算机毕业设计Java企业员工工资管理系统
  9. Codeforces Round #590 (Div. 3)题解
  10. Excel事件触发VBA配置 - 名称管理器下拉菜单选项事件