- •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)