From a79bf6edc13daaea8135ca71fdc92e02e229f030 Mon Sep 17 00:00:00 2001 From: Andrea Asperti Date: Fri, 29 Jan 2010 10:16:48 +0000 Subject: [PATCH] minus in nat.ma --- .../matita/nlibrary/arithmetics/nat.ma | 198 +++++++++++++++++- 1 file changed, 191 insertions(+), 7 deletions(-) diff --git a/helm/software/matita/nlibrary/arithmetics/nat.ma b/helm/software/matita/nlibrary/arithmetics/nat.ma index 287648840..3152b0dbe 100644 --- a/helm/software/matita/nlibrary/arithmetics/nat.ma +++ b/helm/software/matita/nlibrary/arithmetics/nat.ma @@ -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,14 @@ 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. + (* times *) ntheorem monotonic_le_times_r: ∀n:nat.monotonic nat le (λm. n * m). -#n; #x; #y; #lexy; nelim n; nnormalize;//; -#a; #lea; napply le_plus;//; (* lentissimo /2/ *) +#n; #x; #y; #lexy; nelim n; nnormalize;//;(* lento /2/;*) +#a; #lea; napply le_plus; //; nqed. (* @@ -583,7 +589,7 @@ theorem le_times_l: \forall p,n,m:nat. n \le m \to n*p \le m*p ntheorem le_times: ∀n1,n2,m1,m2:nat. n1 ≤ n2 → m1 ≤ m2 → n1*m1 ≤ n2*m2. #n1; #n2; #m1; #m2; #len; #lem; -napply transitive_le; (* too slow *) +napply transitive_le; (* /2/ slow *) ##[ ##| napply monotonic_le_times_l;//; ##| napply monotonic_le_times_r;//; ##] @@ -609,3 +615,181 @@ nqed. ntheorem le_S_times_2: ∀n,m.O < m → n ≤ m → n < 2*m. #n; #m; #posm; #lenm; (* interessante *) nnormalize; napplyS (le_plus n); //; nqed. + +(************************** minus ******************************) + +nlet rec minus n m ≝ + match n with + [ O ⇒ O + | S p ⇒ + match m with + [ O ⇒ S p + | S q ⇒ minus p q ]]. + +interpretation "natural minus" 'minus x y = (minus x y). + +ntheorem minus_S_S: ∀n,m:nat.S n - S m = n -m. +//; nqed. + +ntheorem minus_O_n: ∀n:nat.O=O-n. +#n; ncases n; //; nqed. + +ntheorem minus_n_O: ∀n:nat.n=n-O. +#n; ncases n; //; nqed. + +ntheorem minus_n_n: ∀n:nat.O=n-n. +#n; nelim n; //; nqed. + +ntheorem minus_Sn_n: ∀n:nat. S O = (S n)-n. +#n; nelim n; //; nqed. + +ntheorem minus_Sn_m: ∀m,n:nat. m ≤ n → S n -m = S (n-m). +(* qualcosa da capire qui +#n; #m; #lenm; nelim lenm; napplyS refl_eq. *) +napply nat_elim2; + ##[// + ##|#n; #abs; napply False_ind;/2/; + ##|/3/; + ##] +nqed. + +ntheorem eq_minus_S_pred: ∀n,m. n - (S m) = pred(n -m). +napply nat_elim2; //; nqed. + +ntheorem plus_minus: +∀m,n,p:nat. m ≤ n → (n-m)+p = (n+p)-m. +napply nat_elim2; + ##[// + ##|#n; #p; #abs; napply False_ind;/2/; + ##|nnormalize;/3/; + ##] +nqed. + +ntheorem minus_plus_m_m: ∀n,m:nat.n = (n+m)-m. +#n; #m; napplyS (plus_minus m m n); //; nqed. + +ntheorem plus_minus_m_m: ∀n,m:nat. +m \leq n \to n = (n-m)+m. +#n; #m; #lemn; napplyS symmetric_eq; +napplyS (plus_minus m n m); //; nqed. + +ntheorem le_plus_minus_m_m: ∀n,m:nat. n ≤ (n-m)+m. +#n; nelim n; + ##[// + ##|#a; #Hind; #m; ncases m;/2/; + ##] +nqed. + +ntheorem minus_to_plus :∀n,m,p:nat. + m ≤ n → n-m = p → n = m+p. +#n; #m; #p; #lemn; #eqp; napplyS plus_minus_m_m; //; +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; +napplyS (minus_plus_m_m p m); +nqed. + +ntheorem minus_pred_pred : ∀n,m:nat. O < n → O < m → +pred n - pred m = n - m. +#n; #m; #posn; #posm; +napply (lt_O_n_elim n posn); +napply (lt_O_n_elim m posm);//. +nqed. + +(* +theorem eq_minus_n_m_O: \forall n,m:nat. +n \leq m \to n-m = O. +intros 2. +apply (nat_elim2 (\lambda n,m.n \leq m \to n-m = O)). +intros.simplify.reflexivity. +intros.apply False_ind. +apply not_le_Sn_O; +[2: apply H | skip]. +intros. +simplify.apply H.apply le_S_S_to_le. apply H1. +qed. + +theorem le_SO_minus: \forall n,m:nat.S n \leq m \to S O \leq m-n. +intros.elim H.elim (minus_Sn_n n).apply le_n. +rewrite > 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. -- 2.39.2