# HG changeset patch # User haftmann # Date 1664874758 0 # Node ID c9ea813f92f217b965b2c303bfee793542385a99 # Parent 4111c94657b4fc5404bf01c18be57750ea789c9f tuned proof diff -r 4111c94657b4 -r c9ea813f92f2 src/HOL/Euclidean_Division.thy --- a/src/HOL/Euclidean_Division.thy Tue Oct 04 09:12:34 2022 +0000 +++ b/src/HOL/Euclidean_Division.thy Tue Oct 04 09:12:38 2022 +0000 @@ -1411,7 +1411,7 @@ using div_less_iff_less_mult [of q n m] that by auto lemma div_Suc: - \Suc m div n = (if Suc m mod n = 0 then Suc (m div n) else m div n)\ (is "_ = ?rhs") + \Suc m div n = (if Suc m mod n = 0 then Suc (m div n) else m div n)\ proof (cases \n = 0 \ n = 1\) case True then show ?thesis by auto @@ -1419,34 +1419,15 @@ case False then have \n > 1\ by simp - then have *: \Suc 0 div n = 0\ - by (simp add: div_eq_0_iff) - have \(m + 1) div n = ?rhs\ + then have \Suc m div n = m div n + Suc (m mod n) div n\ + using div_add1_eq [of m 1 n] by simp + also have \Suc (m mod n) div n = of_bool (n dvd Suc m)\ proof (cases \n dvd Suc m\) - case True - then obtain q where \Suc m = n * q\ .. - then have m: \m = n * q - 1\ - by simp - have \q > 0\ by (rule ccontr) - (use \Suc m = n * q\ in simp) - from m have \m mod n = (n * q - 1) mod n\ - by simp - also have \\ = (n * q - 1 + n) mod n\ - by simp - also have \n * q - 1 + n = n * q + (n - 1)\ - using \n > 1\ \q > 0\ by (simp add: algebra_simps) - finally have \m mod n = (n - 1) mod n\ - by simp - with \n > 1\ have \m mod n = n - 1\ - by simp - with True \n > 1\ show ?thesis - by (subst div_add1_eq) auto - next case False - have \Suc (m mod n) \ n\ + moreover have \Suc (m mod n) \ n\ proof (rule ccontr) assume \\ Suc (m mod n) \ n\ - then have \m mod n = n - 1\ + then have \m mod n = n - Suc 0\ by simp with \n > 1\ have \(m + 1) mod n = 0\ by (subst mod_add_left_eq [symmetric]) simp @@ -1456,28 +1437,35 @@ qed moreover have \Suc (m mod n) \ n\ using \n > 1\ by (simp add: Suc_le_eq) - ultimately have \Suc (m mod n) < n\ + ultimately show ?thesis + by (simp add: div_eq_0_iff) + next + case True + then obtain q where q: \Suc m = n * q\ .. + moreover have \q > 0\ by (rule ccontr) + (use q in simp) + ultimately have \m mod n = n - Suc 0\ + using \n > 1\ mult_le_cancel1 [of n \Suc 0\ q] + by (auto intro: mod_nat_eqI) + with True \n > 1\ show ?thesis by simp - with False \n > 1\ show ?thesis - by (subst div_add1_eq) (auto simp add: div_eq_0_iff mod_greater_zero_iff_not_dvd) qed - then show ?thesis - by simp + finally show ?thesis + by (simp add: mod_greater_zero_iff_not_dvd) qed lemma mod_Suc: - \Suc m mod n = (if Suc (m mod n) = n then 0 else Suc (m mod n))\ (is "_ = ?rhs") -proof (cases "n = 0") + \Suc m mod n = (if Suc (m mod n) = n then 0 else Suc (m mod n))\ +proof (cases \n = 0\) case True then show ?thesis by simp next case False - have "Suc m mod n = Suc (m mod n) mod n" + moreover have \Suc m mod n = Suc (m mod n) mod n\ by (simp add: mod_simps) - also have "\ = ?rhs" - using False by (auto intro!: mod_nat_eqI intro: neq_le_trans simp add: Suc_le_eq) - finally show ?thesis . + ultimately show ?thesis + by (auto intro!: mod_nat_eqI intro: neq_le_trans simp add: Suc_le_eq) qed lemma Suc_times_mod_eq: