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=bc389dd4724959688aafc1ede450794f47b8d0b5;hp=bbce188e521db6730749d2fb03bdeda18cb94175;hpb=29cfb9e2961e62c836cb50217905c0594a074e81;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 bbce188e5..06ace91b2 100644 --- a/helm/software/matita/contribs/ng_assembly/common/nat_lemmas.ma +++ b/helm/software/matita/contribs/ng_assembly/common/nat_lemmas.ma @@ -16,7 +16,7 @@ (* Progetto FreeScale *) (* *) (* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) -(* Ultima modifica: 05/08/2009 *) +(* 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,18 +60,26 @@ 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. +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; nelim 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,53 +100,28 @@ nlemma eqnat_to_eq : ∀n1,n2:nat.(eq_nat n1 n2 = true → n1 = n2). ##] nqed. -nlemma decidable_nat : ∀x,y:nat.decidable (x = y). - #x; nelim x; nnormalize; - ##[ ##1: #y; ncases y; - ##[ ##1: napply (or2_intro1 (O = O) (O ≠ O) (refl_eq …)) - ##| ##2: #n2; napply (or2_intro2 (O = (S n2)) (O ≠ (S n2)) ?); - nnormalize; #H; napply (nat_destruct_0_S n2 H) - ##] - ##| ##2: #n1; #H; #y; ncases y; - ##[ ##1: napply (or2_intro2 ((S n1) = O) ((S n1) ≠ O) ?); - nnormalize; #H1; napply (nat_destruct_S_0 n1 H1) - ##| ##2: #n2; napply (or2_elim (n1 = n2) (n1 ≠ n2) ? (H n2) …); - ##[ ##1: #H1; napply (or2_intro1 (? = ?) (? ≠ ?) …); - nrewrite > H1; napply refl_eq - ##| ##2: #H1; napply (or2_intro2 (? = ?) (? ≠ ?) …); - nnormalize; #H2; napply (H1 (nat_destruct_S_S … H2)) - ##] - ##] - ##] +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 neq_to_neqnat : ∀n1,n2:nat.n1 ≠ n2 → eq_nat n1 n2 = false. - #n1; nelim n1; - ##[ ##1: #n2; ncases n2; - ##[ ##1: nnormalize; #H; nelim (H (refl_eq …)) - ##| ##2: #nn2; #H; nnormalize; napply refl_eq - ##] - ##| ##2: #nn1; #H; #n2; ncases n2; - ##[ ##1: #H1; nnormalize; napply refl_eq - ##| ##2: #nn2; nnormalize; #H1; - napply (H nn2 ?); nnormalize; #H2; - nrewrite > H2 in H1:(%); #H1; - napply (H1 (refl_eq …)) - ##] +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 neqnat_to_neq : ∀n1,n2:nat.(eq_nat n1 n2 = false → n1 ≠ n2). - #n1; nelim n1; - ##[ ##1: #n2; ncases n2; - ##[ ##1: nnormalize; #H; napply (bool_destruct … H) - ##| ##2: #nn2; nnormalize; #H; #H1; nelim (nat_destruct_0_S … H1) - ##] - ##| ##2: #nn1; #H; #n2; ncases n2; - ##[ ##1: nnormalize; #H1; #H2; nelim (nat_destruct_S_0 … H2) - ##| ##2: #nn2; nnormalize; #H1; #H2; napply (H nn2 H1 ?); - napply (nat_destruct_S_S … H2) - ##] +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.