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

Аназиз типов данных

Чтобы показать, что программа, которая использует тип дан-ных, корректна, мы должны проанализировать свойства объектов типа. Этот анализ осуществляется на абстрактном уровне, т. е. мы используем спецификацию типа и игнорируем его реализацию.

Например, иногда полезно установить свойство, являющееся общим для всех объектов типа. Такое свойство называется инвариантом абстракции оно по существу является абстрактным аналогом инварианта представления. Такое свойство подобно теореме о целых числах и, как и теорема, доказывается с помощью индукции. Чтобы установить инвариант абстракции, мы должны показать, что он сохраняется для всех объектов, произведенных типом. Так как объекты производят только примитивные конструкторы, конструкторы и модификаторы, мы можем использовать следующий метод.

1. Показать, что свойство сохраняется для всех объектов, возвращаемых примитивными конструкторами.

2. Показать, что свойство сохраняется для объектов, возвращаемых конструкторами, предполагая, что свойство сохраняется для объектов, передаваемых конструкторам в качестве аргументов.

3. Показать, что при выходе из модификатора свойство сохраняется для модифицированных объектов, предполагая, что свойство сохраняется при вызове модификатора.

Например, интересное свойство упорядоченных списков (см. рис. 4.6) заключается в том, что они не содержат дублирующих друг друга элементов (что определяется операцией t$equal). Этот инвариант полезен для определения корректности реализации наборов intset с использованием упорядоченных списков. То, что это свойство является инвариантом, устанавливается следующим образом: 1) оно сохраняется для единственного примитивного конструктора create, так как операция create возвращает новый пустой список; 2) оно сохраняется для операции addel (s, х). При возврате из этой операции в s содержатся те же элементы, которые там были до вызова, плюс элемент х. По предположению, до вызова в s нет дублирующих друг друга элементов. Кроме того, операция addel требует (в предложении requires), чтобы х не содержался в s. Следовательно, набор s с добавленным элемен­том х не содержит дублирующих друг друга элементов; 3) оно сохраняется для операции remel (s, х), так как оно сохраняется для s (по предположению), а операция remel только удаляет элементы из s.

Этот способ анализа называется индукцией типа данных. Индукция осуществляется по количеству вызовов процедур, используемых для получения текущего значения объекта. Первый шаг индукции — это установить сохранение свойства для примитивных конструкторов. Индукционный шаг устанавливает сохранность свойства для конструкторов и модификаторов.

Отметим, что анализ осуществляется на абстрактном уровне, а не на уровне реализации. Нас не интересует, как реализованы упорядоченные списки. Вместо этого мы работаем прямо с их спецификацией. Работа на абстрактном уровне существенно упрощает анализ.

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

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