методичка (Кузьменкова Е. А., Петренко А. К. Практикум по формальной спецификации программ на языке RSL), страница 3
Описание файла
Документ из архива "Кузьменкова Е. А., Петренко А. К. Практикум по формальной спецификации программ на языке RSL", который расположен в категории "". Всё это находится в предмете "формальная спецификация и верификация программ" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "методичка"
Текст 3 страницы из документа "методичка"
all x : T1 :- exists! y : T2 :- f(x) is y
Сигнатура функции f в этом случае имеет вид:
f : T1 -> T2
Всюду вычислимые функции всегда детерминированы и определены для всех значений входных параметров.
Функция f, отображающая значения типа T1 в значения типа T2, является частично вычислимой (partial function), если существует такое значение v типа T1, для которого вычисление f(v) может либо вообще не завершиться (в этом случае f(v) is chaos), либо привести к недетерминированному результату, когда различные вхождения выражения f(v) могут возвращать разные значения.
Сигнатура частично вычислимой функции f имеет вид:
f : T1 --> T2
Частично вычислимые функции включают в себя всюду вычислимые функции.
Как правило определение частично вычислимой функции содержит описание предусловия, накладывающего некоторые ограничения на значения входных параметров и гарантирующего нормальное завершение вычисления функции при условии соблюдения этих ограничений. Предусловие задается предикатом, зависящим от входных параметров определяемой функции.
Дальнейшее определение функции подобно рассмотренному ранее определению констант может производиться в одном из следующих стилей:
-
явном (эксплицитном, explicit),
-
неявном (имплицитном, implicit),
-
аксиоматическом.
Выбор конкретного стиля спецификации зависит от специфики решаемой задачи.
Явное описание функций
Описание функции в явном стиле (операционная спецификация) ориентировано на описание конкретного алгоритма и используется в том случае, когда явно задаётся способ преобразования входных параметров в выходные. Примером явного описания всюду вычислимой функции может служить следующий фрагмент RSL спецификации:
value
f : Int -> Int
f(x) is x + 1
В качестве примера описания частично вычислимой функции в явном стиле рассмотрим функцию p(x), вычисляющую значение 1/x:
value
p : Real -~-> Real
p(x) is 1.0/x
pre x ~= 0.0
Последняя строка данного описания содержит предусловие, представляющее собой предикат, накладывающий ограничение на значения входного параметра.
Неявное описание функций
Описание функции в неявном стиле (контрактная спецификация) нацелено на описание свойств результата функции, которые фиксируются в виде некоторого предиката в постусловии определяемой функции. Неявная спецификация, абстрагируясь от конкретного способа получения результата, во главу угла ставит формализацию отношений, связывающих между собой входные и выходные параметры, т.е. здесь описывается не сам алгоритм, а эффект его применения. Данный стиль описания соответствует более высокому уровню абстракции, чем явная спецификация, поскольку конкретный алгоритм преобразования не указывается и может быть уточнен в дальнейшем путем построения явной спецификации определяемой функции. При этом для одной и той же неявной спецификации можно предложить, вообще говоря, разные алгоритмы, эффект применения которых удовлетворяет указанной спецификации. При разработке спецификаций функций этап построения их неявных спецификаций как правило предшествует этапу построения явных спецификаций.
Ниже приведены примеры описания в неявном стиле всюду вычислимой функции f(x), возвращающей в качестве результата некоторое целое число, превосходящее входное значение:
value
f : Int -> Int
f(x) as r post r > x
и частично вычислимой функции square_root(x) для нахождения значения квадратного корня:
value
square_root : Real -->. Real
square_root(x) as s
post s s = x /\ s >= 0.0
pre x >= 0.0
Причем, как видно из примеров, конкретный алгоритм получения результата остается в обоих случаях за рамками рассмотрения, описываются лишь свойства результата.
Аксиоматическое описание функций
При использовании аксиоматического стиля описания функции предлагается некоторый набор аксиом, определяющих свойства данной функции. Аксиоматическая спецификация может применяться с одинаковым успехом и для описания способа получения результата, и для описания свойств самого результата выполнения функции. Поэтому как для явного, так и для неявного описаний всегда можно предложить эквивалентное описание в аксиоматическом стиле. Кроме того данный стиль является единственно возможным при построении алгебраических спецификаций, где аксиомы описывают свойства цепочек функций и имеют специфический вид (например, f(g(x), x) is h(x)), т.е. в качестве аргумента функции допускается использование обращения к функции.
В качестве примеров приведем аксиоматическое описание всюду вычислимой функции f(x), эквивалентное рассмотренному выше явному описанию той же функции:
value
f : Int -> Int
axiom all x : Int :- f(x) is x + 1
и аксиоматическую спецификацию частично вычислимой функции square_root(x), эквивалентную ее неявной спецификации, также рассмотренной ранее:
value
square_root : Real --> Real
axiom
all x : Real :-x >= 0.0 =>
exists s : Real :- square_root(x) = s /\ s s = x /\ s >= 0.0
Схема определения функции
Подводя итог вышесказанному, можно предложить следующую схему определения функции:
-
Описать сигнатуру функции:
-
выбрать имя функции;
-
выбрать тип:
-
аргументов,
-
результата,
-
отображения:
- всюду вычислимая функция (может быть определена для всех значений входных параметров),
- частично вычислимая функция (необходимо предусловие);
-
выбрать стиль спецификации:
-
явный (можно задать способ вычисления результата),
-
неявный (можно описать связь входа и выхода посредством предиката),
-
аксиоматический (может быть использован всегда, необходим в алгебраических спецификациях).
Упражнения
-
Для обеспечения работы с точками на плоскости описать тип для представления:
-
всех точек на плоскости, принадлежащих первому квадранту и лежащих выше прямой y=x,
-
всех точек с целочисленными координатами, лежащих внутри круга с центром в начале координат и радиусом 5.
Указания: используйте декартово произведение и аппарат определения подтипов.
-
Используя явный стиль спецификации, определить функцию:
-
is_even для проверки заданного числа на четность,
-
is_a_prime, которая проверяет, является ли ее аргумент простым числом.
Указания: в пункте (a) можно использовать операцию \ (остаток от деления) или воспользоваться квантифицированным выражением.
-
Определить функцию max, возвращающую значение максимума из двух целых чисел, используя один из следующих стилей описания:
-
явный,
-
неявный,
-
аксиоматический.
Указания:
-
воспользуйтесь приведенной в этой главе общей схемой определения функции;
-
для удобства записи в пунктах (a) и (c) используйте условное выражение языка RSL.
-
Для обеспечения работы с комплексными числами описать:
-
тип Complex для представления комплексных чисел,
-
константу zero для представления комплексного числа 0 + 0i,
-
константу c, представляющую любое комплексное число вида x + xi;
-
функции add и mult для сложения и умножения комплексных чисел,
-
функцию f, возвращающую в качестве результата некоторое комплексное число, отличное от заданного.
Указания:
-
в пунктах (b) и (d) воспользуйтесь явным (explicit) стилем описания константы и функций, т.к. здесь явно указано значение константы и способ получения результатов функций по их входным значениям;
-
в пунктах (c) и (e) следует использовать неявное (implicit) описание константы и функции, поскольку в условии не оговаривается явно значение константы и способ получения результата по входному значению;
-
в пунктах (c) и (d) для упрощения записи удобно воспользоваться выражением let. С помощью этого выражения, например, для пункта (c) факт равенства действительной и мнимой частей комплексного числа c можно записать так:
let (x, y) = c in x = y end
-
Пусть задана следующая спецификация системы координат:
scheme SYSTEM_OF_COORDINATES=
class
type
Position = Real >< Real
value
origin : Position = (0.0,0.0),
distance : Position >< Position -> Real
distance((x1, y1),(x2, y2)) is
((x2 – x1)**2.0 + (y2 – y1)**2.0)**0.5
end
Здесь тип Position предназначен для описания координат точек на плоскости, константа origin задает начало координат, функция distance определяет способ вычисления расстояния между двумя точками. Обратите внимание на то, что при описании константы origin и функции distance использован явный стиль описания, т.к. указано непосредственное значение константы и формула для вычисления расстояния.
Дополнить заданную спецификацию определением:
-
типа Circle для описания окружности по ее центру и радиусу;
-
функции on_circle, определяющей, лежит ли точка с заданными координатами на заданной окружности;
-
окружности с радиусом 3.0 и центром в начале координат;
-
константы pos для представления произвольной точки, лежащей на заданной окружности.
Указания:
-
в пункте (a) определите вспомогательные типы Center и Radius для представления центра окружности и ее радиуса соответственно, для определения типа Center используйте тип Position, для типа Radius воспользуйтесь следующим описанием:
Radius = { r : Real :- r >= 0.0 },
задающим подтип действительных чисел с неотрицательными значениями;
-
в пунктах (b) и (c) следует воспользоваться явным стилем описания функции и константы, можно также использовать конструкцию let для достижения большей наглядности записи;
-
в пункте (d) используйте неявный стиль описания константы.
-
Для обеспечения работы с рациональными числами предложить спецификацию схемы RATIONAL_NUMBERS, содержащей определения:
-
типа Rational для представления рациональных чисел;
-
функции less, которая сравнивает два рациональных числа и возвращает true, если первое число меньше второго;
-
функции add для сложения двух рациональных чисел;
-
функции max для определения максимума из двух рациональных чисел;
-
функции check, которая проверяет, является ли заданное рациональное число несократимой дробью.
Указания: используйте явный стиль спецификации.
-
Определить функцию approx_sqrt, которая с заданной точностью eps (положительное вещественное число) находит приближённое значение корня квадратного из неотрицательного вещественного числа. Возвращаемый функцией результат должен быть таким, чтобы точное значение квадратного корня лежало в полуоткрытом интервале:
[approx_sqrt(x,eps), approx_sqrt(x,eps) + eps).