形式化方法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
全称量化是对集合中元素的一种陈述方法,该陈述对 集合中每个元素都成立。全称量化使用符号" ,它的 使用的一个例子如下: " i, j: N · i > j i 2 > j 2 该表达式陈述的是:对在自然数集合中的每一个 值对,如果i 大于j,则i 的平方大于j 的平方。
序列
序列是一种数学结构,用于对元素是有序的这一事实进行 建模。一个序列s 是对的集合,其元素的取值范围从1 到 最大数。例如,
{n:N|n< 3· n} 这个规格说明中有三个部分:特征n:N,谓词n<3, 以及项n。 (1) 特征描述在形成集合时考虑的值的范围; (2) 谓词(布尔表达式)定义集合如何被构造; (3) 项给出了集合中项的一般形式。 在上面例子中,N 表示自然数,这样自然数将被考 虑;谓词指出只有小于 3 的自然数被包含在集合 中;项规定集合中每个元素的形式为n。 这样,上面的规格说明定义的集合为: {0 ,1 ,2 }
操作的后臵条件定义当操作完成后保证什么为真, 这是通过其对数据的影响来定义的。在增加标识符 到职员标识符符号表操作的例子中,后臵条件将数 学地描述表已经增加了新标识符。
例2:块处理器。
在操作系统中一个更重要的部分是维护由用户创建的文件的 子系统。块处理器是文件子系统中的一部分。文件存储中的 文件由存储设备上的存储块构成,在计算机的操作中,文件 被创建和删除,需要存储块的获取和释放。 为了处理这些,文件子系统维持一个未用块池,并保持对当 前使用块的跟踪。当块从被删除文件释放时,它们通常被加 入到等待进入未用块池的块队列中。
(1)
有两种定义集合的方式:
通过枚举出集合的元素来定义 ( 如上面的集合定 义); 创建一个构造性集合规格说明。集合成员的一般 形式用布尔表达式来指定。因为构造性集合规格 说明可以为大集合提供简洁的定义,所以它优于 枚举方式。它也显式地定义了用于构造集合的规 则。
(2)
考虑下面构造性规格说明的例子:
即使使用形式化方法,完整性也是难于达到的。当 创建规格说明时,系统的某些方面可能尚未定义; 某些特征可能被有意省略,以允许设计者在选择实 现方法时具有一定自由度;最后,在一个大型复杂 系统中,不可能考虑每一个操作场景。某些细节可 能是由于错误而被遗漏。
非形式化方法的缺点
使用自然语言描述的系统规格说明, 可能存在矛盾、二义性、含糊性、不完
{(1,81),(2,64),(3,49),...}
集合运算符
集合中的成员关系:, 集合间关系: , ,∪ ,∩ 空集 , 对应数学中的 0 。空集具有这样的性质: 它是所有其它集合的子集。涉及空集的两个有用 的等式是:对任何集合A, ∪A=A 和 ∩A= 其中,∪被称为并运算符,有时称作“cup”;∩被 称为交运算符,有时称作“cap”。
软件开发中的数学
数学最有用的性质之一是,它能够简洁、准确地描述物 理现象、对象或动作的结果,因此是理想的建模工具。 在软件开发过程中使用数学的另一个优点是,可以在软 件工程活动之间平滑地过渡。不仅功能规格说明,而且 系统设计也可以用数学表达,当然,程序代码也是一种 数学符号(虽然是一种相当繁琐、冗长的数学符号)。 数学作为软件开发工具的最后一个优点是,它提供了高 层确认的手段。可以使用数学方法证明,设计符合规格 说明,程序代码正确地反映了设计结果。
当集合元素的形式是明显的时候,项可以省略。 例如,上面集合可表示为: { n: N| n < 3} 上述的集合均只含单项元素。集合元素可以是对, 三元组等等,例如,集合规格说明: {x,y:N|x+y=10· (x,y2)} 描述了形为 (x , y2) 的自然数对的集合,这里 x 和 y 之和是10,下面是此集合:
{1,2}×{4,5,6}
该表达式的结果为
{(1,4),(1,5),(1,6),(2,4),(2,5),(2,6)}
幂集(powerset),一个集合的幂集是一个其元素是 该集合的子集的集合。本章中用来表示幂集运算符 的符号是 P 。它是一个一元运算符,当应用于某集 合时,得到其操作数的子集的集合。 例如:
也就是说,一个系统可能处于多种状态之一,每一 种状态都表示外部可观察到的行为模式。 在Z语言中,对术语状态有不同的定义。在 Z (及 相关的语言)中,一个系统的状态由系统的存储数 据来表示(因此,Z给出了太多的状态来表示每种 可能的数据配臵)。
在符号表程序的例子中使用后面的定义,状态就是 符号表。
形式化规格说明的期望特性——一致性、完整性及 无歧义性——是所有规格说明方法的目标。形式化 方法的使用增加了这些理想实现的可能性。
规格说明语言的形式化语法使得需求或设计以唯一的方式 被解释,从而排除了读者解释自然语言 ( 例如英语 ) 或图形 表示时经常产生的歧义性; 集合论和逻辑符号的描述便利使得可以清晰地陈述事实 (需 求)。 要达到一致,在规格说明中某地方陈述的事实就不能与其 他地方有矛盾。一致性是通过数学证明将初始事实形式化 地映射 ( 使用推理规则 ) 到规格说明中后面的陈述来保证的。
图2显示了一些部件:未用块池、被操作系统管理的文件 使用的块、以及那些等待被加入到未用块池中的块。等待 块被组织为队列,队列中每个元素包含来自于被删除文件 的一组块。
图2 块处理器
对这个子系统来说,状态是自由块的集合、已用块的集合、以 及返回块的队列。数据不变式用自然语言表达如下:
块未同时被标记为未用和已用。 所有在队列中的块集合将是当前已用块集合的子集。 队列元素未包含相同的块号。 已用块和未用块的集合将是组成文件的块的总集。 在未用块集合中没有重复的块号。 在已用块集合中没有重复的块号。
应用形式化方法的准则
应该形式化,但不要过分形式化。通常没有必要对系统 的每个方面都使用形式化方法。 应该进行成本/ 不要放弃传统的开发方法。把形式化方法和结构化方法 或面向对象方法集成起来是可能的,而且由于取长补短 往往能获得很好的效果。
应该建立详尽的文档。建议使用自然语言注释来配合 形式化的规格说明,以帮助读者理解系统
最后一个概念是操作,这是在系统中发生的读写数 据的动作。
如果对符号表程序考虑从符号表加入或去除职员名, 则它将关联两个操作: (1)将一个指定名增加到符号表的操作;
(2)从符号表中去除一个现存名的操作。
如果程序提供检查是否某指定名包含在表中的机制, 则将有一个返回某种指示值的操作,这个指示值表 示名字是否在表中。
图2 块处理器
与数据不变式相关联的某些操作是:(1) 将一个块集合加到队 列的末尾; (2) 从队列前面去除一个已用块集合并将其放到未用 块集合中; (3) 检查块队列是否为空。 第一个操作的前置条件是:将被加入的块必须在已用块集合 中;后置条件是:这个块集合现在处于队列的末尾。 第二个操作的前置条件是:队列中必须至少有一项;后置条 件是:块必须被加到未用块集合中。 最后一个操作——检查返回块的队列是否为空——没有前置 条件,这意味着不管状态具有什么值,操作总是有定义的。后 置条件是:如果队列为空,返回true,否则,返回false。
是一个序列。形成对的第一个元素的项总称为序列的定义域,第二个 元素的聚集称为序列的值域。本书中序列用尖括号指明。例如,上面 的序列通常写作: <Jones,Wilson,Shapiro,Estavez>
{(1,Jones),(2,Wilson),(3,Shapiro),(4,Estavez)}
有三种类型的条件与操作相关联:不变式、 前臵条件和后臵条件。
不变式定义什么保持不变。例如,符号表有一个不 变式表示元素的个数总是小于或等于MaxIds。 前臵条件定义一个特定操作有效的环境。例如,增 加一个名字到职员标识符符号表的前臵条件是有效 的,仅当表中不含有将被加入的名字,而且在表中 只有少于MaxIds 的职员标识符。
形式化方法中的主要概念
本节的目的是给出软件系统的数学规格说明中涉 及的主要概念,而不是给读者堆砌太多的数学细 节。为此,我们使用一些简单例子:
例1:符号表。
使用一个程序来维护符号表,此符号表在许多不同类型的 应用中频繁使用。它由一组没有重复的项构成。
图1 给出了一个典型的符号表例子。它表示操作系统用于 保存系统用户名的表。
集合与构造性规格说明
集合是对象或元素的聚集,被用于形式化方法的 基础。集合中包含的元素是唯一的 (即,不允许重 复)。具有少量元素的集合用花括号括起来,元素 间用逗号分开。例如,集合 {C++,Smalltalk,Ada,COBOL,Java} 包含五种程序设计语言的名字。
集合中元素出现的顺序是不重要的,集合中元素 的数量称为集合的基数 (cardinality) ,操作符 # 给出集合的基数,例如,表达式 #{A, B, C, D}= 4 说明基数操作符被用于已知集合,其结果指出集合 中项的数量。
P{ 1,2,3}= {,{1},{2},{3},{1,2},{1,3},{2,3},{1,2, 3}}
其中所有元素均是集合{1,2,3}的子集。
逻辑运算符
形式化方法的另一个重要成分是 逻辑 :关于真、 假表达式的代数。和常见的程序设计语言关联的 逻辑运算符是用键盘上已有的符号表示的,和这 些符号等价的数学运算符为: ∧ 与(and) ∨ 或(or) 非(not) 蕴含(implies)
集合差运算符\,顾名思义,结果为从第一个操作 数中去掉第二个操作数中的元素而得到的集合。 这样,表达式 的结果为集合{New,TaxFile}
{New,Old,TaxFile,Sysparam}\{Old,Sysparam}
叉积(cross product)×,有时也称为笛卡尔积。它 以两个集合为操作数,其结果是对的集合,这里每 个对由来自第一个操作数的元素和来自第二个操作 数的元素构成。下面是包含叉积表达式的例子:
第9章 形式化方法
基本概念 数学预备知识 应用数学符号描述形式化规格说明 形式规格说明语言 Z规格说明语言 有穷状态机 Petri网
基本概念
根据形式化的程度,可以把软件工程方法划分成 非形式化、半形式化和形式化三类。使用自然语 言描述需求规格说明,是典型的非形式化方法。
使用数据流图或实体—关系图等图形符号建立模
假设本例中的表包括的职员数量不大于 MaxIds 。可以使用 数据不变式为表设定限制条件。数据不变式是一个条件,它 在包含一组数据的系统的执行过程中总保持为真。
符号表的数据不变式有 两个构成成分:
(1)表中包含的名字数不 超过MaxIds; (2)在表中没有重复的名 字。
图1 符号表
另一个重要的概念是状态。许多形式化语言(如 OCL)使用状态概念;
不应该放弃质量标准。在系统开发过程中必须一如既 往地实施其他SQA
不应该盲目依赖形式化方法,这种方法并不能保证系 应该测试、测试再测试。由于形式化方法不能保证系 统绝对正确,因此,软件测试的重要性并没有降低。
应该重用。即使使用了形式化方法,软件重用仍然是
数学预备知识
为了有效地应用形式化方法,软件工程师必须具 有与集合和序列相关的数学符号知识,以及谓词 演算中的逻辑符号方面的知识。
用于开发计算机系统的形式化方法,是描述系统
性质的基于数学的技术。
Anthony Hall 在其关于形式化方法的介绍性讨论 [Hall90]中说到:
形式化方法是有争议的。支持者声称形式化方法可以 引发软件开发的革命。而批评者认为:这是极端困难的。
同时,对大多数人来说,他们对形式化方法是如此的不熟
悉Байду номын сангаас以至难于判断这些争论。
《The Encyclopedia of Software Engineering》 [MAR94]中对形式化方法的定义如下: 如果一个方法有良好的数学基础,特别地, 是以形式化说明语言描述的,那么它是形式化 的。这种数学基础提供了精确定义诸如一致性 和完整性概念的表示方法,以及更进一步地定 义规格说明、实现和正确性。