С<Sets
>и<Collectors
>семантика<operator-
>заключается в том, что изустановленная разницаозначает, что вы можете вычесть только то, что было помещено в контейнер раньше.<Quantifiers
>, чтосчитатьиликоличественноих ключевые значения в некотором роде, семантика<operator
-
>может быть различной.
Вопрос в том, как вычитание должно быть определено здесь?
icl::map<int,some_number> q = {(1->1)};
q -= (2->1);
Если<some_number
>—<unsigned
>,— разница в наборе— вычитание имеет смысл.
icl::map<int,some_number> q = {(1->1)};
q -= (2->1);
q == {(1->1)};
Если<some_number
>является<signed
>числовым типом, результат также может быть следующим:
icl::map<int,some_number> q = {(1->1)};
q -= (2->1);
q == {(1->1), (2-> -1)};
Как указано в примере, вычитание пары значений ключа<(k,v)
>, очевидно, может быть определено как добавлениеобратного элементадля этого ключа<(k,-v)
>, если ключ еще не сохранен на карте.
Другая концепция, о которой мы можем думать, заключается в том, что в<Quantifier
>каждый<key_value
>первоначально количественно определен<0
>-времени, где<0
>означает нейтральный элемент числового<CodomainT
>типа. Такой<Quantifier
>будет полностью определен на всех значениях его<DomainT
>типа и может быть задуман как<InfiniteVector
>.
Для создания бесконечного вектора, который полностью определен на его домене, мы можем установить параметр карты<Trait
>на значение<total_absorber
>.<total_absorber
>особенно хорошо подходит для<Quantifier
>, если он<CodomainT
>имеет обратный элемент, как и все подписанные числовые типы. Как мы увидим далее в этом разделе, этот вид совокупности<Quantifier
>обладает основными свойствами, которые обеспечивают элементы векторного пространства.
Другое различие между<Collectors
>и<Quantifiers
>— это семантика<operator&
>, которая имеет значение пересечения множества<Collectors
>.
Дляагрегата по принципу перекрытияоперация<&
>должна быть передана для объединения связанных значений при перекрытии интервалов или столкновении ключей. Этого нельзя сделать для<Quantifiers
>, так как числовые типы не реализуют пересечения.
Для<CodomainT
>типов, не являющихся моделями<Sets
><operator&
>, определенаагрегация на пересечении доменов. Вместо<codomain_intersect
>функтора<codomain_combine
>используется операция агрегации:
interval_map<int,int> p, q;
p = {[1 3)->1 };
q = { ([2 4)->1};
p & q =={ [2 3)->2 };
Таким образом, сложение или агрегирование связанных значений выполняется как для<operator+
>, но пары значений, которые не имеют общих ключей, не добавляются к результату.
Для<Quantifier
>, которая является моделью<InfiniteVector
>и которая поэтому определена для каждого ключевого значения<DomainT
>типа, это определение<operator
&
>вырождается в те же сематики, что<operaotor+
>реализует:
interval_map<int,int> p, q;
p = {[min 1)[1 3)[3 max]};
->0 ->1 ->0
q = {[min 2)[2 4)[4 max]};
->0 ->1 ->0
p&q =={[min 1)[1 2)[2 3)[3 4)[4 max]};
->0 ->1 ->2 ->1 ->0
Семантика icl Maps of Numbers отличается для неподписанных или подписанных чисел. Таким образом, наборы законов, которые действительны для Квантификаторов, будут отличаться в зависимости от инстанциации неподписанного или подписанного типа номера в качестве<CodomainT
>параметра.
Опять же, мы представляем исследованные наборы законов, на этот раз для<Quantifier
>типов<Q
>, которые являются<icl::map
><<D,N,T>
>,<interval_map
><<D,N,T>
>и<split_interval_map
><<D,N,T>
>, где<CodomainT
>тип<N
>является<Number
>и<Trait
>тип<T
>является одной из черт карты icl.
Associativity<Q,+,== >: Q a,b,c; a+(b+c) == (a+b)+c
Neutrality<Q,+,== > : Q a; a+Q() == a
Commutativity<Q,+,== >: Q a,b; a+b == b+a
Associativity<Q,&,== >: Q a,b,c; a&(b&c) ==(a&b)&c
Commutativity<Q,&,== >: Q a,b; a&b == b&a
RightNeutrality<Q,-,== >: Q a; a-Q() == a
Inversion<Q,-,=v= > : Q a; a - a =v= Q()
Для<unsignedQuantifier
>, icl Карты<unsignednumbers
>применяются те же основные законы, которые действительны для<Collectors
>:
+ & -
Associativity == ==
Neutrality == ==
Commutativity == ==
Inversion absorbs_identities ==
enriches_identities =d=
CommutativeModoid
снова CommutativeModoid
.
.
Другие законы, действительные для<Collectors
>, не действительны для<unsignedQuantifier
>.
Для<Quantifiers
>подписанных чисел, или<signedQuantifiers
>, структура действительных законов несколько отличается:
+ & -
Associativity =v= =v=
Neutrality == ==
Commutativity == ==
Inversion absorbs_identities ==
enriches_identities =d=
Различия помечены как<=v=
>, что указывает на то, что закон ассоциативности не является однозначно действительным для одного отношения равенства<==
>, как это было в случае<Collector
>и<unsignedQuntifier
>карт.
Различия заключаются в следующем:
+
Associativity icl::map ==
interval_map ==
split_interval_map =e=
Для<operator+
>ассоциативность на<split_interval_maps
>действительна только при равенстве элементов<=e=
>, что не является большим ограничением, поскольку требуется только равенство элементов.
Для<operator&
>ассоциативность нарушается для всех карт, которые являются частичными поглотителями. Для полных поглотителей ассоциативность действительна для равенства элементов. Все карты, имеющиеобогатитель идентичностипризнак, являются ассоциативными. лексикографическое равенство<==
>.
Associativity &
absorbs_identities && !is_total false
absorbs_identities && is_total =e=
enriches_identities ==
Обратите внимание, что все законы, которые устанавливают коммутативный моноид для<operator+
>и элемент идентичности<Q()
>, действительны для<signedQuantifiers
>. Кроме того, симметричная разница, которая не удерживает<unsigned
Qunatifiers
>, действительна для<signedQunatifiers
>.
SymmetricDifference<Q,== > : Q a,b,c; (a + b) - (a & b) == (a - b) + (b - a)
Для<signedTotalQuantifier
><Qt
>симметричная разница вырождается в тривиальную форму, поскольку<operator
&
>и<operator
+
>становятся идентичными.
SymmetricDifference<Qt,== > : Qt a,b,c; (a + b) - (a + b) == (a - b) + (b - a) == Qt()
Q
являются коммутативными моноидами
в отношении operator +
и нейтрального элемента Q()
. Если Quantifier CodomainT
Тип имеет обратный элемент, например, signed numbers
do, тип CodomainT
a коммутативная или abelian группа. В этом случае signed Quantifier
который также total
имеет инверс и
Закон гласит:
InverseElement<Qt,== > : Qt a; (0 - a) + a == 0
Это означает, что каждый<TotalQuantifier
>над абелевой группой является абелевской группой.
Quantifiers
снова a
Quantifiers
и TotalQuantifier
TotalQuantifiers
также TotalQuantifier
.
.
<TotalQuantifiers
>напоминает понятие векторного пространства частично. Концепция может быть завершена в векторном пространстве, если будет добавлено скалярное умножение.