методичка (811291), страница 2
Текст из файла (страница 2)
chaos chaos
В таблицах истинности для операций = и is символы a и b обозначают выражения, значения которых отличаются друг от друга.
is | a | b | chaos |
a | true | false | false |
b | false | true | false |
chaos | false | false | true |
| a | b | chaos |
a | true | false | chaos |
b | false | true | chaos |
chaos | chaos | chaos | chaos |
На основании приведенных таблиц можно заметить, например, что в отличие от классической логики в RSL операции /\ и \/ не обладают свойством коммуникативности, т.е. выражения e1 /\ e2 e2 /\ e1 и e1 \/ e2 e2 \/ e1 уже не являются тавтологиями.
Квантифицированные и условные выражения RSL
Для обеспечения возможности альтернативного выбора при вычислении выражений в RSL введены условные выражения, имеющие следующий вид:
if expr then expr1 else expr2 end,
где expr является логическим выражением, а выражения expr1 и expr2 имеют один и тот же тип, который является и типом всего условного выражения. Например, вычисление модуля разности двух величин можно задать с помощью выражения:
if x > y then x – y else y – x end
При вычислении значений условных выражений необходимо иметь в виду следующие свойства:
if true then expr1 else expr2 end expr1 (1),
при этом вычисление выражения expr2 не производится,
if false then expr1 else expr2 end expr2 (2),
при этом вычисление выражения expr1 не производится,
if a then expr1 else expr2 end
if a then expr1[true/a] else expr2[false/a ] end (3),
где запись вида expr1[true/a] обозначает подстановку в выражение expr1 значения true вместо a.
if chaos then expr1 else expr2 end chaos (4),
при этом вычисление выражений expr1 и expr2 не производится.
В языке RSL допускается также более сложная форма условного выражения, имеющая следующий вид:
if expr1 then v_expr1
elsif expr2 then v_expr2
...
if exprn-1 then v_exprn-1
else v_exprn end
Такое выражение является сокращенной записью условного выражения:
if expr1 then v_expr1
else
if expr2 then v_expr2
else
...
else
if exprn-1 then v_exprn-1
else v_exprn
end
end
...
end
В качестве примера сложного условного выражения можно привести выражение, вычисляющее модуль x:
if x = 0 then 0
elsif x > 0 then x
else 0 – x end
Квантифицированные выражения языка RSL имеют традиционную форму и используются в основном для записи аксиом. Допускаются кванторы: all (), exists (), exists! ().
Упражнения
-
Определить подтип:
-
всех положительных натуральных чисел,
-
всех нечетных целых чисел,
-
всех вещественных чисел из интервала (–1.0, 1.0).
-
Ниже приведены равенства, которые верны в классической логике. Какие из них верны в RSL?
-
(a) is a
-
true \/ a is true
-
a \/ true is true
-
a => true is true
-
a => b is a b
-
a \/ a is true
-
(a /\ a) is false
-
(a /\ b) /\ c is a /\ (b /\ c)
-
(a \/ b) \/ c is a \/ (b \/ c)
-
(a a) is true
-
(a is a) is true
Указания:
-
воспользуйтесь приведенными в данной главе таблицами истинности для основных логических операций;
-
для проверки справедливости предложенных утверждений достаточно исследовать их значения на наборах данных, где хотя бы один операнд обращается в chaos.
Например, для пункта (c):
chaos \/ true is chaos,
(chaos is true) is false
Следовательно, утверждение (c) неверно в RSL.
-
Упростить следующие выражения:
-
if true then false else chaos end is ?
-
if a then ( a is chaos) else false end is ?
Указание: воспользуйтесь свойствами условного выражения (1) - (4).
-
Какие из следующих квантифицированных выражений верны?
-
all i : Int :- exists j : Int :- i+j 0
-
all i : Int :- exists j : Nat :- i+j 0
-
exists i : Int :- all j : Int :- i+j 0
-
Напишите RSL выражение, выражающее следующий факт:
-
нет наибольшего целого числа,
-
значение max является максимумом значений x и y,
-
натуральное число n является четным числом,
-
натуральное число n является полным квадратом,
-
натуральное число n является простым числом.
Указания: воспользуйтесь предопределенными операциями над встроенными типами и квантифицированными выражениями RSL.
ГЛАВА 2. ОПИСАНИЕ КОНСТАНТ И ФУНКЦИЙ
Общая структура RSL спецификации. Декартовы произведения. Выражение let. Характеристика основных стилей спецификации функций - явного, неявного, аксиоматического. Описание констант в различных стилях спецификации. Понятие всюду вычислимой и частично вычислимой функции. Описание функций в различных стилях спецификации. Схема описания функции. Упражнения.
Общая структура RSL спецификации
Спецификация на языке RSL состоит из набора описаний определенного вида. Описания верхнего уровня представляют собой модули. Мы ограничимся рассмотрением одного вида модулей – схемами, когда модуль содержит определение схемы. В этом случае описание модуля (схемы) имеет вид:
scheme id =
class
decl1
...
decln
end
где id – идентификатор схемы, decl1 ,…, decln (n 0) – разделы описаний. Каждый раздел описаний содержит описания определенного вида и начинается с ключевого слова, задающего вид перечисленных в нем описаний. Внутри раздела все входящие в него описания перечисляются через запятую.
Кроме модулей в языке RSL имеются следующие виды описаний: типы (type), значения (value), аксиомы (axiom), переменные (variable) и каналы (channel). В самом общем случае описание схемы имеет вид:
scheme id =
class
type
<описание типов>
value
<описание значений>
axiom
<описание аксиом>
end
Декартовы произведения ( products )
Декартовым произведением называется упорядоченный конечный набор значений, возможно, различных типов, например:
(1,2)
(1,true,John).
В декартовом произведении существенен порядок следования элементов, т.е. (1,2) и (2,1) являются различными значениями.
Тип, определяющий декартово произведение нескольких типов, задается типовым выражением вида:
t1 >< ... >< tn, где n2,
и представляет собой составной тип, образованный из типов ti (1 i n) путем применения типовой операции ><. Значениями такого типа являются декартовы произведения длины n (n-ки значений или кортежи) (v1,...,vn), где каждое vi – некоторое значение типа ti.
Примеры записи значений декартовых произведений с указанием их типов:
(true, p => q) : Bool >< Bool
(x + 1,0,this is a text) : Int >< Nat >< Text
Над декартовыми произведениями разрешены операции = и ~=. Допустимо также использование именования компонент декартова произведения, например, (x,y,z).
Выражение let
Выражение let предназначено для введения новых имен для обозначения отдельных компонент более сложного значения. При этом let–выражение объявляет блок, который определяет область видимости введенных в нем имен.
Наиболее часто с помощью выражения let производится именование компонент декартова произведения. В этом случае let-выражение имеет вид:
let (x1,...,xn) = a in
expr
end
где a обозначает декартово произведение, x1,...,xn -новые вводимые имена для обозначения его отдельных компонент, expr задает выражение, в пределах которого можно использовать данные имена.
Например, пусть a и b обозначают координаты двух точек на плоскости. Тогда расстояние между двумя этими точками вычисляется с помощью выражения:
let (x1,y1) = a in
let (x2,y2) = b in
((x2 – x1)**2.0 + (y2 – y1)**2.0)**0.5
end
end
Описание констант
В RSL константа рассматривается как частный случай функции, а именно как функция без параметров с постоянным значением, поэтому для описания констант и функций в языке предусмотрен единый раздел описания значений value.
Описание констант в языке RSL может производиться в одном из трех стилей:
-
явном (эксплицитном, explicit),
-
неявном (имплицитном, implicit),
-
аксиоматическом.
Явный стиль описания применяется, когда помимо типа определяемой константы непосредственно указывается ее значение. Например, RSL- спецификация вида:
value x : Int = 1
определяет целочисленную константу x=1.
Неявный стиль описания используется, если точное значение константы не указывается, а задается лишь ее тип, а также, возможно, некоторые ограничения на значение константы. Например, спецификация:
type Stack
value x : Int :- x > 0,
empty : Stack
определяет целочисленную константу x, значением которой может являться любое целое положительное число, и константу empty абстрактного типа Stack, о значении которой вообще не сообщается никакой информации. Спецификация при этом получается неполной и может быть уточнена в дальнейшем. Такой прием называется недоспецификацией или неполной спецификацией и применяется в том случае, когда описываемое значение по каким-либо причинам не может быть определено полностью на данном этапе составления спецификации. В основном это характерно для начальных этапов разработки спецификаций.
Аксиоматический стиль описания заключается в том, что наряду с типом определяемой константы задается также некоторый набор аксиом, определяющих свойства этой константы (например, накладывающих дополнительные ограничения на ее значение). Заметим, что как для явного, так и для неявного описания можно построить эквивалентное ему описание в аксиоматическом стиле. Так, эквивалентная форма приведенных выше описаний константы x в аксиоматическом стиле выглядит следующим образом:
value x : Int
axiom x is 1 (для явного описания),
value x : Int
axiom x > 0 (для неявного описания).
Всюду вычислимые и частично вычислимые функции
Описание функции в RSL начинается с определения её сигнатуры, т.е. имени функции и типов входных и выходных параметров, здесь же задается вид функции с точки зрения возможности её вычисления для всех значений, определяемых типом входных параметров. Различаются два вида функций – всюду вычислимые и частично вычислимые функции.
Функция f, отображающая значения типа T1 в значения типа T2, является всюду вычислимой (total function), если для любого значения из T1 f возвращает некоторое единственное значение из T2, т.е. f обладает следующим свойством: