Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
43
Добавлен:
23.03.2015
Размер:
860.67 Кб
Скачать

Сохранение инварианта представления

Для того чтобы продемонстрировать корректность реализа­ции типа, мы должны, в частности, показать, что инвариант пред­ставления сохраняется для всех законных объектов представ­ления. Мы можем сделать это следующим образом. Прежде всего мы покажем, что инвариант сохраняется для объектов, возвра­щаемых операциями, которые возвращают объект типа, но не имеют аргументов типа. Для всех других операций мы можем предположить, что при их вызове инвариант сохраняется для всех аргументов, являющихся объектами типа; тогда мы должны показать, что он сохраняется при возврате как для аргументов типа, так и для возвращаемых объектов типа.

Например, реализация набора intset имеет инва­риант

для всех целых i, j, таких, что low (r) < i < j <high (r) : r [i] <> r [j]

Операция intset$create отвечает этому инварианту потому, что заново созданный массив пуст. Операция member также сохраняет этот инвариант, так как мы знаем, что инвариант сох­раняется для аргумента s и что эта операция не модифицирует s. Операция insert также сохраняет инвариант, так как

1) инвариант сохраняется для ее аргумента s при обращении;

2) при вызове операции member из операции insert инвариант сохраняется потому, что он сохраняется в операции member;

3) операция insert добавляет х к s, только если выражение member (s, х) имеет значение true; следовательно, так как на­бор s удовлетворяет инварианту при вызове, он также удовлетво­ряет инварианту после добавления к нему х.

=============================== Дзыгин =======================================

21. Абстракция через итерацию и ее спецификация.

Итератор - абстракция, скрывающая подробности перебора элементов какой-то структуры данных.

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

Смысл абстракции через итерацию – итератор позволяет отделить проблему перебора элементов от реализации этого перебора.

Тип данных может иметь несколько итераторов.

В некоторых языках программирования итератор является встроенной языковой конструкцией. В языке CLU итератор взаимодействует с циклом for и используется в следующих конструкциях:

for each <для элемента i, возвращаемого итератором А>

do <<выполнить над i некоторое действие D>>

Спецификация итератора имеет вид:

Iname = iter (<список входных параметров>)

gields (<список результатов, выдаваемых итератором>)

signals (<результаты, возвращаемые по исключительной ситуации>)

requires (<задаются требования входным параметрам>)

modifiers (<список входных параметров, которые могут быть изменены при работе

итератора >)

effects (<описывается общий эффект применения итератора>)

end Iname

Очень важным является понятие генератора.

Генератор – это способ моделирования итератора.

Генератор реализуется как объект, который содержит четыре основных метода (Create, Done, Iter, Destroy)

Они реализуют элементы цикла, позволяющего производить итерирование (в скобках указано имя метода, которых выполняет данную операцию).

1) Подготовка цикла ( Create )

2) Условие продолжения цикла ( Done )

3) Тело цикла ( Iter )

4) Модификатор цикла ( Iter )

5) Завершение работы генератора (Destroy )

К примеру, на языке Паскаль генератор типа данных ATD может описываться так

Generator_ATD = Object

Private

<Поля, необходимые для реализации генератора>

Public

Procedure Create(A : ATD);

Procedure Iter(Var Rezult : ATD_Elem);

Function Done : Boolean;

Procedure Destroy;

End;

============================================================================

Логические спецификации

(или введение в верификацию программ)

Верификация программы предполагает анализ ее текста. Это отличает верификацию от тестирования, при котором всегда производятся наблюдения за вычислениями. В процессе верификации мы анализируем текст программы и делаем выводы по поводу описываемого набора вычислений (но никогда не создаем этот набор или его часть, хотя часто ссылаемся на этот набор для подтверждения правильности наших рассуждений).

Соседние файлы в папке POSIBNIK