My understanding (which may be wrong) goes like this:
Coinduction is a way to prove things about infinite data structures.
Just like induction, it seems like cheating at first. The key thing to realize is that instead of:
- proving that something works for the base cases
- proving that it works for each "single step", under the assumption that it works for all (finite) cases
- then claiming that it therefore works for all (finite) cases (this is induction)
you instead:
- prove, under the assumption that it works for all non-finite cases, that it works for each "single step"
- claim that it therefore works for all non-finite cases (this is coinduction, and it's justified since each non-finite case is a (finite) sequence of single steps followed by a non-finite part which works by hypothesis)
Coinduction is a useful proof technique for establishing structurally "obvious" propositions about infinite data structures. Unfortunately (or not?) the fact that it's commonly useful for proving "obvious" things makes it harder to see how it is proving anything at all and not just hand-waving.
This paper is helpful in some ways, and confusing in others (at least those uninitiated in category theory, among whom I count myself).