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

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