I'm wondering if I can "make up" an identity element, like so:
I can define an element I such that any element x + I is equal to x, i.e.: I can redefine my set as [the old set] union with {I}, and redefine my binary operation such that if one of the operands is I, then the result is the other operand. Then I will have an identity element.
For example, imagine the set of integers greater than 100 and addition; this forms a semigroup but has no identity. I can define a new element I (it doesn't have any "numerical value" but it doesn't need to). Then I say 100 + I = 100, 101 + I = 101, etc. Of course, I wouldn't be able to do multiplication or take the square root of I, but those operations aren't a part of my semigroup anyways.
with_zero.add_monoid
, so named because the adjoined element "I" acts like a 0. $\endgroup$