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

100 Глава 4

для s (по предположению), а операция remel только удаляет эле­менты из s.

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

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

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

4.9.5. Операции egual, similar и copy

Может показаться, что абстракции данных должны предо­ставлять операции copy и equal автоматически, т. е. что каждый тип автоматически должен быть обеспечен этими операциями и что их реализации должны быть сгенерированы компилятором. Однако автоматически такие реализации сгенерированы быть не могут, так как они зависят от интерпретации представления, т. е. от функции абстракции.

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

{num: I, denom: 21

равно рациональному числу, представленному записью {пит: 13, denom: 26}.

Копирование не может быть реализовано автоматически по­тому, что не всегда ясно, из чего состоит объект. Например,

Абстракции данных

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

Несмотря на то что реализация таких операций, как equal, осуществляется программистом, чтобы гарантировать одинаковые значения операций с такими именами, мы рекомендуем придер­живаться принятых соглашений. Мы приняли соглашение, со­гласно которому имя equal резервируется для условия равенства, т. е. когда невозможно различить два равных объекта. Следова­тельно, два изменяемых объекта равны тогда и только тогда, когда они являются одним и тем же объектом; в противном слу­чае мы могли бы различить их, применив к одному из них модифи­цирующую операцию. Например, рассмотрим две ситуации, по­казанные на рис. 4.18. Здесь х = у, но х ~ = г.

Мы используем имя similar для операции, которая имеет дело со взаимосвязью ос и Р, а именно с фактом совпадения значений двух объектов. Мы требуем, чтобы результат операции copy совпадал по значению со своим аргументом, но не разделял с этим аргументом никаких компонентов. Так, объект z мог быть получен при вызове copy (х).

В отношении имен equal, copy и similar встроенные в язык CLU типы отвечают этим соглашениям. Должны отвечать им и определяемые пользователями типы. Таким образом, если тип данных intset предоставляет эти операции, их спецификации должны быть такими, как показано на рис. 4.19, а их реализации— как на рис. 4.20. Отметим, что операция similar сравнивает зна­чения двух своих аргументов и проверяет, содержат ли они одни и те же элементы. Операции equal и copy могут быть реализованы в терминах операций equal и copy для массивов.

Рис, 4,18. Две концепции равенства.

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