Icl Collectors
, behave like
Sets
. This can be understood
easily, if we consider, that every map of sets can be transformed to an equivalent
set of pairs. For instance in the pseudocode below map m
icl::map<int,set<int> > m = {(1->{1,2}), (2->{1})};
is equivalent to set s
icl::set<pair<int,int> > s = {(1,1),(1,2),
(2,1) };
Также результаты добавления, вычитания и других операций на map m
и set s
сохраняет эквивалентность контейнеров почти<218>:
m += (1,3);
m == {(1->{1,2,3}), (2->{1})};
s += (1,3);
s == {(1,1),(1,2),(1,3),
(2,1) };
Эквивалентность m
и s
нарушается только в том случае, если пустой набор происходит в m
путем вычитания пары значений:
m -= (2,1);
m == {(1->{1,2,3}), (2->{})};
s -= (2,1);
s == {(1,1),(1,2),(1,3)
};
Эту проблему можно решить двумя способами.
- Удаление пар значений образует Коллектора, если это связанное значение становится нейтральным значением или
identity_element
. - Используя другое равенство, называемое отдельным равенством в законах для проверки. Различное равенство означает только ценностные пары, которые несут ценности, не равные
identity_element
.
Решение (1) привело к появлению особенностей карты, в частности, trait partial_absorber, что является параметром по умолчанию во всех шаблонах карты icl.
Решение (2), применяется для проверки семантики icl::Maps для частичного_enricher черта, которая не удаляет пары значений, которые несут элементы идентичности. Различное равенство осуществляется функцией нечлена, называемой is_distinct_equal
. На протяжении всей этой главы отдельное равенство в псевдокоде и правовых денотациях обозначается как =d=
оператор.
Действительность сводов законов, составляющих Set
семантика, теперь должна быть вполне очевидной. >1>> >1>>>1>>>2>>>>>2>2>>2>>2>>2>>2>>2>>2>2>>2>>2>2>2>>2>2>2>2>>2>2>2>>2>2>2>>>2>2>2>>.
Associativity<C,+,== >: C a,b,c; a+(b+c) == (a+b)+c
Neutrality<C,+,== > : C a; a+C() == a
Commutativity<C,+,== >: C a,b; a+b == b+a
Associativity<C,&,== >: C a,b,c; a&(b&c) ==(a&b)&c
Commutativity<C,&,== >: C a,b; a&b == b&a
RightNeutrality<C,-,== >: C a; a-C() == a
Inversion<C,-,=v= > : C a; a - a =v= C()
Все фундаментальные законы могут быть подтверждены для всех icl Maps в их моментации как Maps of Sets или Collectors. Как и ожидалось, инверсия удерживает только определенное равенство, если карта не является partial_absorber
.
+ & -
Associativity == ==
Neutrality == ==
Commutativity == ==
Inversion partial_absorber ==
partial_enricher =d=
Distributivity<C,+,&,=v= > : C a,b,c; a + (b & c) =v= (a + b) & (a + c)
Distributivity<C,&,+,=v= > : C a,b,c; a & (b + c) =v= (a & b) + (a & c)
RightDistributivity<C,+,-,=v= > : C a,b,c; (a + b) - c =v= (a - c) + (b - c)
RightDistributivity<C,&,-,=v= > : C a,b,c; (a & b) - c =v= (a - c) & (b - c)
>>>>>>>>a>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
+,& &,+
Distributivity joining == ==
splitting partial_absorber =e= =e=
partial_enricher =e= ==
+,- &,-
RightDistributivity joining == ==
splitting =e= ==
DeMorgan<C,+,&,=v= > : C a,b,c; a - (b + c) =v= (a - b) & (a - c)
DeMorgan<C,&,+,=v= > : C a,b,c; a - (b & c) =v= (a - b) + (a - c)
+,& &,+
DeMorgan joining == ==
splitting == =e=
SymmetricDifference<C,== > : C a,b,c; (a + b) - (a * b) == (a - b) + (b - a)
Обзор приведенных выше таблиц действительности показывает, что наборы действительных законов для icl Sets
и icl Maps Sets
, которые являются поглощение идентичности, точно такие же. Как и ожидалось, только для Maps of Sets, которые представляют пустые наборы как связанные значения, называемые обогатители идентичностей, существуют маргинальные семантические различия.