Автоматизированное проектирование - часть 44

 

  Главная      Учебники - Производство     

 

поиск по сайту           правообладателям

 

 

 

 

 

 

 

 

 

содержание   ..  42  43  44  45   ..

 

 

Автоматизированное проектирование - часть 44

 

 

%
*#$A&,& +($*,#&($"!)&P !"#$%!#&’&($"!))KH :&:#*%
5
@!"!
6
З
аписи
вида
array
[2:8]
или
list
[
1
:?]
в
Express-G
преобразуются
в
форму
A
[2:8]
или
L
[
1
:?],
указываемую
около
линии
атрибута
агрегативного
типа
после
имени
этого
атрибута
.
Так
,
первый
из
вышеприведенных
приме
-
ров
представлен
на
рис
. 6.24.
$38.
5.D>./12
,
0.
A+,D4
9
42
,
915.D>./12
-+31
.
U0"$-$49$/.;
&’0
обычно
вводится
пользователем
для
улучшения
читаемости
модели
.
G$1’+4#(#;
&’0
тип
данных
,
экземплярами
которого
являются
нечисловые
(
пред
-
метные
)
переменные
.
I.-$49$/.;
&’0
соответствует
поименованной
совокупности
других
типов
.
Описание
этих
типов
данных
начинается
со
служебного
слова
type,
за
которым
следует
идентификатор
типа
и
его
определение
.
Пример
описа
-
ния
определяемого
типа
:
type
volume
= real;
end_type;
entity
manual
;
name
: string;
v
1
,v2,v3: volume;
end_entity;
Определение
нечислового
типа
начинается
со
служебных
слов
enumeration of,
после
которых
в
скобках
перечисля
-
ются
элементы
множества
.
Например
:
type
c
о
l
о
r
= enumeration of
(red, green, blue);
end_type;
Ссылка
на
значение
red
теперь
возможна
в
виде
red
или
color.red.
Выделяемый
тип
соответствует
одному
из
некоторого
списка
уже
введенных
типов
.
Этот
список
записывается
по
-
сле
служебного
слова
select.
Ссылка
на
имя
выделяемого
типа
означает
,
что
выбирается
один
из
типов
совокупности
:
type
a_c
= select
(one, two, three);
end_type;
. . .
proc: a_c; (* proc
может
быть
объектом
одного
из
типов
one, two, three*)
Графические
изображения
определяемых
,
нечисловых
и
выделяемых
типов
данных
показаны
на
рис
. 6.25.
Внутри
прямоугольников
,
ограничиваемых
пунктирными
линиями
,
записывается
имя
типа
.
*
<3.8
-+31
+
34
5-+31
.
Отношения
типа
целое
-
часть
или
функция
-
вариант
реализации
,
характерные
для
представления
структур
объектов
в
виде
альтернативных
(
И
-
ИЛИ
)
деревьев
,
в
языке
EXPRESS
выражаются
в
форме
от
-
ношений
между
типами
данных
.
Для
этого
введены
понятия
+70$"&’0)
(supertype)
,
как
более
общего
типа
,
и
0#-&’0#(
(subtypes)
,
как
подчиненных
типов
.
На
рис
. 6.26
верхняя
сущность
относится
к
супертипу
,
а
три
нижних
прямоугольника
изображают
подтипы
,
линии
связи
прямоугольников
должны
быть
утолщенными
.
Рассмотрим
пример
фрагмента
И
-
ИЛИ
-
дерева
,
в
котором
имеется
ИЛИ
вершина
а1
и
две
подчиненные
ей
альтер
-
нативные
вершины
b
1
и
b2.
Общим
атрибутом
для
b
1
и
b2
является
size
типа
real
,
специфичный
для
b
1
атрибут
— vol
ти
-
па
real
,
а
специфичный
для
b2
атрибут
met
типа
string
.
Этот
фрагмент
может
быть
описан
следующим
образом
:
entity
a
1
supertype of (oneof (
b
1
,b2
));
size:
real;
end_entity;
entity
b
1
subtype of (
a
1
);
vol:
real;
end_entity;
entity
b2
subtype of (
a
1
);
met:
string;
end_entity;
Используются
также
следующие
правила
записи
супертипов
и
подтипов
:
в
случае
,
если
а1
есть
И
вершина
,
вместо
oneof
используется
зарезервиро
-
ванное
слово
and
(
в
более
общем
случае
andor
),
т
.
е
.
вторая
строчка
примера
будет
выглядеть
так
:
supertype of (
b
1
and
b2
);
&
.
+
.
)
"#$%!#&’&($"!))$* +($*,#&($"!)&*
175
%+,
. 6.24.
Обозначение
атрибута
агрегативного
типа
в
Express-G
%+,
. 6.25.
Изображения
типов
данных
в
Express-G
%+,
. 6.26.
Изображение
иерархии
типов
в
Express-G
%
*#$A&,& +($*,#&($"!)&P !"#$%!#&’&($"!))KH :&:#*%
5
@!"!
6
если
между
подтипами
нет
взаимосвязи
,
выражаемой
логической
функцией
(
в
частности
,
ИЛИ
или
И
вершина
-
ми
),
то
указание
в
а1
факта
,
что
это
супертип
,
не
требуется
;
достаточно
упоминание
о
подчиненности
подтипов
в
их
дек
-
ларациях
в
виде
subtype of
(a
1
);
перед
декларацией
supertype
записывается
зарезервированное
слово
abstract
,
если
вершине
а1
не
соответству
-
ют
какие
-
либо
экземпляры
сущности
,
т
.
е
.
если
а1
введена
только
для
указания
общих
для
подтипов
атрибутов
;
у
одного
подтипа
может
быть
больше
одного
супертипа
;
подтип
наследует
атрибуты
всех
своих
супертипов
;
ес
-
ли
в
декларациях
супертипов
используются
одинаковые
идентификаторы
атрибутов
,
то
ссылка
на
них
должна
быть
в
ви
-
де
составного
идентификатора
,
например
, a
1
.size.
Пример
:
entity
device
supertype of (oneof (
transistor, diode
));
(* device
есть
ИЛИ
вершина
И
-
ИЛИ
-
дерева
с
двумя
альтернативами
transistor
и
diode*)
end_entity;
entity
transistor —
subtype of
(device);
b:
real;
end_entity;
entity
diode
subtype of
(device)
;
r:
real;
end_entity;
$@8:0+A.0+>
.
Ограничения
,
накладываемые
на
экземпляры
сущности
,
выражаются
с
помощью
0")(’4
(rules)
.
Правила
могут
быть
общими
или
локальными
.
Описание
правила
,
общего
для
ряда
сущностей
,
начинается
со
служебного
слова
rule
,
далее
следуют
идентификатор
пра
-
вила
,
служебное
слово
for
,
ссылки
на
сущности
,
на
которые
правило
распространяется
,
и
,
наконец
,
собственно
ограничения
.
Локальные
правила
могут
описывать
ключевые
атрибуты
(
uniqueness rules
)
или
выражать
ограничения
,
накладыва
-
емые
на
атрибуты
некоторой
сущности
(
domain rules
).
Например
,
если
ключевой
атрибут
сущности
Z
есть
составной
ат
-
рибут
X.Y,
или
,
другими
словами
,
одному
сочетанию
значений
атрибутов
X
и
Y
должен
соответствовать
единственный
эк
-
земпляр
сущности
Z,
то
entity
Z;
X:
integer
;
Y:
string
;
unique
X,Y;
end_entity
;
Ограничение
на
атрибуты
некоторой
сущности
выражается
с
помощью
правила
в
теле
этой
сущности
.
Ограничение
записывается
после
слова
where
в
виде
выражения
,
значениями
которого
могут
быть
true, false
или
unknown
.
Допусти
-
мыми
значениями
атрибута
будут
только
те
,
для
которых
выражение
принимает
значение
true
.
Например
,
можно
записать
,
что
длина
вектора
vect = (x,y,z)
должна
быть
равна
единице
,
в
виде
правила
cons:
entity
vect;
x,y,z:
real
;
where
cons: x**2 + y**2 + z**2 =
1
.0;
end_entity;
"84=.
5<81
+
H
<07=++
.
!"#=$-7".
и
E7*%=’’
служат
для
описания
процедурной
части
модели
.
Как
и
в
алго
-
ритмических
языках
,
используется
концепция
формальных
и
фактических
параметров
.
Описание
процедуры
начинается
с
служебного
слова
procedure
,
за
которым
следуют
идентификатор
процедуры
и
описание
формальных
параметров
в
круг
-
лых
скобках
.
Пример
описания
заголовка
процедуры
:
procedure
eq
(
x,y:
real;
n:
integer; var
result: route
);
Аналогично
описываются
функции
,
их
отличает
только
описание
в
заголовке
типа
результата
после
закрываю
-
щей
скобки
:
function
log
(
a
: real;
m:
integer): real;
&
.
+
.
)
"#$%!#&’&($"!))$* +($*,#&($"!)&*
176
%
*#$A&,& +($*,#&($"!)&P !"#$%!#&’&($"!))KH :&:#*%
5
@!"!
6
Локальные
переменные
,
описанные
в
блоке
local
...
end_local;
действуют
только
в
пределах
данных
функции
или
процедуры
.
Ряд
функций
и
процедур
относится
к
стандартным
и
потому
не
требует
описания
во
вновь
разрабатываемых
моде
-
лях
.
Отметим
следующие
стандартные
функции
:
Abs
абсолютная
величина
;
Sqrt
корень
квадратный
;
Exp
экспонента
;
Log, Log2, Log
)
0
логарифмы
на
-
туральный
,
двоичный
,
десятичный
соответственно
;
Sin, Cos, Tan, Acos, Asin, ATan
тригонометрические
и
обратные
тригонометрические
функции
sin, cos, tg, Arc cos, Arc sin, Arc tg
.
В
число
стандартных
входят
также
функции
:
BLength
подсчет
числа
бит
в
двоичном
коде
;
HiBound
верхняя
граница
индекса
у
array
или
верхняя
граница
числа
элементов
у
set, bag, list
;
LoBound
то
же
в
отношении
нижних
гра
-
ниц
;
Length
подсчет
числа
символов
в
строке
;
Odd
возвращает
значение
true,
если
аргумент
нечетное
число
;
SizeOf
возвращает
число
элементов
в
объекте
агрегативного
типа
;
TypeOf —
возвращает
список
типов
,
к
которым
при
-
надлежит
параметр
этой
функции
;
Exists
возвращает
значение
true,
если
аргумент
этой
функции
входит
в
число
атри
-
бутов
соответствующей
сущности
,
и
др
.
К
стандартным
процедурам
относятся
процедуры
Insert
и
Remove
вставка
или
изъятие
элемента
в
заданной
по
-
зиции
у
объекта
агрегативного
типа
соответственно
.
При
описании
алгоритмов
в
телах
процедур
и
функций
могут
использоваться
операторы
07+&#;
(Null
),
0"’+()’()
-
*’9
(Assignment
),
(.2#")
(
:
ase
),
+#+&)(*#;
(Compound Statement
),
7+4#(*.;
(if..then..else
),
=’%4)
(Repeat
),
(.,#-)
’6
E7*%
-
=’’
’4’
0"#=$-7".
(Return
),
0$"$,#-)
*)
%#*$=
=’%4)
(Skip
).
В
выражениях
используются
операнды
,
знаки
операций
,
вызовы
функций
.
Так
,
для
арифметических
операций
над
числами
типа
real
применяются
следующие
знаки
: * —
умножение
, / —
деление
, DIV —
целочисленное
деление
, + —
сло
-
жение
, — -
вычитание
, ** —
возведение
в
степень
, MOD –
деление
по
модулю
.
Знаки
логических
операций
:
not
отрицание
,
and
конъюнкция
,
or
дизъюнкция
,
xor
исключающее
ИЛИ
.
В
применении
к
величинам
типа
logical
эти
операции
выполняются
по
правилам
действий
в
трехзначном
алфавите
.
Логи
-
ческое
выражение
a
1
in
a2
принимает
значение
true
,
если
а1
содержится
в
а
2.
Оператор
like
используется
для
посимволь
-
ного
сравнения
строк
.
Для
сравнения
экземпляров
сущностей
используют
операции
равно
и
неравно
со
знаками
:=:
и
:<>:
соответственно
.
Операции
над
множествами
(
типами
bag
и
set
) –
пересечение
(
Intersection
),
объединение
(
Union
),
разность
(
Difference
).
Их
знаки
суть
* (
умножение
), + (
плюс
), — (
минус
)
соответственно
.
Оператор
Query
(
А
<*
В
|
С
)
возвращает
подмножество
тех
элементов
из
агрегативного
типа
В
,
для
которых
выполняется
условие
С
,
здесь
А
простая
перемен
-
ная
,
используемая
в
С
.
Знак
+ (
плюс
)
по
отношению
к
операндам
типа
binary
или
string
есть
знак
конкатенации
.
В
качестве
формальных
параметров
процедур
и
функций
,
кроме
типов
данных
,
применяемых
в
других
конструкци
-
ях
языка
и
охарактеризованных
выше
,
могут
использоваться
обобщенные
типы
:
generic, aggregate
и
некоторые
другие
.
Тип
generic
формального
параметра
означает
,
что
соответствующий
фактический
параметр
может
иметь
любой
тип
дан
-
ных
из
числа
предусмотренных
при
описании
процедуры
.
Аналогично
тип
aggregate
обобщает
агрегативные
типы
данных
array, bag, list, set
.
Например
:
function
add (a,b:
generic:
intype
): generic:
intype
;
local
nr:
number;
vr:
vector;
end_local;
if (
‘number’
in typeof (
a
)) and (
‘number’
in typeof (
b
))
then
nr := a+b;
(*
функция
typeof
(a)
возвращает
тип
аргумента
а
и
,
если
этот
тип
есть
number,
то
первый
операнд
логического
выражения
равен
true *)
return
(nr);
else
if (
‘this schema.vector’
in typeof (
a
)) and (
‘this schema.vector’
in typeof (
b
)) then
vr.i := a.i + b.i;
vr.j := a.j + b.j;
vr.k := a.k + b.k;
(*
подразумевается
,
что
декларация
типа
vector
была
произведена
в
схеме
с
именем
this schema *)
return
(vr);
end_if;
end_if;
end_function;
&
.
+
.
)
"#$%!#&’&($"!))$* +($*,#&($"!)&*
177