X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fmatita%2Fnlibrary%2Farithmetics%2Fnat.ma;h=0418444e376e0ecd47ca07a83b8915b1aa8cbc57;hb=221472ea1597505d12677f5742e388125a15e2b9;hp=28764884064208238dd7966591bdfbd5ca53e56f;hpb=a581a54f6118908a21ed3f960c70a0a2c863ca89;p=helm.git diff --git a/helm/software/matita/nlibrary/arithmetics/nat.ma b/helm/software/matita/nlibrary/arithmetics/nat.ma index 287648840..0418444e3 100644 --- a/helm/software/matita/nlibrary/arithmetics/nat.ma +++ b/helm/software/matita/nlibrary/arithmetics/nat.ma @@ -76,7 +76,7 @@ ntheorem nat_elim2 : #R; #ROn; #RSO; #RSS; #n; nelim n;//; #n0; #Rn0m; #m; ncases m;/2/; nqed. -ntheorem decidable_eq_nat : \forall n,m:nat.decidable (n=m). +ntheorem decidable_eq_nat : ∀n,m:nat.decidable (n=m). napply nat_elim2; #n; ##[ ncases n; /2/; ##| /3/; @@ -260,7 +260,7 @@ ntheorem le_pred_n : ∀n:nat. pred n ≤ n. #n; nelim n; //; nqed. ntheorem monotonic_pred: monotonic ? le pred. -#n; #m; #lenm; nelim lenm; /2/; nqed. +#n; #m; #lenm; nelim lenm; //; /2/; nqed. ntheorem le_S_S_to_le: ∀n,m:nat. S n ≤ S m → n ≤ m. /2/; nqed. @@ -310,7 +310,8 @@ ntheorem lt_to_not_le: ∀n,m. n < m → m ≰ n. ntheorem not_lt_to_le: ∀n,m:nat. n ≮ m → m ≤ n. #n; #m; #Hnlt; napply lt_S_to_le; -(* something strange here: /2/ fails *) +(* something strange here: /2/ fails: + we need an extra depths for unfolding not *) napply not_le_to_lt; napply Hnlt; nqed. ntheorem le_to_not_lt: ∀n,m:nat. n ≤ m → m ≮ n. @@ -528,21 +529,23 @@ apply le_to_or_lt_eq.apply H6. qed. *) -(******************* monotonicity ******************************) +(*********************** monotonicity ***************************) ntheorem monotonic_le_plus_r: ∀n:nat.monotonic nat le (λm.n + m). #n; #a; #b; nelim n; nnormalize; //; #m; #H; #leab;napply le_S_S; /2/; nqed. +(* ntheorem le_plus_r: ∀p,n,m:nat. n ≤ m → p + n ≤ p + m -≝ monotonic_le_plus_r. +≝ monotonic_le_plus_r. *) ntheorem monotonic_le_plus_l: ∀m:nat.monotonic nat le (λn.n + m). /2/; nqed. +(* ntheorem le_plus_l: \forall p,n,m:nat. n \le m \to n + p \le m + p -\def monotonic_le_plus_l. +\def monotonic_le_plus_l. *) ntheorem le_plus: ∀n1,n2,m1,m2:nat. n1 ≤ n2 \to m1 ≤ m2 → n1 + m1 ≤ n2 + m2. @@ -561,11 +564,47 @@ ntheorem eq_plus_to_le: ∀n,m,p:nat.n=m+p → m ≤ n. ntheorem le_plus_to_le: ∀a,n,m. a + n ≤ a + m → n ≤ m. #a; nelim a; /3/; nqed. +ntheorem le_plus_to_le_r: ∀a,n,m. n + a ≤ m +a → n ≤ m. +/2/; nqed. + +(* plus & lt *) +ntheorem monotonic_lt_plus_r: +∀n:nat.monotonic nat lt (λm.n+m). +/2/; nqed. + +(* +variant lt_plus_r: \forall n,p,q:nat. p < q \to n + p < n + q \def +monotonic_lt_plus_r. *) + +ntheorem monotonic_lt_plus_l: +∀n:nat.monotonic nat lt (λm.m+n). +/2/;nqed. + +(* +variant lt_plus_l: \forall n,p,q:nat. p < q \to p + n < q + n \def +monotonic_lt_plus_l. *) + +ntheorem lt_plus: ∀n,m,p,q:nat. n < m → p < q → n + p < m + q. +#n; #m; #p; #q; #ltnm; #ltpq; +napply (transitive_lt ? (n+q));/2/; nqed. + +ntheorem lt_plus_to_lt_l :∀n,p,q:nat. p+n < q+n → p H2 in H1. + rewrite > (S_pred a) in H1 + [ apply False_ind. + apply (eq_to_not_lt O ((S (pred a))*(S m))) + [ apply sym_eq. + assumption + | apply lt_O_times_S_S + ] + | assumption + ] +] +qed. + +theorem O_lt_times_to_O_lt: \forall a,c:nat. +O \lt (a * c) \to O \lt a. +intros. +apply (nat_case1 a) +[ intros. + rewrite > H1 in H. + simplify in H. + assumption +| intros. + apply lt_O_S +] +qed. + +lemma lt_times_to_lt_O: \forall i,n,m:nat. i < n*m \to O < m. +intros. +elim (le_to_or_lt_eq O ? (le_O_n m)) + [assumption + |apply False_ind. + rewrite < H1 in H. + rewrite < times_n_O in H. + apply (not_le_Sn_O ? H) + ] +qed. *) + +(* +ntheorem monotonic_lt_times_r: +∀n:nat.monotonic nat lt (λm.(S n)*m). +/2/; +simplify. +intros.elim n. +simplify.rewrite < plus_n_O.rewrite < plus_n_O.assumption. +apply lt_plus.assumption.assumption. +qed. *) + +ntheorem monotonic_lt_times_l: + ∀c:nat. O < c → monotonic nat lt (λt.(t*c)). +#c; #posc; #n; #m; #ltnm; +nelim ltnm; nnormalize; + ##[napplyS monotonic_lt_plus_l;//; + ##|#a; #_; #lt1; napply (transitive_le ??? lt1);//; + ##] +nqed. + +ntheorem monotonic_lt_times_r: + ∀c:nat. O < c → monotonic nat lt (λt.(c*t)). +(* /2/ lentissimo *) +#c; #posc; #n; #m; #ltnm; +(* why?? napplyS (monotonic_lt_times_l c posc n m ltnm); *) +nrewrite > (symmetric_times c n); +nrewrite > (symmetric_times c m); +napply monotonic_lt_times_l;//; +nqed. + +ntheorem lt_to_le_to_lt_times: +∀n,m,p,q:nat. n < m → p ≤ q → O < q → n*p < m*q. +#n; #m; #p; #q; #ltnm; #lepq; #posq; +napply (le_to_lt_to_lt ? (n*q)); + ##[napply monotonic_le_times_r;//; + ##|napply monotonic_lt_times_l;//; + ##] +nqed. + +ntheorem lt_times:∀n,m,p,q:nat. n nat_compare_n_n.reflexivity. +intro.apply nat_compare_elim.intro. +absurd (p minus_Sn_m. +apply le_S.assumption. +apply lt_to_le.assumption. +qed. + +theorem minus_le_S_minus_S: \forall n,m:nat. m-n \leq S (m-(S n)). +intros. +apply (nat_elim2 (\lambda n,m.m-n \leq S (m-(S n)))). +intro.elim n1.simplify.apply le_n_Sn. +simplify.rewrite < minus_n_O.apply le_n. +intros.simplify.apply le_n_Sn. +intros.simplify.apply H. +qed. + +theorem lt_minus_S_n_to_le_minus_n : \forall n,m,p:nat. m-(S n) < p \to m-n \leq p. +intros 3.intro. +(* autobatch *) +(* end auto($Revision: 9739 $) proof: TIME=1.33 SIZE=100 DEPTH=100 *) +apply (trans_le (m-n) (S (m-(S n))) p). +apply minus_le_S_minus_S. +assumption. +qed. + +theorem le_minus_m: \forall n,m:nat. n-m \leq n. +intros.apply (nat_elim2 (\lambda m,n. n-m \leq n)). +intros.rewrite < minus_n_O.apply le_n. +intros.simplify.apply le_n. +intros.simplify.apply le_S.assumption. +qed. + +theorem lt_minus_m: \forall n,m:nat. O < n \to O < m \to n-m \lt n. +intros.apply (lt_O_n_elim n H).intro. +apply (lt_O_n_elim m H1).intro. +simplify.unfold lt.apply le_S_S.apply le_minus_m. +qed. + +theorem minus_le_O_to_le: \forall n,m:nat. n-m \leq O \to n \leq m. +intros 2. +apply (nat_elim2 (\lambda n,m:nat.n-m \leq O \to n \leq m)). +intros.apply le_O_n. +simplify.intros. assumption. +simplify.intros.apply le_S_S.apply H.assumption. +qed. +*) + +(* monotonicity and galois *) + +ntheorem monotonic_le_minus_l: +∀p,q,n:nat. q ≤ p → q-n ≤ p-n. +napply nat_elim2; #p; #q; + ##[#lePO; napply (le_n_O_elim ? lePO);//; + ##|//; + ##|#Hind; #n; ncases n; + ##[//; + ##|#a; #leSS; napply Hind; /2/; + ##] + ##] +nqed. + +ntheorem le_minus_to_plus: ∀n,m,p. n-m ≤ p → n≤ p+m. +#n; #m; #p; #lep; +napply transitive_le; + ##[##|napply le_plus_minus_m_m + ##|napply monotonic_le_plus_l;//; + ##] +nqed. + +ntheorem le_plus_to_minus: ∀n,m,p. n ≤ p+m → n-m ≤ p. +#n; #m; #p; #lep; +(* bello *) +napplyS monotonic_le_minus_l;//; +nqed. + +ntheorem monotonic_le_minus_r: +∀p,q,n:nat. q ≤ p → n-p ≤ n-q. +#p; #q; #n; #lepq; +napply le_plus_to_minus; +napply (transitive_le ??? (le_plus_minus_m_m ? q));/2/; +nqed.