- •Информационная модель предметной области
- •Моделирование задач на эвм
- •Преобразование информации при решении задачи на эвм
- •Понятие о данных
- •Абстрактные структуры данных
- •Классификация структур данных
- •14101954
- •Абстракция
- •Лекция 6. Види та методи абстракції в програмуванні. Абстракция через параметризацию
- •Абстракция через спецификацию
- •Виды абстракций
- •Лекция 7. Процедурна абстракція. Специфікація процедурної абстракції. Процедурная абстракция
- •Спецификации
- •Спецификации процедурных абстракций
- •Реализация процедур
- •Более обобщенные процедуры
- •Создание процедурных абстракций
- •Заключение
- •Лекция 8. Абстракція даних Абстракции данных
- •Спецификации для абстракций данных
- •Реализация на языке clu
- •Замечания по поводу операций up и down
- •Использование абстракций данных
- •Лекция 9. Реалізація абстракції даних. Функція абстракції. Функція інваріант подання.
- •Функция абстракции
- •Инвариант представления
- •Сохранение инварианта представления
- •Изменяемые представления
- •Параметризованные абстракции данных
- •Будем искать решение нашей задачи в виде цикла, имеющего следующий вид:
Спецификации
Очень важно дать абстракциям четкие определения. В противном случае не могут быть достигнуты преимущества, рассмотренные в разд. 3.1.Например, мы можем заменить одну реализацию абстракции на другую только в том случае, если все то, что поддерживала старая реализация, поддерживает и новая. Элементом, создающим данную зависимость, является абстракция. Следовательно, мы должны знать, что она собой представляет.
Мы будем определять абстракции посредствомспецификаций, которые создаются наязыке спецификаций,причем последний может быть как формальным, так и неформальным. Преимущество формальных спецификаций заключается в том, что они имеют точно определенное значение. Неформальные спецификации легче читать и понимать, однако точное их содержание установить затруднительно, поскольку язык неформальных спецификаций точным не является. Несмотря на это, неформальные спецификации могут быть весьма информативны и составлены таким образом, что читатели без труда поймут их смысловое содержание. В нашеvкурсе мы используем как формальные, так и неформальные спецификации, однако основной акцент делается на неформальных спецификациях.
Спецификация отлична от любой определяемой ей реализации абстракции. Все реализации сходны между собой, поскольку они реализуют одну и ту же абстракцию. Отличие их заключается в том, что это делается разными способами. Спецификация определяет их схожесть.
Спецификации процедурных абстракций
Спецификация процедуры состоит из заголовка и описания функции, выполняемого процедурой.Заголовоксодержит имя процедуры, номер, порядок и типы входных и выходных параметров. Кроме этого, выходные параметры могут, а входные должны быть поименованы. Например, заголовок для процедурыremove,dupisесть
remove_dupls = proc (a: array [int])
а заголовок для процедурыsqrtесть
sqrt = proc (x: real) returns (rt: real)
Информация в заголовке чисто синтаксическая; она описывает «форму» процедуры. Это аналогично описанию «формы» математической функции:
f:integer ->integer
Ни в одном из случаев смысл действий, выполняемых процедурой или функцией, не описывается. Эта информация приводится в семантической части спецификации, в которой смысл выполняемых процедурой действий описывается на естественном (разговорном) языке, возможно расширенном привычными математическими обозначениями. В этом описании используются имена входных и выходных параметров.
На рис. 3.2приводится шаблон спецификации для процедуры. Семантическая часть спецификации состоит из трех предложений —requires(требует),modifies(модифицирует) иeffects(эффекты). Эти предложения должны появляться в указанном ниже порядке, однако предложенияrequiresиmodifiesобязательными не являются.
рпагпе = proc (...)returns (…)
requires %этот оператор задает необходимые требования
modifies%этот оператор идентифицирует все модифицируемые входные
% данные
effects %этот оператор описывает выполняемые функции
Рис. 3.2.Шаблон спецификации для процедурных абстракций.
Предложениеrequiresзадает ограничения, накладываемые на абстракцию. Предложениеrequiresнеобходимо в том случае, если процедура является частичной, т. е. если ее поведение для некоторых входных значений недетерминировано. Если же процедура глобальна, т. е. ее поведение определено для всех входных значений, то предложениеrequiresможет быть опущено. В этом случае единственными требованиями, предъявляемыми при обращении к процедуре, являются требования, указанные в заголовке, т. е. число и типы аргументов. Операторmodifiesзадает список имен входных параметров, модифицируемых процедурой. Если входные параметры не указаны, то это предложение может быть опущено. Наконец, предложениеeffectsописывает работу процедуры со значениями, не охваченными предложениемrequires. Оно определяет выходные значения и модификации, производимые над входными параметрами, перечисленными в спискеmodifies. Предложениеeffectsсоставляется исходя из предположения, что требования предложенияrequiresудовлетворены. Однако в том случае, когда требования в предложенииrequiresне удовлетворены, о поведении процедуры ничего не сообщается.
concat = proc (а., Ь: string) returns (ab: string)
effectsпо возвратуabесть новая строка, содержащая символы из а (в том порядке, в котором они расположены в а), за которыми следуют символы изb(в том порядке, в котором они расположены вb),
remove_dupls = proc (a: array [int])
modifiesа
effectsУдаляет из массива а все повторяющиеся элементы. Нижняя граница а остается без изменений, однако порядок следования оставшихся элементов может измениться. Если, например, перед вызовом а == [1: 3, 13, 3, 6],то по возвращению массив а имеет нижнюю границу, равную 1,и содержит три элемента 3, 13и 6,расположенных в некоторой неопределенной последовательности.
search = proc(a: array [int], х: int) retunis (i; int)
requiresмассив а упорядочен по возрастанию.
effectsЕсли элемент х принадлежит массиву а, то возвращается значениеiтакое, что а [i ] =х; в противном случае значениеiна единицу больше, чем значение верхней границы массива а.
Рис. 3.3.Спецификация процедурной абстракции.
На рис. 3.3приведено несколько спецификаций. Процедураconcatне модифицирует входные переменные, а процедура ге-move_duplsизменяет входной массив, что отмечено в предложенииmodifies. Отметим, что в спецификации процедурыremove.dupisдается пример. Наличие примеров облегчает понимание спецификации, и их рекомендуется использовать во всех подходящих случаях.
Процедурыconcatиremove_duplsявляются общими процедурами, поскольку их спецификации не содержат предложенийrequires. Процедураsearchявляется частичной; она выполняет свои функции только в том случае, если входной массив отсортирован. Отметим, что предложениеeffectsничего не говорит о результате работы процедуры в том случае, когда входной массив не отсортирован. В этом случае составитель процедуры может выбрать любой подходящий для него вариант; например, процедураsearchможет в этом случае возвращать индекс, выходящий за границы массива, или индекс, лежащий в пределах границ, но не содержащий х, или даже зацикливаться.
Спецификации составляются на языке спецификаций, а не на языке программирования. Следовательно, рассмотренные ранее спецификации написаны не на языкеCLU. Кроме этого, спецификации обычно принципиально отличаются от программ, поскольку они фокусируют свое внимание на описании самой абстракции, а не ее реализации. Мы вернемся к описанию спецификаций.