- •1. Введение
- •1.1. Декомпозиция и абстракция
- •1.2. Абстракция
- •1.2.1. Абстракция через параметризацию
- •1.2.2. Абстракция через спецификацию
- •1.2.3. Виды абстракций
- •3. Процедурная абстракция
- •3.2. Спецификации
- •3.3. Спецификации процедурных абстракций
- •3.4. Реализация процедур
- •3.5. Более обобщенные процедуры
- •3.6. Создание процедурных абстракций
- •3.7. Заключение
- •4. Абстракции данных
- •4.1. Спецификации для абстракций данных
- •4.2.1. Реализация на языке clu
- •4.2.2. Замечания по поводу операций up и down
- •4.3. Использование абстракций данных
- •4.4. Реализация полиномов
- •4.5. Пояснения для понимания реализаций
- •4.5.1. Функция абстракции
- •4.5.2. Инвариант представления
- •4.6.3. Сохранение инварианта представления
- •4.5.4. Изменяемые представления
- •4.6. Параметризованные абстракции данных
- •4.7. Списки
- •4.8. Упорядоченные списки
4.8. Упорядоченные списки
В качестве последнего примера рассмотрим списки, в которых элементы отсортированы по доступу. Спецификация такого типа представлена на рис. 4.16. Упорядоченные списки — изменяемые и параметризуемы по типу, который должен быть полностью упорядочен его операциями It и equal. Итак, упорядоченные списки olist не содержат дублирующих друг друга элементов.
olist == data type [t: type] is create, addel, remel, isJn, empty, least Requires t имеет операции
It, equal: proctype (t, t) returns (bool), которые определяют упорядочение t Описание
Упорядоченные списки olist — изменяемые списки элементов. Операции addel и remel модифицируют списки. Каждый элемент упорядоченного списка отличается от остальных (как определяется t$equal). Операция least возвращает наименьший элемент olist (как определяется t$lt). Операции create == proc ( ) returns (olist [t])
effects Возвращает новый, пустой список. addel = proc (s: olist [t], х: t) requires ~ is.in (s, х) modifies s cHects Вставляет х в s. remel = proc (s: olist [t], х: t) requires isJn (s, х) modifies s effects Удаляет х из s. isJn = proc (s: olist [t], х:) returns (bool)
effects Возвращает значение true, если s содержит элемент равный х (используется t$equal), в противном случае возвращает значение false. empty == proc (s: olist [t]) returns (bool)
effects Возвращает значение true, если s не содержит элементов, и значение false — в противном случае. least = proc (s: olist [t]) returns (t) requires^ empty (s). effects Возвращает элемент e из s, такой, что в s не существует элемента,
меньшего е (как определяется t$lt). end olist Рис. 4.16. Спецификация типа данных olist,
