(* Protected addition, with a more systematic set of lemmas.                *)

Definition addn_rec := plus.Notation "m ^ n" := (expn_rec m n) : nat_rec_scope.Definition addn := nosimpl addn_rec.

(* Specifications: *)
Lemma addnE : addn = addn_rec.
Lemma plusE : plus = addn.
Lemma add0n : left_id 0 addn.
Lemma addSn m n : m.+1 + n = (m + n).+1.
Lemma add1n n : 1 + n = n.+1.
Lemma addn0 : right_id 0 addn.
Lemma addnS m n : m + n.+1 = (m + n).+1.
Lemma addSnnS m n : m.+1 + n = m + n.+1.
Lemma addnCA : left_commutative addn.
Lemma addnC : commutative addn.
Lemma addn1 n : n + 1 = n.+1.
Lemma addnA : associative addn.
Lemma addnAC : right_commutative addn.
Lemma addnACA : interchange addn addn.
Lemma addnI : right_injective addn.
Lemma addIn : left_injective addn.
Lemma addn2 m : m + 2 = m.+2.
Lemma add2n m : 2 + m = m.+2.
Lemma addn3 m : m + 3 = m.+3.
Lemma add3n m : 3 + m = m.+3.
Lemma addn4 m : m + 4 = m.+4.
Lemma add4n m : 4 + m = m.+4.