Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AlgStr / Лекции.doc
Скачиваний:
44
Добавлен:
23.03.2015
Размер:
741.89 Кб
Скачать

Спецификации

Очень важно дать абстракциям четкие определения. В про­тивном случае не могут быть достигнуты преимущества, рассмо­тренные в разд. 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. Кроме этого, специфи­кации обычно принципиально отличаются от программ, поскольку они фокусируют свое внимание на описании самой абстракции, а не ее реализации. Мы вернемся к описанию спецификаций.

Соседние файлы в папке AlgStr