AlgStr / Библиотека / ЗАДАЧИ / INTSET3 / INTSET
.DOC
СПЕЦИФИКАЦИЯ
абстракции данных
"Набор целых чисел intset"
intset = DATA TYPE IS create, insert, delete, member, size, choose, equal, similar, copy
ОПИСАНИЕ
Наборы целых чисел intset - это неограниченные математические
множества целых чисел. Наборы целых чисел ИЗМЕНЯЕМЫЕ: операции
insert и delete добовляют и удаляют целые числа из набора.
ОПЕРАЦИИ
create = PROC () RETURNS (intset)
EFFECTS Возвращает новый, пустой набор intset
insert = PROC (S: intset, X: int)
MODIFIES S
EFFECTS Добавляет X к элементам S; после добавления - воз-
вращает Spost = S U {X}, где Spost - это набор зна-
чений в S при возврате из insert.
delete = PROC (S: intset, X: int)
MODIFIES s
EFFECTS Удаляет X из S (т.е. Spost = S - {X}).
member = PROC (S: intset, X: int) RETURNS (bool)
EFFECTS Возвращает значение true, если X Ї S.
size = PROC (S: intset) RETURNS (int)
EFFECTS Возвращает число элементов в S
choose = PROC (S: intset) RETURNS (int)
REQUIRES Набор S не пуст.
EFFECTS Возвращает произвольный элемент S
equal = PROC (S1, S2: intset) RETURNS (bool)
EFFECTS Возвращает значение true, если S1 и S2 - один и тот же
объект intset.
similar = PROC (S1, S2: intset) RETURNS (bool)
EFFECTS Возвращает значение true, если s1 и S2 содержат одинаковые элементы.
copy = PROC (S: intset) RETURNS (intset)
EFFECTS Возвращает новый объект intset, содержащий те же элементы, что и S.
END intset
Функция АБСТРАКЦИИ
для абстракции данных
"Набор целых чисел intset"
REP = record[ els: array[bool], other_els: array[int], size: int]
{====================================================================}
{ Типичный набор данных intset есть: {x1, x2, ..., xn} }
{--------------------------------------------------------------------}
{ Функция АБСТРАКЦИИ есть }
{ A(r) = }
{ {r.other_els[i] | low(r.other_els) <= i <= high(r.other_els)} U }
{ {j | 1 <= j <= 100 & r.els[j]} }
{--------------------------------------------------------------------}
{ ПОЯСНЕНИЯ: Набор целых чисел определяется как объединение двух мно-}
{ жеств: первое определяется элементами, хранящимися в }
{ массиве r.other_els (их r.size штук), а второе - }
{ индексами тех элементов r.els[j], значения которых }
{ есть true }
{====================================================================}
Функция ИНВАРИАНТ ПРЕДСТАВЛЕНИЯ
для абстракции данных
"Набор целых чисел intset"
REP = record[ els: array[bool], other_els: array[int], size: int]
Идея данного представления заключается в том, что для чисел из
диапазона 1..100 мы отмечаем их принадлежность набору, записывая значение true в r.els[i]. Остальные значения записываются в r.other_els
как и в обычной реализации на базе массива целых.
{====================================================================}
{ ИНВАРИАНТ ПРЕДСТАВЛЕНИЯ есть }
{ size(r.els)=100 & low(r.els)=1 }
{ & все элементы r.other_els не принадлежат диапазону 1..100 }
{ & в r.other_els нет дубликатов элементов }
{ & size(A) = size(r.other_els) + }
{ (число элементов в r.els со значением true) }
{--------------------------------------------------------------------}
{ ПРИМЕЧАНИЕ: Здесь A - абстрактный объект (т.е. набор intset, а }
{ r - объект представления (т.е. record[els и т.д.]}
{====================================================================}