用自然语言书写的系统规格说明书,可能存在矛盾、二义性、含糊性、不完整性及抽象层次混乱等问题。 - 1.矛盾是指一组相互冲突的陈述。 - 2.二义性是指读者可以用不同方式理解的陈述。 - 3.含糊性 - 4.不完整性 - 5.抽象层次混乱是指在非常抽象的陈述中混进了一些关于细节的低层次陈述。
C1:每部电梯内有m个按钮,每个按钮代表一个楼层。当按下一个按钮时该按钮指示灯亮,同时电梯驶向相应的楼层,到达按钮指定的楼层时指示灯熄灭。 C2:除了大厦的最低层和最高层之外,每层楼都有两个按钮分别请求电梯上行和下行。这两个按钮之一被按下时相应的指示灯亮,当电梯到达此楼层时灯熄灭,电梯向要求的方向移动。 C3:当对电梯没有请求时,它关门并停在当前楼层。 令EB(e,f)表示按下电梯e内的按钮并请求到f层去。EB(e,f)有两个状态,分别是按钮发光(打开)和不发光(关闭)。状态是: EBON(e,f):电梯按钮(e,f)打开 EBOFF(e,f):电梯按钮(e,f)关闭 如果电梯按钮(e,f)发光且电梯到达f层,该按钮将熄灭。相反如果按钮熄灭,则按下它时,按钮将发光。两个事件,它们分别是: EBP(e,f):电梯按钮(e,f)被按下 EAF(e,f):电梯e到达f层 电梯按钮状态转换规则时定义的谓词V(e,f),可以用谓词S(d,e,f)重新定义如下:V(e,f)=S(U,e,f)or S(D,e,f)or S(N,e,f) 电梯的状态及其转换规则,一个电梯状态实质上包含许多子状态(如,电梯减速、停止、开门、在一段时间后自动关门)。 下面定义电梯的3个状态。 M(d,e,f):电梯e正沿d方向移动,即将到达的是第f层 S(d,e,f):电梯e停在f层,将朝d方向移动(尚未关门) W(e,f):电梯e在f层等待(已关门)其中,S(d,e,f)状态已在讨论楼层按钮时定义过,但是,现在的定义更完备。 图4.4中包含了下述3个可触发状态发生改变的事件。 DC(e,f):电梯e在楼层f关上门 ST(e,f):电梯e靠近f层时触发传感器,电梯控制器决定在当前楼层电梯是否停下 RL:电梯按钮或楼层按钮被按下进入打开状态,登录需求
有穷状态机方法比数据流图技术更精确,而且和它一样易于理解。 它也有缺点:在开发一个大系统时三元组(即状态、事件、谓词)的数量会迅速增长。此外,和数据流图方法一样,形式化的有穷状态机方法也没有处理定时需求。
通常,当每个输入位置所拥有的权标数大于等于从该位置到转换的线数时,就允许转换。当t1被激发时,P2和P4上各有一个权标被移出,而P1上则增加一个权标。Petri网中权标总数不是固定的,在这个例子中两个权标被移出,而P1上只能增加一个权标。 在图4.6中P2上有权标,因此t2也可以被激发。当t2被激发时,P2上将移走一个权标,而P3上新增加两个权标。Petri网具有非确定性,也就是说,如果数个转换都达到了激发条件,则其中任意一个都可以被激发。
现在把Petri网应用于上一节讨论过的电梯问题。当用Petri网表示电梯系统的规格说明时,每个楼层用一个位置Ff代表(1≤f≤m),在Petri网中电梯是用一个权标代表的。在位置Ff上有权标,表示在楼层f上有电梯。 假设电梯由g层驶向f层,因为电梯在g层,如上图所示,位置Fg上有一个权标。由于每条输入线上各有一个权标,转换“电梯在运行”被激发,从而EBf和Fg上的权标被移走,按钮EBf被关闭,在位置Ff上出现一个新权标,即转换的激发使电梯由g层驶到f层。 事实上,电梯由g层移到f层是需要时间的,为处理这个情况及其他类似的问题,Petri网模型中必须加入时限。也就是说,在标准Petri网中转换是瞬时完成的,而在现实情况下就需要时间控制Petri网,以使转换与非零时间相联系。
操作的谓词部分,包含了一组调用操作的前置条件,以及操作完全结束后的后置条件。
图4.14中的第一个前置条件规定,“button?”必须是buttons的一个元素,而buttons是电梯系统中所有按钮的集合。如果第二个前置条件button? ∉pushed得到满足(即按钮没有开启),则更新pushed按钮集,使之包含刚开启的按钮“button?”。Z语言中,当一个变量的值发生改变时,就用符号“′”表示。后置条件是当执行完操作Push_Button之后,“button?”将被加入到pushed集中。无须打开按钮,使“button?”变成pushed中的一个元素即可。
另一种可能性是,被按的按钮原先已经打开了。由于button?∈pushed,根据第3个前置条件,将没有任何事情发生,这可以用pushed′=pushed来表示,即pushed的新状态和旧状态一样。注意,如果没有第3个前置条件,规格说明将不能说明在一个按钮已被按过之后又被按了一次的情况下将发生什么事,因此,结果将是不可预测的。
Z也许是应用得最广泛的形式化语言, (1) 可以比较容易地发现用Z写的规格说明的错误,特别是在自己审查规格说明,及根据形式化的规格说明来审查设计与代码时,情况更是如此。 (2) 用Z写规格说明时,要求作者十分精确地使用Z说明符 (3) Z是一种形式化语言,在需要时开发者可以严格地验证规格说明的正确性。 (4) 虽然完全学会Z语言相当困难,但是,经验表明,只学过中学数学的软件开发人员仍然可以只用比较短的时间就学会编写Z规格说明,当然,这些人还没有能力证明规格说明的结果是否正确。 (5) 使用Z语言可以降低软件开发费用。 (6) 虽然用户无法理解用Z写的规格说明,但是,可以依据Z规格说明用自然语言重写规格说明。经验证明,这样得到的自然语言规格说明,比直接用自然语言写出的非形式化规格说明更清楚、更正确。