src/HOL/Library/Multiset.thy
changeset 76401 e7e8fbc89870
parent 76359 f7002e5b15bb
child 76570 608489919ecf
equal deleted inserted replaced
76385:5ca3391244a3 76401:e7e8fbc89870
  3191 lemmas subset_implies_multp = subset_implies_mult[of _ _ "{(x, y). r x y}" for r, folded multp_def]
  3191 lemmas subset_implies_multp = subset_implies_mult[of _ _ "{(x, y). r x y}" for r, folded multp_def]
  3192 
  3192 
  3193 
  3193 
  3194 subsubsection \<open>Monotonicity\<close>
  3194 subsubsection \<open>Monotonicity\<close>
  3195 
  3195 
       
  3196 lemma multp_mono_strong:
       
  3197   assumes "multp R M1 M2" and "transp R" and
       
  3198     S_if_R: "\<And>x y. x \<in> set_mset M1 \<Longrightarrow> y \<in> set_mset M2 \<Longrightarrow> R x y \<Longrightarrow> S x y"
       
  3199   shows "multp S M1 M2"
       
  3200 proof -
       
  3201   obtain I J K where "M2 = I + J" and "M1 = I + K" and "J \<noteq> {#}" and "\<forall>k\<in>#K. \<exists>x\<in>#J. R k x"
       
  3202     using multp_implies_one_step[OF \<open>transp R\<close> \<open>multp R M1 M2\<close>] by auto
       
  3203   show ?thesis
       
  3204     unfolding \<open>M2 = I + J\<close> \<open>M1 = I + K\<close>
       
  3205   proof (rule one_step_implies_multp[OF \<open>J \<noteq> {#}\<close>])
       
  3206     show "\<forall>k\<in>#K. \<exists>j\<in>#J. S k j"
       
  3207       using S_if_R
       
  3208       by (metis \<open>M1 = I + K\<close> \<open>M2 = I + J\<close> \<open>\<forall>k\<in>#K. \<exists>x\<in>#J. R k x\<close> union_iff)
       
  3209   qed
       
  3210 qed
       
  3211 
       
  3212 lemma mult_mono_strong:
       
  3213   assumes "(M1, M2) \<in> mult r" and "trans r" and
       
  3214     S_if_R: "\<And>x y. x \<in> set_mset M1 \<Longrightarrow> y \<in> set_mset M2 \<Longrightarrow> (x, y) \<in> r \<Longrightarrow> (x, y) \<in> s"
       
  3215   shows "(M1, M2) \<in> mult s"
       
  3216   using assms multp_mono_strong[of "\<lambda>x y. (x, y) \<in> r" M1 M2 "\<lambda>x y. (x, y) \<in> s",
       
  3217       unfolded multp_def transp_trans_eq, simplified]
       
  3218   by blast
       
  3219 
  3196 lemma monotone_on_multp_multp_image_mset:
  3220 lemma monotone_on_multp_multp_image_mset:
  3197   assumes "monotone_on A orda ordb f" and "transp orda"
  3221   assumes "monotone_on A orda ordb f" and "transp orda"
  3198   shows "monotone_on {M. set_mset M \<subseteq> A} (multp orda) (multp ordb) (image_mset f)"
  3222   shows "monotone_on {M. set_mset M \<subseteq> A} (multp orda) (multp ordb) (image_mset f)"
  3199 proof (rule monotone_onI)
  3223 proof (rule monotone_onI)
  3200   fix M1 M2
  3224   fix M1 M2