Конечно, это можно закодировать как правильный шаблон класса c++, который был сделан для проверкиicl. Для простоты мы будем использовать псевдокод.
На всех наборах и картографических контейнерах icl есть<operator
<
>, который реализуетстрогий слабый порядок. Семантика<operator
<
>такая же, как и для стела. Сортированный ассоциативный контейнер, в частностиstl::setиstl::map:
Irreflexivity<T,< > : T a; !(a<a)
Asymmetry<T,< > : T a,b; a<b implies !(b<a)
Transitivity<T,< > : T a,b,c; a<b && b<c implies a<c
<Operator<
>зависит от icl:: параметр шаблона контейнера<Compare
>, который реализуетстрогий слабый порядокдля контейнера<domain_type
>. Для данного<Compare
>заказа<operator<
>реализует лексикографическое сравнение на icl::контейнерах, в котором используется<Compare
>порядок для установления уникальной последовательности значений в контейнере.
Индуцированная эквивалентность<operator
<
>является лексикографическим равенством, которое реализуется как<operator==
>.
!(a<b) && !(b<a) implies a == b;
В этом и заключается смысл.. Лексикографическое равенство сильнее равенства элементов. Два контейнера, которые содержат одни и те же элементы, могут быть лексикографически неравными, если их элементы сортируются по-разному. Лексикографическое сравнение относится ксегментарномуаспекту. Из всех различных последовательностей, которые действительны для неупорядоченных наборов и карт, одна такая последовательность выбирается по<Compare
>порядку элементов. На основе этого выбора возможна уникальная итерация.
В фундаментальном аспекте имеет значение только членство элементов, а не их последовательность. Таким образом, существуют функции<contained_in
>и<element_equal
>, которые реализуют отношение подмножества и равенство элементов. Однако функции<contained_in
>и<is_element_equal
>на самом деле не работают на уровне элементов. Они также работают на основе шаблонов контейнеров<Compare
>параметра. В практическом плане необходимо различать лексикографическое равенство<operator==
>и равенство элементов<is_element_equal
>, если мы работаем с интервальным расщеплением интервальных контейнеров:
split_interval_set<time> w1, w2;
w1 = {[Mon .. Sun)};
w2 = {[Mon .. Fri)[Sat .. Sun)};
w1 == w2;
is_element_equal(w1,w2);
Для постоянного<Compare
>порядка на ключевых элементах функция члена<contained_in
>, которая определена для всех icl::контейнеров, реализуетчастичный порядокна icl::контейнерах.
with <= for contained_in,
=e= for is_element_equal:
Reflexivity<T,<= > : T a; a <= a
Antisymmetry<T,<=,=e=> : T a,b; a <= b && b <= a implies a =e= b
Transitivity<T,<= > : T a,b,c; a <= b && b <= c implies a <= c
Индуцированная эквивалентность — это равенство элементов, реализуемое посредством функции<is_element_equal
>.
a.contained_in(b) && b.contained_in(a) implies is_element_equal(a, b);