## § 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.