循环不变式 Loop Invariant
目录
- 循环不变式(量)
- 定义
- 定理
- 示例
- 参考资料
循环不变式(量)
定义
循环不变量:S是一个语句,已知循环
while C do
E
当此循环满足以下条件,即:在任何循环开始前,语句S和C都为真,而且在循环结束后,S仍为真,那么S就是循环不变量。
定理
循环不变量定理:已知一个循环和循环条件的guard condition G。命 I(n) 为循环不变式。如果下面四个条件为真,那么此循环是正确的:
- Basic property: the pre-condition implies I(0)
- Induction property: for all ints k = 0, if guard and I(k) are true before the iteration, then I(k+1) is true after.
- Eventual falsity of the guard: after a finite number of iterations, G becomes false.
- Correctness of post-conditons: if N is the first place where G is false, and I(N) is true, then post-condition holds.
翻译:
- 基本属性:先验条件即 I(0)。
- 归纳属性:对于所有的整数 k = 0,如果守卫条件和 I(k) 都在迭代前成立,那么 I(k+1) 在迭代后也成立。
- 最终守卫条件不成立:经过有限的迭代次数后,守卫条件 G 不成立。
- 后验条件的正确性:如果 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)将会成立。
考虑两种情况:
- A[i+1]>m,在这种情况下,A[i+1]比先前A中的元素都大,通过传递性,m=A[i+1]也是A[1]…A[i+1]中最大的元素。
- 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相关推荐
- loop invariant
http://www.doc88.com/p-9661504502550.html p,q都是断言 R就是循环不变式 - By their role with respect to the postc ...
- 循环不变量(loop invariant)的理解
在计算机科学中,循环不变量(loop invariant),是一组在循环体内.每次迭代均保持为真的某种性质,通常被用来证明程序或算法的正确性. 理解循环不变量这个概念对我们理解算法过程,和解决算法问题 ...
- 循环不变式(loop invariant)
循环不变式是一种条件式(必须满足的条件,对循环而言是保持不变的,无论循环执行了多少次),循环语句没执行一次,就要求中间的结果必须符合不变式的要求. (1)进入循环语句时,不变式必须成立: (2)循环语 ...
- java 里的 循环不变式 百度百科,循环不变式
熟练掌握数学归纳法的思路对于程序员来说是相当重要的.例如,要在程序中编写循环处理(loop) 时数学归纳法是非常有用的. 在编写循环时,找到让每次循环都成立的逻辑表达式很重要.这种逻辑表达式称为循环不 ...
- linux内核形式化验证,聪明人的笨功夫 -- MesaTEE安全形式化验证实践
各类TEE(例如TPM和Intel SGX)提供了强大的可信计算硬件基础,但他们并不直接保证软件的安全性.诸如缓冲区溢出等内存安全问题为攻击者提供了侵入TEE的可乘之机.因此,软件内存安全保护极其重要 ...
- invariant 释义
Effective Java 的 item 2 的 Builder 模式可以在 Builder 的 build 中检查参数是否符合约束条件,原文和中文版译文是这样的: Like a construct ...
- 循环控制-链表反转(与创建链表)
0.目录 1.循环控制 2.Java代码实现 2.1 创建链表和递归反转实现 2.2 循环反转思路 2.3 链表反转的实现 2.4 测试用例 2.5 循环控制-创建链表 1.循环控制 循环书写方法: ...
- 算法入门章——引出贯穿《算法导论》全书的算法分析和设计框架
刚刚认真学习了第二章,习题还未做.现在趁热打铁,先来凭空总结和回忆一下整个过程. 本章主要线索:通过引入两个算法,从插入排序分析和设计排序算法,引出了整本书后续各章节的算法设计和分析的框架.这个框架归 ...
- 英语单词大小序 c语言,C语言中的英语单词
Electronic numerical integrator and computer 电子数字积分器和计算机 Patch panel 配线板 Von Neumann architecture 冯 ...
最新文章
- docker(3)docker下的centos7下安装jdk
- 基于分布式的短文本命题实体识别之----人名识别(python实现)
- favicon支持的图片格式
- STM32分类及命名方法
- PushYourself
- size_t和ssie_t的区别
- maven-settings.xml的那些事
- 工作274:ele-图标使用
- 因kuaipan等PPA造成的Duplicate sources.list entry 错误
- 【华为云技术分享】云小课 | 搬迁本地数据至OBS,多种方式任你选
- cookie知识,小应用:记住用户名;记录用户浏览记录
- 行测题中逻辑判断题的规律
- Lucene学习总结之一:全文检索的基本原理
- 在pfSense上使用pfBlockerNG(DNSBL)来阻止广告
- frp客户端进行windows远程桌面连接
- php 微信开发实战pdf,微信开发实战之模块化的实例详解
- 用于商用微处理器的快速位收集、位分散和位置换指令(一)
- c语言*p1 什么意思,p1什么意思_p1,意思_词汇大全意思全集
- Oracle应用之to_char(参数,'FM990.00')函数
- 军用杀手机器人,人类的救星还是魔鬼?
热门文章
- Zookeeper节点个数设置
- 联想a668t各种root方法汇集
- Zotero:文献管理神器五分钟学会
- 把字节数B转换为KB,MB,GB的方法
- 动态秘钥分发(基于PKI)的方案论文详读
- 笔记本显示网络电缆被拔出怎么解决_笔记本提示网络电缆被拔出,我在自己的位置上显示网络电缆被拔出,但? 爱问知识人...
- 菜鸟进阶高手, 推荐 7 个 Python 上手实战项目
- 计算机毕业设计Java企业员工工资管理系统
- Codeforces Round #590 (Div. 3)题解
- Excel事件触发VBA配置 - 名称管理器下拉菜单选项事件