(**  An alternative tail-recursive definition for reverse *)
Fixpoint rev_append (l l': list A) : list A :=
match l with
| [] => l'
| a :: l => rev_append l (a::l')
end.
Definition rev' l : list A := rev_append l [].

Lemma rev_alt : forall l, rev l = rev_append l [].
Fixpoint concat (l : list (list A)) : list A :=
match l with
| [] => []
| x :: l => x ++ concat l
end.