当前位置:
文档之家› 程序设计方法学基本理论程序正确性证明
程序设计方法学基本理论程序正确性证明
• 程序终止:若对于每个使得Q(i)为真的输入i,程序S 的计算都终止,则称程序S关于Q是终止的。
• 完全正确:若对于每个使得Q(i)为真,并且程序S的计 算都将终止的输入信息i,R(i,S(i))都为真,则称程序S 关于Q和R是完全正确的。
• 一个程序的完全正确,等价于该程序是部分正确,同 时又是终止的。
程序正确性的证明方法分类
• (1)证明部分正确性的方法
A. Floyd的不变式断言法
B. Manna的子目标断言法
•
C. Hoare的公理化方法
• (2)终止性证明的方法
•
A. Floyd的良序集方法
•
B. Knuth的计数器方法
•
C.Manna等人的不动点方法
• (3)完全正确性的方法
•
A. Hoare公理化方法的推广
程序规约的实例(1/2)
• 在书写程序规约时,使用Q表示前置断言,R 表示后置断言,S表示问题求解的实现程序。 在前置断言Q之前,还必须给出Q和R中所出现 的标识符的必要说明。
例1:求数组b[0 : n-1]中所有元素的最大值。 [in n:integer; in b[0:n-1]:array of integer; out y:integer] Q: {n ≥ 1} S
R:{y = MAX(i: 0 ≤ i < n; b[i])}
程序规约的实例(2/2)
例2:求两个非负整数的最大公约数。 [in a,b :integer; out y:integer] Q: {a ≥ 0 ∧ b ≥ 0} S
R:{y = MAX(i: 1 ≤ i ≤min(a,b) ∧
(a mod i = 0) ∧ (b mod i = 0): i)}
while( r ≥ y)
//该循环不变式断言:
{
//(x=y×q+r )∧ r ≥ 0
r = r-y;
q = q+1;
}
不变式断言法
• 证明步骤: – 1、建立断言:建立程序的输入、输出断言,如果 程序中有循环出现的话,在循环中选取一个断点, 在断点处建立一个循环不变式断言 – 2、建立检验条件,将程序分解为不同的通路,为 每一个通路建立一个检验条件,该检验条件为如 下形式: – I ∧ R => O,其中I为输入断言,R为进入通路的条 件,O为输出断言 – 3、证明检验条件:运用数学工具证明步骤2得到 的所有检验条件,如果每一条通路检验条件都为 真,则该程序为部分正确的。
End.
START
(x1,x2)->(y1,y2)
y1<>y2
T
y1>y2
T
y1:=y1-y2
F
z:=y1
STOP
F
y2:=y2-y1
不变式断言法实例(建立断言)
程序正确性理论是十分活跃的课题,不仅可 以证明顺序程序的正确性,而且还可以证明非确 定性程序,以及并行程序的正确性。
程序正确性理论
• 程序设计的一般过程
程序正确性理论
• 程序功能的精确描述
1、程序规约:对程序所实现功能的精确描述, 由程序的前置断言和后置断言两部分组成。
2、前置断言:程序执行前的输入应满足的条件, 又称为输入断言。
正确的。
程序正确性定义(2/3)
• 程序规约Q{S}R 是一个逻辑表达式,其取值 为真或假,其中取值为真的含义是指:给定 一段程序S,若程序开始执行之前Q为真,S的 执行将终止,且终止时R为真,则称为 “程序 S,关于前置断言Q和后置断言R是完全正确 的”。
程序正确性定义(3/3)
• 部分正确:若对于每个使得Q(i)为真,并且程序S计算 终止的输入信息i,R(i,S(i))都为真,则称程序S关于Q 和R是部分正确的。
3、后置断言:程序执行后的输出应满足的条件, 又称为输出断言。
程序设计过程:问题 程序规约 程序
程序规约的基本分类
• 非形式化程序规约 非形式化程序规约采用自然语言描述程序功能, 简单、方便,但存在二义性,因此,不利于程 序的正确性证明。
• 形式化程序规约 采用数学化的语言描述程序功能,描述精确, 无二义性,便于程序的正确性证明。
程序正确性概述
• 什么样的程序才是正确的? • 如何来保证程序是正确的?
关于程序正确性的认识
• 什么样的程序才是正确的? “测试”或“调试”方法 采根用据“问测试题”的方特法性可和以软发件现程所序要中实的现错的
功 计 现误 论能测被,上因,试测但研此却究选用试,不有择例程为能关保一 。 序证“证些 通 的明程程具 过 错程序序有 用 误序正的代 例 。中确正没性表 程确有证性 序性错明,的 执误”必数行!的须据,方从,去法理设发。
程序正确性证明发展历程
• 20世纪50年代 Turing开始研究 • 1967年,Floyd和Naur提出不变式断言法 • 1969年,Hoare提出公理化方法 • 1975年,Dijkstra提出最弱前置谓词和程序推导
方法,解决了断言构造难的问题,可从程序规 约推导出正确程序,使正确性证明变得实用。
不变式断言cd(x,y)。
Function gcd(x1,x2:integer); var y1,y2,z : Integer;
Begin y1:=x1;y2:=x1; while y1<>y2 do if y1>y2 then y1:=y1-y2 else y2:=y2-y1 end; z:=y1; write(z);
•
B. Burstall的间发断言法
•
C. Dijkstra的弱谓词变换方法以及强验证方法
循环不变式断言
• 把反映循环变量的变化规律,且在每次循环体的执行 前后均为真的逻辑表达式称为该循环的不变式断言。
例 带余整数除法问题:设x为非负整数,y为正整数, 求x除以y的商q,以及余数r。
程序:
q=0;r=x;
程序正确性定义(1/3)
程序设计过程:问题 程序规约 程序
• 衡量一个程序的正确性,主要看程序是否实现了问题 所要求的功能。若程序实现了问题所要求的功能,则 称它为正确的,否则是不正确的。
对程序的正确性理解,可以分为两个层次: • 从广义来说,一个程序的正确性取决于该程序满足问
题实际需求的程度。 • 从狭义而言,如果一个程序满足了它的程序规约就是