今天又开眼界了,原来程序也可以证明正确性啊!编写代码,可以靠编程技巧,也就是 之前的问题定义,算法和数据结构,但是今天,作者告诉我们还可以用数学知识来证明程 序的正确性。这让我想起了dijkstra说的,程序员跟手术师最大的区别是:手术师如果 手术失败了,没有人会怪罪他,因为人体构造太负责。但是程序员就不同了,程序是你写 的,你如果不能完全控制程序的正确,没有人会听你的借口。所以说:一定要认真学好程 序的正确性构造,这方面作者推荐了《sciece of programming》,还有《编程的修炼》 这两本书在之后,就把它们看完。 本章作者主要证明了二分搜索程序的正确性。构造程序的正确性上来先要找到断言,也 就是所谓的循环不变式,当然这个在实际程序中,只有靠经验了。找到断言,即可以勾勒 出,输入、程序变量和输出之间的关系,使得程序员可以准确阐述这些关系。拿二分来说, 就是如果元素t在数组中,那么它一定在range中。在之后所有的操作都要遵循该不变式。 接下来看程序的结构。如果是顺序控制结构。则可以通过在语句之间添加断言并分别分 析程序执行的每一步。 如果是选择控制结构,则要对每一个分支进行结构的正确性证明。选择每一个分支, 使用断言来证明。例如,如果进入了if i>j的分支,那么我们就可以断言i>j并且使用 这个事实来推倒出下一个断言。 最麻烦就是迭代控制结构。要证明循环的正确性,就必须为其确立3个性质。 初始化:循环初次执行的时候不变式为真。 保持:如果在某次迭代开始的时候以及循环体执行的时候,不变式为真,那么循环执行 完毕的时候不变式仍然为真。每次迭代都保持该不变式为真。 终止:循环能够终止,并且可以得到预期的结果,而且我们必须用其他方法证明循环 一定能终止。就像二分每次范围都在减少,课后习题,豆子每次都在减少一个。 对于函数的正确性证明,首先要使用两个断言来陈述目的。 前置条件:调用该函数之前成立的状态。 后置条件的正确性有函数在终止时保证。 拿二分来说,前置条件是序列有序(二分),后置条件是找没有找到元素,返回位置。 如果在前置条件满足情况下调用函数,那么函数的执行将确立后置条件,这就是契约 编程。 证明程序的正确性是一门学问,如果违反断言就指明了程序的错误所在。程序状态的 断言对理解程序很有帮助。 附:代码在第五章的时候再详细讨论,本章的思想是关于如果正确证明程序。
编程珠玑第四章
最新推荐文章于 2018-02-27 19:27:48 发布