Значение постусловия

Я могу понять значение и назначение предварительных условий в этом коде, но у меня есть проблема с пониманием значения и назначения постусловий. В 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;

person Memo    schedule 05.12.2018    source источник
comment
Я не знаю Ада, но в целом я знаю, что постусловие означает ограничение на данные, возвращаемые функцией. Данные, возвращаемые функцией, должны позволять постусловию быть истинным, иначе функция ведет себя неправильно.   -  person Carcigenicate    schedule 05.12.2018
comment
Похоже, что кто-то перенес большую часть деталей реализации стека из тела пакета в спецификацию пакета. Что произойдет, если кто-то изменит Stack.Pointer, не используя ни одну из указанных подпрограмм?   -  person Jacob Sparre Andersen    schedule 05.12.2018
comment
@JacobSparreAndersen, я подозреваю, что они в теле пакета?   -  person Simon Wright    schedule 05.12.2018


Ответы (3)


С помощью постусловий вы должны определить новое состояние с точки зрения эффекта, который подпрограмма должна была оказать на старое состояние.

Когда постусловие говорит post Pointer = Pointer~ +1, это означает, что новое значение Pointer должно быть старым значением + 1; т. е. Variable~ означает "значение Variable при входе в подпрограмму".

Боюсь, я не знаю, что означает S~[Pointer=>X]; возможно, «Pointerth элемент S теперь X» (как насчет того, чтобы указать, что все остальные элементы S должны оставаться неизменными?).

Несколько моментов:

  • Это необычная смесь нотации SPARK2014 (with SPARK_Mode;) и аннотаций старого стиля (--#). Я задавался вопросом, нужен ли новому ПО SPARK (gnatprove) первый, чтобы распознать второй, но это больше похоже на промежуточный этап в переходе от старого к новому.
  • Pointer — глупое имя для чего-то, что явно является индексом массива. Возможно, Top будет менее обманчивым.
person Simon Wright    schedule 05.12.2018

В общем, пост-условие представляет обещания от разработчика пользователю о том, каким будет состояние (подмножество) системы после рассматриваемой подпрограммы.

Конкретные пост-условия здесь, похоже, объясняют, как реализован стек.

person Jacob Sparre Andersen    schedule 05.12.2018

Еще одна высокоуровневая интерпретация: предусловия — это требования, чтобы разрешить вызывающему, постусловия — это проверки того, что произошло внутри.

person Álex    schedule 06.12.2018