Remark rev_unit : forall (l:list A) (a:A), rev (l ++ [a]) = a :: rev l.

(* Specifications: *)
Lemma rev_involutive : forall l:list A, rev (rev l) = l.
Lemma rev_inj (l1 l2: list A): rev l1 = rev l2 -> l1 = l2.
Lemma rev_eq_app : forall l l1 l2, rev l = l1 ++ l2 -> l = rev l2 ++ rev l1.
Lemma rev_list_ind : forall P:list A-> Prop, P [] -> (forall (a:A) (l:list A), P (rev l) -> P (rev (a :: l))) -> forall l:list A, P (rev l).
Theorem rev_ind : forall P:list A -> Prop, P [] -> (forall (x:A) (l:list A), P l -> P (l ++ [x])) -> forall l:list A, P l.
Lemma in_rev : forall l x, In x l <-> In x (rev l).
Lemma length_rev : forall l, length (rev l) = length l.
Lemma rev_nth : forall l d n, n < length l -> nth n (rev l) d = nth (length l - S n) l d.
Lemma nth_error_rev n l : nth_error (rev l) n = if Nat.ltb n (length l) then nth_error l (length l - S n) else None.