![形式化方法--程序的正确性验证-14_第1页](http://file3.renrendoc.com/fileroot_temp3/2021-12/21/87bf62da-fd18-47c9-98bb-f80e0880676a/87bf62da-fd18-47c9-98bb-f80e0880676a1.gif)
![形式化方法--程序的正确性验证-14_第2页](http://file3.renrendoc.com/fileroot_temp3/2021-12/21/87bf62da-fd18-47c9-98bb-f80e0880676a/87bf62da-fd18-47c9-98bb-f80e0880676a2.gif)
![形式化方法--程序的正确性验证-14_第3页](http://file3.renrendoc.com/fileroot_temp3/2021-12/21/87bf62da-fd18-47c9-98bb-f80e0880676a/87bf62da-fd18-47c9-98bb-f80e0880676a3.gif)
![形式化方法--程序的正确性验证-14_第4页](http://file3.renrendoc.com/fileroot_temp3/2021-12/21/87bf62da-fd18-47c9-98bb-f80e0880676a/87bf62da-fd18-47c9-98bb-f80e0880676a4.gif)
![形式化方法--程序的正确性验证-14_第5页](http://file3.renrendoc.com/fileroot_temp3/2021-12/21/87bf62da-fd18-47c9-98bb-f80e0880676a/87bf62da-fd18-47c9-98bb-f80e0880676a5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十四讲 形式化方法-程序的正确性验证一、概述计算机的程序是一种静态的对象,但它所描述的问题(问题的解)却是一个动态的对象。所谓的程序设计就是用程序设计语言中的语句改变程序中数据对象的状态,构造所描述问题的动态行为。这是不自然的,程序所描述的动态行为也无法直接用程序本身的静态结构进行正确性证明。形式化规约(formal specification)是需求阶段的形式化说明,是用户需求的严格描述,其一般形式用Hoare逻辑描述1如下:P <1>其中和分别表示初始和结束断言条件,其含义是:“假如初始状态dI满足条件,那么程序结束并且终结状态df必须满足”。设DD1××
2、Dn为程序P的状态空间,其中,Dj(j=1,n)表示程序中数据对象的值域。显然,由和断言条件所确定的合法初始和结束状态的集合是D的一个子集。 执行函数E:×P定义如下: 无定义 对合法的初始状态di,程序P不结束E(P,dI)= 终结状态df 对合法的初始状态di,程序P结束程序的正确性即为:Piff <2>"di(di)(程序P结束 and (E(P,di)总地来讲,验证一个程序的正确与否有两种办法,一种是程序的测试,另一种是程序的正确性证明。1 程序的测试与程序的验证 对给定的一个合法的初始状态di,当程序执行结束时其终结状态为df,那么,(di)和(df)
3、都应该被满足。这一点可用下式表示:diPdf <3>所谓程序的测试就是验证测试用例diPdf,即验证程序对di的执行结果是否为df。由于合理的初始状态是无限的,因此,对程序验证来讲,测试不是一个完备的方法。测试被认为是一种尽量发现错误,但并不能保证程序中没有错误2的方法。对大数应用来讲,它是可满足的;但对有些应用来讲,测试是一种不能满足的验证方法,例如:航空、航天等领域的软件系统。显然,对要求绝对正确的软件,测试是一种不能采用的方法。无论白盒测试还是黑盒测试都是在无限集合(di,df)|"di,"df, di和df满足diPdf中选择有限的一些(di,df)对进
4、行验证,而各种测试方法只是选择(di,df)的策略不同而已。因此,验证程序是否完全正确要寻求另外的解决途径。那就是程序的正确性验证。2 形式语义与程序的正确性验证 程序的正确性验证应该具有严密的推量过程,以保证程序每步执行结果都是希望的结果,而与程序执行的某个初始状态无关。程序的正确性证明现有三种方式:操作语义、指称语义和公理语义。它们分别用不同的形式化方法,严格地证明一个程序是否正确。尽管这种方法还不够完善,还不为一般软件人员所掌握,但它确实是保证软件绝对正确的唯一途径。操作语义(Operational Semantics) 操作语义的根据是,一种程序设计语言一但在某种计算机系统中实施,其语
5、义的含义也就完全确定下来了,因此,自然地就用语言的实施作为语言含义的定义,故称这种语义为操作语义。当然,这种实施应该在一种标准的、抽象的机器上进行。英国科学家P.J.Landin最早提出这种类型的一个抽象机器,称为“栈-环境-控制-外存”。IBM公司提出了一种可描述程序设计语言语义的元语言:VDL。后来,英国的爱丁堡大学提出了更一般的方法:在数据结构上用数学关系建立操作语义的解释系统。这种方法的本质就是,用抽象机器的状态空间和最简单的基本指令来定义抽象语言的语义,将抽象语言的程序转换为一系列抽象机器的基本指令序列。这种对应关是固定的,而且抽象机器的基本指令的含义是固定的,这样一个程序设计语言的
6、程序就有了一个明确的、无二义的语义。为了验证一个抽象程序的正确性,就必须在抽象计算机上执行其相应的基本指令序列。基本指令序列的一次执行只能验证一组输入、输出状态之间的关系。因此,用操作语义验证一个程序的正确性实质上是一种测试型的验证方式。指称语义(Denotational Semantics)指称语义学认为,程序设计语言的语义是由其语言成份的语义决定的,而程序设计语言成份的语义应该是其本身固有的,与程序设计语言的个体实现无关。指称语义的出发点是语言成份执行的最终结果,而不是其执行过程。这种执行结果是由语言成份形式后面隐藏的所指物决定的,故这种方式也称为指称语义。指称语义是由牛津大学的C.Str
7、achey教授创立,D.Scott教授完善的,故指称语义也称为牛津语义。IBM公司也创立了基于指称语义的VDM软件开发方法。指称语义的指称物均为数学对象,如整数、集合和映射等。指称物的集合称为论域。一个语言的指称语义就是确定该语言的相关论域,并给出语法成份到论域上的语义映射。一个抽象的程序设计语言程序的语义就是指称语义所指的数学对象在论域上的数学运算,其正确性证明就是指称语义相应的数学运算公式的特性(递归类型语言成份的数学运算公式特征就是其不动点的特征),这些性质是可严格推理和证明的。公理语义(Axiomatic Semantics)公理语义是根据数学中的公理化方法形式化程序设计语言相关语法的
8、语义。赋以公理语义的程序设计语言,可推理出该程序设计语言的程序语义,也可用逻辑推理的方法证明该程序是否具有某种性质。公理语义是最流行的程序证明方法。这种方法最早是由Floyd在他的“Assigning Meanings to Programs”一文中提出的,后经C.A.Hoare在它的“An Axiomatic Basis for Computer Programming”一文中发展和完善的。公理语义对程序设计语言中的每个成份(包括整个程序)定义了一对断言(assertoin):前置断言(Precondition)和后置断言(Postcondition)。前置断言是某个语言成份在执行前满足的谓
9、词,而后置断言则是该语言成份执行后应该满足的谓词。有两种使用公理语义的方式,一种是所谓的自顶向下的方法,用前置和后置断言描述用户的需求,然后,将前置断言向后置断言转化的步骤逐步细化,直到每一步都能用计算机语言进行实施为止。只要保证分解的步骤是正确的,那么最终的程序设计结果也是正确的。这种方法的典型代表是唐稚松先生的XYZ系列语言4。另一种方法是自底向上的,根据每个语言单元定义的前置断言和该成份本身的特征,推导出其后置断言。一个语法单元的后置断言可作为下一个语法单元的前置断言,从而揄出整个程序的后置断言,以此可证明程序应满足的性质和程序的正确性。二、公理系统:Hoare逻辑和时态逻辑公理系统是最
10、流行的程序正确性证明和验证的方法,Hoare系统是公理系统中的典型代表,它用命题P表法程序P的语义:如果程序执行前满足断言,则当程序执行终止后,它一定满足断言。下面通过一个经典的例子说明Hoare逻辑表述和其优缺点。求n!的程序FAC(程序FAC的描述采用FLOW语言2,以下其它程序的描述相同):1=>x; n=>y; (while(y,0) do (*(x,y)=>x; -(y,1)=>y)。表示当n为任意自然数时,如果该程序执行终止,x的值为n!,这一性质可用nÎNFACx=n!命题表示。用命题还可表示程序FAC的其它性质,如:ttFACy=0命题表示无论
11、初值如何,当程序终止时,y的值为0。由于命P不能保证程序P一定能终止,因此,这种命题也称为程序的部分正确性证明的命题(因为证明程序是否结束是一个递归不可判定问题,即图灵机停机问题。本文不深入讨论,以下所说的程序正确性证明均指部分正确性证明,在文章的最后再给出正确性证明的补充)。这种程序正确性的命题如果为真,就称其为Hoare系统中的定理。那么,如何用公理的方法进行推理呢?设D(A,I)是一个演绎系统,其中,A(A1,A2,Am)表示公理的集合;I(I1,I2,In)表示规则的集合。公理是一个系统中不用证明、预先承认的事实。如果,S是系统中一条合法的语句,那么,S表示S为真,即S是系统中的一个定
12、理。S1S2SPSr表示系统中的一条规则,其含义是if (S1 and S2 and and SP) then Sr。演绎系统中,一个定理的证明就是一个合法的语句序列(要用公理或规则说明为什么该语句是合法的)。下面举一个著名的、最简单的演绎系统及其推理的例子。设Dg=(Ag,Ig),其中Ag=(A1,A2,A3)为:A1:最少由两个点。A2:如果P和Q是两个不同的点,那么经过P和Q的线只有一条。A3:假如L是一条线,那么存在一个不在L上的点。Ig=(I1,I2)为:I1: P if P then Q QI2: P Q P and Q下面是“最少有三个点”的证明步骤:1最少由两个点 A12存在一
13、条线 1,A2,I13在线外有一个点 2,A3,I14最少由三个点 1,2,I2程序的本质是状态的转换,程序的执行就是从满足前置条件的状态转换到满足后置条件的状态,程序的正确性证明即证明2。由于结构化程序设计的任何语法单位均为单入口和单出口的,所以,任何一个结构化的程序设计语言写的程序均可表示为以下的形式:s1;s2;sn <4>对"d0,存在一个状态转换序列:d1,d2,dn(di表示执行语句si后的状态)。为了证明<2>,对每一对(si, si+1)定义一个谓词断言Mi。显然,可按下面的逻辑推理步骤证明(2):"d0(d0)(d0)M1(d1)M
14、1(d1)M2(d2)Mn-1(dn-1)(dn)而证明Mi(di)Mi+1(di+1)就是证明:"di(假如Mi(di),执行语句si后,Mi+1(di+1))。这样,程序的正确性证明就归结到每条语句的正确性证明。下面的Hoare逻辑为验证程序中的语句提供了一般性的方法。Hoare逻辑是这样的一个演绎系统Dh=(Ah,Ih),Ah是Hoare逻辑系统中的公理集(这里不再列出)。Ih除了包含一般逻辑系统中的推理规则外,还包括以下与FLOW语言有关的语法语义规则(公理系统中的一般推理规则详见5):(1)R skip R(2)Ra/xa=>x R (3)R S1 O O S2 Q
15、RS1;S2 Q(4)RÙB S1 Q RÙØB S2 Q R if B then S1 else S2 Q(5)IÙB S I I while B do S IÙØB(6)RR1 R1 S Q1 Q1Q R S Q要用Hoare逻辑验证一个程序,即所谓的程序正确性证明(证明Hoare系统中的定理),就是用前置条件、逻辑系统中的公理、定理以及上述语言成份所规定的语义规则,按程序的执行步骤推导出后置条件。下面是应用Hoare逻辑,对归纳命题nNFACx=n!的证明过程:1nÎN 前置条件2nÎN Ù l=1
16、 1,Ù+3l=>x; FAC的第一条语句4nÎN Ù x=1 2,3,规则(2)5nÎN Ù x=1 Ù n=n 4, Ù+6n=>y; FAC的第二条语句7nÎN Ù x=1 Ù y=n 5,6,规则(2)8$kÎN(nÎN Ù x=1*n*(n-(k-1) Ù y=n-k) 7É8,令8为规则5的I9y¹0 6É9,令9为规则5的B10$kÎN(nÎN Ù x*y=1*n*(n-
17、(k-1)*y Ù y=n-k) 8,911*(x,y)=>x; 循环的第一条语句12$kÎN(nÎN Ù x=1*n*(n-(k-1)*(n-k) Ù y=n-k) 10,11,规则213$kÎN(nÎN Ù x=1*n*(n-(k-1)*(n-k) Ù y-1=n-(k+) 12,12É1314-(y,1)=>y; 循环的第二条语句15$kÎN(nÎN Ù x=1*n*(n-(k-1)*(n-k) Ù y=n-(k+1) 13,14,规则2
18、16$kÎN(nÎN Ù x=1*n*(n-(k-1) Ù y=n-k) 15É1617I Ù B*(x,y)=>x; -(y,1)=>y; I 10,11,13,14,16,规则3和618(while¹(y,0) do *(x,y)=>x; -(y,1)=>y) FAC的第三条语句19$kÎN(nÎN Ù x=1*n*(n-(k-1) Ù y=n-k) ÙØ (y¹0) 17,18,规则520x=n! 规则6,19É20
19、可见,用Hoare逻辑进行推理与一般的逻辑系统的推理是一样的。对FLOW语言写的程序,用Hoare逻辑证明其正确性的难点是while语句。证明while语句的办法就是寻找适当的循环不变量(证明某个循环语句时,它的循环不变量既要利用前面的推理结果和其它条件,也要为后续的证明提供必要的前置条件),其数学基础是不动点理论。注意:在证明循环语句的正确性时,并不要求循环不变量在循环体内的证明过程中的每一点上都满足,它只是要求在循环体的前和后保持不变即可;另外,不变量在每次循环前后的形式一样,但其“含义”是不一样的,是要发生变化的。一般情况下,循环不变量的设计是与该循环的循环变量相关的、与循环体中包含的语
20、句的语义相关。以Hoare逻辑为代表的传统的公理证明方法的弱点是:程序本身描述的行为是动态的,是随时间变化的对象;而逻辑本身是一个研究静态对象的数学理论,它不能表达状态的变化。由于程序的本质是用语句改变程序变量的状态,使程序执行前的初始状态一步一步地变为希望的终结状态的过程,因此,用这种逻辑进行描述程序的性质是不自然的,也是不直观的。另一个用Hoare逻辑进行推理的弱点就是推理的方向性。用Hoare逻辑验证程序的正确性,就是要构造满足<5>的M1,M2,Mn:序列。这就像从入口进入迷宫一样(已知M1),要达到出口是很难的(寻找Mn)。由于有规则<6>,有人提出了最弱前置
21、条件(weaskest precondition)逆向推理的办法。其基本思想是:设一条语句S和一个该语句执行后满足的断言Q,那么,能使RSQ成立的R很多,我们把其中最弱的一个R记为:wp(S,Q)。这样,我们就可以根据一个给定的程序的最后一条语句和程序最终的断言,倒着一步一步地推出整个程序唯一的最弱前置条件,记为wp(S,)。设该程序P的归纳命题的前置断言为,如果wp(P,),那么,原命题成立,即它是Hoare系统中的一个定理。按照这一思路,我们也可以设置相对应的最强后置条件(strongest postcondition):对给定的语句S和一个该语句执行前满足的断言P,能使PSQ成立的Q很多
22、,我们把其中最强的一个Q记为sp(P,S)。对程序P的Hoare逻辑的命题P,从给定程序的第一条语句和程序的前置断言开始,一步一步地推出整个程序最后一条语句的最强后置条件,记为:sp(,P)。如果sp(,P),那么,命题P亦成立。还有一种办法就是,从前向后推出该程序的前缀¢P的最强后置条件sp(,¢p);同时,从后向前推出该程序后缀P¢的最弱前置条件wp(P¢,)。当两个方向的推理交汇时,如果sp(,¢p) wp(P¢,),则命题得证。寻求wp(P,)和sp(,P)在理论经上是可行的,但实际操作起来却是相当困难和费时的。这就使得用Ho
23、are逻辑的方法证明程序的正确性有相当的难度,这主要是因为Hoare逻辑采用的元语句是命题逻辑,它本身是研究静态对象的,而程序变化的本质规律是变量空间状态的变化,程序的执行是一种动态现象,所以才产生了上述的困难。Hoare逻辑只能描述了某一时刻(当前的)状态,而与其它状态无关。为了能直接描述程序状态变化的本质,我们需要另一种逻辑体系来描述这种随时间变化而变化的状态信息。时态逻辑就是能描述变量随时间变化而变化的逻辑系统。显然,用时态逻辑可描述程序的动态语义,而且比较直观。时态逻辑是公理语义的程序正确性证明的一个分支。时态逻辑是由以色列科学家A.Pnueli和Z.manna等人创立的,由于在传统的
24、逻辑中增加了上一时刻、下一时刻等算子,使它能描述程序的历史和将来的状态,从而可描述程序的性质,并进行逻辑推导以验证程序的正确性。下面介绍时态逻辑,以及用时态逻辑证明程序正确性的方法。设有穷变元集合V=x1,x2,xn构成的变元组的值(x1,x2,xn)为状态s,s(xi)表示xi在状态s下的值,在一定的上下文中s(xi)可简写为xi。同样,s(e)表示表达式e在状态s下的值(对表达式e(xi1,xi2,xim),定义s(e(xi1,xi2,xim)e(s(xi1),s(xi2), s(xim)。令(s0,s1,sk,)为模型,s0表示当前状态,s1表示下一个状态,等等。在时态逻辑中,原子、公式
25、和连接词Ø、Ù、Ú、É、º以及作用于非时态变元的$和"与一般的逻辑系统相同5。时态连接词又分为将来(Future)和过去(Past)两大类。将来时态连接词及其含义为: Next (): (s,j) p iff (s,j+1) pHenceforth(): (s,j) p iff "k,k³j (s,k) pEventually(): (s,j) p iff $k,k³j (s,k) pUntil(m): (s,j) pmq iff $"k,k³j(s,k) q and "i,
26、k>i³j (s,i) pUnless(w): (s,j) pwq iff (s,j) pmq or (s,j) p(s,j) $u:p iff $s¢,s¢是s的u-变体(s¢,j) p(s,j) "u:p iff "s¢,s¢是s的u-变体(s¢,j) p注:(s,0) p 可简写为s p其中,最重要的是O和w,其它的时态连接词均可用他们表示,如: ppwf pØØppmq(pwq)Ùq过去时态连接词也有对应的一组时态公式、§、°、和等,详见6。
27、同其它演绎系统一样,用时态逻辑进行演绎的系统可表示为Dt=(At,It),At除包括一般逻辑系统中的公理外,还包括以下八条将来公理和八条过去公理:FX0:ppFX1:ØpÛØpFX2:(pq)Û (pq)FX3:(pq)Û (pq)FX4:ppFX5:(pÞp) (pÞp)FX6:pwqÛ(qÚ(pÙ(pwq)FX7:pÞpwqFX8:pÞp八条过去公理不再列出,详见6。It表示时态逻辑演绎系统的规则(P表示程序,p表示某个公式或性质):RX1(GEN): Pp Pp RX2
28、(SPEC): Pp PpRX3(INST): Pp PpRX4(MP): P(p1ÙÙpn)q, Pp1,Ppn Pq RX5(p-TAU):"P,"p,p是合法的状态公式 PpIt中还包括其它一些推导出的规则、量词规则和一阶谓词规则等,详见6。这些均被称为一般规则,还有一类与程序有关的规则:RX6(INIT): Qp Pp RX7(STEP): pTq P(pÞq)由以上两公式还可推出:RX8(S-INV): Qp,pTp Pp令Xp:QÙ(taken (t)ÙdiligentÙjust(t)Ùcom
29、passionate(t)表示程序P时态语义, tÎT tÎJ tÎC则有如下语义公理: RX9(T-SEM): PXp如果XPP,那么:1. PXpp RX52. PXp RX93. Pp 1,2,RX4 也就是说,只要证明了PXP,以及在时态逻辑系统下的XPP,就可论证一程序的性质Pp。即只要论证了一个程序P的语义XP,其它的性质均可推出。程序的性质可分为若干层次类型,每种类型可用一个时态逻辑公式模或描述,该类型的性质均可用该模式说明,并有一套相关的证明方法。设为状态的集合,为所有可能的状态序列,那么,一个程序的性质P就是的一个子集。一个时态公式j说明了一个程
30、序的性质,当且仅当,"sÎP,sj。时态公式的形式不同可反映不同的程序性质。安全性(Safety Properties)所有等价于p形式的公式被称为安全公式,它描述的性质被称为安全性。它反映了程序执行中某些不变的性质。其中一种称为条件安全性:pq(等价形式为(°( pÙfirst)q)表明,当p满足计算模型初态时,该计算模型具有不变的性质q。保证性(Guarantee Properties)所有等价于p形式的公式被称为保证公式,它描述的性质被称为程序的保证性。它所映了程序执行中一定发生的性质,例如:termial。责任性(Obligation Prope
31、rties)所有等价于ni=1(piÚqi)形式的公式被称为责任公式,它描述的性质被称为责任性。响应性(Response Properties)所有等价于p形式的公式被称为响应公式,它描述的性质被称为响应性。它描述了某些性质出现了无数次。持久性(Persistence Properties)所有等价于p形式的公式被称为持久公式,它描述的性质被称为持久性。它描述了程序中某些最终变稳定的性质。反应性(Reactivity Properties)所有等价于pÚp形式的公式被称为反应公式,它描述的性质被称为反应性。这些性质之间的关系如下图所示(连线表示包含关系):Reactivit
32、yPersistenceResponseObligationReactivitySafetyGuaranteeSafety将非安全性的性质称为进展性。进展性中都包含,它们之间的不同是初始条件和相应的性质发生的频率不同。安全性强调某个要求在计算过程中一直满足,它可表达某些坏的性质不发生;而进展性可表示某些好的性质一定会发生。程序的部分正确性的时态逻辑公式为:(程序结束)它等价于:(程序结束°(first) 6可见程序的部分正确性是一个安全性问题。要证明6,即要证明6在一个程序所能访问的状态(P_accessible states)中都是可满足的。由于程序的可访问状态均是执行一个程序的语
33、句而得到的,因此,6的证明可归纳于程序的语句的证明。 FLOW语言中各语句的时诚语义如下:1空语句 (1:skip 1) r1:move (1,1)Pres(Y)其中,r1表示可能的程序状态转换关系,Y表示程序中的所有变量,Pres(Y)表示集合Y的值保持不变。以下相同。 2赋值语句 (1:a=>x 1:) r1:move (1,1) Ù x=a Ù Pres(Y-x)3条件语句 (1:if c then l1:S1 else l2:S2) r1:rT1ÚrF1其中,rT1:move(1,11) Ù c Ù Pres(Y)rF1:move
34、(1,12) ÙØ c Ù Pres(Y)4循环语句 (1:while c do 1:S;1:) r1:rT1ÚrF1其中,rT1:move(1,1) Ù c Ù Pres(Y)rF1:move(1,1) ÙØ c Ù Pres(Y)即对一个程序的语句,按上述规定的语义,验证一个p类型的安全性(程序的部分正确性)在变换后还都满足。即采用如下的规则(INV_B):QjjTj j其它的一些规则也可用于证明程序的正确性,如:MON_I, CON_I规则等。但值得一提的是,一个程序的部分正确性并非总是可归纳的。例
35、如,7中图1.2的例子。为此,可采用一个更强的断言(INV),增量式(SV_PSV)证明等策略。下面用时态逻辑验证FAC的$kÎN(nÎNÙy=n)(x=1*n*(n-(k-1)Ùy=n-k)性质,令p为$kÎN(nÎNÙy=n)(x=1*n*(n-(k-1)Ùy=n-k),下面逐一验证FAC的语句:1=>x; n=>y; (while(y,0) do *(x,y)=>x; -(y,1)=>y)。1Tp 前提2p 1=>x p y=n不成立,执行后x=13p n=>y p 执行后
36、y=n,存在k=n使p成立4P*(x,y)=>x p 3Éy¹0,执行循环体的第一条语句,由于y=n-k和 x*y=1*n*(n-(k-1)*y所以,执行该语句后 x=1*n*(n-(k-1)*(n-k)。又y=n-k,得y-1=n-(k+1) 所以p成立。5p-(y,1)=>y p 执行该语句后y=y-1,由y-1=n-(k+1)得y=n-(k+1)所以 p成立。6p(while¹(y,0) do *(x,y)=>x; -(y,1)=>y) p 4,57p 由规则INV_B,此时,循环结束=(y,0),那么k=n,所以x=1*n*1,即x
37、=n!上述的验证方法还没有脱离一般逻辑系统验证程序的思路,只是验证的具体方式和规则变了。用时态逻辑还有另一种验证正确性的思路:因为,时态逻辑可以表示状态的变化,我们可以把一种适合于冯.诺依曼型计算机进行计算的程序设计语言翻译成时态逻辑公式。例如,令:;表示顺序算了,即控制自动转向下一个语句的句首。Ox=a:表法系统中x的值下一个时刻为a,而其它变量的值不变。LB=y:表示当前执行语句的标号为y下面是FLOW语言翻译成时态逻辑公式的规则参见4:1:skip 1: LB=1OLB=l; 1:a=>x 1: LB=1(OLB=lÙx=a);l:if c then l1: S1 els
38、e l2: S2l:(LB=lÙc) S1)Ú(LB=lÙØc) S2);l:while c do l: Sl: (LB=lÙc) SÙLB=l)Ú(LB=lÙØc) LB=l);对一个用FLOW语言写的程序,用上面的规则将其变换为时态逻辑公式的序列。由于FLOW的语句变成了时态逻辑公式,因此可在逻辑系统中,验证该程序是否和其规范等价(用Hoare逻辑只能验证一个性质,但不能证明该性质是否与其规范等,这是因为在Hoare逻辑系统中,一条语句和PsQ等价,PsQ不是逻辑公式,它不能参加逻辑推理),从而验证相
39、应的FLOW程序的正确性。设A表示一段程序P的规范,TL表示P相应的一组时态逻辑公式,现已有成形的、机械的方法证明TL A,但无证明ATL的自动化方法参见4,只能用手工的方法论证。这种方式总的来讲是先有程序,然后再根据它的规范来验证该程序的正确性。唐稚松先生将其称为“马车置于马的前方”。他认为应该先有软件的规范,然后根据规范得到软件的实现。他创立了一套基于时态逻辑的XYZE系统,软件的规范(用抽象的XYZAE表示)和软件的实现(用可执行的XYZEE表示)都可在同一时态逻辑系统下表达,并且也可表达即含XYZAE,也含XYZEE的中间形式的混合描述。这样,从最初的规范到最后的可执行程序,形成了一个
40、逐步细化的时态逻辑描述序列:S1,S2,Sn只要保证S1是正确的,且Si+1Si,那么,Sn就一定是对S1的正确实现。这种逐步求精的思想就是本文最开始提到的自顶向下的方法,它符合软件工程的一般原理和工程化的需要。用时态逻辑还可证明更复杂的程序性质,如:并行程序的性质、死锁问题等等。下面对程序的完全正确性证明作补充说明,程序的完全正确性证明2,即在证明程序的部分正确性的同时,也要证明程序能正常结束。由于结构化语言的特殊性,即它只由顺序语句、分叉语句和循环语句等三种类型的语句组成,而顺序语句和分叉语句执行后一定结束,所以,程序能否结束就是要证明程序中的所有循环语句能否正确结束。Dijkstra为程序的循环语句的完全正确性证明定义了下面的规则:(7) I
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年铁岭货运上岗证考试题
- 2025年唐山c1货运上岗证模拟考试
- 2024-2025年高中政治课时作业10新时代的劳动者含解析新人教版必修1
- 2024-2025学年高中生物课时分层作业12基因指导蛋白质的合成含解析新人教版必修2
- 2024-2025版高中生物2.1.1-2孟德尔遗传试验的科学方法分离规律试验练习含解析中图版必修2
- 2024-2025学年高中化学课时提升作业十五盐类的水解含解析新人教版选修4
- 2024-2025学年八年级物理全册4.1光的反射练习含解析新版沪科版
- 2024-2025学年高中语文7李将军列传学案含解析苏教版选修史记蚜
- 2024-2025学年高中生物第2章细胞的化学组成第2节组成细胞的无机物练习含解析北师大版必修1
- 我想你的检讨书
- 山东省临沂市兰山区2024-2025学年七年级上学期期末考试生物试卷(含答案)
- 湖北省武汉市2024-2025学年度高三元月调考英语试题(含答案无听力音频有听力原文)
- 一年级下册劳动《变色鱼》课件
- 商务星球版地理八年级下册全册教案
- 天津市河西区2024-2025学年四年级(上)期末语文试卷(含答案)
- 2025年空白离婚协议书
- 校长在行政会上总结讲话结合新课标精神给学校管理提出3点建议
- T-CSUS 69-2024 智慧水务技术标准
- 2025年护理质量与安全管理工作计划
- 湖南大学 嵌入式开发与应用(张自红)教案
- 地下商业街的规划设计
评论
0/150
提交评论