]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/matita/library/nat/factorial2.ma
updating the structures for sorts
[helm.git] / helm / software / matita / library / nat / factorial2.ma
index 4f3631cdbd06a3893a97843a2c325323474b250a..bb6c72aebccd7092070199095efb69ea6b279fb3 100644 (file)
@@ -12,8 +12,6 @@
 (*                                                                        *)
 (**************************************************************************)
 
-set "baseuri" "cic:/matita/nat/factorial2".
-
 include "nat/exp.ma".
 include "nat/factorial.ma".
 
@@ -25,20 +23,16 @@ theorem exp_S: \forall n,m. exp m (S n) = m*exp m n.
 intros.reflexivity.
 qed.
 
-lemma times_SSO: \forall n.(S(S O))*(S n) = S(S((S(S O))*n)).
-intro.simplify.rewrite < plus_n_Sm.reflexivity.
-qed.
-
-theorem fact1: \forall n.
-fact ((S(S O))*n) \le (exp (S(S O)) ((S(S O))*n))*(fact n)*(fact n).
-intro.elim n
-  [rewrite < times_n_O.apply le_n
+theorem lt_O_to_fact1: \forall n.O<n \to
+fact (2*n) \le (exp 2 (pred (2*n)))*(fact n)*(fact n).
+intros.elim H
+  [apply le_n
   |rewrite > times_SSO.
    rewrite > factS.
    rewrite > factS.
    rewrite < assoc_times.
    rewrite > factS.
-   apply (trans_le ? (((S(S O))*(S n1))*((S(S O))*(S n1))*(fact (((S(S O))*n1)))))
+   apply (trans_le ? ((2*(S n1))*(2*(S n1))*(fact (2*n1))))
     [apply le_times_l.
      rewrite > times_SSO.
      apply le_times_r.
@@ -46,6 +40,7 @@ intro.elim n
     |rewrite > assoc_times.
      rewrite > assoc_times.
      rewrite > assoc_times in ⊢ (? ? %).
+     change in ⊢ (? ? (? (? ? %) ?)) with (S(2*n1)).
      rewrite > exp_S. 
      rewrite > assoc_times in ⊢ (? ? %).
      apply le_times_r.
@@ -54,26 +49,42 @@ intro.elim n
      rewrite < sym_times in ⊢ (? (? (? % ?) ?) ?).
      rewrite > assoc_times.
      rewrite > assoc_times.
-     rewrite > exp_S. 
-     rewrite > assoc_times in ⊢ (? ? %).
-     apply le_times_r.
-     rewrite > sym_times in ⊢ (? ? %).
-     rewrite > assoc_times in ⊢ (? ? %).
-     rewrite > assoc_times in ⊢ (? ? %).
-     apply le_times_r.
-     rewrite < assoc_times in ⊢ (? ? %).
-     rewrite < assoc_times in ⊢ (? ? %).
-     rewrite < sym_times in ⊢ (? ? (? (? % ?) ?)).
-     rewrite > assoc_times in ⊢ (? ? %).
-     rewrite > assoc_times in ⊢ (? ? %).
-     apply le_times_r.
-     rewrite > sym_times in ⊢ (? ? (? ? %)).
-     rewrite > sym_times in ⊢ (? ? %).
-     assumption
+     rewrite > S_pred in ⊢ (? ? (? (? ? %) ?))
+      [rewrite > exp_S. 
+       rewrite > assoc_times in ⊢ (? ? %).
+       apply le_times_r.
+       rewrite > sym_times in ⊢ (? ? %).
+       rewrite > assoc_times in ⊢ (? ? %).
+       rewrite > assoc_times in ⊢ (? ? %).
+       apply le_times_r.
+       rewrite < assoc_times in ⊢ (? ? %).
+       rewrite < assoc_times in ⊢ (? ? %).
+       rewrite < sym_times in ⊢ (? ? (? (? % ?) ?)).
+       rewrite > assoc_times in ⊢ (? ? %).
+       rewrite > assoc_times in ⊢ (? ? %).
+       apply le_times_r.
+       rewrite > sym_times in ⊢ (? ? (? ? %)).
+       rewrite > sym_times in ⊢ (? ? %).
+       assumption
+      |unfold.rewrite > times_n_SO in ⊢ (? % ?).
+       apply le_times
+        [apply le_n_Sn
+        |assumption
+        ]
+      ]
     ]
   ]
 qed.
 
+theorem fact1: \forall n.
+fact (2*n) \le (exp 2 (pred (2*n)))*(fact n)*(fact n).
+intro.cases n
+  [apply le_n
+  |apply lt_O_to_fact1.
+   apply lt_O_S
+  ]
+qed.
+
 theorem lt_O_fact: \forall n. O < fact n.
 intro.elim n
   [simplify.apply lt_O_S
@@ -87,7 +98,7 @@ intro.elim n
 qed.
 
 theorem fact2: \forall n.O < n \to
-(exp (S(S O)) ((S(S O))*n))*(fact n)*(fact n) < fact (S((S(S O))*n)).
+(exp 2 (2*n))*(fact n)*(fact n) < fact (S(2*n)).
 intros.elim H
   [simplify.apply le_S.apply le_n
   |rewrite > times_SSO.
@@ -140,6 +151,122 @@ intros.elim H
   ]
 qed.
 
+(* a slightly better result *)
+theorem fact3: \forall n.O < n \to
+(exp 2 (2*n))*(exp (fact n) 2) \le 2*n*fact (2*n).
+intros.
+elim H
+  [simplify.apply le_n
+  |rewrite > times_SSO.
+   rewrite > factS.
+   rewrite < times_exp.
+   change in ⊢ (? (? % ?) ?) with ((S(S O))*((S(S O))*(exp (S(S O)) ((S(S O))*n1)))).
+   rewrite > assoc_times.
+   rewrite > assoc_times in ⊢ (? (? ? %) ?).
+   rewrite < assoc_times in ⊢ (? (? ? (? ? %)) ?).
+   rewrite < sym_times in ⊢ (? (? ? (? ? (? % ?))) ?).
+   rewrite > assoc_times in ⊢ (? (? ? (? ? %)) ?).
+   apply (trans_le ? (((S(S O))*((S(S O))*((S n1)\sup((S(S O)))*((S(S O))*n1*((S(S O))*n1)!))))))
+    [apply le_times_r.
+     apply le_times_r.
+     apply le_times_r.
+     assumption
+    |rewrite > factS.
+     rewrite > factS.
+     rewrite < times_SSO.
+     rewrite > assoc_times in ⊢ (? ? %). 
+     apply le_times_r.
+     rewrite < assoc_times.
+     change in ⊢ (? (? (? ? %) ?) ?) with ((S n1)*((S n1)*(S O))).
+     rewrite < assoc_times in ⊢ (? (? % ?) ?).
+     rewrite < times_n_SO.
+     rewrite > sym_times in ⊢ (? (? (? % ?) ?) ?).
+     rewrite < assoc_times in ⊢ (? ? %).
+     rewrite < assoc_times in ⊢ (? ? (? % ?)).
+     apply le_times_r.
+     apply le_times_l.
+     apply le_S.apply le_n
+    ]
+  ]
+qed.
+
+theorem le_fact_10: fact (2*5) \le (exp 2 ((2*5)-2))*(fact 5)*(fact 5).
+simplify in \vdash (? (? %) ?).
+rewrite > factS in \vdash (? % ?).
+rewrite > factS in \vdash (? % ?).rewrite < assoc_times in \vdash(? % ?).
+rewrite > factS in \vdash (? % ?).rewrite < assoc_times in \vdash (? % ?).
+rewrite > factS in \vdash (? % ?).rewrite < assoc_times in \vdash (? % ?).
+rewrite > factS in \vdash (? % ?).rewrite < assoc_times in \vdash (? % ?).
+apply le_times_l.
+apply leb_true_to_le.reflexivity.
+qed.
+
+theorem ab_times_cd: \forall a,b,c,d.(a*b)*(c*d)=(a*c)*(b*d).
+intros.
+rewrite > assoc_times.
+rewrite > assoc_times.
+apply eq_f.
+rewrite < assoc_times.
+rewrite < assoc_times.
+rewrite > sym_times in \vdash (? ? (? % ?) ?).
+reflexivity.
+qed.
+
+(* an even better result *)
+theorem lt_SSSSO_to_fact: \forall n.4<n \to
+fact (2*n) \le (exp 2 ((2*n)-2))*(fact n)*(fact n).
+intros.elim H
+  [apply le_fact_10
+  |rewrite > times_SSO.
+   change in \vdash (? ? (? (? (? ? %) ?) ?)) with (2*n1 - O);
+   rewrite < minus_n_O.
+   rewrite > factS.
+   rewrite > factS.
+   rewrite < assoc_times.
+   rewrite > factS.
+   apply (trans_le ? ((2*(S n1))*(2*(S n1))*(fact (2*n1))))
+    [apply le_times_l.
+     rewrite > times_SSO.
+     apply le_times_r.
+     apply le_n_Sn
+    |apply (trans_le ? (2*S n1*(2*S n1)*(2\sup(2*n1-2)*n1!*n1!)))
+      [apply le_times_r.assumption
+      |rewrite > assoc_times.
+       rewrite > ab_times_cd in \vdash (? (? ? %) ?).
+       rewrite < assoc_times.
+       apply le_times_l.
+       rewrite < assoc_times in \vdash (? (? ? %) ?).
+       rewrite > ab_times_cd.
+       apply le_times_l.
+       rewrite < exp_S.
+       rewrite < exp_S.
+       apply le_exp
+        [apply lt_O_S
+        |rewrite > eq_minus_S_pred.
+         rewrite < S_pred
+          [rewrite > eq_minus_S_pred.
+           rewrite < S_pred
+            [rewrite < minus_n_O.
+             apply le_n
+            |elim H1;simplify
+              [apply lt_O_S
+              |apply lt_O_S
+              ]
+            ]
+          |elim H1;simplify
+            [apply lt_O_S
+            |rewrite < plus_n_Sm.
+             rewrite < minus_n_O.
+             apply lt_O_S
+            ]
+          ]
+        ]
+      ]
+    ]
+  ]
+qed.
+
+
 (*
 theorem stirling: \forall n,k.k \le n \to
 log (fact n) < n*log n - n + k*log n.