循环不变式的要点.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
首先不存在所谓的循环不变式和一般的循环的区别。 其次不可以把条件式当作不变式。因为条件式在跳出while后不成立。 下面是科普时间。 我们要建立一家生产火柴的小厂。 为了发展的好,我们要对火柴的质量有所保证(暂不考虑选址原料销售等问题)。那我们该怎么保证火柴的质量? 员工小明说,每个火柴我们都点一下试试吧,这样最保险。可保险是保险了,就算不考虑火柴还能不能用的问题,这其中的人力物力成本是无法承受的。这就是“穷举”。 员工小芳说,那我们就抽样,每一百箱抽出一箱来做点燃实验。如果抽样的方法没问题,这能体现火柴的质量。就是日常用的“黑盒测试”,搞一些测试用例来来看一下输出是否满足要求。 员工小刚说,我们生产火柴的生产线有这么多道工序,保证每道工序没问题(上一工序输出的产品符合要求,那么经过这一工序,输出的产品也没问题)那么最终的产品也没有问题。这也是我们自查程序常用的方式。通常对于顺序程序来说,每一语句都没问题,那么程序就没问题。 组长小菊说,小刚的方法不错,可是我们引进的生产线里有环,怎么办呢?每次进入环的产品都不一样啊。 班长说,虽然有环,产品有区别,但他们都满足一些性质,我们可以利用这些性质来确定最终产品合格。这个就是invariant。 对于程序,验证起来和上述过程差不多。而程序中控制语句大致有三种,一是通常的顺序往下一步步执行,二是ifelse这种判断,三是循环。对于前两种,只要一步步的走就行了;而对于循环,我们需要找出不变量。(准确来说不变量是一种性质,且这个性质在多次循环中保持) 就是个思想,说明正确算法的循环过程中总是存在一个维持不变的特性,这个特性一直保持到循环结束乃至算法结束,这样就可以保证算法的正确了。 要寻找循环不变的特性,一般都是循环结束时数据具有的特性。如何寻找循环不变量,没有一般方法,不过这是证明算法正确性的最正规的方法。 循环不变式主体是不变式,也就是一种描述规则的表达式。其过程分三个部分:初始,保持,终止。   1、在循环,迭代,递归等用上次结果作为下次初始值的累计过程都可以准确无误的使用。   2、在循环不变式三要素,初始,保持,结束。初始一定要正确,循环的时候也要保证不变式为真,循环一定要可以结束才能得到正确结果。其中后两条比较容易疏漏,解题时要慎而又慎严谨对待循环中不变式和结束条件。   3、可以把三要素再进行一次转化,使之更适合计算机程序:一次循环开始时候不变式为真,一次循环完毕时为真,总循环可以结束,结果必定正确。 抽象解释算是告诉你这么一个世界观: 分析程序, 不要死磕在最底层的具体的细节上, 要在更高的视野上去思考. 传统的解释器知道每个变量最具体的值, 是1, 是2, 还是false. 每个变量的值域就是它原始的值, 姑且称之为具体值域(concrete domain). 这种解释器其实就是具体解释器(concrete interpreter). 所以抽象解释之所以有这个名字就是因为每个变量的值域不是原始的值, 而是一个更高阶的抽象值域(abstract domain). 如果你写好了一个传统的解释器, 迁移到抽象解释器, 差不多就是写一个函数把具体值域映射到抽象值域. 当然你还要适当地修改一下解释器处理抽象值的代码, 也就是语义(semantics), 如之前传统的解释器里1+1返回2, 但是对于做类型推导的抽象解释器看到的是int+int返回的是int. 但是怎么样设计这个抽象值域以及对应语义函数, 抽象解释不管这个, 人家只是告诉你需要这么些东西. 抽象解释就是用来计算程序某些属性的静态分析。但是呢一个程序完全可以有无数种具体的运行时状态(可以理解为变量的值的组合),静态不可能穷举完,不然就变成动态分析了。这时候就要取舍了。 抽象解释牺牲精度换取时间。它将程序某些具体值(concrete value,不一定是变量的值)概括成一个抽象值(abstract value),这样有些语句只用遍历有限次就可以概括它所有运行时的…呃,这个具体属性。一个sound(不知道怎么翻译…)的抽象解释可以把所有具体值可以映射到一个相应的抽象值,但反过来却不行,反过来只能把抽象值映射成相应的具体值的集合,最后抽象解释的结果是抽象值,丢失了精度。但仍然能正确地总结出程序的某些属性。 最经典又简单的例子就是把无限的整数的具体值抽象成正、负、0这三个有限的抽象值。网上随便找个抽象解释的课件都有这个例子。 断言表示程序写错了,只要发生断言(更正:此处应为断言失败),意味着至少有一个人得修改代码。它的性质如同编译错误。例如一个函数规定某输入参数非空,来个断言。如果调用者送了空参数触发断言失败,要么调用方改代码不传空参数,要么被调用方改代码允许空参数处理。如果代码书写完全正确,但因外界环境或者用户操作

文档评论(0)

187****3802 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档