- •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.6. Параметризованные абстракции данных
Типы — выгодные параметры для типов, точно так же, как и для процедур. Например, рассмотрим абстракцию общего набора set, в котором элементы набора могут быть произвольного типа. Конечно, не все типы могут быть имеющими смысл параметрами общего набора. Так как общие наборы set не хранят дублирующих друг друга элементов, должен быть некий способ определить, дублируют элементы друг друга или нет. Следовательно, спецификация set, представленная на рис. 4.10, требует, чтобы элементы типа имели операцию equal. Эти требования помещены сразу после заголовка. (Требования на индивидуальные операции также разрешены; об этом мы будем говорить в следующем разделе.)
set = data type [t: type] is create, insert, delete, member, size, choose
Requires t имеет операцию
equal: proctype (t, t) returns (bool), т. e. условие равенства t
Описание
Общие наборы set — неограниченные математические наборы. Эти наборы изменяемые: операции insert и delete , добавляют и уничтожают элементы набора.
Операции
create = proc ( ) returns (set [t ]) effects Возвращает новый пустой набор
insert = proc (s : set [t], x: t)
modifies s
effects Добавляет x к элементам s; после insert возвращается Spogi == s (J {x},
delete = proc (s: set [t], x: t)
modifies; effects Удаляет x из s (т.е. Spost == s — {x}).
member == proc (s: set [t], x: t) returns (bool)
effects Возвращает x (: s.
size = proc (s: set [t ]) returns (int) effects Возвращает число элементов в s.
choose» proc (s: set [t]) returns (t) requires набор s не пуст effects Возвращает произвольный элемент s.
end set Рис. 4,10. Спецификация параметризованной абстракции данных.
Реализация общего набора set показана на рис. 4.11. Обратите внимание на предложение where, которое следует за заголовком; это предложение содержит синтаксическую часть предложения requires, которая необходима для контроля типов. Реализация набора set использует тип параметра t как тип элементов. Таким образом, представление в кластере набора set есть:
гер == array [tJ
set ^cluster [t: type] is create, insert, delete, member, size, choose where t has equal: proctype (t, t) returns (bool)
rep = array [t ] create = proc ( ) returns (cvt) return (rep$new ( )) end create
insert = proc (s: cvt, x: t)
if — member (up (s), x) then rep$addh (s, x) end end insert
delete == proc (s: cvt, x: t) j: int := getind (s, x)
if j (= rep$high (s) then s [j ] := rep$top (s)
s lJl rep$remh (s) end end delete
member == proc (s: cvt, x: t) returns (bool) return (getind (s, x) (= rep$high (s)) end member
size === proc (s: cvt) returns (int) return (rep$size (s)) end size
choose = proc (s: cvt) returns (t) return (rep$bottom (s)) end choose
getind = proc (s: rep, x: t) returns (int) i: int := rep$low (s) while i (= rep$high (s) do if x == s [i] then return
i) end
% = короткая форма операции t$equal i : = i+ I end return (i)
end getind -. end set
Рис. 4.11. Реализация общего набора set.
Заголовок же операции insert следующий: insert = proc (s: cvt, i: t)
Итак, там, где мы раньше использовали целочисленные операции над элементами, теперь мы будем использовать t-операции. Таким образом, в операции getind мы используем t$eqiial для проверки, принадлежит ли данный элемент набору. Заметим, что equal — единственная t-операция, используемая в кластере общего набора set.
Для использования процедуры set мы должны задать в качестве параметра тип.
psst == set [poly]
Это законный параметр для процедуры set, так как poly имеет операцию equal. Полученный тип имеет все перечисленные операции, где в каждом случае имя параметра заменено на тип параметра, Например, операции для pset включают в себя)
create = proc ( ) returns (pset) insert == proc (s: pset, x: poly)
