src/HOL/Algebra/QuotRing.thy
changeset 68604 57721285d4ef
parent 68584 ec4fe1032b6e
child 68673 22d10f94811e
equal deleted inserted replaced
68603:73eeb3f31406 68604:57721285d4ef
   852 
   852 
   853 corollary ring_iso_trans: "\<lbrakk> R \<simeq> S; S \<simeq> Q \<rbrakk> \<Longrightarrow> R \<simeq> Q"
   853 corollary ring_iso_trans: "\<lbrakk> R \<simeq> S; S \<simeq> Q \<rbrakk> \<Longrightarrow> R \<simeq> Q"
   854   using ring_iso_set_trans unfolding is_ring_iso_def by blast 
   854   using ring_iso_set_trans unfolding is_ring_iso_def by blast 
   855 
   855 
   856 lemma ring_iso_set_sym:
   856 lemma ring_iso_set_sym:
   857   assumes "ring R"
   857   assumes "ring R" and h: "h \<in> ring_iso R S"
   858   shows "h \<in> ring_iso R S \<Longrightarrow> (inv_into (carrier R) h) \<in> ring_iso S R"
   858   shows "(inv_into (carrier R) h) \<in> ring_iso S R"
   859 proof -
   859 proof -
   860   assume h: "h \<in> ring_iso R S"
   860   have h_hom: "h \<in> ring_hom R S"
   861   hence h_hom:  "h \<in> ring_hom R S"
       
   862     and h_surj: "h ` (carrier R) = (carrier S)"
   861     and h_surj: "h ` (carrier R) = (carrier S)"
   863     and h_inj:  "\<And> x1 x2. \<lbrakk> x1 \<in> carrier R; x2 \<in> carrier R \<rbrakk> \<Longrightarrow>  h x1 = h x2 \<Longrightarrow> x1 = x2"
   862     and h_inj:  "\<And> x1 x2. \<lbrakk> x1 \<in> carrier R; x2 \<in> carrier R \<rbrakk> \<Longrightarrow>  h x1 = h x2 \<Longrightarrow> x1 = x2"
   864     unfolding ring_iso_def bij_betw_def inj_on_def by auto
   863     using h unfolding ring_iso_def bij_betw_def inj_on_def by auto
   865 
   864 
   866   have h_inv_bij: "bij_betw (inv_into (carrier R) h) (carrier S) (carrier R)"
   865   have h_inv_bij: "bij_betw (inv_into (carrier R) h) (carrier S) (carrier R)"
   867       using bij_betw_inv_into h ring_iso_def by fastforce
   866       using bij_betw_inv_into h ring_iso_def by fastforce
   868 
   867 
   869   show "inv_into (carrier R) h \<in> ring_iso S R"
   868   show "inv_into (carrier R) h \<in> ring_iso S R"
   870     apply (rule ring_iso_memI)
   869     apply (rule ring_iso_memI)
   871     apply (simp add: h_surj inv_into_into)
   870     apply (simp add: h_surj inv_into_into)
   872     apply (auto simp add: h_inv_bij)
   871        apply (auto simp add: h_inv_bij)
   873     apply (smt assms f_inv_into_f h_hom h_inj h_surj inv_into_into
   872     using ring_iso_memE [OF h] bij_betwE [OF h_inv_bij] 
   874            ring.ring_simprules(5) ring_hom_closed ring_hom_mult)
   873     apply (simp_all add: \<open>ring R\<close> bij_betw_def bij_betw_inv_into_right inv_into_f_eq ring.ring_simprules(5))
   875     apply (smt assms f_inv_into_f h_hom h_inj h_surj inv_into_into
   874     using ring_iso_memE [OF h] bij_betw_inv_into_right [of h "carrier R" "carrier S"]
   876            ring.ring_simprules(1) ring_hom_add ring_hom_closed)
   875     apply (simp add: \<open>ring R\<close> inv_into_f_eq ring.ring_simprules(1))
   877     by (metis (no_types, hide_lams) assms f_inv_into_f h_hom h_inj
   876     by (simp add: \<open>ring R\<close> inv_into_f_eq ring.ring_simprules(6))
   878         imageI inv_into_into ring.ring_simprules(6) ring_hom_one)
       
   879 qed
   877 qed
   880 
   878 
   881 corollary ring_iso_sym:
   879 corollary ring_iso_sym:
   882   assumes "ring R"
   880   assumes "ring R"
   883   shows "R \<simeq> S \<Longrightarrow> S \<simeq> R"
   881   shows "R \<simeq> S \<Longrightarrow> S \<simeq> R"