1 / 62

第五篇 高级课题

第五篇 高级课题. 退出. 第 14 章 形式化方法. 根据形式化的程度,可以把软件工程方法划分成非形式化、半形式化和形式化三类。使用自然语言描述需求规格说明,是典型的非形式化方法。使用数据流图或实体 — 关系图等图形符号建立模型,是典型的半形式化方法。 用于开发计算机系统的形式化方法,是描述系统性质的基于数学的技术,也就是说,如果一 个方法有坚实的数学基础,那么它就是形式化的。. 14.1 概述 14.2 有穷状态机 14.3 Petri 网 14.4 Z 语言 14.5 小结. 14.1 概述.

walter
Download Presentation

第五篇 高级课题

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第五篇 高级课题 退出

  2. 第14章 形式化方法 • 根据形式化的程度,可以把软件工程方法划分成非形式化、半形式化和形式化三类。使用自然语言描述需求规格说明,是典型的非形式化方法。使用数据流图或实体—关系图等图形符号建立模型,是典型的半形式化方法。 • 用于开发计算机系统的形式化方法,是描述系统性质的基于数学的技术,也就是说,如果一个方法有坚实的数学基础,那么它就是形式化的。

  3. 14.1 概述 • 14.2 有穷状态机 • 14.3 Petri网 • 14.4 Z语言 • 14.5 小结

  4. 14.1 概述 • 14.1.1 非形式化方法的缺点 • 基本上使用自然语言描述的系统规格说明,可能存在矛盾、二义性、含糊性、不完整性以及抽象层次混杂等问题。

  5. 14.1.2 软件开发过程中的数学 • 数学最有用的性质之一是,它能够简洁、准确地描述物理现象、对象或动作的结果,因此是理想的建模工具。 • 在软件开发过程中使用数学的另一个优点是,可以在软件工程活动之间平滑地过渡。不仅功能规格说明,而且系统设计也可以用数学表达,当然,程序代码也是一种数学符号(虽然是一种相当繁琐、冗长的数学符号)。 • 数学作为软件开发工具的最后一个优点是,它提供了高层确认的手段。可以使用数学方法证明,设计符合规格说明,程序代码正确地反映了设计结果。

  6. 14.1.3 应用形式化方法的准则 • 为了更好地发挥这种方法的长处,下面给出应用形式化方法的几条准则,供读者在实际工作中使用。 • ·选择适用于当前项目的符号系统。 • ·应该形式化,但不要过分形式化。通常没有必要对系统的每个方面都使用形式化方法。 • ·应该进行成本/效益分析。 • ·需要有形式化方法的顾问。 • ·不要放弃传统的开发方法。把形式化方法和结构化方法或面向对象方法集成起来是可能的,而且由于取长补短往往能获得很好的效果。

  7. ·应该建立详尽的文档。建议使用自然语言注释来配合形式化的规格说明,以帮助读者理解系统。·应该建立详尽的文档。建议使用自然语言注释来配合形式化的规格说明,以帮助读者理解系统。 • ·不应该放弃质量标准。在系统开发过程中必须一如既往地实施其他SQA活动。 • ·不应该盲目依赖形式化方法,这种方法并不能保证系统绝对正确。 • ·应该测试、测试再测试。由于形式化方法不能保证系统绝对正确,因此,软件测试的重要性并没有降低。 • ·应该重用。即使使用了形式化方法,软件重用仍然是降低软件成本和提高软件质量的唯一合理的方法。

  8. 14.2 有穷状态机 • 利用有穷状态机可以准确地描述一个系统,因此是表达规格说明的一种形式化方法。 • 14.2.1 基本概念 • 下面通过一个简单例子介绍有穷状态机的基本概念。

  9. 图14.1 保险箱的状态转换图

  10. 从上面这个简单例子可以看出,一个有穷状态机包括下述5个部分:状态集J、输入集K、由当前状态和当前输入确定下一个状态(次态)的转换函数T、初始态S和终态集F。从上面这个简单例子可以看出,一个有穷状态机包括下述5个部分:状态集J、输入集K、由当前状态和当前输入确定下一个状态(次态)的转换函数T、初始态S和终态集F。 • 如果使用更形式化的术语,一个有穷状态机可以表示为一个5元组(J,R,T,S,F),其中: • J是一个有穷的非空状态集; • K是一个有穷的非空输入集; • T是一个从(J-F)×K到J的转换函数; • S∈J,是一个初始状态; • FJ,是终态集。

  11. 当前状态〔菜单〕+事件〔所选择的项〕下个状态当前状态〔菜单〕+事件〔所选择的项〕下个状态 • 为了对一个系统进行规格说明,通常都需要对有穷状态机做一个很有用的扩展,即在前述的5元组中加入第6个组件——谓词集P,即把有穷状态机扩展为一个6元组,其中每个谓词都是系统全局状态Y的函数。转换函数T现在是一个从(J-F)×K×P到J的函数。现在的转换规则形式如下: • 当前状态〔菜单〕+事件〔所选择的项〕+谓词下个状态。

  12. 14.2.2 电梯问题 • 为了说明在实际工作中怎样使用形式化的方法,现在我们用有穷状态机技术给出电梯问题的规格说明。 • 电梯按钮的状态转换图如图14.2所示。令EB(e,f)表示按下电梯e内的按钮并请求到f层去。EB(e,f)有两个状态,分别是按钮发光(打开)和不发光(关闭)。更精确地说,状态是, • EBON(e,f):电梯按钮(e,f)打开 • EBOFF(e,f):电梯按钮(e,f)关闭 • 如果电梯按钮(e,f)发光且电梯到达f层,该按钮将熄灭。相反如果按钮熄灭,则按下它时,按钮将发光。上述描述中包含了两个事件,它们分别是:

  13. 图14.2 电梯按钮的状态转换图

  14. EBP(e,f):电梯按钮(e,f)被按下 • EAF(e,f):电梯e到达f层 • 为了定义与这些事件和状态相联系的状态转换规则,需要一个谓词V,(e,f),它的含义如下: • V(e,f):电梯e停在f层 • 如果电梯按钮(e,f)处于关闭状态〔当前状态〕,而且电梯按钮(e,f)被按下〔事件〕,而且电梯e不在f层〔谓词〕,则该电梯按钮打开发光〔下个状态〕。状态转换规则的形式化描述如下: • EBOFF(e,f)+EBP(e,f)+not V(e,f)[JX*9]EBON(e,f) • 反之,如果电梯到达f层,而且电梯按钮是打开的,于是它就会熄灭。这条转换规则可以形式化地表示为: • EBON(e,f)+EAF(e,f)[JX*9]EBOFF(e,f)

  15. 接下来让我们考虑楼层按钮。令FB(d,f)表示f层的按钮请求电梯向d方向运动,楼层按钮FB(d,f)的状态转换图如图14.3所示。接下来让我们考虑楼层按钮。令FB(d,f)表示f层的按钮请求电梯向d方向运动,楼层按钮FB(d,f)的状态转换图如图14.3所示。 • 楼层按钮的状态如下。 • FBON(d,f):楼层按钮(d,f)打开; • FBOFF(d,f):楼层按钮(d,f)关闭。 • 如果楼层按钮已经打开,而且一部电梯到达f层,则按钮关闭。反之,如果楼层按钮原来是关闭的,被按下后该按钮将打开。这段叙述中包含了以下两个事件。 • FBP(d,f):楼层按钮(d,f)被按下 • EAF(1··n,f):电梯1或…或n到达f层 • 其中1··n表示或为1或为2…或为n。

  16. 图14.3 楼层按钮的状态转换图

  17. 为了定义与这些事件和状态相联系的状态转换规则,同样也需要一个谓词,它是S(d,e,f),它的定义如下。为了定义与这些事件和状态相联系的状态转换规则,同样也需要一个谓词,它是S(d,e,f),它的定义如下。 • S(d,e,f):电梯e停在f层并且移动方向由d确定为向上(d=U)或向下(d=D)或待定(d=N)。 • 这个谓词实际上是一个状态,形式化方法允许把事件和状态作为谓词对待。 • 使用谓词S(d,e,f),形式化转换规则为: • FBOFF(d,f)+FBP(d,f)+not S(d,1··n,f)[JX*9]FBON(d,f) • FBON(d,f)+EAF(1··n,f)+S(d,1··n,f) • [JX*9]FBOFF(d,f) • 其中,d=UorD。

  18. 也就是说,如果在f层请求电梯向d方向运动的楼层按钮处于关闭状态,现在该按钮被按下,并且当时没有正停在f层准备向d方向移动的电梯,则该楼层按钮打开。反之,如果楼层按钮已经打开,且至少有一部电梯到达f层,该部电梯将朝d方向运动,则按钮将关闭。也就是说,如果在f层请求电梯向d方向运动的楼层按钮处于关闭状态,现在该按钮被按下,并且当时没有正停在f层准备向d方向移动的电梯,则该楼层按钮打开。反之,如果楼层按钮已经打开,且至少有一部电梯到达f层,该部电梯将朝d方向运动,则按钮将关闭。 • 在讨论电梯按钮状态转换规则时定义的谓词V(e,f),可以用谓词S(d,e,f)重新定义如下: • V(e,f)=S(U,e,f)or S(D,e,f)or S(N,e,f) • 定义电梯按钮和楼层按钮的状态都很简单、直观的事情。现在转向讨论电梯的状态及其转换规则,就会出现一些复杂的情况。一个电梯状态实质上包含许多子状态(例如,电梯减速、停止、开门、在一段时间后自动关门)。

  19. 下面定义电梯的三个状态: • M(d,e,f):电梯e正沿d方向移动,即将到达的是第f层; • S(d,e,f):电梯e停在f层,将朝d方向移动(尚未关门); • W(e,f):电梯e在f层等待(已关门)。 • 其中S(d,e,f)状态已在讨论楼层按钮时定义过,但是,现在的定义更完备一些。 • 图14.4是电梯的状态转换图。注意,三个电梯停止状态S(U,e,f)、S(N,e,f)和S(D,e,f)已被组合成一个大的状态,这样做的目的是减少状态总数以简化流图。

  20. 图14.4 电梯的状态转换图

  21. 图14.4中包含了下述三个可触发状态发生改变的事件图14.4中包含了下述三个可触发状态发生改变的事件 • DC(e,f):电梯e在楼层f关上门。 • ST(e,f):电梯e靠近f层时触发传感器,电梯控制器决定在当前楼层电梯是否停下。 • RL:电梯按钮或楼层按钮被按下进入打开状态,登录需求。

  22. 最后,给出电梯的状态转换规则。为简单起见,这里给出的规则仅发生在关门之时。最后,给出电梯的状态转换规则。为简单起见,这里给出的规则仅发生在关门之时。 • S(U,e,f)+DC(e,f)[JX*9]M(U,e,f+1) • S(D,e,f)+DC(e,f)[JX*9]M(D,e,f-1) • S(N,e,f)+DC(e,f)[JX*9]W(e,f) • 第一条规则表明,如果电梯e停在f层准备向上移动,且门已经关闭,则电梯将向上一楼层移动。第二条和第三条规则,分别对应于电梯即将下降或者没有待处理的请求的情况。

  23. 14.2.3 评论 • 有穷状态机方法采用了一种简单的格式来描述规格说明: • 当前状态+事件+谓词[JX*9]下个状态 • 这种形式的规格说明易于书写、易于验证,而且可以比较容易地把它转变成设计或程序代码。事实上,可以开发一个CASE工具把一个有穷状态机规格说明直接转变为源代码。维护可以通过重新转变来实现,也就是说,如果需要一个新的状态或事件,首先修改规格说明,然后直接由新的规格说明生成新版本的产品。

  24. 有穷状态机方法比数据流图技术更精确,而且和它一样易于理解。不过,它也有缺点:在开发一个大系统时三元组(即状态、事件、谓词)的数量会迅速增长。此外,和数据流图方法一样,形式化的有穷状态机方法也没有处理定时需求。下节将介绍的Petri网技术,是一种可处理定时问题的形式化方法。有穷状态机方法比数据流图技术更精确,而且和它一样易于理解。不过,它也有缺点:在开发一个大系统时三元组(即状态、事件、谓词)的数量会迅速增长。此外,和数据流图方法一样,形式化的有穷状态机方法也没有处理定时需求。下节将介绍的Petri网技术,是一种可处理定时问题的形式化方法。

  25. 14.3 Petri网 • 14.3.1 基本概念 • Petri网包含4种元素:一组位置P、一组转换T、输入函数I以及输出函数O。图14.5举例说明了Petri网的组成。 • 其中, • 一组位置P为{P1,P2,P3,P4},在图中用圆圈代表位置。 • 一组转换T为{t1,t2},在图中用短直线表示转换。 

  26. 图14.5 Petri网的组成

  27. 两个用于转换的输入函数,用由位置指向转换的箭头表示,它们是:两个用于转换的输入函数,用由位置指向转换的箭头表示,它们是: • I(t1)={P2,P4} • I(t2)={P2} • 两个用于转换的输出函数,用由转换指向位置的箭头表示,它们是: • O(t1)={P1} • O(t2)={P3,P3} • 注意,输出函数O(t2)中有两个P3,是因为有两个箭头由t2指向P3。

  28. 更形式化的Petri网结构,是一个四元组C=(P,T,I,O)。更形式化的Petri网结构,是一个四元组C=(P,T,I,O)。 • 其中, • P={P1,……,Pn}是一个有穷位置集,n≥0。 • T={t1,……,tm}是一个有穷转换集,m≥0,且T和P不相交。 • I:T→P∞为输入函数,是由转换到位置无序单位组(bags)的映射。 • O:T→P∞为输出函数,是由转换到位置无序单位组的映射。 • 一个无序单位组或多重组是允许一个元素有多个实例的广义集。

  29. Petri网的标记是在Petri网中令牌(token)的分配。例如,在图14.6中有4个令牌,其中一个在P1中,两个在P2中,P3中没有,还有一个在P4中。上述标记可以用向量(1,2,0,1)表示。由于P2和P4中有令牌,因此t1启动(即被激发)。通常,当每个输入位置所拥有的令牌数等于从该位置到转换的线数时,就允许转换。当t1被激发时,P2和P4上各有一个令牌被移出,而P1上则增加一个令牌。Petri网中令牌总数不是固定的,在这个例子中两个令牌被移出,而P1上只能增加一个令牌。

  30. 在图14.6中P2上有令牌,因此t2也可以被激发。当t2被激发时,P2上将移走一个令牌,而P3上新增加两个令牌。Petri网具有非确定性,也就是说,如果数个转换都达到了激发条件,则其中任意一个都可以被激发。图14.6所示Petri网的标记为(1,2,0,1),t1和t2都可以被激发。假设t1被激发了,则结果如图14.7所示,标记为(2,1,0,0)。此时,只有t2可以被激发。如果t2也被激发了,则令牌从P2中移出,两个新令牌被放在P3上,结果如图14.8所示,标记为(2,0,2,0)。在图14.6中P2上有令牌,因此t2也可以被激发。当t2被激发时,P2上将移走一个令牌,而P3上新增加两个令牌。Petri网具有非确定性,也就是说,如果数个转换都达到了激发条件,则其中任意一个都可以被激发。图14.6所示Petri网的标记为(1,2,0,1),t1和t2都可以被激发。假设t1被激发了,则结果如图14.7所示,标记为(2,1,0,0)。此时,只有t2可以被激发。如果t2也被激发了,则令牌从P2中移出,两个新令牌被放在P3上,结果如图14.8所示,标记为(2,0,2,0)。

  31. 图14.6 带标记的Petri网

  32. 图14.7 图14.6的Petri网在转换t1被激发后的情况

  33. 图14.8 图14.7的Petri网在转换t2被激发后的情况

  34. 更形式化地说,Petri网C=(P,T,I,O)中的标记M,是由一组位置P到一组非负整数的映射:更形式化地说,Petri网C=(P,T,I,O)中的标记M,是由一组位置P到一组非负整数的映射: • M:P→{0,1,2,……} • 这样,带有标记的Petri网成为一个五元组(P,T,I,O,M)。 • 对Petri网的一个重要扩充是加入禁止线。如图14.9所示,禁止线是用一个小圆圈而不是用箭头标记的输入线。通常,当每个输入线上至少有一个令牌,而禁止线上没有令牌的时候,相应的转换才是允许的。在图14.9中,P3上有一个令牌而P2上没有令牌,因此转换t1可以被激发。

  35. 图14.9 含禁止线的Petri网

  36. 14.3.2 应用实例 • 让我们把Petri网应用于上一节讨论过的电梯问题。当用Petri网表示电梯系统的规格说明时,每个楼层用一个位置Ff代表(1≤f≤m),在Petri网中电梯是用一个令牌代表的。在位置Ff上有令牌,表示在楼层f上有电梯。 • 1.电梯按钮 • 为了用Petri网表达电梯按钮的规格说明,在Petri网中还必须设置其他的位置。电梯中楼层f的按钮,在Petri网中用位置EBf表示(1≤f≤m)。在EBf上有一个令牌,就表示电梯内楼层f的按钮被按下了。

  37. 电梯按钮只有在第一次被按下时才会由暗变亮,以后再按它则只会被忽略。图14.10所示的Petri网准确地描述了电梯按钮的行为规律。首先,假设按钮没有发亮,显然在位置EBf上没有令牌,从而在存在禁止线的情况下,转换“EBf被按下”是允许发生的。假设现在按下按钮,则转换被激发并在EBf上放置了一个令牌,如图14.10所示。以后不论再按下多少次按钮,禁止线与现有令牌的组合都决定了转换“EBf被按下”不能再被激发了,因此,位置EBf上的令牌数不会多于1。电梯按钮只有在第一次被按下时才会由暗变亮,以后再按它则只会被忽略。图14.10所示的Petri网准确地描述了电梯按钮的行为规律。首先,假设按钮没有发亮,显然在位置EBf上没有令牌,从而在存在禁止线的情况下,转换“EBf被按下”是允许发生的。假设现在按下按钮,则转换被激发并在EBf上放置了一个令牌,如图14.10所示。以后不论再按下多少次按钮,禁止线与现有令牌的组合都决定了转换“EBf被按下”不能再被激发了,因此,位置EBf上的令牌数不会多于1。

  38. 图14.10 Petri网表示的电梯按钮

  39. 假设电梯由g层驶向f层,因为电梯在g层,如图14.10所示,位置Fg上有一个令牌。由于每条输入线上各有一个令牌,转换“电梯在运行”被激发,从而EBf和Fg上的令牌被移走,按钮EBf被关闭,在位置Ff上出现一个新令牌,即转换的激发使电梯由g层驶到f层。假设电梯由g层驶向f层,因为电梯在g层,如图14.10所示,位置Fg上有一个令牌。由于每条输入线上各有一个令牌,转换“电梯在运行”被激发,从而EBf和Fg上的令牌被移走,按钮EBf被关闭,在位置Ff上出现一个新令牌,即转换的激发使电梯由g层驶到f层。 • 事实上,电梯由g层移到f层是需要时间的,为处理这个情况及其他类似的问题(例如,由于物理上的原因按钮被按下后不能马上发亮),Petri网模型中必须加入时限。也就是说,在标准Petri网中转换是瞬时完成的,而在现实情况下就需要时间控制Petri网,以使转换与非零时间相联系。

  40. 2. 楼层按钮 • 在Petri网中楼层按钮用位置 和 表示,分别代表f楼层请求电梯上行和下行的按钮。底层的按钮为 ,最高层的按钮为 ,中间每一层有两个按钮 和 (1<f<m)。 • 图14.11所示的情况为电梯由g层驶向f层。根据电梯乘客的要求,某一个楼层按钮亮或两个楼层按钮都亮。如果两个按钮都亮了,则只有一个按钮熄灭。图14.11所示的Petri网可以保证,当两个按钮都亮了的时候,只有一个按钮熄灭。但是要保证按钮熄灭正确,则需要更复杂的Petri网模型,对此本书不做更进一步的介绍。

  41. 图14.11 Petri网表示楼层按钮

  42. 最后,让我们考虑第三条约束。 • 第三条约束C3:当电梯没有收到请求时,它将停留在当前楼层并关门。 • 这条约束很容易实现,如图14.11所示,当没有请求( 和 上无令牌)时,任何一个转换“电梯在运行”都不能被激发。

  43. 14.4 Z语言 • 14.4.1 简介 • 本节结合电梯问题的例子,简要地介绍Z语言。 • 用Z语言描述的、最简单的形式化规格说明含有下述4个部分。 • ·给定的集合、数据类型及常数。 • ·状态定义。 • ·初始状态。 • ·操作。 • 现在依次介绍这4个部分。

  44. 1. 给定的集合 • 一个Z规格说明从一系列给定的初始化集合开始。所谓初始化集合就是不需要详细定义的集合,这种集合用带方括号的形式表示。对于电梯问题,给定的初始化集合称为Button,即所有按钮的集合,因此,Z规格说明开始于: • 〔Button〕

  45. 2. 状态定义 • 一个Z规格说明由若干个“格(schema)”组成,每个格含有一组变量说明和一系列限定变量取值范围的谓词。例如,格S的格式如图14.12所示。 • 在电梯问题中,Button有4个子集,即floor_buttons(楼层按钮的集合)、elevator_buttons(电梯按钮的集合)、buttons(电梯问题中所有按钮的集合)以及pushed(所有被按的按钮的集合,即所有处于打开状态的按钮的集合)。图14.13描述了格Button_State,其中,符号P表示幂集(即给定集的所有子集)。约束条件声明,floor_buttons集与elevator_buttons集不相交,而且它们共同组成buttons集(在下面的讨论中并不需要floor_buttons集和elevator_buttons集,把它们放于图14.13中只是用来说明Z格包含的内容)。

  46. 图14.12 Z格S的格式

  47. 图14.13 Z格Button_State

  48. 3. 初始状态 • 抽象的初始状态是指系统第一次开启时的状态。对于电梯问题来说,抽象的初始状态为: • Button_Init〔Button_State|pushed=〕 • 上式表示,当系统首次开启时pushed集为空,即所有按钮都处于关闭状态。

  49. 4. 操作 • 如果一个原来处于关闭状态的按钮被按下,则该按钮开启,这个按钮就被添加到pushed集中。图14.14定义了操作Push_Button(按按钮)。Z语言的语法规定,当一个格被用在另一个格中时,要在它的前面加上三角形符号△作为前缀,因此,格Push_Button的第一行最前面有一个三角形符号作为格Button_State的前缀。操作Push_Button有一个输入变量“button?”。问号“?”表示输入变量,而感叹号“!”代表输出变量。

More Related