
- •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.
endsetРис. 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)