X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fmatita%2Flibrary%2FQ%2Ffrac.ma;h=d00cd3158956c72f9f59e3a479a9b7850eebfa79;hb=7a116453d799657958e32693be28d18a5aab84fc;hp=de156e2db3881836b774e74ee0e26569906ffc45;hpb=9d7d400d540ba79edaab1e0c8345127e1a79bb53;p=helm.git diff --git a/helm/software/matita/library/Q/frac.ma b/helm/software/matita/library/Q/frac.ma index de156e2db..d00cd3158 100644 --- a/helm/software/matita/library/Q/frac.ma +++ b/helm/software/matita/library/Q/frac.ma @@ -32,722 +32,10 @@ definition nat_fact_all_to_Q_inv \def definition nat_to_Q_inv \def \lambda n. nat_fact_all_to_Q_inv (factorize n). -*) definition frac:nat \to nat \to Q \def \lambda p,q. Qtimes (nat_to_Q p) (Qinv (nat_to_Q q)). -theorem rtimes_oner: \forall r.rtimes r one = r. -intro.cases r;reflexivity. -qed. - -theorem rtimes_onel: \forall r.rtimes one r = r. -intro.cases r;reflexivity. -qed. - -let rec times_f h g \def - match h with - [nf_last a \Rightarrow - match g with - [nf_last b \Rightarrow nf_last (S (a+b)) - |nf_cons b g1 \Rightarrow nf_cons (S (a+b)) g1 - ] - |nf_cons a h1 \Rightarrow - match g with - [nf_last b \Rightarrow nf_cons (S (a+b)) h1 - |nf_cons b g1 \Rightarrow nf_cons (a+b) (times_f h1 g1) - ] - ] -. - -definition times_fa \def -\lambda f,g. -match f with -[nfa_zero \Rightarrow nfa_zero -|nfa_one \Rightarrow g -|nfa_proper f1 \Rightarrow match g with - [nfa_zero \Rightarrow nfa_zero - |nfa_one \Rightarrow nfa_proper f1 - |nfa_proper g1 \Rightarrow nfa_proper (times_f f1 g1) - ] -] -. - -theorem eq_times_f_times1:\forall g,h,m. defactorize_aux (times_f g h) m -=defactorize_aux g m*defactorize_aux h m. -intro.elim g - [elim h;simplify;autobatch - |elim h - [simplify;autobatch - |simplify.rewrite > (H n3 (S m)).autobatch - ] - ] -qed. - -theorem eq_times_fa_times: \forall f,g. -defactorize (times_fa f g) = defactorize f*defactorize g. -intros. -elim f - [reflexivity - |simplify.apply plus_n_O - |elim g;simplify - [apply times_n_O - |apply times_n_SO - |apply eq_times_f_times1 - ] - ] -qed. - -theorem eq_times_times_fa: \forall n,m. -factorize (n*m) = times_fa (factorize n) (factorize m). -intros. -rewrite <(factorize_defactorize (times_fa (factorize n) (factorize m))). -rewrite > eq_times_fa_times. -rewrite > defactorize_factorize. -rewrite > defactorize_factorize. -reflexivity. -qed. - - -theorem eq_plus_Zplus: \forall n,m:nat. Z_of_nat (n+m) = -Z_of_nat n + Z_of_nat m. -intro.cases n;intro - [reflexivity - |cases m - [simplify.rewrite < plus_n_O.reflexivity - |simplify.reflexivity. - ] - ] -qed. - -definition unfrac \def \lambda f. -match f with - [one \Rightarrow pp O - |frac f \Rightarrow f - ] -. - -lemma injective_frac: injective fraction ratio frac. -unfold.intros. -change with ((unfrac (frac x)) = (unfrac (frac y))). -rewrite < H.reflexivity. -qed. - -theorem times_f_ftimes: \forall n,m. -frac (nat_fact_to_fraction (times_f n m)) -= ftimes (nat_fact_to_fraction n) (nat_fact_to_fraction m). -intro. -elim n - [elim m - [simplify. - rewrite < plus_n_Sm.reflexivity - |elim n2 - [simplify.rewrite < plus_n_O.reflexivity - |simplify.reflexivity. - ] - ] - |elim m - [elim n1 - [simplify.reflexivity - |simplify.rewrite < plus_n_Sm.reflexivity - ] - |simplify. - cut (\exist h.ftimes (nat_fact_to_fraction n2) (nat_fact_to_fraction n4) = frac h) - [elim Hcut. - rewrite > H2. - simplify.apply eq_f. - apply eq_f2 - [apply eq_plus_Zplus - |apply injective_frac. - rewrite < H2. - apply H - ] - |generalize in match n4. - elim n2 - [cases n6;simplify;autobatch - |cases n7;simplify - [autobatch - |elim (H2 n9). - rewrite > H3. - simplify. - autobatch - ] - ] - ] - ] - ] -qed. - -theorem times_fa_Qtimes: \forall f,g. nat_fact_all_to_Q (times_fa f g) = -Qtimes (nat_fact_all_to_Q f) (nat_fact_all_to_Q g). -intros. -cases f;simplify - [reflexivity - |cases g;reflexivity - |cases g;simplify - [reflexivity - |reflexivity - |rewrite > times_f_ftimes.reflexivity - ] - ] -qed. - -theorem times_Qtimes: \forall p,q. -(nat_to_Q (p*q)) = Qtimes (nat_to_Q p) (nat_to_Q q). -intros.unfold nat_to_Q. -rewrite < times_fa_Qtimes. -rewrite < eq_times_times_fa. -reflexivity. -qed. - -theorem rtimes_Zplus: \forall x,y. -rtimes (Z_to_ratio x) (Z_to_ratio y) = -Z_to_ratio (x + y). -intro. -elim x - [reflexivity - |elim y;reflexivity - |elim y;reflexivity - ] -qed. - -theorem rtimes_Zplus1: \forall x,y,f. -rtimes (Z_to_ratio x) (frac (cons y f)) = -frac (cons ((x + y)) f). -intro. -elim x - [reflexivity - |elim y;reflexivity - |elim y;reflexivity - ] -qed. - -theorem rtimes_Zplus2: \forall x,y,f. -rtimes (frac (cons y f)) (Z_to_ratio x) = -frac (cons ((y + x)) f). -intros. -elim x - [elim y;reflexivity - |elim y;reflexivity - |elim y;reflexivity - ] -qed. - -theorem or_one_frac: \forall f,g. -rtimes (frac f) (frac g) = one \lor -\exists h.rtimes (frac f) (frac g) = frac h. -intros. -elim (rtimes (frac f) (frac g)) - [left.reflexivity - |right.apply (ex_intro ? ? f1).reflexivity - ] -qed. - -theorem one_to_rtimes_Zplus3: \forall x,y:Z.\forall f,g:fraction. -rtimes (frac f) (frac g) = one \to -rtimes (frac (cons x f)) (frac (cons y g)) = Z_to_ratio (x + y). -intros.simplify.simplify in H.rewrite > H.simplify. -reflexivity. -qed. - -theorem frac_to_rtimes_Zplus3: \forall x,y:Z.\forall f,g:fraction. -\forall h.rtimes (frac f) (frac g) = frac h \to -rtimes (frac (cons x f)) (frac (cons y g)) = frac (cons (x + y) h). -intros.simplify.simplify in H.rewrite > H.simplify. -reflexivity. -qed. - -theorem rtimes_Zplus3: \forall x,y:Z.\forall f,g:fraction. -(rtimes (frac f) (frac g) = one \land - rtimes (frac (cons x f)) (frac (cons y g)) = Z_to_ratio (x + y)) -\lor (\exists h.rtimes (frac f) (frac g) = frac h \land -rtimes (frac (cons x f)) (frac (cons y g)) = -frac (cons (x + y) h)). -intros. -simplify. -elim (rtimes (frac f) (frac g));simplify - [left.split;reflexivity - |right. - apply (ex_intro ? ? f1). - split;reflexivity - ] -qed. - -theorem Z_to_ratio_frac_frac: \forall z,f1,f2. -rtimes (rtimes (Z_to_ratio z) (frac f1)) (frac f2) -=rtimes (Z_to_ratio z) (rtimes (frac f1) (frac f2)). -intros 2.elim f1 - [elim f2 - [change with - (rtimes (rtimes (Z_to_ratio z) (Z_to_ratio (pos n))) (Z_to_ratio (pos n1)) - =rtimes (Z_to_ratio z) (rtimes (Z_to_ratio (pos n)) (Z_to_ratio (pos n1)))). - rewrite > rtimes_Zplus.rewrite > rtimes_Zplus. - rewrite > rtimes_Zplus.rewrite > rtimes_Zplus. - rewrite > assoc_Zplus.reflexivity - |change with - (rtimes (rtimes (Z_to_ratio z) (Z_to_ratio (pos n))) (Z_to_ratio (neg n1)) - =rtimes (Z_to_ratio z) (rtimes (Z_to_ratio (pos n)) (Z_to_ratio (neg n1)))). - rewrite > rtimes_Zplus.rewrite > rtimes_Zplus. - rewrite > rtimes_Zplus.rewrite > rtimes_Zplus. - rewrite > assoc_Zplus.reflexivity - |change with - (rtimes (rtimes (Z_to_ratio z) (Z_to_ratio (pos n))) (frac (cons z1 f)) - = rtimes (Z_to_ratio z) (rtimes (Z_to_ratio (pos n)) (frac (cons z1 f)))). - rewrite > rtimes_Zplus.rewrite > rtimes_Zplus1. - rewrite > rtimes_Zplus1.rewrite > rtimes_Zplus1. - rewrite > assoc_Zplus.reflexivity - ] - |elim f2 - [change with - (rtimes (rtimes (Z_to_ratio z) (Z_to_ratio (neg n))) (Z_to_ratio (pos n1)) - =rtimes (Z_to_ratio z) (rtimes (Z_to_ratio (neg n)) (Z_to_ratio (pos n1)))). - rewrite > rtimes_Zplus.rewrite > rtimes_Zplus. - rewrite > rtimes_Zplus.rewrite > rtimes_Zplus. - rewrite > assoc_Zplus.reflexivity - |change with - (rtimes (rtimes (Z_to_ratio z) (Z_to_ratio (neg n))) (Z_to_ratio (neg n1)) - =rtimes (Z_to_ratio z) (rtimes (Z_to_ratio (neg n)) (Z_to_ratio (neg n1)))). - rewrite > rtimes_Zplus.rewrite > rtimes_Zplus. - rewrite > rtimes_Zplus.rewrite > rtimes_Zplus. - rewrite > assoc_Zplus.reflexivity - |change with - (rtimes (rtimes (Z_to_ratio z) (Z_to_ratio (neg n))) (frac (cons z1 f)) - = rtimes (Z_to_ratio z) (rtimes (Z_to_ratio (neg n)) (frac (cons z1 f)))). - rewrite > rtimes_Zplus.rewrite > rtimes_Zplus1. - rewrite > rtimes_Zplus1.rewrite > rtimes_Zplus1. - rewrite > assoc_Zplus.reflexivity - ] - |elim f2 - [change with - (rtimes (rtimes (Z_to_ratio z) (frac (cons z1 f))) (Z_to_ratio (pos n)) - =rtimes (Z_to_ratio z) (rtimes (frac (cons z1 f)) (Z_to_ratio (pos n)))). - rewrite > rtimes_Zplus1.rewrite > rtimes_Zplus2. - rewrite > rtimes_Zplus2.rewrite > rtimes_Zplus1. - rewrite > assoc_Zplus.reflexivity - |change with - (rtimes (rtimes (Z_to_ratio z) (frac (cons z1 f))) (Z_to_ratio (neg n)) - =rtimes (Z_to_ratio z) (rtimes (frac (cons z1 f)) (Z_to_ratio (neg n)))). - rewrite > rtimes_Zplus1.rewrite > rtimes_Zplus2. - rewrite > rtimes_Zplus2.rewrite > rtimes_Zplus1. - rewrite > assoc_Zplus.reflexivity - |elim (or_one_frac f f3) - [rewrite > rtimes_Zplus1. - rewrite > (one_to_rtimes_Zplus3 ? ? ? ? H2). - rewrite > (one_to_rtimes_Zplus3 ? ? ? ? H2). - rewrite > rtimes_Zplus. - rewrite > assoc_Zplus.reflexivity - |elim H2.clear H2. - rewrite > rtimes_Zplus1. - rewrite > (frac_to_rtimes_Zplus3 ? ? ? ? a H3). - rewrite > (frac_to_rtimes_Zplus3 ? ? ? ? a H3). - rewrite > rtimes_Zplus1. - rewrite > assoc_Zplus.reflexivity - ] - ] - ] -qed. - -theorem cons_frac_frac: \forall f1,z,f,f2. -rtimes (rtimes (frac (cons z f)) (frac f1)) (frac f2) -=rtimes (frac (cons z f)) (rtimes (frac f1) (frac f2)). -intro.elim f1 - [elim f2 - [change with - (rtimes (rtimes (frac (cons z f)) (Z_to_ratio (pos n))) (Z_to_ratio (pos n1)) - =rtimes (frac (cons z f)) (rtimes (Z_to_ratio (pos n)) (Z_to_ratio (pos n1)))). - rewrite > rtimes_Zplus2.rewrite > rtimes_Zplus2. - rewrite > rtimes_Zplus.rewrite > rtimes_Zplus2. - rewrite > assoc_Zplus.reflexivity - |change with - (rtimes (rtimes (frac (cons z f)) (Z_to_ratio (pos n))) (Z_to_ratio (neg n1)) - =rtimes (frac (cons z f)) (rtimes (Z_to_ratio (pos n)) (Z_to_ratio (neg n1)))). - rewrite > rtimes_Zplus2.rewrite > rtimes_Zplus2. - rewrite > rtimes_Zplus.rewrite > rtimes_Zplus2. - rewrite > assoc_Zplus.reflexivity - |change with - (rtimes (rtimes (frac (cons z f)) (Z_to_ratio (pos n))) (frac (cons z1 f3)) - = rtimes (frac (cons z f)) (rtimes (Z_to_ratio (pos n)) (frac (cons z1 f3)))). - rewrite > rtimes_Zplus2.rewrite > rtimes_Zplus1. - elim (or_one_frac f f3) - [rewrite > (one_to_rtimes_Zplus3 ? ? ? ? H1). - rewrite > (one_to_rtimes_Zplus3 ? ? ? ? H1). - rewrite > assoc_Zplus.reflexivity - |elim H1.clear H1. - rewrite > (frac_to_rtimes_Zplus3 ? ? ? ? a H2). - rewrite > (frac_to_rtimes_Zplus3 ? ? ? ? a H2). - rewrite > assoc_Zplus.reflexivity - ] - ] - |elim f2 - [change with - (rtimes (rtimes (frac (cons z f)) (Z_to_ratio (neg n))) (Z_to_ratio (pos n1)) - =rtimes (frac (cons z f)) (rtimes (Z_to_ratio (neg n)) (Z_to_ratio (pos n1)))). - rewrite > rtimes_Zplus2.rewrite > rtimes_Zplus2. - rewrite > rtimes_Zplus.rewrite > rtimes_Zplus2. - rewrite > assoc_Zplus.reflexivity - |change with - (rtimes (rtimes (frac (cons z f)) (Z_to_ratio (neg n))) (Z_to_ratio (neg n1)) - =rtimes (frac (cons z f)) (rtimes (Z_to_ratio (neg n)) (Z_to_ratio (neg n1)))). - rewrite > rtimes_Zplus2.rewrite > rtimes_Zplus2. - rewrite > rtimes_Zplus.rewrite > rtimes_Zplus2. - rewrite > assoc_Zplus.reflexivity - |change with - (rtimes (rtimes (frac (cons z f)) (Z_to_ratio (neg n))) (frac (cons z1 f3)) - = rtimes (frac (cons z f)) (rtimes (Z_to_ratio (neg n)) (frac (cons z1 f3)))). - rewrite > rtimes_Zplus2.rewrite > rtimes_Zplus1. - elim (or_one_frac f f3) - [rewrite > (one_to_rtimes_Zplus3 ? ? ? ? H1). - rewrite > (one_to_rtimes_Zplus3 ? ? ? ? H1). - rewrite > assoc_Zplus.reflexivity - |elim H1.clear H1. - rewrite > (frac_to_rtimes_Zplus3 ? ? ? ? a H2). - rewrite > (frac_to_rtimes_Zplus3 ? ? ? ? a H2). - rewrite > assoc_Zplus.reflexivity - ] - ] - |elim f3 - [change with - (rtimes (rtimes (frac (cons z1 f2)) (frac (cons z f))) (Z_to_ratio (pos n)) - =rtimes (frac (cons z1 f2)) (rtimes (frac (cons z f)) (Z_to_ratio (pos n)))). - rewrite > rtimes_Zplus2. - elim (or_one_frac f2 f) - [rewrite > (one_to_rtimes_Zplus3 ? ? ? ? H1). - rewrite > (one_to_rtimes_Zplus3 ? ? ? ? H1). - rewrite > rtimes_Zplus. - rewrite > assoc_Zplus.reflexivity - |elim H1.clear H1. - rewrite > (frac_to_rtimes_Zplus3 ? ? ? ? a H2). - rewrite > (frac_to_rtimes_Zplus3 ? ? ? ? a H2). - rewrite > rtimes_Zplus2. - rewrite > assoc_Zplus.reflexivity - ] - |change with - (rtimes (rtimes (frac (cons z1 f2)) (frac (cons z f))) (Z_to_ratio (neg n)) - =rtimes (frac (cons z1 f2)) (rtimes (frac (cons z f)) (Z_to_ratio (neg n)))). - rewrite > rtimes_Zplus2. - elim (or_one_frac f2 f) - [rewrite > (one_to_rtimes_Zplus3 ? ? ? ? H1). - rewrite > (one_to_rtimes_Zplus3 ? ? ? ? H1). - rewrite > rtimes_Zplus. - rewrite > assoc_Zplus.reflexivity - |elim H1.clear H1. - rewrite > (frac_to_rtimes_Zplus3 ? ? ? ? a H2). - rewrite > (frac_to_rtimes_Zplus3 ? ? ? ? a H2). - rewrite > rtimes_Zplus2. - rewrite > assoc_Zplus.reflexivity - ] - |elim (or_one_frac f2 f) - [rewrite > (one_to_rtimes_Zplus3 ? ? ? ? H2). - rewrite > rtimes_Zplus1. - elim (or_one_frac f f4) - [rewrite > (one_to_rtimes_Zplus3 ? ? ? ? H3). - rewrite > rtimes_Zplus2. - cut (f4 = f2) - [rewrite > Hcut. - rewrite > assoc_Zplus.reflexivity - |apply injective_frac. - rewrite < rtimes_onel. - rewrite < H2. - (* problema inaspettato: mi serve l'unicita' dell'inversa, - che richiede (?) l'associativita. Per fortuna basta - l'ipotesi induttiva. *) - cases f2 - [change with - (rtimes (rtimes (Z_to_ratio (pos n)) (frac f)) (frac f4)=Z_to_ratio (pos n)). - rewrite > Z_to_ratio_frac_frac. - rewrite > H3. - rewrite > rtimes_oner. - reflexivity - |change with - (rtimes (rtimes (Z_to_ratio (neg n)) (frac f)) (frac f4)=Z_to_ratio (neg n)). - rewrite > Z_to_ratio_frac_frac. - rewrite > H3. - rewrite > rtimes_oner. - reflexivity - |rewrite > H. - rewrite > H3. - rewrite > rtimes_oner. - reflexivity - ] - ] - |elim H3.clear H3. - rewrite > (frac_to_rtimes_Zplus3 ? ? ? ? a H4). - cut (rtimes (frac f2) (frac a) = frac f4) - [rewrite > (frac_to_rtimes_Zplus3 ? ? ? ? f4 Hcut). - rewrite > assoc_Zplus.reflexivity - |rewrite < H4. - generalize in match H2. - cases f2;intro - [change with - (rtimes (Z_to_ratio (pos n)) (rtimes (frac f)(frac f4)) =frac f4). - rewrite < Z_to_ratio_frac_frac. - rewrite > H3. - rewrite > rtimes_onel. - reflexivity - |change with - (rtimes (Z_to_ratio (neg n)) (rtimes (frac f)(frac f4)) =frac f4). - rewrite < Z_to_ratio_frac_frac. - rewrite > H3. - rewrite > rtimes_onel. - reflexivity - |rewrite < H. - rewrite > H3. - rewrite > rtimes_onel. - reflexivity - ] - ] - ] - |elim H2.clear H2. - rewrite > (frac_to_rtimes_Zplus3 ? ? ? ? a H3). - elim (or_one_frac f f4) - [rewrite > (one_to_rtimes_Zplus3 ? ? ? ? H2). - rewrite > rtimes_Zplus2. - cut (rtimes (frac a) (frac f4) = frac f2) - [rewrite > (frac_to_rtimes_Zplus3 ? ? ? ? f2 Hcut). - rewrite > assoc_Zplus.reflexivity - |rewrite < H3. - generalize in match H2. - cases f2;intro - [change with - (rtimes (rtimes (Z_to_ratio (pos n)) (frac f)) (frac f4)=Z_to_ratio (pos n)). - rewrite > Z_to_ratio_frac_frac. - rewrite > H4. - rewrite > rtimes_oner. - reflexivity - |change with - (rtimes (rtimes (Z_to_ratio (neg n)) (frac f)) (frac f4)=Z_to_ratio (neg n)). - rewrite > Z_to_ratio_frac_frac. - rewrite > H4. - rewrite > rtimes_oner. - reflexivity - |rewrite > H. - rewrite > H4. - rewrite > rtimes_oner. - reflexivity - ] - ] - |elim H2.clear H2. - rewrite > (frac_to_rtimes_Zplus3 ? ? ? ? a1 H4). - elim (or_one_frac a f4) - [rewrite > (one_to_rtimes_Zplus3 ? ? ? ? H2). - cut (rtimes (frac f2) (frac a1) = one) - [rewrite > (one_to_rtimes_Zplus3 ? ? ? ? Hcut). - rewrite > assoc_Zplus.reflexivity - |rewrite < H4. - generalize in match H3. - cases f2;intro - [change with - (rtimes (Z_to_ratio (pos n)) (rtimes (frac f)(frac f4)) = one). - rewrite < Z_to_ratio_frac_frac. - rewrite > H5. - assumption - |change with - (rtimes (Z_to_ratio (neg n)) (rtimes (frac f)(frac f4)) = one). - rewrite < Z_to_ratio_frac_frac. - rewrite > H5. - assumption - |rewrite < H. - rewrite > H5. - assumption - ] - ] - |elim H2.clear H2. - rewrite > (frac_to_rtimes_Zplus3 ? ? ? ? a2 H5). - cut (rtimes (frac f2) (frac a1) = frac a2) - [rewrite > (frac_to_rtimes_Zplus3 ? ? ? ? a2 Hcut). - rewrite > assoc_Zplus.reflexivity - |rewrite < H4. - generalize in match H3. - cases f2;intro - [change with - (rtimes (Z_to_ratio (pos n)) (rtimes (frac f)(frac f4)) = frac a2). - rewrite < Z_to_ratio_frac_frac. - rewrite > H2. - assumption - |change with - (rtimes (Z_to_ratio (neg n)) (rtimes (frac f)(frac f4)) = frac a2). - rewrite < Z_to_ratio_frac_frac. - rewrite > H2. - assumption - |rewrite < H. - rewrite > H2. - assumption - ] - ] - ] - ] - ] - ] - ] -qed. - -theorem frac_frac_fracaux: \forall f,f1,f2. -rtimes (rtimes (frac f) (frac f1)) (frac f2) -=rtimes (frac f) (rtimes (frac f1) (frac f2)). -intros. -cases f - [change with - (rtimes (rtimes (Z_to_ratio (pos n)) (frac f1)) (frac f2) - =rtimes (Z_to_ratio (pos n)) (rtimes (frac f1) (frac f2))). - apply Z_to_ratio_frac_frac - |change with - (rtimes (rtimes (Z_to_ratio (neg n)) (frac f1)) (frac f2) - =rtimes (Z_to_ratio (neg n)) (rtimes (frac f1) (frac f2))). - apply Z_to_ratio_frac_frac - |apply cons_frac_frac - ] -qed. - -theorem associative_rtimes:associative ? rtimes. -unfold.intros. -cases x - [reflexivity - |cases y - [reflexivity. - |cases z - [rewrite > rtimes_oner.rewrite > rtimes_oner.reflexivity - |apply frac_frac_fracaux - ] - ] - ] -qed. - -theorem associative_Qtimes:associative ? Qtimes. -unfold.intros. -cases x - [reflexivity - (* non posso scrivere 2,3: ... ?? *) - |cases y - [reflexivity. - |cases z - [reflexivity - |simplify.rewrite > associative_rtimes. - reflexivity. - |simplify.rewrite > associative_rtimes. - reflexivity - ] - |cases z - [reflexivity - |simplify.rewrite > associative_rtimes. - reflexivity. - |simplify.rewrite > associative_rtimes. - reflexivity - ] - ] - |cases y - [reflexivity. - |cases z - [reflexivity - |simplify.rewrite > associative_rtimes. - reflexivity. - |simplify.rewrite > associative_rtimes. - reflexivity - ] - |cases z - [reflexivity - |simplify.rewrite > associative_rtimes. - reflexivity. - |simplify.rewrite > associative_rtimes. - reflexivity - ] - ] - ] -qed. - -theorem Qtimes_OQ: \forall q.Qtimes q OQ = OQ. -intro.cases q;reflexivity. -qed. - -theorem symmetric_Qtimes: symmetric ? Qtimes. -unfold.intros. -cases x - [simplify in ⊢ (? ? % ?).rewrite > Qtimes_OQ.reflexivity - |elim y - [reflexivity - |simplify.rewrite > symmetric_rtimes.reflexivity - |simplify.rewrite > symmetric_rtimes.reflexivity - ] - |elim y - [reflexivity - |simplify.rewrite > symmetric_rtimes.reflexivity - |simplify.rewrite > symmetric_rtimes.reflexivity - ] - ] -qed. - -theorem Qtimes_Qinv: \forall q. q \neq OQ \to Qtimes q (Qinv q) = Qone. -intro. -cases q;intro - [elim H.reflexivity - |simplify.rewrite > rtimes_rinv.reflexivity - |simplify.rewrite > rtimes_rinv.reflexivity - ] -qed. - -theorem eq_Qtimes_OQ_to_eq_OQ: \forall p,q. -Qtimes p q = OQ \to p = OQ \lor q = OQ. -intros 2. -cases p - [intro.left.reflexivity - |cases q - [intro.right.reflexivity - |simplify.intro.destruct H - |simplify.intro.destruct H - ] - |cases q - [intro.right.reflexivity - |simplify.intro.destruct H - |simplify.intro.destruct H - ] - ] -qed. - -theorem Qinv_Qtimes: \forall p,q. -p \neq OQ \to q \neq OQ \to -Qinv(Qtimes p q) = -Qtimes (Qinv p) (Qinv q). -intros. -rewrite < Qtimes_Qone_q in ⊢ (? ? ? %). -rewrite < (Qtimes_Qinv (Qtimes p q)) - [lapply (Qtimes_Qinv ? H). - lapply (Qtimes_Qinv ? H1). - rewrite > symmetric_Qtimes in ⊢ (? ? ? (? % ?)). - rewrite > associative_Qtimes. - rewrite > associative_Qtimes. - rewrite < associative_Qtimes in ⊢ (? ? ? (? ? (? ? %))). - rewrite < symmetric_Qtimes in ⊢ (? ? ? (? ? (? ? (? % ?)))). - rewrite > associative_Qtimes in ⊢ (? ? ? (? ? (? ? %))). - rewrite > Hletin1. - rewrite > Qtimes_q_Qone. - rewrite > Hletin. - rewrite > Qtimes_q_Qone. - reflexivity - |intro. - elim (eq_Qtimes_OQ_to_eq_OQ ? ? H2) - [apply (H H3)|apply (H1 H3)] - ] -qed. - -(* a stronger version, taking advantage of inv(O) = O *) -theorem Qinv_Qtimes': \forall p,q. -Qinv(Qtimes p q) = -Qtimes (Qinv p) (Qinv q). -intros. -cases p - [reflexivity - |cases q - [reflexivity - |apply Qinv_Qtimes;intro;destruct H - |apply Qinv_Qtimes;intro;destruct H - ] - |cases q - [reflexivity - |apply Qinv_Qtimes;intro;destruct H - |apply Qinv_Qtimes;intro;destruct H - ] - ] -qed. - theorem Qtimes_frac_frac: \forall p,q,r,s. Qtimes (frac p q) (frac r s) = (frac (p*r) (q*s)). intros. @@ -762,7 +50,7 @@ rewrite < Qinv_Qtimes'. rewrite < times_Qtimes. reflexivity. qed. - +*) (* la prova seguente e' tutta una ripetizione. Sistemare. *) (*CSC @@ -886,12 +174,6 @@ definition numQ:Q \to nat \def definition denomQ:Q \to nat \def \lambda q. defactorize (numeratorQ (Qinv q)). -definition Qopp:Q \to Q \def \lambda q. -match q with -[OQ \Rightarrow OQ -|Qpos q \Rightarrow Qneg q -|Qneg q \Rightarrow Qpos q -]. (*CSC theorem frac_numQ_denomQ1: \forall r:ratio. frac (numQ (Qpos r)) (denomQ (Qpos r)) = (Qpos r).