- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
课程讲义第02章-程序设计语言原理.ppt
第*页 第*页 公理语义:不变式 不变式(不变量,invariant)的概念在许多领域中有重要地位 – 程序理论中的不变式,指写在程序里特定位置的逻辑公式,要求程序执执行中每次达到某个(某些)情况时,这个公式都必须成立 – 其实,不变式并不特殊,因为写在程序里的断言,也就是位于代码中相应特定位置的不变式,“情况”就是执行达到这个位置 程序理论里最重要的不变式之一是循环不变式(loop invariant),要求一个循环的每次迭代开始之前成立,在描述和推导程序的意义时有特殊价值 直接插入排序算法两重循环的不变式(图示): 第*页 第*页 Floyd 最早提出用断言描述程序的意义,通过逻辑推导证明程序的正确性。他称自己提出的方法为“断言法”。基本方法: - 在流程图程序里的每条边上放一条断言 - 设法证明从一个动作框的入边上的断言出发,执行相应动作产生的效 果能保证该动作框的出边上的断言成立 - 对分支控制框也有特殊的规则(请自己考虑) - 如果对每个动作框都能证明上述事实成立,那么标注在流程图中各条 边上的断言就形成了该程序的一个(一套)语义描述 - 特别的,标在程序入口和出口上的断言表示了这段程序的整体效果 Hoare 总结了Floyd 的工作,针对结构化的程序控制结构提出了一套逻辑推理规则,这就是有名的Hoare 逻辑 公理语义:程序的意义 第*页 第*页 公理语义:Hoare逻辑 Hoare 逻辑是对有关程序意义的逻辑描述的整理和系统化 Hoare 逻辑中的逻辑公式形式为(称为Hoare 三元组): {p} S {q} 其中p 和q 是谓词逻辑公式,S 是一段程序 直观意义:如果在S 执行之前公式p 成立,在S 执行终止时q 就成立 Hoare 的最重要贡献是提出了一套推理规则,通过这些规则,可以把证明一 个Hoare 公式(程序S 相对于p 和q 的正确性)的问题归结为证明一组普通 一阶谓词逻辑公式的问题 Dijkstra 在此基础上提出了最弱前条件(weakest precondition)的概念,借 助于这一概念,可以 ? 把程序的正确性证明工作进一步规范化 ? 用于做程序的推导(从规范出发推导程序) 第*页 第*页 公理语义:Hoare逻辑 公理: 规则[LOOP] 里的I 是循环不变式 第*页 第*页 公理语义:Hoare逻辑 可以用Hoare 逻辑证明程序的正确性,也就是说,证明三元组中的程序语句“符合”前后条件的要求。其意义是: 若在前条件满足的情况下执行语句且语句执行终止,那么后条件满足 这个证明并不保证语句终止,如果语句的执行不终止,什么后条件都可以证明。因此,这样证明的正确性称为“部分正确性” 程序终止性需要另外证明,主要是需要证明其中循环的执行必然终止 如果同时证明程序的部分正确性和终止性,这一程序就是“完全正确的”程序正确性证明中的一个关键点是为各个循环提供适当的不变式 就像做数学归纳法证明中需要合适的归纳假设,过强或过弱都不行 人们已证明,循环不变式不可能自动生成(无完全的算法,但有许多研究) 公理语义为我们提供了许多有助于理解程序行为的概念,为设计程序时思考 其行为提供了重要的依据和线索。 第*页 第*页 指称语义 指称语义学(denotational semantics)有坚实的数学基础,它的基本想法由C.Strachey 提出,D. Scott 完成了它的基础理论并因此获图灵奖 指称语义的基本思想是定义一个语义函数(指称函数),把程序的意义映射到某种意义清晰的数学对象(就像用中文解释英文) 作为被指的数学对象可以根据需要选择 对简单的程序语言,一种自然的选择是把程序的语义定义为从环境到环境的函数(作为指称)。定义语义就是指定每个程序对应的函数 环境的集合: 语义映射: 表达式的语义: 假设是整型表达式 命令的语义: 第*页 第*页 指称语义 表达式的语义定义: 语句的语义定义: 第*页 specification LISTS sorts List NATURALS formal sort Component Operations empty_list : List cons(_,_) : Component,List→List headof_ : List → Component tailof_
文档评论(0)