Уникальность среди элементов агрегированных структур основана на сравнении экземпляров (см. 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.