- •Информационная модель предметной области
- •Моделирование задач на эвм
- •Преобразование информации при решении задачи на эвм
- •Понятие о данных
- •Абстрактные структуры данных
- •Классификация структур данных
- •14101954
- •Абстракция
- •Лекция 6. Види та методи абстракції в програмуванні. Абстракция через параметризацию
- •Абстракция через спецификацию
- •Виды абстракций
- •Лекция 7. Процедурна абстракція. Специфікація процедурної абстракції. Процедурная абстракция
- •Спецификации
- •Спецификации процедурных абстракций
- •Реализация процедур
- •Более обобщенные процедуры
- •Создание процедурных абстракций
- •Заключение
- •Лекция 8. Абстракція даних Абстракции данных
- •Спецификации для абстракций данных
- •Реализация на языке clu
- •Замечания по поводу операций up и down
- •Использование абстракций данных
- •Лекция 9. Реалізація абстракції даних. Функція абстракції. Функція інваріант подання.
- •Функция абстракции
- •Инвариант представления
- •Сохранение инварианта представления
- •Изменяемые представления
- •Параметризованные абстракции данных
- •Будем искать решение нашей задачи в виде цикла, имеющего следующий вид:
Спецификации для абстракций данных
Точно так же, как и для процедур, значение типа не должно задаваться никакой его реализацией. Вместо этого должна иметься определяющая его спецификация. Так как объекты типа используются только вызовом операций, основная часть спецификации посвящена описанию того, что эти операции делают. Общий вид спецификации представлен на рис. 4.1.Он состоит из заголовка, определяющего имя типа и имена его операций, и двух главных секций —секции описания и секции операций.
dnarne = data type is % список операций
Описание
%Здесь приводится описание абстракции данных
Операции
%Здесь задаются спецификации для всех операций
enddnarne
Рис. 4.1.Общий вид спецификации абстракции данных.
Всекции описаниятип описывается как целое. Иногда там дается модель для объектов, т. е. объекты описываются в терминах других объектов —таких, которые по предположению понятны тем, для кого эта спецификация предназначена. Например, стеки могут быть описаны в терминах математических последовательностей. В секции описания должно также говориться, изменяемый или неизменяемый это тип.
В секции операцийсодержатся спецификации для всех операций. Если операция —процедура, то ее спецификация будет процедурной спецификацией. (Операция также может быть абстракцией через итерацию. Об этом мы будем говорить в гл. 5.) В этих спецификациях могут использоваться концепции, введенные в секции описания.
На рис. 4.2представлена' спецификация абстракции данныхintset. Наборы целых чиселintset —это неограниченные множества целых чисел с операциями создания нового, пустого набора, проверки данного целого числа на принадлежность данному наборуintsetи добавления или удаления элементов. Заметим, что в секции описания мы описали наборы целых чисел в терминах математических наборов. Там же мы отметили, что наборы целых чисел —изменяемые, и перечислили все изменяющие операции. В секции операций мы задали каждую операцию в терминах математических наборов. Заметим, что спецификации операцийinsertиdeleteиспользуют обозначениеSpost, что указывает на значениеsпри возврате из операции. Имя входного аргумента без квалификатораpostвсегда обозначает значение при вызове операции.
intset = data type is create, insert, delete, member, size, choose
Описание
Наборы целых чиселintset —это неограниченные математические множества целых чисел. Наборы целых чисел изменяемые: операцииinsertиdeleteдобавляют и удаляют целые числа из набора,
Операции
create =proc ( )returns(intset)
effectsВозвращает новый, пустой наборintset
insert = proc (s: intset, x: int)
modifiess
effectsДобавляетxк элементамs; после добавления -возврат,Spost=sU{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.
endintset
Рис. 4.2.Спецификация типа данныхintset.
В этой спецификации мы полагаемся на то, что читателю известно, что такое математические наборы; в противном случае спецификация не будет понятна. В общем случае неформальное описание —слабое место неформальных спецификаций. Разумно, конечно, ожидать, что читатель знаком с определенными математическими концепциями (например, с наборами, последовательностями и целыми числами), однако не все типы могут быть хорошо описаны в терминах таких концепций. Если концепции неадекватны, мы должны описать тип настолько хорошо, насколько возможно, даже с использованием рисунков, но тем не менее все равно остается опасность, что читатель не поймет описания или истолкует его в другом, чем мы имели в виду, смысле. Как мы увидим в гл. 10,этой слабости можно избежать, если использовать формальные спецификации.
На рис. 4.3представлена спецификация типа данныхpoly. Полиномы poly -это неизменяемые полиномы с целыми коэффициентами. Предоставляются операции для создания одночленного полинома, для сложения, вычитания и умножения полиномов, а также для проверки двух полиномов на равенство.
poly = data type is create, degree, coeff, add, mul, sub, minus, equal
Описание
Полиномыpoly —это неизменяемые полиномы с целыми коэффициентами, Операции
create = аргос (с, n: int) returns (poly)
requiresn>=0
effectsВозвращает полином сх". Например,
poly$create (6.3) =6x3
poly$create (3.0) = 3
poly$create (0, 0) = 0
degree = proc (p: poly) returns (int)
effectsВозвращает степеньp, т.e. наибольшую степень при ненулевом коэффициенте. Степень нулевого полинома равна 0.Например,poly$degree(х» + 1) = 2 poly$degree (17) =0
coeff = proc (p: poly, n: int) returns (int) requires n>= 0
effectsВозвращает коэффициент членаpсо степеньюn. Возвращает 0,если nбольше степени р. Например,poly$coeff(x»+ 2х+ 1,4)=0poly$coeff(x»+ 2х+ 1,1)=2
add = proc (p, q: poly) returns (poly)
effectsВозвращает полином, являющийся суммой полиномов р и q.
mul = proc (p, q: poly) returns (poly)
effectsВозвращает полином, являющийся произведением полиномовpиq.
sub =proc(p,q:poly)returns(poly)
effectsВозвращает полином, являющийся разностью полиномов р иq.
minus = proc (p: poly) returns (poly)
effectsВозвращает полином, являющийся разностью полиномовzи р, где z -нулевой полином.
equal = proc (р, q: poly) returns (bool)
effectsВозвращает значениеtrue, если р и qимеют одинаковые коэффициенты при соответствующих членах, и значениеfalse -в противном случае.
end poly
Рис. 4.3.Неформальная спецификация абстракции данных для полиномов.
Реализация абстракций данных
Для реализации типа данных мы выбираем представление для объектов и реализуем операции в терминах этого представления. Выбранное представление должно предоставлять возможности для довольно простой и эффективной реализации всех операций. Кроме того, если некоторые операции должны выполняться быстро, представление должно предоставлять и эту возможность. Часто представление, обеспечивающее быструю работу некоторых операций, приводит к тому, что другие операции выполняются медленно. В этом случае мы должны использовать несколько различных реализаций одного и того же типа.
Например, возможное представление для объектаintset - это массив целых чисел, где каждое целое число набораintsetсоответствует элементу массива. Мы должны решить -должен ли каждый элемент набора встречаться в массиве только один раз или же он может встречаться много раз. В последнем случае операцияinsertбудет работать быстрее, однако операцииdeleteиmemberбудут выполняться медленнее. Если операцияmemberиспользуется часто, мы должны остановиться на первом случае.
Заметим, что здесь мы говорим о двух разных типах: новом абстрактном типеintset, который мы реализуем, и массиве целых, который используется как представление. Каждая реализация будет иметь два таких типа:абстрактный типитип представления(reptype). Предполагается, что с типом представления мы имеем дело только при реализации. Все, что мы можем делать с объектами абстрактного типа, —это применять к ним соответствующие данному типу операции. Соблюдение этого ограничения в языкеCLUосуществляется с помощью контроля типов.
В следующем разделе мы рассмотрим, как реализовать абстракции данных на языке CLU,о том же, как реализовать типы на других языках, мы поговорим позже.