- •Информационная модель предметной области
- •Моделирование задач на эвм
- •Преобразование информации при решении задачи на эвм
- •Понятие о данных
- •Абстрактные структуры данных
- •Классификация структур данных
- •14101954
- •Абстракция
- •Лекция 6. Види та методи абстракції в програмуванні. Абстракция через параметризацию
- •Абстракция через спецификацию
- •Виды абстракций
- •Лекция 7. Процедурна абстракція. Специфікація процедурної абстракції. Процедурная абстракция
- •Спецификации
- •Спецификации процедурных абстракций
- •Реализация процедур
- •Более обобщенные процедуры
- •Создание процедурных абстракций
- •Заключение
- •Лекция 8. Абстракція даних Абстракции данных
- •Спецификации для абстракций данных
- •Реализация на языке clu
- •Замечания по поводу операций up и down
- •Использование абстракций данных
- •Лекция 9. Реалізація абстракції даних. Функція абстракції. Функція інваріант подання.
- •Функция абстракции
- •Инвариант представления
- •Сохранение инварианта представления
- •Изменяемые представления
- •Параметризованные абстракции данных
- •Будем искать решение нашей задачи в виде цикла, имеющего следующий вид:
Сохранение инварианта представления
Для того чтобы продемонстрировать корректность реализации типа, мы должны, в частности, показать, что инвариант представления сохраняется для всех законных объектов представления. Мы можем сделать это следующим образом. Прежде всего мы покажем, что инвариант сохраняется для объектов, возвращаемых операциями (как, например, операцией poly$create), которые возвращают объект типа, но не имеют аргументов типа. Для всех других операций мы можем предположить, что при их вызове инвариант сохраняется для всех аргументов, являющихся объектами типа; тогда мы должны показать, что он сохраняется при возврате как для аргументов типа, так и для возвращаемых объектов типа.
Например, реализация набора intset(рис. 4.5)имеет инвариант
% Для всех целых i, j, таких, что low (r) i < j high (r)
% r [i]~=r lj]
Операция intset$createотвечает этому инварианту потому, что заново созданный массив пуст. Операцияmemberтакже сохраняет этот инвариант, так как мы знаем, что инвариант сохраняется для аргументаsи что эта операция не модифицируетs. Операцияinsertтакже сохраняет инвариант, так как
1)инвариант сохраняется для ее аргумента sпри обращении;
2)при вызове операцииmemberиз операцииinsertинвариант сохраняется потому, что он сохраняется в операцииmember; и
3)операцияinsertдобавляет х к s,только если выражение ^member (s,х) имеет значениеtrue; следовательно, так как набор sудовлетворяет инварианту при вызове, он также удовлетворяет инварианту после добавления к нему х.
В качестве второго примера рассмотрим реализацию полиномов poly, представленную на рис. 4.7.Вспомним, что инвариант есть
% low (r) >= 0
% & if empty (s) then high (r) = 0
% else г [low (r)] ~ = 0 & г [high (г)] ~ = 0
Операция poly$createсохраняет инвариант потому, что она создает нулевой полином. Операцияmillсохраняет инвариант потому, что
1)при вызове инвариант сохраняется для р иq;
2)случай, когда р или q —нулевой полином, распознается и создается соответствующее представление; и
3)в противном случае ни р, ни qне содержат нулей ни в старшем, ни в младшем члене; следовательно, ни младший элемент возвращаемого массива (bottom(р)*bottom (q)),ни старший элемент (top(р)*top (q))не может быть нулем.
Здесь мы предполагаем, что абстрактные объекты нельзя модифицировать вне их реализации. Если это возможно, то мы не можем предполагать, что инвариант сохраняется при вызове операции, так как какие-то модули могут его изменить.
Изменяемые представления
Изменяемость (или неизменяемость) —это свойство абстракции, которое должно сохраняться реализацией. Изменяемые абстракции должны иметь изменяемые представления, иначе будет невозможно обеспечить требуемую изменяемость. Однако неизменяемые абстракции не обязательно должны иметь неизменяемые представления. Например, полиномы неизменяемы, но имеют изменяемое представление. Изменяемые представления приемлемы, если модификации, сделанные в представлении, не могут быть замечены пользователями абстракций.
Иногда полезно создавать объект, изменяя его представление, однако, когда объект создан, его представление больше не модифицируется. Так, например, созданы полиномы. Изменяемость также полезна для благоприятных побочных эффектов,являющихся модификациями, которые не видны вне реализации. Например, давайте представим рациональное число парой целых:
гер =•record [num, denom: int]
Функция абстракции есть
%типичное рациональное число естьn/d
%Функция абстракции есть
%А (г) =r.num/r.denom
Исходя из этого представления, мы должны принять несколько решений: что делать с нулевым знаменателем, как хранить отрицательные рациональные числа и хранить ли рациональные числа в сокращенной форме (т. е. когда числитель и знаменатель не имеют общего делителя). Мы решаем: исключить нулевой знаменатель, представлять отрицательные рациональные числа с помощью отрицательного числителя и нехранить представления в сокращенной форме (для ускорения таких операций, как умножение). Таким образом, имеем
%Инвариант представления есть
%r.denom >0
Давайте также решим находить сокращенную форму при проверке двух рациональных чисел на равенство. Это мы можем сделать, используя процедуру gcd.
gcd =proc(n,d:int)returns(int)
requiresnиdдолжны быть положительными
effectsВозвращает макс. общий делитель nи d.
Реализация операции equalпредставлена на рис. 4.9.Однажды найденные, сокращенные формы записываются в представление, так как это ускоряет работу при последующих обращениях к операцииequal.
rep = record [num, denom: int]
equal = proc (rl, r2: cvt) returns (bool)
if rl.nurn =: 0 then return (r2.niim = 0)
elseif r2.niim == 0 then return (false)
end
reduce (rl)
reduce (r2)
return (rl.num == r2.num cand rl.denom = r2.denom)
endequal
%reduce -внутренняя программа, приводящая ее аргумент к сокращенной
% форме
reduce proc (r: rep)
g: int := gcd (in1$abs (r.num), r.denom)
r.num := r.num/g
r.denom := r.denom/g
end reduce
Рис, 4.9. Благоприятный побочный эффект.
Модификация представления, осуществляемая операцией equal, —благоприятный побочный эффект. Такие побочные эффекты часто используются для улучшения эффективности. Они возможны, если функция абстракции отображает различные элементы в один, так как тогда имеется много объектов представления, которые представляют один и тот же абстрактный объект. Иногда полезно внутри реализации переходить от одного такого объекта представления к другому. Такой переход законен, так как новое представление соответствует тому же самому абстрактному объекту.
