X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fmatita%2Fcontribs%2Fng_assembly%2Fcommon%2Fnat_lemmas.ma;h=06ace91b2581313105126405c4ea51603ffbccaf;hb=eb4144a401147a44a9620169eb6dafeb8f5a2c17;hp=f4525c463aafdb8b9538b0af606790bbfe00e5df;hpb=db235934efa41a0f38e79747f6db4f468367410b;p=helm.git diff --git a/helm/software/matita/contribs/ng_assembly/common/nat_lemmas.ma b/helm/software/matita/contribs/ng_assembly/common/nat_lemmas.ma index f4525c463..06ace91b2 100644 --- a/helm/software/matita/contribs/ng_assembly/common/nat_lemmas.ma +++ b/helm/software/matita/contribs/ng_assembly/common/nat_lemmas.ma @@ -15,8 +15,8 @@ (* ********************************************************************** *) (* Progetto FreeScale *) (* *) -(* Sviluppato da: Cosimo Oliboni, oliboni@cs.unibo.it *) -(* Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) (* *) (* ********************************************************************** *) @@ -35,6 +35,7 @@ nlemma nat_destruct_S_S : ∀n1,n2:nat.S n1 = S n2 → n1 = n2. napply refl_eq. nqed. +(* !!! da togliere *) nlemma nat_destruct_0_S : ∀n:nat.O = S n → False. #n; #H; nchange with (match S n with [ O ⇒ True | S a ⇒ False ]); @@ -43,6 +44,7 @@ nlemma nat_destruct_0_S : ∀n:nat.O = S n → False. napply I. nqed. +(* !!! da togliere *) nlemma nat_destruct_S_0 : ∀n:nat.S n = O → False. #n; #H; nchange with (match S n with [ O ⇒ True | S a ⇒ False ]); @@ -51,26 +53,6 @@ nlemma nat_destruct_S_0 : ∀n:nat.S n = O → False. napply I. nqed. -nlemma symmetric_eqnat : symmetricT nat bool eq_nat. - nnormalize; - #n1; - nelim n1; - ##[ ##1: #n2; - nelim n2; - nnormalize; - ##[ ##1: napply refl_eq - ##| ##2: #n3; #H; napply refl_eq - ##] - ##| ##2: #n2; #H; #n3; - nnormalize; - ncases n3; - nnormalize; - ##[ ##1: napply refl_eq - ##| ##2: #n4; napply (H n4) - ##] - ##] -nqed. - nlemma eq_to_eqnat : ∀n1,n2:nat.n1 = n2 → eq_nat n1 n2 = true. #n1; nelim n1; @@ -78,17 +60,25 @@ nlemma eq_to_eqnat : ∀n1,n2:nat.n1 = n2 → eq_nat n1 n2 = true. nelim n2; nnormalize; ##[ ##1: #H; napply refl_eq - ##| ##2: #n3; #H; #H1; nelim (nat_destruct_0_S ? H1) + ##| ##2: #n3; #H; #H1; ndestruct (*nelim (nat_destruct_0_S ? H1)*) ##] ##| ##2: #n2; #H; #n3; #H1; ncases n3 in H1:(%) ⊢ %; nnormalize; - ##[ ##1: #H1; nelim (nat_destruct_S_0 ? H1) + ##[ ##1: #H1; ndestruct (*nelim (nat_destruct_S_0 ? H1)*) ##| ##2: #n4; #H1; napply (H n4 (nat_destruct_S_S … H1)) ##] ##] -nqed. +nqed. + +nlemma neqnat_to_neq : ∀n1,n2:nat.(eq_nat n1 n2 = false → n1 ≠ n2). + #n1; #n2; #H; + napply (not_to_not (n1 = n2) (eq_nat n1 n2 = true) …); + ##[ ##1: napply (eq_to_eqnat n1 n2) + ##| ##2: napply (eqfalse_to_neqtrue … H) + ##] +nqed. nlemma eqnat_to_eq : ∀n1,n2:nat.(eq_nat n1 n2 = true → n1 = n2). #n1; @@ -97,12 +87,12 @@ nlemma eqnat_to_eq : ∀n1,n2:nat.(eq_nat n1 n2 = true → n1 = n2). nelim n2; nnormalize; ##[ ##1: #H; napply refl_eq - ##| ##2: #n3; #H; #H1; napply (bool_destruct … (O = S n3) H1) + ##| ##2: #n3; #H; #H1; ndestruct (*napply (bool_destruct … (O = S n3) H1)*) ##] ##| ##2: #n2; #H; #n3; #H1; ncases n3 in H1:(%) ⊢ %; nnormalize; - ##[ ##1: #H1; napply (bool_destruct … (S n2 = O) H1) + ##[ ##1: #H1; ndestruct (*napply (bool_destruct … (S n2 = O) H1)*) ##| ##2: #n4; #H1; nrewrite > (H n4 H1); napply refl_eq @@ -110,6 +100,31 @@ nlemma eqnat_to_eq : ∀n1,n2:nat.(eq_nat n1 n2 = true → n1 = n2). ##] nqed. +nlemma neq_to_neqnat : ∀n1,n2:nat.n1 ≠ n2 → eq_nat n1 n2 = false. + #n1; #n2; #H; + napply (neqtrue_to_eqfalse (eq_nat n1 n2)); + napply (not_to_not (eq_nat n1 n2 = true) (n1 = n2) ? H); + napply (eqnat_to_eq n1 n2). +nqed. + +nlemma decidable_nat : ∀x,y:nat.decidable (x = y). + #x; #y; nnormalize; + napply (or2_elim (eq_nat x y = true) (eq_nat x y = false) ? (decidable_bexpr ?)); + ##[ ##1: #H; napply (or2_intro1 (x = y) (x ≠ y) (eqnat_to_eq … H)) + ##| ##2: #H; napply (or2_intro2 (x = y) (x ≠ y) (neqnat_to_neq … H)) + ##] +nqed. + +nlemma symmetric_eqnat : symmetricT nat bool eq_nat. + #n1; #n2; + napply (or2_elim (n1 = n2) (n1 ≠ n2) ? (decidable_nat n1 n2)); + ##[ ##1: #H; nrewrite > H; napply refl_eq + ##| ##2: #H; nrewrite > (neq_to_neqnat n1 n2 H); + napply (symmetric_eq ? (eq_nat n2 n1) false); + napply (neq_to_neqnat n2 n1 (symmetric_neq ? n1 n2 H)) + ##] +nqed. + nlemma Sn_p_n_to_S_npn : ∀n1,n2.(S n1) + n2 = S (n1 + n2). #n1; nelim n1;