最弱前置谓词方法
- 格式:pdf
- 大小:169.23 KB
- 文档页数:37
基于动态协同双向映射的相似执行路径生成方法郭曦;王盼【摘要】相似执行路径的生成是代码分析和检测的基础性工作之一,现有的方法通常以程序的行为序列或结构为分析对象,通过改变关键谓词的取值等方法来进行分析,但由于缺乏必要的引导信息导致生成的相似路径的有效性较低,另外由于路径的谓词集合较长而难以求解也降低了分析的精度。
提出基于动态协同双向映射的分析方法,通过对程序控制流图的表示形式进行扩展,结合后向符号分析的方法生成候选路径的最弱前置条件,并以此为引导信息使用编辑距离的方法通过改变距离因子的取值来生成有针对性的相似路径集合。
实验结果表明,与现有的方法相比,该方法的准确性和效率有明显的优势。
%Similar execution paths generation is one of the fundamental tasks in code analysis and detection .The current methods usually target to the program behavior or program structure ,and change the value of key predicates ,but these methods has a low effectiveness due to the lack of the necessary guidanceinformation ,Meanwhile ,the predicates set has a large size and usually hard to solve ,thus it will reduce the analyze precision as well .A technique of similar execution paths generation based on dynamic synergy bidirectional mapping is proposed in this paper .According to extend the shape of Control Flow Graph and use the backward symbolic analysis ,the weakest precondition of the candidate path is generated ,which can be used as the guidance information to generate pointed similar execution paths set according to the edit distance via changing the distancefactor .The experimental results show that this method has the advantageof precision and anti-inference .【期刊名称】《电子学报》【年(卷),期】2014(000)011【总页数】6页(P2168-2173)【关键词】静态分析;控制流图;最弱前置条件;相似执行路径【作者】郭曦;王盼【作者单位】华中农业大学信息学院计算机科学系,湖北武汉 430070;武汉电力职业技术学院,湖北武汉 430079; 武汉大学电气工程学院,湖北武汉 430072【正文语种】中文【中图分类】TP3111 引言为了保证软件开发的质量,软件测试作为必要的阶段约占软件开发和维护成本的60%左右,其中程序调试是最耗时、代价最为昂贵的任务之一.程序执行路径分析是调试过程中的发掘程序行为特征的重要方法,该过程需要理解程序的功能、结构、语义以及执行路径的特点,故高效地分析程序执行路径并构建程序的行为特征对于提高软件产品的安全性具有重要意义.程序分析中的一个重要问题是路径可行性判定问题[1],即通过使用符号执行[2]和约束求解等分析方法生成初始变量的取值范围,使得程序能够沿着指定的路径执行,同时对于不能验证的属性,通过生成反例的方法来判断是否存在对应的执行路径.由于这些分析工具通常使用抽象的分析方法生成反例程序,故源代码的抽象程度会对反例生成的效果产生直接的影响.最弱前置条件[3]能够分析程序的执行语义并建模,是一种后向符号分析方法,能够减小抽象操作对分析精度造成的影响.但由于大规模程序的路径约束条件的解空间与程序分支呈指数关系,容易产生状态空间爆炸的问题,从而对程序性质的分析带来干扰.上述问题导致程序路径分析过程中容易产生不可达或者冗余的路径,同时最弱前置条件在计算过程中需要对循环变量进行计算,对程序可能陷入死循环的状态的情况进行预处理.目前的路径生成方法由于缺乏必要的路径引导信息,导致生成较多无效或者冗余的路径集合,故需要对路径条件和检测点之间关联关系进行深入研究.本文针对以上问题,以程序路径的可满足性为研究对象,提出动态协同双向映射的路径生成方法,具体的过程是:首先以程序的控制流图中的循环结构为分析对象,对循环体中的节点设置相互正交的标签变量以区分执行路径在循环提中的节点序列,使得每条执行路径都具有惟一的路径编码;然后在距离因子k的作用下,计算指定节点的最弱前置条件,不断回溯到控制流图的起始节点,在该过程中通过对路径编码在标签变量的作用下进行逆运算,以还原执行路径在循环结构中的节点执行序列,最后通过符号执行工具在最弱前置条件的作用下生成与目标执行路径的编辑距离不超过k的路径集合.该方法可有效减少在符号执行分析过程中由于缺乏路径引导信息而导致的死循环问题,可更加高效地生成有针对性的路径集合.2 相关工作程序执行路径的生成与程序输入有紧密的联系,对于程序P及P中的一条执行路径l,设P的输入空间为S,路径生成问题为:对于程序输入i∈S,i对应的测试用例t在P中所生成的执行路径.程序执行路径的生成可以转化为测试数据的问题,由于通过人工的方式构建测试数据的效率较低,目前测试数据生成已经进入自动化时代.其中主要有基于动态的方法和基于静态方法[4],动态的方法需要通过输入数据使目标程序能够实际运行,故该方法生成的测试数据是确定的,主要有线性式分析法[5],该方法将判断语句转化为布尔型的赋值语句,由于该方法在求解非线性的路径约束条件过程中可能会产生局部极值,故存在不完备性.文献[6]采用动态数据流分析的方法来定位分支条件对应的谓词变量,该方法虽然对于线性路径约束条件具有完备性,但是该方法每次只能分析一个分支谓词变量,故需要频繁地进行迭代操作.文献[7]采用松弛迭代法分析输入和谓词函数之间的依赖关系,通过求解建立的输入变量线性方程组而产生输入数据,由于方法采用线性函数来逼近非线性函数,故当谓词中存在非线性函数时,需要进行多次迭代以产生新的输入数据.文献[8]采用进化的分析方法对搜索空间进行缩减以生成路径覆盖的测试数据,但是对于路径的选择仍然采用人工的分析方式.静态分析方法对路径谓词约束进行求解,从而获得输入数据生成问题的全部解.符号执行是最常用的静态分析方法,它通过将符号引入到程序的输入中来建立约束系统,但是符号执行的方法对于循环变量、数组下表等结构不能准确地进行分析,同时由于符号执行在分析过程中需要对复杂的代数进行运算以缩减状态空间,这些都限制了其使用范围.文献[9]通过最弱前置条件引导符号执行的方法来对程序所具有的性质进行验证,但未对产生最弱前置条件进行约简.文献[10]通过最弱前置条件的方法来检测并定位程序中的错误语句,其分析过程与本文方法中的距离因子k=0情况类似,由于循环结构的执行次数可以通过改变k的取值来调整,故具有更好适应性.对程序中循环结构的分析是本文方法中需要着重研究的内容.循环结构的分析即程序的终止性判定问题,它从可计算性的角度可归结为停机问题,从而是不可判定的,故不存在一个通用的算法能够检测一个给定的程序中是否存在停机现象.目前的研究工作主要集中在程序的终止性和非终止性分析两个方面.对于终止性分析,常用的方法有循环不变式和Ranking函数的方法,包括线性阶和多项式阶函数[11,12],文献[13]提出了抽象精化的方法来分析程序的终止性.对于非终止性分析,文献[14]提出了一种死循环检测方法,但是该方法不能处理诸如嵌套循环等复杂控制结构的程序.文献[15]提出基于lasso(由前缀和环组成)的方法来分析程序的非终止性,但是该方法需要枚举出程序中的lasso,同时文中也指出lasso不能检测出所有的循环结构.3 控制流图中循环结构的预处理定义1 控制流图(Control Flow Graph,CFG).控制流图是由基本块(Basic Block)和边组成的有向图,每一个基本块被抽象成控制流图中的一个节点.控制流图采用形式化的方法可以表示为<N,E,s,f>.其中N是CFG中节点的集合,E⊆N×N 是基本块之间边的集合,若程序的执行路径中的节点序列中存在节点Bi到Bj间的流向,则存在一条边 e=(Bi,Bj)∈E,bin和 bout分别表示控制流图的入口基本块和出口基本块.本文所讨论的控制流图具有单一入口和单一出口,对于其它类型的控制流图,可以添加额外的节点以转化为具有单一入口和单一出口节点的控制流图.定义2 CFG路径的可行性.对于节点序列s=<n1,n2,…,nk>,其中(ni,ni+1)∈E(1≤i≤k),k=|s|为序列的长度,若ni=s,nk=f,则该序列是一条完整的执行路径.称路径l是可行的,当且仅当存在程序的一组输入,使得程序能够沿着指定的节点序列s执行,表示为N×N→{T,F}的计算过程,否则称l是不可行的路径.定义3 路径条件(Path Condition,PC).在控制流图中只可能在分支结构和循环结构的条件判定语句处通过调整谓词的取值产生不同的路径,路径条件是由程序中的分支结构或循环结构对应的约束条件构成的一阶逻辑公式,即分支结构在控制流迭代过程中产生的数据流值.在CFG中,出了入口节点外,其它节点均有入边,即存在从其它节点指向该节点的边.对于循环结构的入口节点,由于存在多条入边,即在满足循环条件的基础上循环体会不断执行从而产生新的路径集合.若CFG中某个节点存在多条入边的时候,则表明程序中存在循环结构或者分支结构.本文方法在分析过程中需要对程序中的循环结构进行处理,用以获取循环体中节点的执行顺序和次数.当检测到CFG中存在环结构的时候,即程序中有循环体,对于循环体中的每一个节点,同时设置特定的码片向量,同时对每条入边设定不同的标签变量,这样获取的执行路径在循环体中节点的连接序列可以保证不同的循环次数对应于不同的路径编码(执行路径在循环体中尾节点处的值),即可以利用不同的路径编码来区分不同的执行路径.循环体中不同节点的码片向量必须设定为互不相同,且相互正交.本文的方法需要通过回溯以获取程序执行序列对应的输入集合,故在回溯过程中通过路径编码和码片向量进行逆运算以区分节点的不同入边,从而还原程序的执行过程.设循环体中某一节点的码片向量为S(-1,-1,-1,1,1,-1,1,1),另一节点的码片向量为T(-1,-1,1,-1,1,1,1,-1).由于S和T是相互正交的两个向量,故其规格化内积为0:同时对每条入边以二进制的方式设定标签变量,这样当执行序列从一个节点经过另一个节点的时候,采用如下方式进行编码:标签变量中的数据比特依次和该节点码片向量进行乘积操作,当编码位为1的时候直接将该码片向量传递给下一个执行路径中的节点;当编码位为0的时候,传递的是该码片向量的反码;当执行序列不经过某一条边时,则不传送任何向量.同时,码片向量与自身的规格化内积为1,而与自身反码的规格化内积为-1,这种性质可以为路径的回溯操作提供依据.当进行回溯操作的时候,通过路径编码和节点的码片向量进行规格化内积操作,即通过计算CFG图中边的标签变量还原出程序的执行路径.在CFG图中使用节点序列表示程序执行的路径,通过以上方法建立起路径编码和执行路径之间的对应关系,可以区分节点的不同入边和不同的出边.同时由于回溯是从CFG的出口基本块开始,故可以通过入边来区分执行路径,且通过一次回溯就可以还原出程序的执行路径.在控制流图中使用带回边的节点集合表示循环结构的执行路径,这些节点构成了一个环结构.图1表示了一个带循环结构的控制流图片段,其中原始的CFG结构如图1(a)所示,图1(b)为消除了循环结构的控制流图,记为CFG∞.该方法使得程序的每条执行路径都有惟一的节点序列与之对应,即拥有惟一的路径编码.在实际分析过程中,由于循环的终止性是不可判定的,即在实验过程中程序的执行次数是有限的,即控制流图可以表示为CFGn,显然CFGn中的节点集合是CFG∞的子集.以下给出CFG节点的码片向量和边的标签变量插入算法.算法1:CFG节点的码片向量和边的标签变量插入算法Input:CFG,loop Output:CFG with chip vector and label variables label variable of loopentry←0;foreach node n in loop do m←number of entry edges ofn;n←chipVector;if m>1 then i←0;foreach InEdge ie of n do label variableof ie←i;i++;endfor endif endfor CFG with chip vector and label variables由于本文的方法需要对循环体进行抽象操作,同时获取程序的执行路径,故对循环结构的分析精度会对相似执行路径的生成产生直接的影响.循环分析主要有线性循环分析和非线性循环分析,由于线性循环分析已有较多的研究,故本文主要针对非线性循环的执行条件进行分析.4 相似路径的生成定义4 最弱前置条件(Weakest Precondition,WP).对于程序中的一条语句,若从入口基本块bin到该语句是路径可行的,且该语句执行后满足结果断言(即后置条件),最弱前置条件是保证这些条件发生的最小前提条件.WP由一组谓词公式组成:WP(S,R),其中S为CFG中语句集合,R是S执行后的结果断言集合.算法2为CFG中各节点对应的最弱前置条件的生成过程.对于CFG中指定节点对应的语句s及其后置条件φpost,通过该算法可以获得该节点的符号状态的集合ST,并对结果进行合并和约简操作.算法2 最弱前置条件生成算法.Input:CFG,φpost Output:weakest precondition 1 varF:{Formula}←Statement;2 var List:pair of(Stateme nt,Formula);3 ∀s∈Statement,F(s)←;4 List← {(ExitNode,φpost)};5 while List≠do;6 (s',φpost)←select from List;7 while(s,s')∈E of CFG do;8φpre←merge(F(s),simplify(WP(s,φpost)));9 if φpre≠false then 10 F(s)← F(s)∪ φpre;11 List←List∪(s,φpre);12 endif 13 end while 14 endwhile 15 return F(EntryNode)最弱前置条件在计算过程中的两个主要的规则表示如下:WP(x=e,Q)=Q[e/x];WP(if(c)s1else s2,Q)=(c→WP(s1,Q))∧(┓c→WP(s2,Q));由于最弱前置条件具有析取性质,故可以实现诸如 WP(s,φ1∨φ2)=WP(s,φ1)∨WP(s,φ2)的约简操作,它是状态集合中被选取的条件的析取范式.为了量化程序执行路径之间的相似程度,本文使用计算路径之间编辑距离(edit distance)的方法来生成与目标路径近邻的执行路径集合,同时引入因子k调整路径编辑距离的值.对于程序Prog所有的可行路径集合Paths,设目标执行路径为l,则与l的编辑距离不超过k的路径集合L表示如下,显然L⊂Paths,其中函数D用来计算编辑距离.对于CFG中节点的路径条件的集合,它是由待分析语句s,语句s处的路径条件pc,程序可行路径path和距离因子k通过笛卡尔乘积经SMT求解器计算得出:对CFG图最弱前置条件操作后,通过自底向上的回溯过程得到包含入口基本块的路径集合L,对于此过程所得到的最弱前置条件集合WP,它是各条回溯路径所得到最弱前置条件的析取:由于距离因子k的取值可以控制相似路径的生成,过小的k取值因生成的路径数量较少,生成的近邻路径也较少,通过回溯所得到的输入域较实际有效的输入域有较大的局限性;若不断增加k的取值,可以生成更多的执行路径,但此时的路径条件集合和最弱前置条件集合也相应地增大,从而对约束求解器的性能提出较高的要求,故需要在路径的规模和分析的精度之间进行权衡.在距离因子k的影响下,最弱前置条件的计算如下所示:5 实验与分析本文采用符号执行和近邻最弱前置条件相结合的分析方法来生成相似执行路径,通过为CFG中循环结构中的节点加入相互正交的标签变量方式为每一条执行路径构建具有惟一的路径编码作为该路径的标识,通过分析本文方法在处理循环结构和相似路径生成的效率来进行实验,实验的整体分析流程如图2所示.我们以WALA作为实验分析平台,并使用其提供的T.J.Watson Libraries进行程序的过程内分析.在前端(Front End)的功能主要是进行代码的预处理,通过修改GCC语法扫描器中的parse.y文件中的语义动作,通过对源文件的扫描生成对应的抽象语法树(AST),并对AST的结构进行划分以获取程序的基本块,然后构建程序的调用图与控制流图,在前端还需对程序中的循环结构进行检测和分析,通过循环展开的方法为后端生成检测路径提供必要的信息.后端(Rear End)的主要功能是使用本文的方法对程序进行最弱前置条件分析,并使用符号执行的方法在距离因子的作用下生成待验证的路径集合,通过分析路径的可满足性来检验所产生的路径的可行性.在后端分析过程中使用CVC3工具对路径谓词集合进行计算和精化,保留可求解的路径谓词集合.本文使用的符号执行工具是Java PathFinder,它以CVC3工具生成的路径谓词集合为前置条件引导程序在CFG中沿着指定的路径执行以生成有针对性的路径集合.本文的基准测试程序来自DaCapo[16]和常见的开源JAVA程序,其中包含有大量的循环语句,故可以较好地满足本文方法的所需要的分析条件.执行路径的生成主要通过遍历CFG的方法生成待检测路径的集合,在此过程中需对循环次数进行分析.虽然可以对程序的循环终止性进行分析,但是在实际的分析过程中往往需要指定循环次数以预防因内存资源耗尽而导致的异常现象,我们可通过调整距离因子k的取值来间接控制循环的次数.由于本文的方法是对传统最弱前置条件分析方法的近似,故距离因子k的取值对路径的生成有直接影响,即k的取值越大,可生成的执行路径也越多,同时时空开销也相应地增长.在相似路径生成方面,传统的符号执行分析方法由于缺少必要的路径引导信息,从而需遍历整个程序状态空间,这种粗粒度的分析方法往往造成很大的开销,且生成大量不可满足的路径,导致路径可行性的分析精度相对较低.最弱前置条件作为后向符号分析方法从CFG图中待分析的节点出发,结合后置条件与本文方法中生成的路径编码进行回溯操作,生成CFG中各节点的最弱前置条件.这样符号执行工具在路径生成过程中由于有各节点的最弱前置条件作为引导信息,可高效地生成与目标路径相近邻的可行路径集合.在实验过程中,主要分析的是本文方法在生成相似执行路径时的效率,考察指标为加入距离因子后生成可行路径的效率,主要从循环结构断点数目与k值之间的关系,以及可行路径生成的数量的两个方面展开讨论. 现有的循环结构处理方法一般通过设置循环的上限,然后使用循环展开的方式来进行分析,但是对于循环次数相对较多的情形,由于没有中断处理过程,可能出现路径编码的值溢出的情况,同时一条执行路径可能包含大量重复的路径片段,故在实验过程中我们引入断点机制,用以检测路径片段与执行路径编码的对应关系.当编码值出现溢出的情况,则使用新设置的一组相互正交的标量变量继续进行路径编码,同时在路径的回溯过程中,应从当前出现溢出的节点开始回溯分析,一直到上一个出现溢出的节点;若不存在这样的上一个溢出节点,则将入口基本块作为回溯的终点.在实验过程中,我们通过距离因子k设定循环执行次数,同时与之对应的执行路径为迭代路径.距离因子k和断点数量之间的对应关系如图3所示,它表示在某一k值情况下具有最多迭代路径的断点个数.实验过程中,k的取值一般不超过20,同时由于迭代路径的数量和k的取值呈指数关系,若k值继续增加可能导致分析的开销过大而出现资源不足的情况.另外需要注意的是,最弱前置条件在分析过程中路径谓词的数量会随着k值的增大而增多,从而使分析的效果趋于仅使用符号执行工具的效果.图4表示生成可行的相似路径数量的对比实验.我们采用符号执行工具Java PathFinder生成执行路径,实验对象为Java PathFinder加入本文方法后生成可行路径与仅使用Java PathFinder所生成的路径数量.对于每一个测试基准程序,仅使用Java PathFinder所生成的可行路径占所生成的所有路径的百分比用黑色的柱状图表示;加入Java PathFinder后所对应的百分比使用灰色的柱状图表示;不可行的路径百分比用带斜线的柱状图.采用本文的方法后,由于Java PathFinder在生成可行路径的时候,由于在分支结构和循环结构中有距离因子以及最弱前置条件的引导,可以生成更有针对性的相似路径集合,提高分析的精度与效率.6 结论及将来工作本文针对符号执行在分析过程中由于缺乏路径引导信息而生成大量无效路径的问题提出一种相似路径生成方法,首先对程序控制流图的表示形式进行改进,通过对CFG中循环体中节点设置相互正交的标签编码,同时使用循环展开的方法消除CFG中的循环结构,从而不同的执行路径具有不同的路径编码,这样最弱前置条件在分析过程中可以依据路径编码来还原程序的执行路径.符号执行工具依据最弱前置条件所生成的引导信息可以生成相似的执行路径.实验分析表明本文的方法可以高效地针对指定的执行路径生成与之近邻的可行路径集合,在程序调试、程序分析过程中有重要的应用价值.将来的工作可从以下两个方面展开:(1)由于本文的方法还不能够处理递归程序,故对于因函数调用而在调用图中出现的环,需分析针对环结构所生成的路径的可行性,从而可以分析函数递归调用而导致的死循环;(2)对于并行程序中的循环结构,由于需要对并行执行线程之间所有的循环条件组合进行分析,如何对本文的方法进行扩展从而支持具有此类结构的程序是下一步需要研究的内容.参考文献【相关文献】[1]张健.精确的程序静态分析[J].计算机学报,2008,31(9):1549-1553.Zhang Jian.Sharp static analysis of programs[J].Chinese Journal of Computers,2008,31(9):1549 -1553.(in Chinese)[2]King J.Symbolic execution and program testing[J].Communications of the ACM,1976,19(7):385 -394.[3] Dijstra E.A discipline of programming[R].Englewood Cliffs:Prentice Hall,1976. [4]单锦辉,王戟,齐治昌.面向路径的测试数据自动生成方法述评[J].电子学报,2004,32(1):109 -113.J HShan,J Wang,Z C Qi.Survey on path-wise automatic generation of test data[J],Acta Electronica Sinica,2004,32(1):109 -113.(in Chinese)[5] Miller W,Spooner D L.Automatic generation of floating point test data[J].IEEE Trans on Software Engineering,1976,2(3):223 -226.[6]Korel B.Automated software test data generation[J].IEEE Trans on Software Engineering,1990,16(8):870 -879.。
第三章 程序的正确性证明一、 F loyd-Hoare 规则公理方法前提条件,初始状态 前置断言结论,终止状态满足的条件 后置断言 程序规范:程序的前置断言和程序的后置断言组成。
程序的状态:程序执行到某一时刻,程序中所有变量的一组取值。
初始状态:所有变量的取值使程序的前置断言为真的状态。
终止状态:所有变量的取值使程序的后置断言为真的状态。
程序的执行可以看作是程序状态的变迁。
1、完全正确性断言:程序S 的执行开始于满足P 的状态,则该执行必定能在有限的时间内终止,且终止的状态满足Q ,则称完全正确性断言,记为{P}S{Q}2、部分正确性断言:程序S 的执行开始与满足P 的状态,若此执行能在有限的时间内终止,则终止时的状态满足Q ,则称部分正确性断言,记为[P]S[Q](一)预备规则1)如果执行之前P 是真,执行之后Q 也是真,则记为Q P ⊃2) 若n 条路径在语句T 之前汇合,则所有前面语句S i 的结论Q i 都必须在逻辑上蕴含语句T 的前提P ,就是说 P Q i ⊃,其中, i=1,2,…,n.。
P Q ⊃1,P Q ⊃2,P Q ⊃33)若断言P 在条件B 的判断之前成立,则判断的两个结论分别是B P ∧ 和 B P ⌝∧程序,语句 逻辑谓词 逻辑谓词 n2 (0<X<10)P B ⌝4) 若断言P 位于赋值E 于变量I 之后,则P 中出现的所有I 替换成E ,可得到赋值的前提(称赋值等效)。
5) 凡蕴含一语句前提的断言,都是这个语句的前提。
凡一语句结论所蕴含的断言,都是这个语句的结论。
','Q Q P P ⊃⊃{P ’}S{Q ’}为真,则{P}S{Q}为真。
(二)Hoare 验证系统 1. 空语句skip {P}skip{P} 结论即为前提2. 赋值语句{IE P } I:=E {P}由规则43. 条件语句{P} if B then S 1 else S 2 {Q} 由规则3得到{B P ∧}S 1{Q}和{B P ⌝∧}S 2{Q}为表示方便,我们可用证明规则的一般形式HH H H n,...,,21来记,其中n H H H ,...,,21是规则的前提,H 是结论,它表示如果’n H H H ,...,,21为真,那么H 也为真。
与谓词演算公式
谓词演算是数理逻辑中的一种推理方法,用于描述和操作命题。
在谓词演算中,我们使用量词、谓词和变量来构造公式。
一个谓词演算公式包括以下部分:
1. 量词:谓词演算中有两种量词,即全称量词和存在量词。
全
称量词使用符号∀表示,表示公式对于所有的变量都成立。
存在量
词使用符号∃表示,表示存在至少一个使公式成立的变量。
2. 谓词:谓词是描述一个特定属性的函数,用于判断命题的真假。
谓词通常带有变量,用于在特定情况下对命题进行判断。
3. 变量:变量是谓词中的未知数,代表具体对象。
变量可以有
不同的取值范围,用于对命题中的不确定部分进行具体化。
4. 逻辑连接词:谓词演算中常用的逻辑连接词有与(∧)、或(∨)、非(¬)等。
逻辑连接词用于组合多个子公式形成复合公式。
一个简单的谓词演算公式示例是:
∀x (P(x) → Q(x))
其中,P(x) 和 Q(x) 是谓词,x 是变量,∀是全称量词,→
是逻辑连接词。
这个公式表示对于任意一个 x,如果 P(x) 成立,则
Q(x) 也成立。
谓词演算公式用于数理逻辑的推理和证明过程,有助于分析问题、描述特定状况并得出结论。
在谓词演算中,公式之间的转换和推理常
常使用规则和定理进行,以验证命题的真假。
计算机文化基础系列常识-图灵奖获奖者介绍连载(八)埃德斯加·狄克斯特拉(Edsgar Wybe Dijkstra)——最先察觉“goto有害”的计算机科学大师1972年的图灵奖授予荷兰的计算机科学家埃德斯加·狄克斯特拉(Edsgar Wybe Dijkstra)。
狄克斯特拉因最早指出“goto是有害的”以及首创结构化程序设计而闻名于世。
事实上,他对计算机科学的贡献并不仅仅限于程序设计技术。
在算法和算法理论、编译器、操作系统诸多方面,狄克斯特拉都有许多创造,作出了杰出贡献。
1983年,ACM为纪念Communications of ACM创刊25周年,评选出从1958—1982的四分之一个世纪中在该杂志上发表的25篇有里程碑意义的论文,每年一篇,狄克斯特拉一人就有两篇人选,是仅有的这样的两位学者之一(另一位是英国学者霍尔:C.A.R.Hoare,1980年图灵奖获得者)。
狄克斯特拉1930年5月11日生于鹿特丹的一个知识分子家庭,在兄弟姊妹4人中排行第三。
他的父亲是一名化学家和发明家,曾担任荷兰化学会主席。
他母亲则是一位数学家。
狄克斯特拉的少年时代是在德国法西斯占领军的铁蹄下度过的。
由于食物短缺,他被送到乡下他父亲的一个朋友那里去。
纳粹德国投降后,1945年7月,十分虚弱的狄克斯特拉才和家人重新团聚。
狄克斯特拉原打算学法律,毕业后到联合国工作,为维护世界和平服务。
但他中学毕业时,数理化成绩都特别好,因此他父亲说服了他,1948年进莱顿大学学习数学与物理。
在学习理论物理的过程中,狄克斯特拉发现这个领域中的许多问题都需要进行大量复杂的计算,于是决定学习计算机编程。
1951年,他自费赴英参加了剑桥大学举办的一个程序设计培训班,学习在EDSAC(Electronic Delay Storage Automatic Calculator,这是由1967年图灵奖获得者威尔克斯主持设计与开发的世界上第一台存储程序式电子计算机)上的编程方法,这使他成为世界上第一批程序员之一。
谓词逻辑表示法是把一些知识表示为经典逻辑中的谓词表示式。
它只能表示出精确的知识,而对不确定的知识无法有效表示,同时这种表示方式也不能很好地体现知识的内在联系。
在进行教学时,首先需要通过实例让学生了解什么是命题和命题公式,什么是谓词和谓词公式,然后用实例来分析讲解将知识表示为谓词公式的过程:1)定义谓词和个体例:王先生是李文的老师。
首先定义谓词:TEACHER(X,Y):X 是Y 的老师,而后定义个体:王先生(Wang),李文(LiWen );2)为每个谓词中的变元赋以特定的值:TEACHER(Wang,LiWen);3)根据所要表达的知识语义,以适当的连接词和量词符号将各个谓词连接起来,得到知识的谓词公式:TEACHER(Wang,LiWen)。
在理解连接词∧(逻辑与)、∨(逻辑或)、┐(逻辑非)时可以参考我们平时的语言中的“并且”、“或者”、“不”,对P →Q 的理解可以参考┐P ∨Q 。
在此节只要求学生对谓词表示法有了解,命题的证明等内容不做要求,可以将相关内容放在辅助教学网站的拓展篇,以满足不同学生的需求。
在教学中除了书本中介绍的例子之外,还可以使用以下例子。
例1:用谓词逻辑和公式表达意境。
分析如下命题和谓词逻辑,并尽可能正确表达它的含义:(1) 蓝的(天)∧飘(白云)∧奔跑(马儿)∧飞翔歌唱(鸟儿);答:这是一个由“与”关系连接起来的谓词逻辑公式,它表达了一种大自然的景观:蓝色的天上白云飘飘,马儿在奔跑,鸟儿在飞翔歌唱。
(2) )(x {好姑娘(x )∧居住的地方(z,x) ∧遥远的(z) ∧(y)[人(y) ∧行走经过(y,z) →回头留恋地张望(y)]}答:这是一个既有谓词表示,又有命题逻辑表达,既有连接词,又有全称量词和存在量词的较复杂的谓词公式,它表达的意思是:在那遥远的地方,有位好姑娘,人们经过她的身旁,都要回头留恋地张望。
这就是青海民歌《在那遥远的地方》(王洛宾词曲)中的意境。
Dijkstra’s Weakest PreconditionEdsko de Vries•We characterise a program state by listing the value of all variables in the program•A predicate(or condition)is a function from program state to a boolean value•We define the“goal”of the program as a predicate on itsfinal state:the postcondition•We are interested in the set of states I,such that when the program is started in a state i∈I,it is guaranteed to terminate in a state that meets the postcondition.This set is defined by the weakest precondition of the pro-gram and the postcondition.condition is denoted by R,then the corresponding weakest precondition is given bywp(S,R)Thus,if a program S is started in a state satisfying wp(S,R), it is guaranteed to terminate in a state satisfying R.We introduce two constant predicates:•All program states satisfy true(T)•No program states satisfy false(F)wp(S,F)=F Property(1) When a program S is started in a state satisfying wp(S,F), it will terminate in a state satisfying F.However,no states satisfy F;therefore,no states can satisfy wp(S,F).This law is also called the“Law of the Excluded Miracle”.We will briefly come back to it later.wp(S,Q)→wp(S,R)Property(2) When S is started in a state satisfying wp(S,Q),it will termi-nate in a state satisfying Q.But Q→R,so when S is started in a state satisfying wp(S,Q) it will also terminate in a state satisfying R.wp(S,R)is the weakest precondition for states that will re-sult in R;so the set of states that satisfy wp(S,Q)must be a subset of the set of states that satisfy wp(S,R).junction(“or”)of wp respectively.I.e.,for a program S and postconditions Q and R,we are interested inwp(S,Q)∧wp(S,R)(conjunction) andwp(S,Q)∨wp(S,R)(disjunction)Every state(solid box)that satisfies wp(S,Q)(dashed box)is guaranteed to terminate in some state that satisfies Q.wp(S,Q)∧wp(S,R)=wp(S,Q∧R)Property(3)wp(S,Q)∨wp(S,R)→wp(S,Q∨R)Property(4)wp(S,Q)∨wp(S,R)=wp(S,Q∨R)wp(S,Q)∨wp(S,R)=wp(S,Q∨R)Property(4 )(S deterministic)the null statement.Thenwp( Skip ,R)=R(skip) In words,R will only hold after executing Skip when it held before executing Skip.tion(one that does not depend on the postcondition).wp( Abort ,R)=F(abort) By definition,Abort will fail to reach any state,so it cannot reach a state that satisfies any R.The following is(explicitely)excluded by Dijkstra but is useful in a lattice theoretic framework:wp( Miracle ,R)=T(miracle) So,Miracle is guaranteed to terminate in a state that satis-fies any postcondition you want,independent of the precon-dition.Let R[x:=E]denote R with E substituted for x.Thenwp( x:=E ,R)=R[x:=E](assignment) For examplewp( a:=7 ,a=7)=(7=7)=Twp( a:=7 ,a=6)=(7=6)=FSo,a is always7after executing a:=7,and never6,as one would expect.wp( a:=7 ,b=c)=(b=c)wp( a:=2∗b+1 ,a=13)=(2∗b+1=13)=(b=6) wp( a:=a−b ,a>b)=(a−b>b)=(a>2∗b)wp( S1;S2 ,R)=wp(S1,wp(S2,R))(sequencing) Intuitively,if S1;S2is to establish R,the last statement in the sequence(S2)should establish R,and thefirst statement in the sequence should“pave the way”for S2.But by definition S2will be able to establish R if wp(S2,R) holds;so this is exactly what S1must establish.Thus,the weakest precondition of S1;S2is the condition such that S1is able to to establish the weakest precondition of S2.I.e.,S1must be able to“pave the way”for S2.wp( a:=a+b;b:=a∗b ,b>a)=wp( a:=a+b ,wp( b:=a∗b ,b>a))wp( b:=a∗b ,b>a)=(a∗b>a)=(b>1∧a≥0)∨(b<1∧a≤0)wp( a:=a+b ,(b>1∧a≥0)∨(b<1∧a≤0))=(b>1∧(a+b)≥0)∨(b<1∧(a+b)≤0)=(b>1∧a≥−b)∨(b<1∧a≤−b)if B1→S1 B2→S2 ··· B n→S nfianddo B1→S1 B2→S2 ··· B n→S n odLet IF if B1S1 B2S2 B n S nfi.Thenwp(IF,R)=∃i·B i∧∀i·B i→wp(S i,R)(if) Thus,at least one of the guards must be true,and the weak-est precondition of all selected statements must be satisfied. (The if–statement will abort if all guards are false.)numbers1IF=ifx>y∧x>z→max:=xy>x∧y>z→max:=y¬((x>y∧x>z)∨(y>x∧y>z))→max:=z fi(Example is due to Hugh Gibbons)z.By definition,wp(IF,R)=∃i·B i∧∀i·B i→wp(S i,R)∃i·B i is automatically satisfied because the conditions of IFare exclusive.Left to show∀i·B i→R.For thefirst branch:x>y∧x>z→wp( max:=x ,max≥x∧max≥y∧max≥z ≡x>y∧x>z→x≥x∧x≥y∧x≥z≡x>y∧x>z→x≥y∧x≥z≡TThe proof is similar for the second branch.¬((x>y∧x>z)∨(y>x∧y>z))→wp( max:=z ,max≥x∧max≥y∧max≥z)≡¬((x>y∧x>z)∨(y>x∧y>z))→z≥x∧z≥y≡¬(x>y∧x>z)∧¬(y>x∧y>z))→z≥x∧z≥y≡(x≤y∨x≤z)∧(y≤x∨y≤z)→z≥x∧z≥y≡((x≤y∨x≤z)∧y≤x)∨((x≤y∨x≤z)∧y≤z)→z≥x∧z≥≡(x=y)∨(y≤x≤z)∨(x≤y≤z)∨(x≤z∧y≤z)→z≥x∧z≥≡(x=y)→(z≥x∧z≥y)≡(x=y)∨(z≥x∧z≥y)≡(x=y)∨(z≥x)IF=ifx>y∧x>z→max:=xy>x∧y>z→max:=y¬((x>y∧x>z)∨(y>x∧y>z))→max:=z fiwe havewp(IF,max≥x∧max≥y∧max≥z)=(x=y∨z≥x) and the program fails if x=y∧z<x.Let DO do B1S1 B2S2 B n S n od,and let IF be the corresponding if–statement.If H k(R)is the weakest condition such that the loop will terminate in a state satisfying R after at most k iterations (k≥0),thenwp(DO,R)=∃k·H k(R)(do) We define H k inductively.H0(R)=R∧∀i·¬B iH k(R)=wp(IF,H k−1(R))∨H0•P holds before and after IF,and•IF does not abort(at least one branch is selected)I.e.,P∧(∃i·B i)→wp(IF,P)(if-invariant) This will hold if P is invariant in all selected branches:∀i·(P∧B i)→wp(S j,P)Theorem(Fundamental Invariance Theorem for Loops) Let P be invariant in IF,i.e.P∧(∃i·B i)→wp(IF,P)Then for the corresponding DO construct,we can conclude P∧wp(DO,T)→wp(DO,P∧∀i·¬B i)(do-invariant) (The condition wp(DO,T)forces the loop to terminate.)wp(DO,T)is impossible to prove in the general case(halting problem).The idea is to•introduce a function t from program state to the set of integers,and•to show that t is bounded below by some number and •every execution of the loop reduces t by at least one. This guarantees termination of the loop.We design our pro-gram in a way such that we canfind a suitable function t.from program state to the set of integers,such thatP∧(∃i·B i)→t>0(t-bounded) Furthermore,for any value t0,P∧(∃i·B i)∧(t≤t0+1)→wp(IF,t≤t0)(t-decreasing) This proves that P∧(t≤k)→wp(H k(T)),therefore P→wp(DO,T),and thusP→wp(DO,P∧∀i·¬B i)the DO reduces t,i.e.∀i·P∧B i∧(t≤t0+1)→wp(S i,t≤t0)Consider wp(S i,t≤t0).Calculating this yieldswp(S i,t≤t0)=t ≤t0where both t and t are functions of the current state.We must show that t ≤t−1,i.e.,S i decreases t by at least one.This is denoted by wdec:wdec(S i,t)=t ≤t−1(wdec)τ,x,y:=0,10,10;doτ=0∧x>0→τ,x:=1,x−1;τ=1∧y>0→τ,y:=0,y−1;odProve thatτ=x=y=0when the loop terminates.τ,x,y:=0,10,10;doτ=0∧x>0→τ,x:=1,x−1;τ=1∧y>0→τ,y:=0,y−1;odWhat is invariant throughout the program?Pˆ=(y−x=τ)∧x≥0∧y≥0wp( τ,x,y:=0,10,10 ,y−x=τ∧x≥0∧y≥0)≡10−10=0∧10≥0∧10≥0≡Tbranch in the loop:(y−x=τ∧x≥0∧y≥0)∧τ=0∧x>0→wp( τ,x:=1,x−1 ,y−x=τ∧x≥0∧y≥0)≡(y−x=0)∧x>0∧y≥0→(y−(x−1)=1)∧(x−1)≥0∧y≥0≡TBy a similar argument,P is also invariant in the second branch in the loop.Thus,P is invariant throughout the pro-gram.τ,x,y:=0,10,10;doτ=0∧x>0→τ,x:=1,x−1;τ=1∧y>0→τ,y:=0,y−1;odWhat would be a suitable function?tˆ=x+y(t-bounded)and(t-decreasing).First,we show(t-bounded):(y−x=τ∧x≥0∧y≥0)∧τ=0∧x>0→(x+y)>0≡T(y−x=τ∧x≥0∧y≥0)∧τ=1∧y>0→(x+y)>0≡Tof the do–loop reduces t.We havewp( t,x:=1,x−1 ,x+y<t0)=((x−1)+y)<t0wdec( t,x:=1,x−1 ,x+y)=((x−1)+y)≤(x+y)−1=T By a similar argument,the second branch of the do–loop also decreases t.So,we have proven termination.So,now we know that P→wp(DO,P∧∀i·¬B i).We know that P holds before the do–loop,and we can conclude thatP∧∀i·¬B i holds when the program terminates.T o be ac-curate,we know¬(t=0∧x>0)∧¬(t=1∧y>0)∧(y−x=τ∧x≥0∧y≥0) There are only two possibilities forτ;eitherτ=0orτ=1.We cannot haveτ=1,because then y≤0,y−x=1,sox<0which contradicts the invariant.So,τ=0,therefore x≤0.But x≤0∧x≥0→x=0.We know y−x=τ;y−0=0,so y=0.。