(* Progetto FreeScale *)
(* *)
(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *)
-(* Ultima modifica: 05/08/2009 *)
+(* Sviluppo: 2008-2010 *)
(* *)
(* ********************************************************************** *)
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 ]);
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 ]);
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;
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;
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
##]
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.