Как включить аспекты проверки в спецификацию, чтобы каждая функция и процедура имели аспект Post и, если требуется, аспект Pre

Как включить аспекты доказательства в спецификацию, чтобы каждая функция и процедура имели аспект Post и, при необходимости, аспект Pre, который описывает правильное поведение кода ниже:

package Stack with SPARK_Mode is
pragma Elaborate_Body;

   Stack_Size : constant := 100;
   type Pointer_Range is 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;
   procedure Push(X : in Integer)
     with
       Global => (In_out => (S, Pointer)),
       Depends => (S => (S, Pointer, X),
                   Pointer => Pointer);

   procedure Pop(X : out Integer)
     with
       Global => (input => S, in_out => Pointer),
       Depends => (Pointer => Pointer,
                   X => (S, Pointer));

end Stack;
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
114
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Предусловия и постусловия в Аде объясняются на http://www.ada-auth.org/standards/22rm/html/RM-6-1-1.html.

В чем твоя проблема, на самом деле? Речь идет о синтаксисе аспектов до/после условия или об их содержании и значении? Или речь идет о значении «надлежащего поведения» в постановке задачи? В последнем случае попытайтесь представить, что может быть неправильным поведением или неправильным использованием операции Push или Pop в стеке с фиксированным максимальным размером.

Аспекты подпрограммы записываются в конце объявления подпрограммы после ключевого слова with и перед завершающей точкой с запятой. Если аспектов несколько, они разделяются запятыми. Показанные операции Push и Pop уже имеют по два аспекта: глобальный аспект и аспект зависимостей. Вы добавляете аспекты Pre и Post в эти списки аспектов, ставя перед каждым разделяющую запятую: procedure Push ... with Global => ..., Depends => ..., Pre => ..., Post => . ..;

Niklas Holsti 02.12.2022 16:00

Ниже приведен возможный набор пост-условий и предварительных условий для вашего примера. Фактический набор должен зависеть от фактических требований к поведению вашего стека. Этот пример — просто типичный набор условий для стека.

package Stack with SPARK_MODE is
   pragma Elaborate_Body;
   
   Stack_Size : constant := 100;
   type Pointer_Range is 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 := 0;
   
   function isEmpty return Boolean with
     Post => IsEmpty'Result = (if Pointer = 0 then True else False);
   
   procedure Push(X : in Integer) with
     Global => (In_Out => (S, Pointer)),
     Depends => (S => (S, Pointer, X), Pointer => Pointer),
     Pre => Pointer < Stack_Size,
     Post => Pointer = Pointer'Old + 1 and S(Pointer) = X;
   
   procedure Pop(X : out Integer) with
     Global => (In_Out => (S, Pointer)),
     Depends => (Pointer => Pointer,
                 X => (S, Pointer),
                 S => S),
     Pre => not isEmpty,
     Post => Pointer = Pointer'Old - 1 and X = S(Pointer'Old);
   
end Stack;

Другие вопросы по теме

Похожие вопросы

Spring Boot 3 с тестированием в Spock не создает контекст в тесте @SpringBootTest
Как эффективно исключить несколько свойств из объектов сравнения и проверки различий в FluentAssertions
Как я могу получить временную базу данных mssql с тестовыми контейнерами, используя специально измененный URL-адрес JDBC?
DataJpaTest - каждый тест проходит успешно, но при совместном запуске 1/3 терпит неудачу
Spring WebFlux: в тестируемом контроллере имитированная служба возвращала значение, которое не устанавливалось как ответ JSON
Как вы запускаете тест интеграции с клиентом и сервером GRPC вместе?
Тестирование функции Formik onSubmit с библиотекой тестирования реакции
Как заставить Playwright использовать файл конфигурации из моего пайплайна
Весеннее интеграционное тестирование с MockMvc — внедрение службы
SpringBoot+Liquibase+TestContainer db — невозможно заполнить базу данных во время интеграционного теста