X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fmatita%2Flibrary%2Fnat%2Fdiv_and_mod.ma;h=8c1e0e95317be691c9d9b78b03ec8ba4c72c747e;hb=6565cd51fb866a80838003cd65dc00e4d5a9814b;hp=ca8b6c3faaaec0cd8c89c5bce373ba0efd9a588a;hpb=3eff4cc36820df9faddb3cb16390717851db499c;p=helm.git diff --git a/helm/matita/library/nat/div_and_mod.ma b/helm/matita/library/nat/div_and_mod.ma index ca8b6c3fa..8c1e0e953 100644 --- a/helm/matita/library/nat/div_and_mod.ma +++ b/helm/matita/library/nat/div_and_mod.ma @@ -15,7 +15,7 @@ set "baseuri" "cic:/matita/nat/div_and_mod". include "nat/minus.ma". -include "nat/orders_op.ma". +include "nat/le_arith.ma". include "nat/compare.ma". let rec mod_aux p m n: nat \def @@ -174,3 +174,80 @@ apply le_times_r. apply lt_to_le. apply H6. qed. + +theorem div_mod_spec_to_eq2 :\forall a,b,q,r,q1,r1. +(div_mod_spec a b q r) \to (div_mod_spec a b q1 r1) \to +(eq nat r r1). +intros.elim H.elim H1. +apply inj_plus_r (q*b). +rewrite < H3. +rewrite > div_mod_spec_to_eq a b q r q1 r1 H H1. +assumption. +qed. + +theorem div_mod_spec_times : \forall n,m:nat.div_mod_spec ((S n)*m) (S n) m O. +intros.constructor 1. +simplify.apply le_S_S.apply le_O_n. +rewrite < plus_n_O.rewrite < sym_times.reflexivity. +qed. + +(* some properties of div and mod *) +theorem div_times: \forall n,m:nat. div ((S n)*m) (S n) = m. +intros. +apply div_mod_spec_to_eq ((S n)*m) (S n) ? ? ? O. +apply div_mod_spec_div_mod. +simplify.apply le_S_S.apply le_O_n. +apply div_mod_spec_times. +qed. + +theorem div_n_n: \forall n:nat. O < n \to div n n = S O. +intros. +apply div_mod_spec_to_eq n n (div n n) (mod n n) (S O) O. +apply div_mod_spec_div_mod.assumption. +constructor 1.assumption. +rewrite < plus_n_O.simplify.rewrite < plus_n_O.reflexivity. +qed. + +theorem mod_n_n: \forall n:nat. O < n \to mod n n = O. +intros. +apply div_mod_spec_to_eq2 n n (div n n) (mod n n) (S O) O. +apply div_mod_spec_div_mod.assumption. +constructor 1.assumption. +rewrite < plus_n_O.simplify.rewrite < plus_n_O.reflexivity. +qed. + +theorem mod_S: \forall n,m:nat. O < m \to S (mod n m) < m \to +(mod (S n) m) = S (mod n m). +intros. +apply div_mod_spec_to_eq2 (S n) m (div (S n) m) (mod (S n) m) (div n m) (S (mod n m)). +apply div_mod_spec_div_mod.assumption. +constructor 1.assumption.rewrite < plus_n_Sm. +apply eq_f. +apply div_mod. +assumption. +qed. + +(* injectivity *) +theorem injective_times_r: \forall n:nat.injective nat nat (\lambda m:nat.(S n)*m). +change with \forall n,p,q:nat.(S n)*p = (S n)*q \to p=q. +intros. +rewrite < div_times n. +rewrite < div_times n q. +apply eq_f2.assumption. +reflexivity. +qed. + +variant inj_times_r : \forall n,p,q:nat.(S n)*p = (S n)*q \to p=q \def +injective_times_r. + +theorem injective_times_l: \forall n:nat.injective nat nat (\lambda m:nat.m*(S n)). +change with \forall n,p,q:nat.p*(S n) = q*(S n) \to p=q. +intros. +apply inj_times_r n p q. +rewrite < sym_times. +rewrite < sym_times q. +assumption. +qed. + +variant inj_times_l : \forall n,p,q:nat. p*(S n) = q*(S n) \to p=q \def +injective_times_l.