我可以理解此代码中前提条件的含义和目的,但是在理解后置条件的含义和目的时遇到问题。在Push
中,我知道这部分在推入整数(Pointer = Pointer〜+1)后增加指针。在Pop
中,我了解到这部分会在弹出整数(Pointer = Pointer〜-1)之后减少指针。
package Stack
--# own S, Pointer;
--# initializes S, Pointer;
with SPARK_Mode
is
pragma Elaborate_Body(Stack);
Stack_Size : constant := 100;
subtype Pointer_Range is Integer range 0 .. Stack_Size;
subtype Index_Range is Pointer_Range range 1..Stack_Size;
type Vector is array(Index_Range) of Integer;
S : Vector;
Pointer : Pointer_Range;
function isEmpty return Boolean;
--# global in Pointer;
procedure Push(X : in Integer);
--# global in out S, Pointer;
--# derives S from S, Pointer, X &
--# Pointer from Pointer;
procedure Pop(X : out Integer);
--# global in S; in out Pointer;
--# derives Pointer from Pointer &
--# X from S, Pointer;
procedure Peek(X : out Integer);
--# global in S, Pointer;
--# derives X from S, Pointer;
procedure Swap(OldLoc, NewLoc: in Pointer_Range);
--# global in out S;
--# in Pointer;
--# derives S from S, OldLoc, NewLoc, Pointer ;
end Stack;
答案 0 :(得分:4)
使用后置条件,必须根据子程序对旧状态的影响来定义新状态。
当后置条件为for (Object[] array : list) {
System.out.println(Arrays.toString(array));
}
时,表示post Pointer = Pointer~ +1
的新值应为旧值+ 1;即Pointer
的意思是“ Variable~
在进入子程序时的值”。
恐怕我不知道Variable
是什么意思;也许“ S~[Pointer=>X]
的第Pointer
个元素现在是X”(要指定S
的所有其他元素不变?)。
几点:
S
)和旧式注释(with SPARK_Mode;
)的不寻常组合。我想知道新的SPARK软件(--#
)是否需要第一个才能识别第二个,但是看起来这似乎是从旧到新转换的中间阶段。gnatprove
是显然是数组索引的东西的愚蠢名称。也许Pointer
会减少误导。答案 1 :(得分:2)
通常,后置条件向实现者提供对用户的承诺,即从系统执行到子程序后系统(子集)的状态。
这里的特定后置条件似乎可以解释如何实现堆栈。
答案 2 :(得分:0)
另一种高级解释:先决条件是允许呼叫者进入的条件,后置条件是对内部发生的情况的检查