Section equality_elimination.
Variables (A: Type)
(a b : A)
(p : a = b)
(Q : A -> Type).
Check (fun H : Q a =>
match p in (eq _  y) return Q y with
refl_equal => H
end).
End equality_elimination.
intros x y e; do 2 rewrite <- e.
reflexivity.
Qed.
Check mult_1_l.
(* mult_1_l : forall n : nat, 1 * n = n *)
Check mult_plus_distr_r.
(* mult_plus_distr_r : forall n m p : nat, (n + m) * p = n * p + m * p  *)

Lemma mult_distr_S : forall n p : nat, n * p + p = (S n)* p.