保护程序的方法_2

文档序号:9383071阅读:来源:国知局
[0078] 1.3进入和退出变量
[0079] "removeFirst"程序具有置于一个与变量"e"一起/相关联的入口变量,以及两个 退出变量"X"和"f",以下面的" + "确认。由于是标准,除非另有说明(这里未给出)该退 出变量只在主要情况"真"("true")下分配并且有意义的的。因此,作为在"空"情况的规 则既不分配"f"也不分配"X",并且它们的值不能在剩余部分中使用。稍后"f"的使用将会 隐含地使用不会被修改的进入值。使用"y"的意图(例如,在循环退出)将通过支持工具 分析为在特定路线中的非法,在第一次进入的循环退出的情况下,"y"的值不会已被绑定。
[0080] 该程序在默认情况下时是确定的且有顺序的(如果它是不确定性的,或者如果它 的执行模型包含了例如回来跟踪或并行执行或不带通信基元,这将是以关键词或额外的注 解所制定或者甚至如有必通过用一个特定的执行机编写。
[0081] 1.4重命名退出情况
[0082] 在括号间的predicate "removeFirst"之前的部分在程序"成员"("member")的 使用中为一中predicate "removeFirst"之前括号之前的部分在用途上是一个重命名描述 符(在这种情况下[empty:eXit]这使得它可以描述情况标签如何重命名且因此最终不同 案件情况如何"扩展分支"。。这种重命名描述符可以可能出现在一个程序调用的前面,以及 同样实际上在任何包含句法结构的前面,并且特别在程序块的前面。在此实例中,有两中其 它情况,一个在主块的前面([真true:false ;found:真true])和[真true:found]在等 式(X = Y)的前面。
[0083] 默认"真"("true")是下面指令的分支,或者更通常的,以允许由句法环境中所 提供的"普通"("normal")流的分支:在该"while"循环结束时,该"普通"("normal") 流是在一个循环的开始返回,在程序结束时,"normal"流是在"normal"的情况下,终止该 程序,即,所述的"真"("true")情况。在内循环的执行过程中提出了 "退出"("exit") 情况,一循环"while"通过生成而终止。因此,它更名为"真"("true")。所以,以某种方 式,括号之间的部分(当明确提及)描述了该方法,其中该情况应该被重新命名,以推断出 需要执行的分支。在这里,在一 "removeFirst"退出于"empty"情况,后者已被重新命名 为"exit",相应的传送,也就是说,"removeFirst"的"空"情况下,在循环之后立即分支程 序的流。该循环环是在程序的结尾,该程序在这种情况下通过"真"("true")本身改名为 "fault"终止。这直观地对应于所寻求的元素还没有被发现的情况。在相反的情况下,一个 是在"真"情况中(即该等式位于3等式,响应"真"("true"),更名为"发现"("found"), 本身改名为"真"("true"))。
[0084] 典型的"f := e"是糖衣语法用于描述"equalise,f+) ^'有:
[0085] public equals (seq a, seq b+)
[0086] implicit program
[0087] 同样《x = y》是《equals (x, y)》的糖衣语法有:
[0088] public equals (elt a, elt b)
[0089] implicit program-)[false]
[0090] 在第一种情况下,程序《equals》与等于"e"值的"f"值相关(实际上是未定义这 里的同余),并在第二种情况下,它会检查是否两个值(从"a"和从"b"的)是相等的。
[0091] 因此一个程序(或子程序)退出情况下的重命名是提供于SM的主方式,以允许用 户根据所采取的情况以描述程序点之间的分支。
[0092] 1. 5逻辑跟踪
[0093] -般来说,SM语言使用前序比如变量。如果在程序中采取任何途径(在执行流程 中程序采取的路径),通过添加与转换(和状态潜在地)相关联的逻辑注释,将获得所谓的 "逻辑执行追踪"。通常在程序的执行过程中每次遇到一" + ",新的变量名称将通过使用一个 新的变量名称产生,以免几次遇到的变量之间有任何命名冲突,并在路径期间修改。例如, 逻辑跟踪"69皿18(6,€+)江61110¥6?;^81:(7+,;^€+);69皿18(1,5〇;"可被表示为逻辑跟踪。
[0094] equals (e0, fl+);
[0095] removeFirst (yl+, f I, f2+);
[0096] equals (x0, yl);
[0097] 它具有从不改变价值("单赋值"变量)的程序变量的优势,并且因此可能会很自 然地认为是逻辑变量。方程序有几个退出情况下,每种情况与predicate (或与关系)相 关。显然,在这里,它们暗含为应该被用于实施例的"removeFirst"和"equals"程序中的 "真"("true")情况。一般,程序的每个返回情况对应于predicate或逻辑表达式或关系), 按照惯例由程序名称与退出情况结合在此进行命名,从而,对应于先前逻辑跟踪predicate 的序列将是:
[0098] [true] equals (e0, fl+);
[0099] [true] removeFirst (yl+, f I, f2+);
[0100] [true] equals (xO, yl);
[0101] 这个逻辑跟踪也可以用符号(n) [true] equals (e0, fl+)->⑴[true] removeFirst (yl+,fl,f2+)_>(m) [true] equals (x0,yl)-> (o)表不,其中 "n"," I ","m" 和"0",为程序点标签,其最后一个,即"〇",潜在的为一退出标签。为简明起见,逻辑跟 踪可以被识别在适当时通过省略一些或全部predicate和参数名称,如(n) [true]-〉(1) [true] -> (m) [true] -> (ο) 〇
[0102] 每当(η)指定的一(或某个)程序进入点,现有追踪描述从程序中入口到程序中 的任何点的一路径被称为前缀。在这种情况下当知道是否跟踪是穿过很重要(从起点到退 出点,我们使用术语"完整的追踪")。因此,每个命令/程序可与一组与每种情况相关潜在 不同数量predicate相关联,一与每种情况都相关联的predicate,除了"错误"情况下。跟 踪一个实施例可为:
[0103] [true] equals (e0, fl+);
[0104] [empty]removeFirst (f I);
[0105] 通常情况下,那么《《[empty]removeFirst (-,fl,-);》正是《[真]empty (fl)》,其 中"empty"是predicate/程序,有两种情况,《true》和《false》:
[0106] public empty(seq e)
[0107] implicit program-)[false]
[0108] 当然,每个逻辑轨迹追踪(完整或不完整),并且每个前缀通常将对应于一普遍的 无限执行轨迹集合。这些执行轨迹将对应于满足逻辑约束域值的逻辑轨迹的实施例。完整 轨迹可以根据如在先前的两个实施例(该程序的完整遍历)或相应模拟从开始(激活)直 到程序不必要终止的任意点程序执行的前缀。在SM语言要考虑两者(尤其第二点使得能 够描述不终止的程序的语义,例如服务器,并且所述程序执行模型可以包括回溯而但不使 用无限轨迹)。然而,这与此处描述的本发明无相关性。同样地,例如无限轨迹可以考虑。
[0109] 当使用有限逻辑跟踪的情况下,这是很容易为将逻辑表达式联系到该轨迹:该逻 辑表达式被作为沿轨迹遇到predicate的结合而获得,该轨迹指明在执行中变量值必须得 到约束。例如沿轨迹:
[0110] [true] equals (e0, fl+);
[0111] [true]removeFirst (yl+, f I, f2+);
[0112] [true] equals (x0, yl);
[0113] 该结合是:《[true] equals (e0, fl)八[true]removeFirst (yl,fl, f2)八[true] eqUals(X〇,yl)》。在这里,符号" + "是不必要的,只要该情况的语义不依赖于进入或 退出变量的用法:该情况《[true]equals (e0, fl+)》产生一个值"fl",其满足于定义 predicate " [true] equals (e0, fl)》,其中第二个命令是对在入口提供的两个值的一等值测 试。这种约定是没有必要的,但允许描述简化并在其它地方被使用。
[0114] 此外,应注意的是,与每一种情况相关的predicate表现出相连程序点之间的 的进化关系。因此,例如从程序"成员"的第2点开始有两个可能的演变通过命令/程序 "removeFirst"中的两种情况"true"和"empty"实现。第一种情况以与predicate《[true] removeFirst (yl+,fl,f2+)》的关系(即将相关联的序列"Π "与第一个元素"Π "中的"yl" 和组成和在《Π 》中跟着《1》的元素《Π 》构成的序列"f2"组成的一对相关)为特征以及并 引导从点2到点3,第二情况《[empty]removeFirst (_,fl, f2+)》,(也就是说,空序列"Π " 到空序列"f2"相连的关系)从第2点到"错误"("false")退出(或到朝向在另一个程 序使用"成员"情况时退出分支的点)。
[0115] 还值得一提的是,使用逻辑跟踪的是使用的程序树形结构的一种方式。虽然逻辑 轨迹,在此被定位于SM语言的情况下,,通常通过归纳,可以被转置或正式的定义于更普遍 的语言。
[0116] 值得注意的是,逻辑轨迹(或前缀)也是程序的特定情况,没有循环且带有单分支 的程序。这被认为贯穿整个文件。当然当考虑到一给定节目的一些逻辑轨迹时,该工具没 有必要重定格式并作为标准程序执行它们。
[0117] 先决条件和不变量
[0118] 现在让我们考虑程序"remove",其目的是去除序列"f"中一个且仅有一个的 '' X ',:
[0119]
[0120]
[0121] 这个例子说明第一个前提条件。在此,这个程序没有描述应用性的关系(也就是 说,"f"联结到"X"和"e"的功能不是总功能)。为了除去一个且仅有一个的值元素" X " 程序"删除"需要应用到一序列,该序列至少有一具有该值的元素。这个例子还说明了一不 变量的使用,第一程序不变量(这里没用),然后循环中每个通道的循环不变量必须是真是 的。在SM语言中的不变量可能是各种复杂程序。它们可以特别介绍和修改该不变量的特 定变量以及使用程序的变量。若评价回到标签"true",一不变量为"true"。
[0122] 1.7不可能的转换
[0123] 最后,引入朝向"错误"("error")的特定分支。此标签是用来描述不可能的分支 (并因此转换)。例如在"删除"定义中,上述,这种标签是使用在其中已知且该集不能是空 的地方,它始终是可能提取第一元素(第一"removeFirst"的"空"情况是不可能的)。当 它被用在程序中,如在前面提到的"删除"的例子,它表示表达的需要,且因此证明该转换是 不可能的。这里,直观地,分支是不可能的,因为"g"包含至少一"X"值的元素,正如循环不 变量表达的,因此,不能为空。进一步可以看出,程序也可以用来公理化被认为是假设为真 的性能。当分支"错误"是用作程序中的公理,这意味着该分支被认为是不可能的。
[0124] 1.8公理,引理,定理
[0125] SM表达具备这种约束(不可能的转变,前提条件)从而表达性能。在这方面,它可 以根据情况其可被认为是"定理",在这种情况下,要证明一个程序,"引理"被认为是,即一 个中介程序,其将必须被证实,然后可实际用于另一个程序的证明,或者最后作为一个"公 理",也就是说一个程序假设为真,且这将允许例如为了不证自明地定义某些被隐式定义的 程序的相应的行为。在下面一节的程序,将进行说明程序作为公理的使用。
[0126] 在此说明在公理中标签"错误"的使用,在此情况下,允许的3个隐含程序的两个 紧随公理时,"removeFirst","addLast"和"empty"的第一版本(即签署"empty (elt x+) ":
[0127]
[0128] 这里直观地,例如在第一公理中分支是不可能的,因为"e"包含刚刚添加的一个元 素。第一公理可以以等同的方式写入:
[0129] empty(e+) ; = >[true:false, empty:true]removeFirst(x+, e, f+);
[0130] 这使我们能够部分地引入SM语言的结构《= >》。该结构使得有可能限制执行指 令的上下文。如果前提正常终止,也就是为"真"("true"),则结论的第一个指令分出,那 么结论是正常"执行"。如果是消极的,结论不执行,这可能其中前提返回《假》(《false》), 《错误》(《error》)或任何其它标签的情况下发生。在按照惯例第一种情况下,隐含返回 "真"("true"),在其它两种情况,标签被返回而没重命名。
[0131] 1.9程序定理
[0132] 通常,一个可接着要推导从以下两个定理程序推到公理(即两个一下程序)
[0133] //Theorems
[0134] Theoreml: addLast (x, e, f+) ; = >member (x, f);
[0135] Theorem2:member (x, e) ;addLast (y, e, f+) ; = >member (x, f);
[0136] 2.0部分函数对比总函数
[0137] SM的语言使得可以选择使用全部或部分功能的命令或程序。由于一个先决条件的 使用,上述的"删除"("remove")的第一个定义是一个部分函数。然而,用户很可能已经 很好地使用总函数,而在由用户所要求退出情况下不失去分离,如下面的新定义:
[0138]
[0139]
[0140] 这第二个定义在第一个上增加一种情况使其完整。第三个定义添加了一处理,通 过改变其语义使得该功能完整。如果它存在,该第三程序删除具有给定值元素的第一个实 例,否则它简单地拷贝序列。
[0141] 类似的例子与经典案例的划分是:
[0142] public divideBy (x, y, z+)
[0143] pre nonZero (y)
[0144] implicit program
[0145] public divideBy (x, y, z+)->[zero]
[0146] implicit program
[0147] public divideBy(x, y, z+)//deterministic or undeterministic value to be defined for y = 0
[0148] implicit program
[0149] I. 10 中介表;
[0150] SM的语言可以是相当容易自然地变换为内部表示,在此称为SMIL,它代表一个有 限状态/节点集(SM语言的程序点,某一些确定点可以是该程序的入口或退出)构成的有 限图形,以及一组连接一些这些节点的有限导向弧。该SMIL表示法是更直接程序点之间 的进化关系的方式。每个节点代表一个程序点和存在与一组有限变量集(即变量名)相 关联。每个程序弧表示可标记在(节点标签的)节点变量命题或连接由程序弧链接的两 个节点变量命题所标示的情况。例如,在第一个定义的程序中,("成员"("member")), 一个节点可以由命令或调用的子程序(它是predicate调用之前的点,然后是这两
当前第2页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1