src/HOL/Algebra/Divisibility.thy
changeset 29237 e90d9d51106b
parent 28823 dcbef866c9e2
child 32456 341c83339aeb
equal deleted inserted replaced
29236:51526dd8da8e 29237:e90d9d51106b
     1 (*
     1 (*
     2   Title:     Divisibility in monoids and rings
     2   Title:     Divisibility in monoids and rings
     3   Id:        $Id$
       
     4   Author:    Clemens Ballarin, started 18 July 2008
     3   Author:    Clemens Ballarin, started 18 July 2008
     5 
     4 
     6 Based on work by Stephan Hohe.
     5 Based on work by Stephan Hohe.
     7 *)
     6 *)
     8 
     7 
    30 
    29 
    31 lemma (in monoid_cancel) is_monoid_cancel:
    30 lemma (in monoid_cancel) is_monoid_cancel:
    32   "monoid_cancel G"
    31   "monoid_cancel G"
    33   ..
    32   ..
    34 
    33 
    35 interpretation group \<subseteq> monoid_cancel
    34 sublocale group \<subseteq> monoid_cancel
    36   proof qed simp+
    35   proof qed simp+
    37 
    36 
    38 
    37 
    39 locale comm_monoid_cancel = monoid_cancel + comm_monoid
    38 locale comm_monoid_cancel = monoid_cancel + comm_monoid
    40 
    39 
    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)
    57 
    56 
    58 lemma (in comm_monoid_cancel) is_comm_monoid_cancel:
    57 lemma (in comm_monoid_cancel) is_comm_monoid_cancel:
    59   "comm_monoid_cancel G"
    58   "comm_monoid_cancel G"
    60   by intro_locales
    59   by intro_locales
    61 
    60 
    62 interpretation comm_group \<subseteq> comm_monoid_cancel
    61 sublocale comm_group \<subseteq> comm_monoid_cancel
    63   ..
    62   ..
    64 
    63 
    65 
    64 
    66 subsection {* Products of Units in Monoids *}
    65 subsection {* Products of Units in Monoids *}
    67 
    66 
   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
  3311     with pnunit
  3310     with pnunit
  3312         show "False" ..
  3311         show "False" ..
  3313   qed
  3312   qed
  3314 qed
  3313 qed
  3315 
  3314 
  3316 interpretation gcd_condition_monoid \<subseteq> primeness_condition_monoid
  3315 sublocale gcd_condition_monoid \<subseteq> primeness_condition_monoid
  3317   by (rule primeness_condition)
  3316   by (rule primeness_condition)
  3318 
  3317 
  3319 
  3318 
  3320 subsubsection {* Divisor chain condition *}
  3319 subsubsection {* Divisor chain condition *}
  3321 
  3320 
  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