43 assumes "comm_monoid G" |
42 assumes "comm_monoid G" |
44 assumes cancel: |
43 assumes cancel: |
45 "\<And>a b c. \<lbrakk>a \<otimes> c = b \<otimes> c; a \<in> carrier G; b \<in> carrier G; c \<in> carrier G\<rbrakk> \<Longrightarrow> a = b" |
44 "\<And>a b c. \<lbrakk>a \<otimes> c = b \<otimes> c; a \<in> carrier G; b \<in> carrier G; c \<in> carrier G\<rbrakk> \<Longrightarrow> a = b" |
46 shows "comm_monoid_cancel G" |
45 shows "comm_monoid_cancel G" |
47 proof - |
46 proof - |
48 interpret comm_monoid [G] by fact |
47 interpret comm_monoid G by fact |
49 show "comm_monoid_cancel G" |
48 show "comm_monoid_cancel G" |
50 apply unfold_locales |
49 apply unfold_locales |
51 apply (subgoal_tac "a \<otimes> c = b \<otimes> c") |
50 apply (subgoal_tac "a \<otimes> c = b \<otimes> c") |
52 apply (iprover intro: cancel) |
51 apply (iprover intro: cancel) |
53 apply (simp add: m_comm) |
52 apply (simp add: m_comm) |
753 and carr: "x \<in> carrier G" "x' \<in> carrier G" "y \<in> carrier G" |
752 and carr: "x \<in> carrier G" "x' \<in> carrier G" "y \<in> carrier G" |
754 shows "properfactor G x' y" |
753 shows "properfactor G x' y" |
755 using pf |
754 using pf |
756 unfolding properfactor_lless |
755 unfolding properfactor_lless |
757 proof - |
756 proof - |
758 interpret weak_partial_order ["division_rel G"] .. |
757 interpret weak_partial_order "division_rel G" .. |
759 from x'x |
758 from x'x |
760 have "x' .=\<^bsub>division_rel G\<^esub> x" by simp |
759 have "x' .=\<^bsub>division_rel G\<^esub> x" by simp |
761 also assume "x \<sqsubset>\<^bsub>division_rel G\<^esub> y" |
760 also assume "x \<sqsubset>\<^bsub>division_rel G\<^esub> y" |
762 finally |
761 finally |
763 show "x' \<sqsubset>\<^bsub>division_rel G\<^esub> y" by (simp add: carr) |
762 show "x' \<sqsubset>\<^bsub>division_rel G\<^esub> y" by (simp add: carr) |
769 and carr: "x \<in> carrier G" "y \<in> carrier G" "y' \<in> carrier G" |
768 and carr: "x \<in> carrier G" "y \<in> carrier G" "y' \<in> carrier G" |
770 shows "properfactor G x y'" |
769 shows "properfactor G x y'" |
771 using pf |
770 using pf |
772 unfolding properfactor_lless |
771 unfolding properfactor_lless |
773 proof - |
772 proof - |
774 interpret weak_partial_order ["division_rel G"] .. |
773 interpret weak_partial_order "division_rel G" .. |
775 assume "x \<sqsubset>\<^bsub>division_rel G\<^esub> y" |
774 assume "x \<sqsubset>\<^bsub>division_rel G\<^esub> y" |
776 also from yy' |
775 also from yy' |
777 have "y .=\<^bsub>division_rel G\<^esub> y'" by simp |
776 have "y .=\<^bsub>division_rel G\<^esub> y'" by simp |
778 finally |
777 finally |
779 show "x \<sqsubset>\<^bsub>division_rel G\<^esub> y'" by (simp add: carr) |
778 show "x \<sqsubset>\<^bsub>division_rel G\<^esub> y'" by (simp add: carr) |
2914 subsubsection {* Gcd condition *} |
2913 subsubsection {* Gcd condition *} |
2915 |
2914 |
2916 lemma (in gcd_condition_monoid) division_weak_lower_semilattice [simp]: |
2915 lemma (in gcd_condition_monoid) division_weak_lower_semilattice [simp]: |
2917 shows "weak_lower_semilattice (division_rel G)" |
2916 shows "weak_lower_semilattice (division_rel G)" |
2918 proof - |
2917 proof - |
2919 interpret weak_partial_order ["division_rel G"] .. |
2918 interpret weak_partial_order "division_rel G" .. |
2920 show ?thesis |
2919 show ?thesis |
2921 apply (unfold_locales, simp_all) |
2920 apply (unfold_locales, simp_all) |
2922 proof - |
2921 proof - |
2923 fix x y |
2922 fix x y |
2924 assume carr: "x \<in> carrier G" "y \<in> carrier G" |
2923 assume carr: "x \<in> carrier G" "y \<in> carrier G" |
2939 and agcd: "a gcdof b c" |
2938 and agcd: "a gcdof b c" |
2940 and a'carr: "a' \<in> carrier G" and carr': "a \<in> carrier G" "b \<in> carrier G" "c \<in> carrier G" |
2939 and a'carr: "a' \<in> carrier G" and carr': "a \<in> carrier G" "b \<in> carrier G" "c \<in> carrier G" |
2941 shows "a' gcdof b c" |
2940 shows "a' gcdof b c" |
2942 proof - |
2941 proof - |
2943 note carr = a'carr carr' |
2942 note carr = a'carr carr' |
2944 interpret weak_lower_semilattice ["division_rel G"] by simp |
2943 interpret weak_lower_semilattice "division_rel G" by simp |
2945 have "a' \<in> carrier G \<and> a' gcdof b c" |
2944 have "a' \<in> carrier G \<and> a' gcdof b c" |
2946 apply (simp add: gcdof_greatestLower carr') |
2945 apply (simp add: gcdof_greatestLower carr') |
2947 apply (subst greatest_Lower_cong_l[of _ a]) |
2946 apply (subst greatest_Lower_cong_l[of _ a]) |
2948 apply (simp add: a'a) |
2947 apply (simp add: a'a) |
2949 apply (simp add: carr) |
2948 apply (simp add: carr) |
2956 |
2955 |
2957 lemma (in gcd_condition_monoid) gcd_closed [simp]: |
2956 lemma (in gcd_condition_monoid) gcd_closed [simp]: |
2958 assumes carr: "a \<in> carrier G" "b \<in> carrier G" |
2957 assumes carr: "a \<in> carrier G" "b \<in> carrier G" |
2959 shows "somegcd G a b \<in> carrier G" |
2958 shows "somegcd G a b \<in> carrier G" |
2960 proof - |
2959 proof - |
2961 interpret weak_lower_semilattice ["division_rel G"] by simp |
2960 interpret weak_lower_semilattice "division_rel G" by simp |
2962 show ?thesis |
2961 show ?thesis |
2963 apply (simp add: somegcd_meet[OF carr]) |
2962 apply (simp add: somegcd_meet[OF carr]) |
2964 apply (rule meet_closed[simplified], fact+) |
2963 apply (rule meet_closed[simplified], fact+) |
2965 done |
2964 done |
2966 qed |
2965 qed |
2967 |
2966 |
2968 lemma (in gcd_condition_monoid) gcd_isgcd: |
2967 lemma (in gcd_condition_monoid) gcd_isgcd: |
2969 assumes carr: "a \<in> carrier G" "b \<in> carrier G" |
2968 assumes carr: "a \<in> carrier G" "b \<in> carrier G" |
2970 shows "(somegcd G a b) gcdof a b" |
2969 shows "(somegcd G a b) gcdof a b" |
2971 proof - |
2970 proof - |
2972 interpret weak_lower_semilattice ["division_rel G"] by simp |
2971 interpret weak_lower_semilattice "division_rel G" by simp |
2973 from carr |
2972 from carr |
2974 have "somegcd G a b \<in> carrier G \<and> (somegcd G a b) gcdof a b" |
2973 have "somegcd G a b \<in> carrier G \<and> (somegcd G a b) gcdof a b" |
2975 apply (subst gcdof_greatestLower, simp, simp) |
2974 apply (subst gcdof_greatestLower, simp, simp) |
2976 apply (simp add: somegcd_meet[OF carr] meet_def) |
2975 apply (simp add: somegcd_meet[OF carr] meet_def) |
2977 apply (rule inf_of_two_greatest[simplified], assumption+) |
2976 apply (rule inf_of_two_greatest[simplified], assumption+) |
2981 |
2980 |
2982 lemma (in gcd_condition_monoid) gcd_exists: |
2981 lemma (in gcd_condition_monoid) gcd_exists: |
2983 assumes carr: "a \<in> carrier G" "b \<in> carrier G" |
2982 assumes carr: "a \<in> carrier G" "b \<in> carrier G" |
2984 shows "\<exists>x\<in>carrier G. x = somegcd G a b" |
2983 shows "\<exists>x\<in>carrier G. x = somegcd G a b" |
2985 proof - |
2984 proof - |
2986 interpret weak_lower_semilattice ["division_rel G"] by simp |
2985 interpret weak_lower_semilattice "division_rel G" by simp |
2987 show ?thesis |
2986 show ?thesis |
2988 apply (simp add: somegcd_meet[OF carr]) |
2987 apply (simp add: somegcd_meet[OF carr]) |
2989 apply (rule meet_closed[simplified], fact+) |
2988 apply (rule meet_closed[simplified], fact+) |
2990 done |
2989 done |
2991 qed |
2990 qed |
2992 |
2991 |
2993 lemma (in gcd_condition_monoid) gcd_divides_l: |
2992 lemma (in gcd_condition_monoid) gcd_divides_l: |
2994 assumes carr: "a \<in> carrier G" "b \<in> carrier G" |
2993 assumes carr: "a \<in> carrier G" "b \<in> carrier G" |
2995 shows "(somegcd G a b) divides a" |
2994 shows "(somegcd G a b) divides a" |
2996 proof - |
2995 proof - |
2997 interpret weak_lower_semilattice ["division_rel G"] by simp |
2996 interpret weak_lower_semilattice "division_rel G" by simp |
2998 show ?thesis |
2997 show ?thesis |
2999 apply (simp add: somegcd_meet[OF carr]) |
2998 apply (simp add: somegcd_meet[OF carr]) |
3000 apply (rule meet_left[simplified], fact+) |
2999 apply (rule meet_left[simplified], fact+) |
3001 done |
3000 done |
3002 qed |
3001 qed |
3003 |
3002 |
3004 lemma (in gcd_condition_monoid) gcd_divides_r: |
3003 lemma (in gcd_condition_monoid) gcd_divides_r: |
3005 assumes carr: "a \<in> carrier G" "b \<in> carrier G" |
3004 assumes carr: "a \<in> carrier G" "b \<in> carrier G" |
3006 shows "(somegcd G a b) divides b" |
3005 shows "(somegcd G a b) divides b" |
3007 proof - |
3006 proof - |
3008 interpret weak_lower_semilattice ["division_rel G"] by simp |
3007 interpret weak_lower_semilattice "division_rel G" by simp |
3009 show ?thesis |
3008 show ?thesis |
3010 apply (simp add: somegcd_meet[OF carr]) |
3009 apply (simp add: somegcd_meet[OF carr]) |
3011 apply (rule meet_right[simplified], fact+) |
3010 apply (rule meet_right[simplified], fact+) |
3012 done |
3011 done |
3013 qed |
3012 qed |
3015 lemma (in gcd_condition_monoid) gcd_divides: |
3014 lemma (in gcd_condition_monoid) gcd_divides: |
3016 assumes sub: "z divides x" "z divides y" |
3015 assumes sub: "z divides x" "z divides y" |
3017 and L: "x \<in> carrier G" "y \<in> carrier G" "z \<in> carrier G" |
3016 and L: "x \<in> carrier G" "y \<in> carrier G" "z \<in> carrier G" |
3018 shows "z divides (somegcd G x y)" |
3017 shows "z divides (somegcd G x y)" |
3019 proof - |
3018 proof - |
3020 interpret weak_lower_semilattice ["division_rel G"] by simp |
3019 interpret weak_lower_semilattice "division_rel G" by simp |
3021 show ?thesis |
3020 show ?thesis |
3022 apply (simp add: somegcd_meet L) |
3021 apply (simp add: somegcd_meet L) |
3023 apply (rule meet_le[simplified], fact+) |
3022 apply (rule meet_le[simplified], fact+) |
3024 done |
3023 done |
3025 qed |
3024 qed |
3027 lemma (in gcd_condition_monoid) gcd_cong_l: |
3026 lemma (in gcd_condition_monoid) gcd_cong_l: |
3028 assumes xx': "x \<sim> x'" |
3027 assumes xx': "x \<sim> x'" |
3029 and carr: "x \<in> carrier G" "x' \<in> carrier G" "y \<in> carrier G" |
3028 and carr: "x \<in> carrier G" "x' \<in> carrier G" "y \<in> carrier G" |
3030 shows "somegcd G x y \<sim> somegcd G x' y" |
3029 shows "somegcd G x y \<sim> somegcd G x' y" |
3031 proof - |
3030 proof - |
3032 interpret weak_lower_semilattice ["division_rel G"] by simp |
3031 interpret weak_lower_semilattice "division_rel G" by simp |
3033 show ?thesis |
3032 show ?thesis |
3034 apply (simp add: somegcd_meet carr) |
3033 apply (simp add: somegcd_meet carr) |
3035 apply (rule meet_cong_l[simplified], fact+) |
3034 apply (rule meet_cong_l[simplified], fact+) |
3036 done |
3035 done |
3037 qed |
3036 qed |
3039 lemma (in gcd_condition_monoid) gcd_cong_r: |
3038 lemma (in gcd_condition_monoid) gcd_cong_r: |
3040 assumes carr: "x \<in> carrier G" "y \<in> carrier G" "y' \<in> carrier G" |
3039 assumes carr: "x \<in> carrier G" "y \<in> carrier G" "y' \<in> carrier G" |
3041 and yy': "y \<sim> y'" |
3040 and yy': "y \<sim> y'" |
3042 shows "somegcd G x y \<sim> somegcd G x y'" |
3041 shows "somegcd G x y \<sim> somegcd G x y'" |
3043 proof - |
3042 proof - |
3044 interpret weak_lower_semilattice ["division_rel G"] by simp |
3043 interpret weak_lower_semilattice "division_rel G" by simp |
3045 show ?thesis |
3044 show ?thesis |
3046 apply (simp add: somegcd_meet carr) |
3045 apply (simp add: somegcd_meet carr) |
3047 apply (rule meet_cong_r[simplified], fact+) |
3046 apply (rule meet_cong_r[simplified], fact+) |
3048 done |
3047 done |
3049 qed |
3048 qed |
3090 |
3089 |
3091 lemma (in gcd_condition_monoid) SomeGcd_ex: |
3090 lemma (in gcd_condition_monoid) SomeGcd_ex: |
3092 assumes "finite A" "A \<subseteq> carrier G" "A \<noteq> {}" |
3091 assumes "finite A" "A \<subseteq> carrier G" "A \<noteq> {}" |
3093 shows "\<exists>x\<in> carrier G. x = SomeGcd G A" |
3092 shows "\<exists>x\<in> carrier G. x = SomeGcd G A" |
3094 proof - |
3093 proof - |
3095 interpret weak_lower_semilattice ["division_rel G"] by simp |
3094 interpret weak_lower_semilattice "division_rel G" by simp |
3096 show ?thesis |
3095 show ?thesis |
3097 apply (simp add: SomeGcd_def) |
3096 apply (simp add: SomeGcd_def) |
3098 apply (rule finite_inf_closed[simplified], fact+) |
3097 apply (rule finite_inf_closed[simplified], fact+) |
3099 done |
3098 done |
3100 qed |
3099 qed |
3101 |
3100 |
3102 lemma (in gcd_condition_monoid) gcd_assoc: |
3101 lemma (in gcd_condition_monoid) gcd_assoc: |
3103 assumes carr: "a \<in> carrier G" "b \<in> carrier G" "c \<in> carrier G" |
3102 assumes carr: "a \<in> carrier G" "b \<in> carrier G" "c \<in> carrier G" |
3104 shows "somegcd G (somegcd G a b) c \<sim> somegcd G a (somegcd G b c)" |
3103 shows "somegcd G (somegcd G a b) c \<sim> somegcd G a (somegcd G b c)" |
3105 proof - |
3104 proof - |
3106 interpret weak_lower_semilattice ["division_rel G"] by simp |
3105 interpret weak_lower_semilattice "division_rel G" by simp |
3107 show ?thesis |
3106 show ?thesis |
3108 apply (subst (2 3) somegcd_meet, (simp add: carr)+) |
3107 apply (subst (2 3) somegcd_meet, (simp add: carr)+) |
3109 apply (simp add: somegcd_meet carr) |
3108 apply (simp add: somegcd_meet carr) |
3110 apply (rule weak_meet_assoc[simplified], fact+) |
3109 apply (rule weak_meet_assoc[simplified], fact+) |
3111 done |
3110 done |
3830 qed |
3829 qed |
3831 |
3830 |
3832 with fca fcb show ?thesis by simp |
3831 with fca fcb show ?thesis by simp |
3833 qed |
3832 qed |
3834 |
3833 |
3835 interpretation factorial_monoid \<subseteq> divisor_chain_condition_monoid |
3834 sublocale factorial_monoid \<subseteq> divisor_chain_condition_monoid |
3836 apply unfold_locales |
3835 apply unfold_locales |
3837 apply (rule wfUNIVI) |
3836 apply (rule wfUNIVI) |
3838 apply (rule measure_induct[of "factorcount G"]) |
3837 apply (rule measure_induct[of "factorcount G"]) |
3839 apply simp (* slow *) (* |
3838 apply simp (* slow *) (* |
3840 [1]Applying congruence rule: |
3839 [1]Applying congruence rule: |
3852 apply (rule r2) |
3851 apply (rule r2) |
3853 apply (rule properfactor_fcount, simp+) |
3852 apply (rule properfactor_fcount, simp+) |
3854 done |
3853 done |
3855 qed |
3854 qed |
3856 |
3855 |
3857 interpretation factorial_monoid \<subseteq> primeness_condition_monoid |
3856 sublocale factorial_monoid \<subseteq> primeness_condition_monoid |
3858 proof qed (rule irreducible_is_prime) |
3857 proof qed (rule irreducible_is_prime) |
3859 |
3858 |
3860 |
3859 |
3861 lemma (in factorial_monoid) primeness_condition: |
3860 lemma (in factorial_monoid) primeness_condition: |
3862 shows "primeness_condition_monoid G" |
3861 shows "primeness_condition_monoid G" |
3864 |
3863 |
3865 lemma (in factorial_monoid) gcd_condition [simp]: |
3864 lemma (in factorial_monoid) gcd_condition [simp]: |
3866 shows "gcd_condition_monoid G" |
3865 shows "gcd_condition_monoid G" |
3867 proof qed (rule gcdof_exists) |
3866 proof qed (rule gcdof_exists) |
3868 |
3867 |
3869 interpretation factorial_monoid \<subseteq> gcd_condition_monoid |
3868 sublocale factorial_monoid \<subseteq> gcd_condition_monoid |
3870 proof qed (rule gcdof_exists) |
3869 proof qed (rule gcdof_exists) |
3871 |
3870 |
3872 lemma (in factorial_monoid) division_weak_lattice [simp]: |
3871 lemma (in factorial_monoid) division_weak_lattice [simp]: |
3873 shows "weak_lattice (division_rel G)" |
3872 shows "weak_lattice (division_rel G)" |
3874 proof - |
3873 proof - |
3875 interpret weak_lower_semilattice ["division_rel G"] by simp |
3874 interpret weak_lower_semilattice "division_rel G" by simp |
3876 |
3875 |
3877 show "weak_lattice (division_rel G)" |
3876 show "weak_lattice (division_rel G)" |
3878 apply (unfold_locales, simp_all) |
3877 apply (unfold_locales, simp_all) |
3879 proof - |
3878 proof - |
3880 fix x y |
3879 fix x y |
3900 factorial_monoid G" |
3899 factorial_monoid G" |
3901 apply rule |
3900 apply rule |
3902 proof clarify |
3901 proof clarify |
3903 assume dcc: "divisor_chain_condition_monoid G" |
3902 assume dcc: "divisor_chain_condition_monoid G" |
3904 and pc: "primeness_condition_monoid G" |
3903 and pc: "primeness_condition_monoid G" |
3905 interpret divisor_chain_condition_monoid ["G"] by (rule dcc) |
3904 interpret divisor_chain_condition_monoid "G" by (rule dcc) |
3906 interpret primeness_condition_monoid ["G"] by (rule pc) |
3905 interpret primeness_condition_monoid "G" by (rule pc) |
3907 |
3906 |
3908 show "factorial_monoid G" |
3907 show "factorial_monoid G" |
3909 by (fast intro: factorial_monoidI wfactors_exist wfactors_unique) |
3908 by (fast intro: factorial_monoidI wfactors_exist wfactors_unique) |
3910 next |
3909 next |
3911 assume fm: "factorial_monoid G" |
3910 assume fm: "factorial_monoid G" |
3912 interpret factorial_monoid ["G"] by (rule fm) |
3911 interpret factorial_monoid "G" by (rule fm) |
3913 show "divisor_chain_condition_monoid G \<and> primeness_condition_monoid G" |
3912 show "divisor_chain_condition_monoid G \<and> primeness_condition_monoid G" |
3914 by rule unfold_locales |
3913 by rule unfold_locales |
3915 qed |
3914 qed |
3916 |
3915 |
3917 theorem factorial_condition_two: (* Jacobson theorem 2.22 *) |
3916 theorem factorial_condition_two: (* Jacobson theorem 2.22 *) |
3918 shows "(divisor_chain_condition_monoid G \<and> gcd_condition_monoid G) = factorial_monoid G" |
3917 shows "(divisor_chain_condition_monoid G \<and> gcd_condition_monoid G) = factorial_monoid G" |
3919 apply rule |
3918 apply rule |
3920 proof clarify |
3919 proof clarify |
3921 assume dcc: "divisor_chain_condition_monoid G" |
3920 assume dcc: "divisor_chain_condition_monoid G" |
3922 and gc: "gcd_condition_monoid G" |
3921 and gc: "gcd_condition_monoid G" |
3923 interpret divisor_chain_condition_monoid ["G"] by (rule dcc) |
3922 interpret divisor_chain_condition_monoid "G" by (rule dcc) |
3924 interpret gcd_condition_monoid ["G"] by (rule gc) |
3923 interpret gcd_condition_monoid "G" by (rule gc) |
3925 show "factorial_monoid G" |
3924 show "factorial_monoid G" |
3926 by (simp add: factorial_condition_one[symmetric], rule, unfold_locales) |
3925 by (simp add: factorial_condition_one[symmetric], rule, unfold_locales) |
3927 next |
3926 next |
3928 assume fm: "factorial_monoid G" |
3927 assume fm: "factorial_monoid G" |
3929 interpret factorial_monoid ["G"] by (rule fm) |
3928 interpret factorial_monoid "G" by (rule fm) |
3930 show "divisor_chain_condition_monoid G \<and> gcd_condition_monoid G" |
3929 show "divisor_chain_condition_monoid G \<and> gcd_condition_monoid G" |
3931 by rule unfold_locales |
3930 by rule unfold_locales |
3932 qed |
3931 qed |
3933 |
3932 |
3934 end |
3933 end |