§ Weird canonical example of monic and epic: left/right shift
- Consider the function
right over an infinite sequence a_n which is defined as right(a[:])[i] = 0 if i == 0 else a[i-1]. That is, it shifts a sequence to the right. - See that this is injective, and not surjective: for example, there is no pre-image to any sequence that starts with a non-zero value, such as
1, 0, 0, .... - Its dual,
left(a[:])[i] = a[i+1] is surjective, but not injective. - This makes it ideal as an "extreme case" to test the monic/epic conditions as left/right cancellable.
§ Monic
- We know that
right is monic. Is it cancellable if we run it before or after? - We should run it after --- that way, if
right(f(a[:])) equals right(g(a[:])) for all a[:], we know that the sequences are (0, f1, f2, ...) which equals (0, g1, g2, ...) which implies (f1, f2, ...) equals (g1, g2, ...). So we can conclude that f = g from right . f = right . g. - On the other hand, if we consider
f(right(a[:])) and g(right([a:]), we will only test the equality of f and gat sequences of the form (0, a1, a2, ...) which is insufficient, this we cannot conclude f = g. So we cannot conclude f = gfrom f . right = g . right.
§ Epic
- We know that
left is epic. Is it cancellable if we run it before or after? - Suppose
f . left = g . left. Since left is epic, this tests f and g on every possible input. Thus f = g. - On the other hand, suppose
left . f = left . g. This is insufficient, since we will only test the equality of (f2, f3, ...)with (g2, g3, ...) leaving f1 =? g1 untested. Thus, we cannot conclude f = g from left . f = left . g.