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

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)

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