(* NATURALI *)
(* ******** *)
-nlemma nat_destruct : ∀n1,n2:nat.S n1 = S n2 → n1 = n2.
+nlemma nat_destruct_S_S : ∀n1,n2:nat.S n1 = S n2 → n1 = n2.
#n1; #n2; #H;
nchange with (match S n2 with [ O ⇒ False | S a ⇒ n1 = a ]);
nrewrite < H;
napply I.
nqed.
-nlemma bsymmetric_eqnat : boolSymmetric nat eq_nat.
+nlemma symmetric_eqnat : symmetricT nat bool eq_nat.
nnormalize;
#n1;
nelim n1;
##| ##2: #n4; napply (H n4)
##]
##]
-nqed.
+nqed.
nlemma eq_to_eqnat : ∀n1,n2:nat.n1 = n2 → eq_nat n1 n2 = true.
#n1;
nnormalize;
##[ ##1: #H1; nelim (nat_destruct_S_0 ? H1)
##| ##2: #n4; #H1;
- napply (H n4 (nat_destruct ?? H1))
+ napply (H n4 (nat_destruct_S_S ?? H1))
##]
##]
nqed.
nelim n2;
nnormalize;
##[ ##1: #H; napply (refl_eq ??)
- ##| ##2: #n3; #H; #H1; nelim (bool_destruct_false_true H1)
+ ##| ##2: #n3; #H; #H1; napply (bool_destruct ?? (O = S n3) H1)
##]
##| ##2: #n2; #H; #n3; #H1;
ncases n3 in H1:(%) ⊢ %;
nnormalize;
- ##[ ##1: #H1; nelim (bool_destruct_false_true H1)
+ ##[ ##1: #H1; napply (bool_destruct ?? (S n2 = O) H1)
##| ##2: #n4; #H1;
nrewrite > (H n4 H1);
napply (refl_eq ??)
##]
##]
nqed.
+
+nlemma Sn_p_n_to_S_npn : ∀n1,n2.(S n1) + n2 = S (n1 + n2).
+ #n1;
+ nelim n1;
+ ##[ ##1: nnormalize; #n2; napply (refl_eq ??)
+ ##| ##2: #n; #H; #n2; nrewrite > (H n2);
+ ncases n in H:(%) ⊢ %;
+ ##[ ##1: nnormalize; #H; napply (refl_eq ??)
+ ##| ##2: #n3; nnormalize; #H; napply (refl_eq ??)
+ ##]
+ ##]
+nqed.
+
+nlemma n_p_Sn_to_S_npn : ∀n1,n2.n1 + (S n2) = S (n1 + n2).
+ #n1;
+ nelim n1;
+ ##[ ##1: nnormalize; #n2; napply (refl_eq ??)
+ ##| ##2: #n; #H; #n2;
+ nrewrite > (Sn_p_n_to_S_npn n (S n2));
+ nrewrite > (H n2);
+ napply (refl_eq ??)
+ ##]
+nqed.
+
+nlemma Opn_to_n : ∀n.O + n = n.
+ #n; nnormalize; napply (refl_eq ??).
+nqed.
+
+nlemma npO_to_n : ∀n.n + O = n.
+ #n;
+ nelim n;
+ ##[ ##1: nnormalize; napply (refl_eq ??)
+ ##| ##2: #n1; #H;
+ nrewrite > (Sn_p_n_to_S_npn n1 O);
+ nrewrite > H;
+ napply (refl_eq ??)
+ ##]
+nqed.
+
+nlemma symmetric_plusnat : symmetricT nat nat plus.
+ #n1;
+ nelim n1;
+ ##[ ##1: #n2; nrewrite > (npO_to_n n2); nnormalize; napply (refl_eq ??)
+ ##| ##2: #n2; #H; #n3;
+ nrewrite > (Sn_p_n_to_S_npn n2 n3);
+ nrewrite > (n_p_Sn_to_S_npn n3 n2);
+ nrewrite > (H n3);
+ napply (refl_eq ??)
+ ##]
+nqed.