src/HOL/Algebra/Divisibility.thy
changeset 55242 413ec965f95d
parent 53374 a14d2a854c02
child 57492 74bf65a1910a
equal deleted inserted replaced
55241:ef601c60ccbe 55242:413ec965f95d
  2829   assumes carr: "a \<in> carrier G"  "b \<in> carrier G"
  2829   assumes carr: "a \<in> carrier G"  "b \<in> carrier G"
  2830   shows "\<exists>x\<in>carrier G. x = somegcd G a b"
  2830   shows "\<exists>x\<in>carrier G. x = somegcd G a b"
  2831 proof -
  2831 proof -
  2832   interpret weak_lower_semilattice "division_rel G" by simp
  2832   interpret weak_lower_semilattice "division_rel G" by simp
  2833   show ?thesis
  2833   show ?thesis
  2834     apply (simp add: somegcd_meet[OF carr])
  2834     by (metis carr(1) carr(2) gcd_closed)
  2835     apply (rule meet_closed[simplified], fact+)
       
  2836   done
       
  2837 qed
  2835 qed
  2838 
  2836 
  2839 lemma (in gcd_condition_monoid) gcd_divides_l:
  2837 lemma (in gcd_condition_monoid) gcd_divides_l:
  2840   assumes carr: "a \<in> carrier G"  "b \<in> carrier G"
  2838   assumes carr: "a \<in> carrier G"  "b \<in> carrier G"
  2841   shows "(somegcd G a b) divides a"
  2839   shows "(somegcd G a b) divides a"
  2842 proof -
  2840 proof -
  2843   interpret weak_lower_semilattice "division_rel G" by simp
  2841   interpret weak_lower_semilattice "division_rel G" by simp
  2844   show ?thesis
  2842   show ?thesis
  2845     apply (simp add: somegcd_meet[OF carr])
  2843     by (metis carr(1) carr(2) gcd_isgcd isgcd_def)
  2846     apply (rule meet_left[simplified], fact+)
       
  2847   done
       
  2848 qed
  2844 qed
  2849 
  2845 
  2850 lemma (in gcd_condition_monoid) gcd_divides_r:
  2846 lemma (in gcd_condition_monoid) gcd_divides_r:
  2851   assumes carr: "a \<in> carrier G"  "b \<in> carrier G"
  2847   assumes carr: "a \<in> carrier G"  "b \<in> carrier G"
  2852   shows "(somegcd G a b) divides b"
  2848   shows "(somegcd G a b) divides b"
  2853 proof -
  2849 proof -
  2854   interpret weak_lower_semilattice "division_rel G" by simp
  2850   interpret weak_lower_semilattice "division_rel G" by simp
  2855   show ?thesis
  2851   show ?thesis
  2856     apply (simp add: somegcd_meet[OF carr])
  2852     by (metis carr gcd_isgcd isgcd_def)
  2857     apply (rule meet_right[simplified], fact+)
       
  2858   done
       
  2859 qed
  2853 qed
  2860 
  2854 
  2861 lemma (in gcd_condition_monoid) gcd_divides:
  2855 lemma (in gcd_condition_monoid) gcd_divides:
  2862   assumes sub: "z divides x"  "z divides y"
  2856   assumes sub: "z divides x"  "z divides y"
  2863     and L: "x \<in> carrier G"  "y \<in> carrier G"  "z \<in> carrier G"
  2857     and L: "x \<in> carrier G"  "y \<in> carrier G"  "z \<in> carrier G"
  2864   shows "z divides (somegcd G x y)"
  2858   shows "z divides (somegcd G x y)"
  2865 proof -
  2859 proof -
  2866   interpret weak_lower_semilattice "division_rel G" by simp
  2860   interpret weak_lower_semilattice "division_rel G" by simp
  2867   show ?thesis
  2861   show ?thesis
  2868     apply (simp add: somegcd_meet L)
  2862     by (metis gcd_isgcd isgcd_def assms)
  2869     apply (rule meet_le[simplified], fact+)
       
  2870   done
       
  2871 qed
  2863 qed
  2872 
  2864 
  2873 lemma (in gcd_condition_monoid) gcd_cong_l:
  2865 lemma (in gcd_condition_monoid) gcd_cong_l:
  2874   assumes xx': "x \<sim> x'"
  2866   assumes xx': "x \<sim> x'"
  2875     and carr: "x \<in> carrier G"  "x' \<in> carrier G"  "y \<in> carrier G"
  2867     and carr: "x \<in> carrier G"  "x' \<in> carrier G"  "y \<in> carrier G"
  3407       using setparts afs'
  3399       using setparts afs'
  3408       by (fast intro: nth_mem[OF len] elim: wfactorsE, simp+)
  3400       by (fast intro: nth_mem[OF len] elim: wfactorsE, simp+)
  3409 
  3401 
  3410     from aa2carr carr aa1fs aa2fs
  3402     from aa2carr carr aa1fs aa2fs
  3411       have "wfactors G (as'!i # drop (Suc i) as') (as'!i \<otimes> aa_2)"
  3403       have "wfactors G (as'!i # drop (Suc i) as') (as'!i \<otimes> aa_2)"
  3412       apply (intro wfactors_mult_single)
  3404         by (metis irrasi wfactors_mult_single)
  3413           apply (rule wfactorsE[OF afs'], fast intro: nth_mem[OF len])
       
  3414          apply (fast intro: nth_mem[OF len])
       
  3415         apply fast
       
  3416        apply fast
       
  3417       apply assumption
       
  3418     done
       
  3419     with len carr aa1carr aa2carr aa1fs
  3405     with len carr aa1carr aa2carr aa1fs
  3420       have v2: "wfactors G (take i as' @ as'!i # drop (Suc i) as') (aa_1 \<otimes> (as'!i \<otimes> aa_2))"
  3406       have v2: "wfactors G (take i as' @ as'!i # drop (Suc i) as') (aa_1 \<otimes> (as'!i \<otimes> aa_2))"
  3421       apply (intro wfactors_mult)
  3407       apply (intro wfactors_mult)
  3422            apply fast
  3408            apply fast
  3423           apply (simp, (fast intro: nth_mem[OF len])?)+
  3409           apply (simp, (fast intro: nth_mem[OF len])?)+
  3427       have as': "as' = (take i as' @ as'!i # drop (Suc i) as')"
  3413       have as': "as' = (take i as' @ as'!i # drop (Suc i) as')"
  3428       by (simp add: drop_Suc_conv_tl)
  3414       by (simp add: drop_Suc_conv_tl)
  3429     with carr
  3415     with carr
  3430       have eer: "essentially_equal G (take i as' @ as'!i # drop (Suc i) as') as'"
  3416       have eer: "essentially_equal G (take i as' @ as'!i # drop (Suc i) as') as'"
  3431       by simp
  3417       by simp
  3432 
       
  3433     with v2 afs' carr aa1carr aa2carr nth_mem[OF len]
  3418     with v2 afs' carr aa1carr aa2carr nth_mem[OF len]
  3434       have "aa_1 \<otimes> (as'!i \<otimes> aa_2) \<sim> a"
  3419       have "aa_1 \<otimes> (as'!i \<otimes> aa_2) \<sim> a"
  3435       apply (intro ee_wfactorsD[of "take i as' @ as'!i # drop (Suc i) as'"  "as'"])
  3420         by (metis as' ee_wfactorsD m_closed)
  3436             apply fast+
       
  3437           apply (simp, fast)
       
  3438     done
       
  3439     then
  3421     then
  3440     have t1: "as'!i \<otimes> (aa_1 \<otimes> aa_2) \<sim> a"
  3422     have t1: "as'!i \<otimes> (aa_1 \<otimes> aa_2) \<sim> a"
  3441       apply (simp add: m_assoc[symmetric])
  3423       by (metis aa1carr aa2carr asicarr m_lcomm)
  3442       apply (simp add: m_comm)
       
  3443     done
       
  3444     from carr asiah
  3424     from carr asiah
  3445     have "ah \<otimes> (aa_1 \<otimes> aa_2) \<sim> as'!i \<otimes> (aa_1 \<otimes> aa_2)"
  3425     have "ah \<otimes> (aa_1 \<otimes> aa_2) \<sim> as'!i \<otimes> (aa_1 \<otimes> aa_2)"
  3446       apply (intro mult_cong_l)
  3426       by (metis associated_sym m_closed mult_cong_l)
  3447       apply (fast intro: associated_sym, simp+)
       
  3448     done
       
  3449     also note t1
  3427     also note t1
  3450     finally
  3428     finally
  3451       have "ah \<otimes> (aa_1 \<otimes> aa_2) \<sim> a" by simp
  3429       have "ah \<otimes> (aa_1 \<otimes> aa_2) \<sim> a" by simp
  3452 
  3430 
  3453     with carr aa1carr aa2carr a'carr nth_mem[OF len]
  3431     with carr aa1carr aa2carr a'carr nth_mem[OF len]
  3528   have "\<exists>as. set as \<subseteq> carrier G \<and> wfactors G as a" by (intro wfactors_exist, simp)
  3506   have "\<exists>as. set as \<subseteq> carrier G \<and> wfactors G as a" by (intro wfactors_exist, simp)
  3529   from this obtain as
  3507   from this obtain as
  3530       where ascarr[simp]: "set as \<subseteq> carrier G"
  3508       where ascarr[simp]: "set as \<subseteq> carrier G"
  3531       and afs: "wfactors G as a"
  3509       and afs: "wfactors G as a"
  3532       by (auto simp del: carr)
  3510       by (auto simp del: carr)
  3533 
       
  3534   have "ALL as'. set as' \<subseteq> carrier G \<and> wfactors G as' a \<longrightarrow> length as = length as'"
  3511   have "ALL as'. set as' \<subseteq> carrier G \<and> wfactors G as' a \<longrightarrow> length as = length as'"
  3535     by (metis afs ascarr assms ee_length wfactors_unique)
  3512     by (metis afs ascarr assms ee_length wfactors_unique)
  3536   thus "EX c. ALL as'. set as' \<subseteq> carrier G \<and> wfactors G as' a \<longrightarrow> c = length as'" ..
  3513   thus "EX c. ALL as'. set as' \<subseteq> carrier G \<and> wfactors G as' a \<longrightarrow> c = length as'" ..
  3537 qed
  3514 qed
  3538 
  3515 
  3547       by auto
  3524       by auto
  3548   have ac: "ac = factorcount G a"
  3525   have ac: "ac = factorcount G a"
  3549     apply (simp add: factorcount_def)
  3526     apply (simp add: factorcount_def)
  3550     apply (rule theI2)
  3527     apply (rule theI2)
  3551       apply (rule alen)
  3528       apply (rule alen)
  3552      apply (elim allE[of _ "as"], rule allE[OF alen, of "as"], simp add: ascarr afs)
  3529      apply (metis afs alen ascarr)+
  3553     apply (elim allE[of _ "as"], rule allE[OF alen, of "as"], simp add: ascarr afs)
       
  3554   done
  3530   done
  3555 
  3531 
  3556   from ascarr afs have "ac = length as" by (iprover intro: alen[rule_format])
  3532   from ascarr afs have "ac = length as" by (iprover intro: alen[rule_format])
  3557   with ac show ?thesis by simp
  3533   with ac show ?thesis by simp
  3558 qed
  3534 qed