]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/matita/library/nat/gcd.ma
huge commit in automation:
[helm.git] / helm / software / matita / library / nat / gcd.ma
index 9bbce8144ff8885a7c7346bdb9b7937983bd5f7e..395b24248f692366330c48ec002ed5c82bb095bd 100644 (file)
@@ -12,8 +12,6 @@
 (*                                                                        *)
 (**************************************************************************)
 
-set "baseuri" "cic:/matita/nat/gcd".
-
 include "nat/primes.ma".
 include "nat/lt_arith.ma".
 
@@ -57,7 +55,7 @@ qed.
 theorem divides_mod_to_divides: \forall p,m,n:nat. O < n \to
 p \divides (m \mod n) \to p \divides n \to p \divides m. 
 intros.elim H1.elim H2.
-apply (witness p m ((n1*(m / n))+n2)).
+apply (witness p m ((n2*(m / n))+n1)).
 rewrite > distr_times_plus.
 rewrite < H3.
 rewrite < assoc_times.
@@ -101,7 +99,6 @@ qed.
 theorem divides_gcd_nm: \forall n,m.
 gcd n m \divides m \land gcd n m \divides n.
 intros.
-(*CSC: simplify simplifies too much because of a redex in gcd *)
 change with
 (match leb n m with
   [ true \Rightarrow 
@@ -594,7 +591,6 @@ intro.apply (nat_case n)
 qed.
 
 theorem symmetric_gcd: symmetric nat gcd.
-(*CSC: bug here: unfold symmetric does not work *)
 change with 
 (\forall n,m:nat. gcd n m = gcd m n).
 intros.
@@ -656,9 +652,9 @@ elim H2.
 generalize in match H1.
 rewrite > H3.
 intro.
-cut (O < n2)
-  [elim (gcd_times_SO_to_gcd_SO n n n2 ? ? H4)
-    [cut (gcd n (n*n2) = n)
+cut (O < n1)
+  [elim (gcd_times_SO_to_gcd_SO n n n1 ? ? H4)
+    [cut (gcd n (n*n1) = n)
       [apply (lt_to_not_eq (S O) n)
         [assumption|rewrite < H4.assumption]
       |apply gcd_n_times_nm.assumption
@@ -666,7 +662,7 @@ cut (O < n2)
     |apply (trans_lt ? (S O))[apply le_n|assumption]
     |assumption
     ]
-  |elim (le_to_or_lt_eq O n2 (le_O_n n2));
+  |elim (le_to_or_lt_eq O n1 (le_O_n n1));
     [assumption
     |apply False_ind.
      apply (le_to_not_lt n (S O))
@@ -674,7 +670,7 @@ cut (O < n2)
        apply divides_to_le
         [rewrite > H4.apply lt_O_S
         |apply divides_d_gcd
-          [apply (witness ? ? n2).reflexivity
+          [apply (witness ? ? n1).reflexivity
           |apply divides_n_n
           ]
         ]
@@ -762,15 +758,11 @@ cut (n \divides p \lor n \ndivides p)
          [(* first case *)
           rewrite > (times_n_SO q).rewrite < H5.
           rewrite > distr_times_minus.
+          elim H1. autobatch;
+          (*
           rewrite > (sym_times q (a1*p)).
           rewrite > (assoc_times a1).
-          elim H1.
-          (*
-             rewrite > H6.
-             applyS (witness n (n*(q*a-a1*n2)) (q*a-a1*n2))
-             reflexivity. *);
-          applyS (witness n ? ? (refl_eq ? ?)) (* timeout=50 *).
-          (*
+          applyS (witness n ? ? (refl_eq ? ?)).          
           rewrite < (sym_times n).rewrite < assoc_times.
           rewrite > (sym_times q).rewrite > assoc_times.
           rewrite < (assoc_times a1).rewrite < (sym_times n).
@@ -781,14 +773,18 @@ cut (n \divides p \lor n \ndivides p)
          |(* second case *)
           rewrite > (times_n_SO q).rewrite < H5.
           rewrite > distr_times_minus.
+          elim H1. autobatch;
+          (*
           rewrite > (sym_times q (a1*p)).
           rewrite > (assoc_times a1).
-          elim H1.rewrite > H6.
+          rewrite > H6.
+          applyS (witness n ? ? (refl_eq ? ?)).
           rewrite < sym_times.rewrite > assoc_times.
           rewrite < (assoc_times q).
           rewrite < (sym_times n).
           rewrite < distr_times_minus.
-          apply (witness ? ? (n2*a1-q*a)).reflexivity
+          apply (witness ? ? (n1*a1-q*a)).reflexivity
+          *)
         ](* end second case *)
      |rewrite < (prime_to_gcd_SO n p)
        [apply eq_minus_gcd|assumption|assumption
@@ -886,14 +882,14 @@ cut (n \divides p \lor n \ndivides p)
           rewrite > distr_times_minus.
           rewrite > (sym_times p (a1*m)).
           rewrite > (assoc_times a1).
-          elim H2.
+          elim H2.rewrite > H7. 
           applyS (witness n ? ? (refl_eq ? ?)) (* timeout=50 *).
          |(* second case *)
           rewrite > (times_n_SO p).rewrite < H6.
           rewrite > distr_times_minus.
           rewrite > (sym_times p (a1*m)).
           rewrite > (assoc_times a1).
-          elim H2.
+          elim H2.rewrite > H7.
           applyS (witness n ? ? (refl_eq ? ?)).
         ](* end second case *)
      |rewrite < H1.apply eq_minus_gcd.
@@ -904,3 +900,35 @@ cut (n \divides p \lor n \ndivides p)
  ]
 qed.
 
+(*
+theorem divides_to_divides_times1: \forall p,q,n. prime p \to prime q \to p \neq q \to
+divides p n \to divides q n \to divides (p*q) n.
+intros.elim H3.
+rewrite > H5 in H4.
+elim (divides_times_to_divides ? ? ? H1 H4)
+  [elim H.apply False_ind.
+   apply H2.apply sym_eq.apply H8
+    [assumption
+    |apply prime_to_lt_SO.assumption
+    ]
+  |elim H6.
+   apply (witness ? ? n1).
+   rewrite > assoc_times.
+   rewrite < H7.assumption
+  ]
+qed.
+*)
+
+theorem divides_to_divides_times: \forall p,q,n. prime p  \to p \ndivides q \to
+divides p n \to divides q n \to divides (p*q) n.
+intros.elim H3.
+rewrite > H4 in H2.
+elim (divides_times_to_divides ? ? ? H H2)
+  [apply False_ind.apply H1.assumption
+  |elim H5.  
+   apply (witness ? ? n2).
+   rewrite > sym_times in ⊢ (? ? ? (? % ?)).
+   rewrite > assoc_times.
+   rewrite < H6.assumption
+  ]
+qed.
\ No newline at end of file