+ // gamma~mu Sodd gamma.mu = -2 Sodd_R
+ // (Chisholm identity in 4 dimensions)
+ } else if (!((other - self) & 1) && dim.is_equal(4)) {
+ if (std::find_if(self + 1, other, is_not_a_clifford()) != other)
+ return false;
+
+ *self = ncmul(exvector(std::reverse_iterator<exvector::const_iterator>(other), std::reverse_iterator<exvector::const_iterator>(self + 1)), true);
+ std::fill(self + 1, other, _ex1);
+ *other = _ex_2;
+ return true;
+
+ // gamma~mu Sodd gamma~alpha gamma.mu = 2 gamma~alpha Sodd + 2 Sodd_R gamma~alpha
+ // (commutate contracted indices towards each other, then use
+ // Chisholm identity in 4 dimensions)
+ } else if (((other - self) & 1) && dim.is_equal(4)) {
+ if (std::find_if(self + 1, other, is_not_a_clifford()) != other)
+ return false;
+
+ exvector::iterator next_to_last = other - 1;
+ ex S = ncmul(exvector(self + 1, next_to_last), true);
+ ex SR = ncmul(exvector(std::reverse_iterator<exvector::const_iterator>(next_to_last), std::reverse_iterator<exvector::const_iterator>(self + 1)), true);
+
+ *self = (*next_to_last) * S + SR * (*next_to_last);
+ std::fill(self + 1, other, _ex1);
+ *other = _ex2;
+ return true;
+