page 2  1 2 3 x 
We want to prove
( L1 L2 : List ) rev(append(L1 , L2)) = append(rev(L2) , rev(L1)) .We use induction on L1 to prove this goal. For this, we use the induction scheme based on the signature { nil, cons } for List. Induction requires that we do the following:
And thus the main goal is proved. 
Explanation
The most notable point about this proof is the now invisible fact that the need for it, as well as for the lemma that it uses (the associativity of append), were discovered from the failed proof attempts in our previous proofweb for the main goal, that reversing a list twice yields the original list. It is also worth noting that when the associativity of append is used as a lemma, it is in the implicit form of the associativity attribute, rather than the explicit application of the associativity equation as a rewrite rule. The way that the associativity lemma is entered into the computational context can be seen in the BOBJ proof score for the present lemma; it has the form of an operator declaration, op append : List List > List [ assoc idr: nil ] .which overwrites the previous declaration for append without the assoc attribute. 
