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

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)

Соседние файлы в папке Б. Лисков