- •Информационная модель предметной области
- •Моделирование задач на эвм
- •Преобразование информации при решении задачи на эвм
- •Понятие о данных
- •Абстрактные структуры данных
- •Классификация структур данных
- •14101954
- •Абстракция
- •Лекция 6. Види та методи абстракції в програмуванні. Абстракция через параметризацию
- •Абстракция через спецификацию
- •Виды абстракций
- •Лекция 7. Процедурна абстракція. Специфікація процедурної абстракції. Процедурная абстракция
- •Спецификации
- •Спецификации процедурных абстракций
- •Реализация процедур
- •Более обобщенные процедуры
- •Создание процедурных абстракций
- •Заключение
- •Лекция 8. Абстракція даних Абстракции данных
- •Спецификации для абстракций данных
- •Реализация на языке clu
- •Замечания по поводу операций up и down
- •Использование абстракций данных
- •Лекция 9. Реалізація абстракції даних. Функція абстракції. Функція інваріант подання.
- •Функция абстракции
- •Инвариант представления
- •Сохранение инварианта представления
- •Изменяемые представления
- •Параметризованные абстракции данных
- •Будем искать решение нашей задачи в виде цикла, имеющего следующий вид:
Более обобщенные процедуры
Рассмотренная ранее процедура sortработает с произвольным массивом целых чисел. Она оказалась бы более полезной, если бы смогла работать с различными массивами данных —символьными, строковыми или массивами действительных чисел. Мы можем достичь подобного обобщения, расширяя абстракцию через параметризацию и используя типы данных в качестве параметров.
Польза от применения типов в качестве параметров очевидна. Это следует из того факта, что многие встроенные типы данных, например массивы, записи и процедуры, параметризованы через типы.
При использовании типов в качестве параметров некоторые значения параметров могут не иметь смысла. Например, массивы могут быть отсортированы только в том случае, если элементы, принадлежащие к типу, упорядочены, ограничения на параметры типа предполагают набор некоторых заданных операций над ними. Спецификация абстракции должна содержать эти ограничения в предложенииrequires.
Некоторые спецификации для параметризованных процедур показаны на рис. 3.7.Отметим, что эти спецификации отличаются от непараметризованных процедур только заголовком, который содержит дополнительную часть, содержащую параметры. Предложениеrequiresпомимо прочих ограничений содержит ограничения, накладываемые на параметры. Если ограничения отсутствуют, то предложениеrequiresможет быть опущено. Например, абстракцияsortтребует, чтобы параметрtимел операциюIt, упорядочивающую t.Аналогично процедураsearchтребует, чтобы ее параметр поддерживал как операцию, так и операциюequal. (Ltесть имя, используемое для операций, для которых допускается сокращенная форма <,aequalесть имя операции с сокращенной формой =.)
sort = pi-ос [t: type] (a: array [t])-returns (array [t])
requires t имеет операцию
It: proctype (t, t) returns (bool) которая упорядочивает t.
modifies a
effectsВозвращает новый массив с теми же границами, что и а, и содержащий элементы а, расположенные в возрастающем порядке; порядок устанавливается черезt$lt.
search = proc [t: type] (a: array [t], x: t) retunis (int)
requires t имеет операции
equal, It: proctype (t, t) returns (bool)
такой, что tупорядочивается черезIt, и массив а упорядочен по возрастанию черезIt.
effectsЕсли х принадлежит а, то возвращаетсяiтакое, чтоa[i] = x; в противном случае возвращаетсяhigh(а) + 1
Рис. 3.7.Спецификации параметризованных процедур.
Параметризованная абстракция в действительности представляет собой класс взаимосвязанных абстракций, определенных в одной спецификации. Например, параметризованная абстракцияsortпредставляет собой не одну параметризованную процедуру, а целый класс процедур, одна из которых принимает в качестве параметра массив целых чисел, другая —строковый массив и т. д. Мы будем поименовывать такие процедуры сочетанием имени класса с именем типа, напримерsort[int] иsort[string]. Аналогично мы получимsearch[int] иsearch[real]. Подобные имена мы уже использовали во встроенных классах абстракций языкаCLU —например,array[int].
Класс содержит элемент для каждого типа, который удовлетворяет ограничениям, заданным в предложенииrequires. Например,sort [int]находится в классеsort,asort [bool] —нет (поскольку в языке CLUк булевым переменным неприменима операцияIt). Спецификация процедуры естественным образом получается из спецификации класса путем замены имени параметра его значением и удалением "из предложенияrequiresограничений на тип параметра(ов) (поскольку эти условия, задаваемые этими ограничениями, были удовлетворены). Следовательно, спецификация дляsearch [int]совпадает со спецификацией дляsearchна рис. 3.3.
Исходя из соображений удобства при составлении, отладке и тестировании, желательно реализовать параметризованную абстракцию в виде одной программы. Язык CLUобеспечивает такую возможность. Например, параметризованная процедура используется для представления класса процедур. Такая процедура имеет заголовок, аналогичный заголовку в спецификации:
sort = proc [t: type ] (a: array [t ]) returns (array [t ])
Обычно операции, перечисленные в предложении requires. спецификации, используются и в реализации. Например, для реализации процедурыsortмы используем операциюIt. Для проверки типа в таких операциях компилятор должен знать их имена, а также число и типы их аргументов и результатов. Мы даем такую информацию в предложенииwhere, которое помещается сразу же за заголовком. Например,
sort = proc [t: type] (a: array [t] returns (array [int])
where t has It: proctype (t, t) returns (bool)
Единственные операции параметра типа, которые могут быть использованы в параметризованном модуле, перечислены в предложении where.
Предложение whereвключает в себя часть информации, приводимую в предложенииrequiresчасти спецификации. Предложениеrequiresвключает в себя как синтаксическую информацию (имена и типы требуемых операций), так и семантическую (смысл выполняемых операций). В соответствующем предложении where мы приводим только синтаксическую информацию, которой вполне достаточно для проверки типа.
Текст параметризованной процедуры аналогичен непараметризованной процедуре. Например, приведенная на рис. 3.8реализация процедурыsearchотличается от реализации на рис. 3.4тем, что элементы массива, принадлежащие ранее к целочисленному типу, имеют теперь тип t —параметр типа. Процедураsearchсравнивает элементы массива при помощи t$ltи t$equal.Эти обращения даются с использованием сокращенных форм.
Для использования параметризованной процедуры мы должны сначала указать значения для параметров, напримерsearch[int]. Следовательно,search [int](а) является разрешенным обращением, если а естьarray [int],ноsearch(а) таковым не является, поскольку дляtне было указано никакого значения.
search == proc [t: type] (a: array [t], x: t) returns (int)
where t has It, equal: proctype (t, t) returns (bool)
%реализация с использованием метода линейного поиска
at = array [t ]
i: int := atjjjlow (a)
while i <= at$high (a) do
if a [i ] = x then return (i) end % использование T$equal
if a [i] <x % использование t$lt
then i := i + 1 else return (at$high (a) + 1) end
end % конец цикла while
return (i)
end search
Рис. 3.8.Параметризованная абстракцияsearch.
При задании параметра для типа компилятор проверяет, применимы ли к данному типу операции, указанные в предложенииwhere. Например, обращениеsearch[array [int]]не допускается, посколькуarray [int]не имеет операцииit. Такая проверка гарантирует, что использованные в параметризованном модуле операции будут снабжены фактическими параметрами и что значения и типы аргументов и результатов соответствуют ожидаемым.
Параметризованная процедура должна содержать список операций в предложенииwhere, даже если она использует эти операции неявным образом, обращаясь к другой параметризованной процедуре, использующей данные операции. Предположим, например, что мы создали параметризованные версии процедур для задачи сортировки слиянием, показанной на рис. 3.5,ОперациюItиспользует только процедураmerge. Однако процедурыmergeиsortдолжны содержатьItв предложенияхwhereс тем, чтобы компилятор мог удостовериться, что сделанное вmerge.sortобращениеmerge [t]является допустимым.