ГОСТ Р И С 0 10303-11 — 2009
Если не оговорено иное, то сравнение экземпляров объектного типаданныхдолжно использоваться
для сравнениядвух экземпляров объектноготипаданных, например, при сравнении агрегированных структур
и проверке правила уникальности UNIQUE.
Пример — Все дети имеют матерей, но некоторые дети могут иметь братьев или сестер.
Это моделируется следующим образом:
ENTITY child
SUBTYPE OF (person):
mother : female; — мы не рассматриваем более одного поколения
father : male;
END ENTITY;
ENTITY sibling
SUBTYPE OF (child):
siblings : SET [1:?] sibling;
WHERE
— установим, что текущий экземпляр не является
— одним из своих братьев или сестер
notjdentical : SIZEOF ( QUERY ( i <* siblings | i ;=: SELF ) ) = 0;
— установим, что каждый из братьев или сестер
— имеет общего отца или мать с текущим экземпляром
same_parent: SIZEOF ( QUERY ( i <* siblings |
( i.mother ;=: SELF.mother) OR
( i.father :=: SELF.father)) =
SIZEOF ( siblings ));
END_ENTTTY:
12.2.3 Оператор принадлежности
Оператор принадлежности IN осуществляет проверку, принадлежит ли данный элемент к какой-
либо агрегированной структуре и возвращает ли результат типа LOGICAL. Операнд, расположенный
справа от оператора, должен иметь значение агрегированного типа данных, а операнд, расположен
ный слева, должен быть совместим с базисным типом данного значения агрегированного типа данных.
Результат выражения е IN agg определяется следующим образом:
a) если любой из операндов имеет неопределенное (?) значение, то выражение имеет значение
UNKNOWN;
b
) если существует такой элемент agg(i], для которого e:=:agg[i], то выражение имеет значение
TRUE.
c) если существует элемент agg[i], имеющий неопределенное (?) значение, то выражение имеет
значение UNKNOWN.
d) в противном случае, выражение имеет значение FALSE.
Примечание — Для того, чтобы проверить, существует ли вагрегированнойструктуреэлемент, имеющий
конкретное значение, может быть использована функция VALUEJN (см. 15.28).
Проверка принадлежности, определенной разработчиком модели, может быть осуществлена посредством
пары функций, названных для примера my_equal (см. примечание в 8.2.5) и my_in в следующем псевдокоде:
FUNCTION my_in(c:AGGREGATE OF GENERIC:gen; v:GENERIC:gen): LOGICAL:
(**my_in" возвращает значение UNKNOWN, если v или с имеет неопределенное (?) значение, иначе,
возвращает значение TRUE, если любой элемент из с имеет ’значение’
V.
иначе, возвращает
значение UNKNOWN, если результатом любого сравнения является UNKNOWN, иначе возвращает
значение FALSE *)
LOCAL
result: LOGICAL;
unknownp : BOOLEAN := FALSE;
END_LOCAL
IF ((NOT EXISTS(v)) OR (NOT EXISTS(c)) THEN
RETURN (UNKNOWN); ENDJF;
REPEAT i := LOINDEX(c) TO HIINDEX(c);
result := my_equal(v. c(i]);
IF (result = TRUE) THEN
RETURN (result); ENDJF;
IF (result = UNKNOWN) THEN
unknownp := TRUE: ENDJF;
END_REPEAT;
75