]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/matita/nlibrary/arithmetics/nat.ma
Nice examples for automation (that fails).
[helm.git] / helm / software / matita / nlibrary / arithmetics / nat.ma
index fe9ef8267ffc064e1d50f9e3283b6f0c5e0c3660..1ef6a81cbbfdc55f335481f199cfcc008f00218f 100644 (file)
 (*                                                                        *)
 (**************************************************************************)
 
-(* include "higher_order_defs/functions.ma". *)
 include "hints_declaration.ma".
 include "basics/functions.ma".
 include "basics/eq.ma".
 
-ntheorem foo: ∀A:Type.∀a,b:A.∀f:A→A.∀g:A→A→A.
-(∀x,y.f (g x y) = x) → ∀x. g (f a) x = b → f a = f b.
-//; nqed.
-
-ninductive nat : Type[0] ≝
+ninductive nat : Type ≝
   | O : nat
   | S : nat → nat.
   
@@ -40,7 +35,7 @@ ncoercion nat_to_pos: ∀n:nat. n ≠0 →pos ≝ mk_pos on
 *)
 
 ndefinition pred ≝
- λn. match n with [ O ⇒  O | (S p) ⇒ p].
+ λn. match n with [ O ⇒ O | S p ⇒ p].
 
 ntheorem pred_Sn : ∀n. n = pred (S n).
 //; nqed.
@@ -84,7 +79,11 @@ ntheorem decidable_eq_nat : ∀n,m:nat.decidable (n=m).
 napply nat_elim2; #n;
  ##[ ncases n; /2/;
  ##| /3/;
- ##| #m; #Hind; ncases Hind; /3/;
+ ##| #m; #Hind; ncases Hind;/3/;
+ (* 
+ ##[/2/; ##|#H; nwhd; 
+    napply or_introl;
+    napply eq_f2; /3/; *)
  ##]
 nqed. 
 
@@ -278,6 +277,7 @@ ntheorem monotonic_pred: monotonic ? le pred.
 
 ntheorem le_S_S_to_le: ∀n,m:nat. S n ≤ S m → n ≤ m.
 (* XXX *) nletin hint ≝ monotonic. 
+#a; #b; #H; napplyS monotonic_pred;
 /2/; nqed.
 
 (* this are instances of the le versions 
@@ -453,7 +453,9 @@ ntheorem le_n_Sm_elim : ∀n,m:nat.n ≤ S m →
 (* le and eq *)
 
 ntheorem le_to_le_to_eq: ∀n,m. n ≤ m → m ≤ n → n = m.
-napply nat_elim2; /4/; nqed. 
+napply nat_elim2; 
+#n; #H1; #H2; /4/;
+ nqed. 
 
 ntheorem lt_O_S : ∀n:nat. O < S n.
 /2/; nqed.
@@ -566,7 +568,6 @@ ntheorem le_plus_r: ∀p,n,m:nat. n ≤ m → p + n ≤ p + m
 
 ntheorem monotonic_le_plus_l: 
 ∀m:nat.monotonic nat le (λn.n + m).
-#m; #x; #y; #H; napplyS monotonic_le_plus_r;
 /2/; nqed.
 
 (*
@@ -890,7 +891,7 @@ ntheorem minus_plus_m_m: ∀n,m:nat.n = (n+m)-m.
 
 ntheorem plus_minus_m_m: ∀n,m:nat.
   m ≤ n → n = (n-m)+m.
-#n; #m; #lemn; napplyS symmetric_eq; 
+#n; #m; #lemn; napplyS sym_eq; 
 napplyS (plus_minus m n m); //; nqed.
 
 ntheorem le_plus_minus_m_m: ∀n,m:nat. n ≤ (n-m)+m.
@@ -909,7 +910,7 @@ nqed.
 ntheorem plus_to_minus :∀n,m,p:nat.n = m+p → n-m = p.
 (* /4/ done in 43.5 *)
 #n; #m; #p; #eqp; 
-napply symmetric_eq;
+napply sym_eq;
 napplyS (minus_plus_m_m p m);
 nqed.
 
@@ -1049,15 +1050,14 @@ simplify.unfold Not.intro.apply H1.apply inj_S.assumption.
 qed.
 *)
 
-naxiom eqb_elim : ∀ n,m:nat.∀ P:bool → Prop.
+ntheorem eqb_elim : ∀ n,m:nat.∀ P:bool → Prop.
 (n=m → (P true)) → (n ≠ m → (P false)) → (P (eqb n m)). 
-(*
 napply nat_elim2; 
   ##[#n; ncases n; nnormalize; /3/; 
   ##|nnormalize; /3/;
   ##|nnormalize; /4/; 
   ##] 
-nqed.*)
+nqed.
 
 ntheorem eqb_n_n: ∀n. eqb n n = true.
 #n; nelim n; nnormalize; //.
@@ -1156,98 +1156,3 @@ ntheorem le_to_ltb_false: ∀n,m. m \le n → ltb n m = false.
 #n; #m; #Hltb; napply lt_to_leb_false; /2/;
 nqed. *)
 
-ninductive compare : Type[0] ≝
-| LT : compare
-| EQ : compare
-| GT : compare.
-
-ndefinition compare_invert: compare → compare ≝
-  λc.match c with
-      [ LT ⇒ GT
-      | EQ ⇒ EQ
-      | GT ⇒ LT ].
-
-nlet rec nat_compare n m: compare ≝
-match n with
-[ O ⇒ match m with 
-      [ O ⇒ EQ
-      | (S q) ⇒ LT ]
-| S p ⇒ match m with 
-      [ O ⇒ GT
-      | S q ⇒ nat_compare p q]].
-
-ntheorem nat_compare_n_n: ∀n. nat_compare n n = EQ.
-#n;nelim n
-##[//
-##|#m;#IH;nnormalize;//]
-nqed.
-
-ntheorem nat_compare_S_S: ∀n,m:nat.nat_compare n m = nat_compare (S n) (S m).
-//;
-nqed.
-
-ntheorem nat_compare_pred_pred: 
-  ∀n,m.O < n → O < m → nat_compare n m = nat_compare (pred n) (pred m).
-#n;#m;#Hn;#Hm;
-napply (lt_O_n_elim n Hn);
-napply (lt_O_n_elim m Hm);
-#p;#q;//;
-nqed.
-
-ntheorem nat_compare_to_Prop: 
-  ∀n,m.match (nat_compare n m) with
-    [ LT ⇒ n < m
-    | EQ ⇒ n = m
-    | GT ⇒ m < n ].
-#n;#m;
-napply (nat_elim2 (λn,m.match (nat_compare n m) with
-  [ LT ⇒ n < m
-  | EQ ⇒ n = m
-  | GT ⇒ m < n ]) ?????) (* FIXME: don't want to put all these ?, especially when … does not work! *)
-##[##1,2:#n1;ncases n1;//;
-##|#n1;#m1;nnormalize;ncases (nat_compare n1 m1);
-   ##[##1,3:nnormalize;#IH;napply le_S_S;//;
-   ##|nnormalize;#IH;nrewrite > IH;//]
-nqed.
-
-ntheorem nat_compare_n_m_m_n: 
-  ∀n,m:nat.nat_compare n m = compare_invert (nat_compare m n).
-#n;#m;
-napply (nat_elim2 (λn,m. nat_compare n m = compare_invert (nat_compare m n)))
-##[##1,2:#n1;ncases n1;//;
-##|#n1;#m1;#IH;nnormalize;napply IH]
-nqed.
-     
-ntheorem nat_compare_elim : 
-  ∀n,m. ∀P:compare → Prop.
-    (n < m → P LT) → (n=m → P EQ) → (m < n → P GT) → P (nat_compare n m).
-#n;#m;#P;#Hlt;#Heq;#Hgt;
-ncut (match (nat_compare n m) with
-    [ LT ⇒ n < m
-    | EQ ⇒ n=m
-    | GT ⇒ m < n] →
-  P (nat_compare n m))
-##[ncases (nat_compare n m);
-   ##[napply Hlt
-   ##|napply Heq
-   ##|napply Hgt]
-##|#Hcut;napply Hcut;//;
-nqed.
-
-ninductive cmp_cases (n,m:nat) : CProp[0] ≝
-  | cmp_le : n ≤ m → cmp_cases n m
-  | cmp_gt : m < n → cmp_cases n m.
-
-ntheorem lt_to_le : ∀n,m:nat. n < m → n ≤ m.
-#n;#m;#H;nelim H
-##[//
-##|/2/]
-nqed.
-
-nlemma cmp_nat: ∀n,m.cmp_cases n m.
-#n;#m; nlapply (nat_compare_to_Prop n m);
-ncases (nat_compare n m);#H
-##[@;napply lt_to_le;//
-##|@;//
-##|@2;//]
-nqed.