- •Лекции по
- •(Те что я нашел)
- •Информация и данные.
- •Анализ программ, не содержащих ветвлений
- •Если p{ а }q и q{ b }r, то выполняется p{ a;b }r.
- •Проектирование цикла с помощью инварианта Задача 1. Найти сумму величин 1/iот 1 до тех пор, пока она не станет больше некоторого наперед заданного числаa.
- •Будем искать решение нашей задачи в виде цикла, имеющего следующий вид:
- •Линейные структуры данных.
- •Операции над линейной структурой данных
- •Виды линейных структур данных.
- •4)Стек на базе массива
- •Тема: Анализ создаваемых абстракций
- •Полнота
- •Аназиз типов данных
- •Операции egual, similar и copy
- •Функция абстракции
- •Функция абстракции есть
Функция абстракции есть
% типичное рациональное число есть n/d
% Функция абстракции есть
% А (r) == r.num / r.denom
Исходя из этого представления, мы должны принять несколько решений: что делать с нулевым знаменателем, как хранить отрицательные рациональные числа и хранить ли рациональные числа в сокращенной форме (т.е. когда числитель и знаменатель не имеют общего делителя). Мы решаем: исключить нулевой знаменатель, представляй отрицательные рациональные числа с помощью отрицательного числителя и не хранить представления в сокращенной форме (для ускорения таких операций, как умножение). Таким образом, имеем
% Инвариант представления есть
% r.denom > 0
Давайте также решим находить сокращенную форму при проверке двух рациональных чисел на равенство. Это мы можем сделать, используя процедуру gcd.
gcd = proc (n, d: int) returns (int)
requires n и d должны быть положительными
effects Возвращает макс. общий делитель n и d. ,
Реализация операции equal представлена на рис.2. Однажды найденные, сокращенные формы записываются в представление, так как это ускоряет работу при последующих обращениях к операции equal.
rep = record [num, denom: int] equal = proc (rl,. r2: cvt) returns (bool)
if rl.num = 0 then return (r2.num = 0)
elseif r2.num = 0 then return (false)
end
reduce (rl)
reduce (r2)
return (rl.num = r2.num cand rl.denom = r2.denom)
end equal
% reduce — внутренняя программа, приводящая ее аргумент к сокращенной
% форме
reduce proc (r: гер)
g: int := gcd (int$abs (r.num), r.denom)
r.num := r.num/g
r.denom := r.denom/g
end reduce
Рис. 2. Благоприятный побочный эффект.
Модификация представления, осуществляемая операцией equal, — благоприятный побочный эффект. Такие побочные эффекты часто используются для улучшения эффективности. Они возможны, если функция абстракции отображает различные элементы в один, так как тогда имеется много объектов представления, которые представляют один и тот же абстрактный объект. Иногда полезно внутри реализации переходить от одного такого объекта представления к другому. Такой переход законен, так как новое представление соответствует тому же самому абстрактному объекту.