X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;ds=sidebyside;f=helm%2Fmatita%2Flibrary%2Fnat%2Fminus.ma;h=7240b7d09ebbc9f18384e68ae1d51f3dffa8021b;hb=ab44166935d77276c04fcce50aa8281292776e29;hp=7945a76e01c3c36ebe2d68ad3eda850af1bf4186;hpb=03fcee16d9c262aad38a47d0a409b684a965cc3f;p=helm.git diff --git a/helm/matita/library/nat/minus.ma b/helm/matita/library/nat/minus.ma index 7945a76e0..7240b7d09 100644 --- a/helm/matita/library/nat/minus.ma +++ b/helm/matita/library/nat/minus.ma @@ -82,7 +82,7 @@ qed. theorem minus_to_plus :\forall n,m,p:nat.m \leq n \to n-m = p \to n = m+p. -intros.apply trans_eq ? ? ((n-m)+m) ?. +intros.apply trans_eq ? ? ((n-m)+m). apply plus_minus_m_m. apply H.elim H1. apply sym_plus. @@ -118,8 +118,8 @@ intros 2. apply nat_elim2 (\lambda n,m.n \leq m \to n-m = O). intros.simplify.reflexivity. intros.apply False_ind. -(* ancora problemi con il not *) -apply not_le_Sn_O n1 H. +apply not_le_Sn_O. +goal 13.apply H. intros. simplify.apply H.apply le_S_S_to_le. apply H1. qed. @@ -153,6 +153,12 @@ 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.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). @@ -209,26 +215,55 @@ qed. theorem distributive_times_minus: distributive nat times minus. simplify. intros. -apply (leb_elim z y).intro. -cut x*(y-z)+x*z = (x*y-x*z)+x*z. -apply inj_plus_l (x*z). -assumption. -apply trans_eq nat ? (x*y). -rewrite < distr_times_plus. -rewrite < plus_minus_m_m ? ? H.reflexivity. -rewrite < plus_minus_m_m ? ? ?.reflexivity. -apply le_times_r. -assumption. -intro. -rewrite > eq_minus_n_m_O. -rewrite > eq_minus_n_m_O (x*y). -rewrite < sym_times.simplify.reflexivity. -apply lt_to_le. -apply not_le_to_lt.assumption. -apply le_times_r.apply lt_to_le. -apply not_le_to_lt.assumption. +apply (leb_elim z y). + intro.cut x*(y-z)+x*z = (x*y-x*z)+x*z. + apply inj_plus_l (x*z).assumption. + apply trans_eq nat ? (x*y). + rewrite < distr_times_plus.rewrite < plus_minus_m_m ? ? H.reflexivity. + rewrite < plus_minus_m_m. + reflexivity. + apply le_times_r.assumption. + intro.rewrite > eq_minus_n_m_O. + rewrite > eq_minus_n_m_O (x*y). + rewrite < sym_times.simplify.reflexivity. + apply le_times_r.apply lt_to_le.apply not_le_to_lt.assumption. + apply lt_to_le.apply not_le_to_lt.assumption. qed. theorem distr_times_minus: \forall n,m,p:nat. n*(m-p) = n*m-n*p \def distributive_times_minus. +theorem eq_minus_minus_minus_plus: \forall n,m,p:nat. (n-m)-p = n-(m+p). +intros. +cut m+p \le n \or \not m+p \le n. + elim Hcut. + symmetry.apply plus_to_minus.assumption. + rewrite > assoc_plus.rewrite > sym_plus p.rewrite < plus_minus_m_m. + rewrite > sym_plus.rewrite < plus_minus_m_m. + reflexivity. + apply trans_le ? (m+p). + rewrite < sym_plus.apply le_plus_n. + assumption. + apply le_plus_to_minus_r.rewrite > sym_plus.assumption. + rewrite > eq_minus_n_m_O n (m+p). + rewrite > eq_minus_n_m_O (n-m) p. + reflexivity. + apply le_plus_to_minus.apply lt_to_le. rewrite < sym_plus. + apply not_le_to_lt. assumption. + apply lt_to_le.apply not_le_to_lt.assumption. + apply decidable_le (m+p) n. +qed. + +theorem eq_plus_minus_minus_minus: \forall n,m,p:nat. p \le m \to m \le n \to +p+(n-m) = n-(m-p). +intros. +apply sym_eq. +apply plus_to_minus. +apply le_plus_to_minus. +apply trans_le ? n.assumption.rewrite < sym_plus.apply le_plus_n. +rewrite < assoc_plus. +rewrite < plus_minus_m_m. +rewrite < sym_plus. +rewrite < plus_minus_m_m.reflexivity. +assumption.assumption. +qed.