diff -r 413a86331bf6 -r 898034c8a799 src/HOL/Algebra/Sylow.thy --- a/src/HOL/Algebra/Sylow.thy Wed Jun 19 10:20:35 2024 +0200 +++ b/src/HOL/Algebra/Sylow.thy Wed Jun 19 12:13:16 2024 +0200 @@ -10,9 +10,8 @@ text \The combinatorial argument is in theory \Exponent\.\ -lemma le_extend_mult: "\0 < c; a \ b\ \ a \ b * c" - for c :: nat - by (metis divisors_zero dvd_triv_left leI less_le_trans nat_dvd_not_less zero_less_iff_neq_zero) +lemma le_extend_mult: "\0 < c; a \ b\ \ a \ b * c" for c :: nat + using gr0_conv_Suc by fastforce locale sylow = group + fixes p and a and m and calM and RelM @@ -30,15 +29,9 @@ by (auto simp: refl_on_def RelM_def calM_def) (blast intro!: coset_mult_one [symmetric]) lemma RelM_sym: "sym RelM" -proof (unfold sym_def RelM_def, clarify) - fix y g - assume "y \ calM" - and g: "g \ carrier G" - then have "y = y #> g #> (inv g)" - by (simp add: coset_mult_assoc calM_def) - then show "\g'\carrier G. y = y #> g #> g'" - by (blast intro: g) -qed + unfolding sym_def RelM_def calM_def + using coset_mult_assoc coset_mult_one r_inv_ex + by (smt (verit, best) case_prod_conv mem_Collect_eq) lemma RelM_trans: "trans RelM" by (auto simp add: trans_def RelM_def calM_def coset_mult_assoc) @@ -62,14 +55,13 @@ begin lemma M_subset_calM: "M \ calM" - by (rule M_in_quot [THEN M_subset_calM_prep]) + by (simp add: M_in_quot M_subset_calM_prep) lemma card_M1: "card M1 = p^a" using M1_in_M M_subset_calM calM_def by blast lemma exists_x_in_M1: "\x. x \ M1" - using prime_p [THEN prime_gt_Suc_0_nat] card_M1 - by (metis Suc_lessD card_eq_0_iff empty_subsetI equalityI gr_implies_not0 nat_zero_less_power_iff subsetI) + using prime_p [THEN prime_gt_Suc_0_nat] card_M1 one_in_subset by fastforce lemma M1_subset_G [simp]: "M1 \ carrier G" using M1_in_M M_subset_calM calM_def mem_Collect_eq subsetCE by blast @@ -77,25 +69,14 @@ lemma M1_inj_H: "\f \ H\M1. inj_on f H" proof - from exists_x_in_M1 obtain m1 where m1M: "m1 \ M1".. - have m1: "m1 \ carrier G" - by (simp add: m1M M1_subset_G [THEN subsetD]) show ?thesis proof - show "inj_on (\z\H. m1 \ z) H" - by (simp add: H_def inj_on_def m1) + have "m1 \ carrier G" + by (simp add: m1M M1_subset_G [THEN subsetD]) + then show "inj_on (\z\H. m1 \ z) H" + by (simp add: H_def inj_on_def) show "restrict ((\) m1) H \ H \ M1" - proof (rule restrictI) - fix z - assume zH: "z \ H" - show "m1 \ z \ M1" - proof - - from zH - have zG: "z \ carrier G" and M1zeq: "M1 #> z = M1" - by (auto simp add: H_def) - show ?thesis - by (rule subst [OF M1zeq]) (simp add: m1M zG rcosI) - qed - qed + using H_def m1M rcosI by auto qed qed @@ -108,7 +89,7 @@ begin lemma EmptyNotInEquivSet: "{} \ calM // RelM" - by (blast elim!: quotientE dest: RelM_equiv [THEN equiv_class_self]) + using RelM_equiv in_quotient_imp_non_empty by blast lemma existsM1inM: "M \ calM // RelM \ \M1. M1 \ M" using RelM_equiv equiv_Eps_in by blast @@ -131,10 +112,8 @@ with zero_less_card_calM prime_p have "Suc (multiplicity p m) \ multiplicity p (card calM)" by (intro multiplicity_geI) auto - then have "multiplicity p m < multiplicity p (card calM)" by simp - also have "multiplicity p m = multiplicity p (card calM)" - by (simp add: const_p_fac prime_p zero_less_m card_calM) - finally show False by simp + then show False + by (simp add: card_calM const_p_fac prime_p zero_less_m) qed lemma finite_calM: "finite calM" @@ -171,7 +150,7 @@ show "H \ carrier G" using H_into_carrier_G by blast show "\a. a \ H \ inv a \ H" - by (metis H_I H_into_carrier_G H_m_closed M1_subset_G Units_eq Units_inv_closed Units_inv_inv coset_mult_inv1 in_H_imp_eq) + by (metis H_I H_into_carrier_G M1_subset_G coset_mult_assoc coset_mult_one in_H_imp_eq inv_closed r_inv) show "\a b. \a \ H; b \ H\ \ a \ b \ H" by (blast intro: H_m_closed) qed (use H_not_empty in auto) @@ -237,12 +216,12 @@ assume eq: "H #> ?inv x = H #> ?inv y" and xy: "x \ M" "y \ M" have "x = M1 #> ?inv x" by (simp add: M_elem_map_eq \x \ M\) - also have "... = M1 #> ?inv y" + also have "\ = M1 #> ?inv y" proof (rule coset_mult_inv1 [OF in_H_imp_eq [OF coset_join1]]) show "H #> ?inv x \ inv (?inv y) = H" by (simp add: H_into_carrier_G M_elem_map_carrier xy coset_mult_inv2 eq subsetI) qed (simp_all add: H_is_subgroup M_elem_map_carrier xy) - also have "... = y" + also have "\ = y" using M_elem_map_eq \y \ M\ by simp finally show "x=y" . qed @@ -279,7 +258,7 @@ assume eq: "M1 #> ?inv x = M1 #> ?inv y" and xy: "x \ rcosets H" "y \ rcosets H" have "x = H #> ?inv x" by (simp add: H_elem_map_eq \x \ rcosets H\) - also have "... = H #> ?inv y" + also have "\ = H #> ?inv y" proof (rule coset_mult_inv1 [OF coset_join2]) show "?inv x \ inv (?inv y) \ carrier G" by (simp add: H_elem_map_carrier \x \ rcosets H\ \y \ rcosets H\) @@ -288,7 +267,7 @@ show "H \ carrier G" by (simp add: H_is_subgroup subgroup.subset) qed (simp_all add: H_is_subgroup H_elem_map_carrier xy) - also have "... = y" + also have "\ = y" by (simp add: H_elem_map_eq \y \ rcosets H\) finally show "x=y" . qed @@ -305,7 +284,7 @@ lemma cardMeqIndexH: "card M = card (rcosets H)" using inj_M_GmodH inj_GmodH_M - by (blast intro: card_bij finite_M H_is_subgroup rcosets_subset_PowG [THEN finite_subset]) + by (metis H_is_subgroup card_bij finite_G finite_M finite_UnionD rcosets_part_G) lemma index_lem: "card M * card H = order G" by (simp add: cardMeqIndexH lagrange H_is_subgroup) @@ -314,9 +293,10 @@ proof (rule antisym) show "p^a \ card H" proof (rule dvd_imp_le) - show "p ^ a dvd card H" - apply (rule div_combine [OF prime_imp_prime_elem[OF prime_p] not_dvd_M]) + have "p ^ (a + multiplicity p m) dvd card M * card H" by (simp add: index_lem multiplicity_dvd order_G power_add) + then show "p ^ a dvd card H" + using div_combine not_dvd_M prime_p by blast show "0 < card H" by (blast intro: subgroup.finite_imp_card_positive H_is_subgroup) qed