(****************************************************************)
(* rev: renverse une liste *)

Fixpoint rev (l : list A) : list A :=
  
 (************************)
 match l return (list A) with
 | nil => nil
 | b :: l' => rev l' ++ b :: nil
 end.

(* Specifications: *)
Lemma rev_eq1 : rev nil = nil.
Lemma rev_eq2 : forall (b : A) (l' : list A), rev (b :: l') = rev l' ++ b :: nil.
Lemma rev_eq : forall l n : list A, l = n -> rev l = rev n.
Lemma rev_app : forall l n : list A, rev (l ++ n) = rev n ++ rev l.
Lemma rev_rev : forall l : list A, rev (rev l) = l.
Lemma length_rev : forall l : list A, length (rev l) = length l.