Статус документа
Статус документа

ГОСТ Р ИСО 10303-11-2009 Системы автоматизации производства и их интеграция. Представление данных об изделии и обмен этими данными. Часть 11. Методы описания. Справочное руководство по языку EXPRESS

     8.2.5 Уникальность значений в агрегированных структурах


Уникальность среди элементов агрегированных структур основана на сравнении экземпляров (см. 12.2.2). К агрегированным структурам может быть предъявлено требование уникальности значений их элементов посредством использования функции VALUE_UNIQUE (см. 15.29).

Пример - Определение набора с уникальными значениями:

TYPE value_unique_set = SET OF a;
     WHERE
          wrl: value_unique(SELF);
     END_TYPE;


Примечание - Определяемая разработчиком уникальность значений может быть задана посредством двух функций с именами, например, my_equal и my_unique, как показано в следующем псевдокоде:

FUNCTION my_equal (v1,v2: GENERIC: gen): LOGICAL;

(*Функция my_ equal возвращает значение TRUE, если vl "равно" v2 *)

ЕND FUNCTION;

FUNCTION my_unique (c: AGGREGATE OF GENERIC): LOGICAL;

(*Функция my_unique возвращает значение FALSE, если два элемента из с имеют одинаковое "значение", или возвращает значение UNKNOWN, если любой из сравниваемых элементов имеет значение UNKNOWN, в противном случае возвращает значение TRUE *)

LOCAL

result : LOGICAL;

unknownp : BOOLEAN := FALSE;

ЕND_LOCAL;

IF (SIZEOF(c) = 0)THEN

RETURN(TRUE); END IF;

REPEAT i := LOINDEX(c) TO (HIINDEX(c) -1);

REPEAT j := (i+1) TO HIINDEX(c);

result := my_ equal(c[i], c[j]);

IF (result = TRUE) THEN

RETURN(FALSE); END_ IF;

IF (result = UNKNOWN) THEN

unknownp := TRUE; END IF;

END REPEAT;

ЕND_REPEAT;

IF unknownp THEN

RETURN(UNKNOWN);

ЕLSE

RETURN(TRUE);

ЕND_IF;

ЕND_ FUNCTION;


Функция my_equal должна иметь следующие свойства, позволяющие формировать классы эквивалентности. Ниже через S обозначен рассматриваемый набор объектов, a my_equal(i, j), где i и j принадлежат S, возвращает одно из значений [FALSE, UNKNOWN, TRUE]:

my_equal(i, i) имеет значение TRUE для всех i из S (так как в S нет неопределенных (?) значений, то не требуется, чтобы значением my_equal (?, ?) было TRUE);

my_equal(i, j) = my_equal(j, i) для всех i и j из S;

(my_equal(i, j) = TRUE) AND (my_equal(j, k) = TRUE) влечет за собой (my_equal(i, k) = TRUE) для всех i, j, k из S.