后置条件的含义

时间:2018-12-05 12:57:36

标签: ada post-conditions spark-ada

我可以理解此代码中前提条件的含义和目的,但是在理解后置条件的含义和目的时遇到问题。在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;

3 个答案:

答案 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的所有其他元素不变?)。

几点:

  • 这是SPARK2014注释(S)和旧式注释(with SPARK_Mode;)的不寻常组合。我想知道新的SPARK软件(--#)是否需要第一个才能识别第二个,但是看起来这似乎是从旧到新转换的中间阶段。
  • gnatprove是显然是数组索引的东西的愚蠢名称。也许Pointer会减少误导。

答案 1 :(得分:2)

通常,后置条件向实现者提供对用户的承诺,即从系统执行到子程序后系统(子集)的状态。

这里的特定后置条件似乎可以解释如何实现堆栈。

答案 2 :(得分:0)

另一种高级解释:先决条件是允许呼叫者进入的条件,后置条件是对内部发生的情况的检查