Adam Chlipala's solution