src/HOL/Library/Multiset_Order.thy
changeset 63793 e68a0b651eb5
parent 63525 f01d1e393f3f
child 64076 9f089287687b
equal deleted inserted replaced
63792:4ccb7e635477 63793:e68a0b651eb5
    67   case (step N P)
    67   case (step N P)
    68   from step(3) have "M \<noteq> N" and
    68   from step(3) have "M \<noteq> N" and
    69     **: "\<And>y. count N y < count M y \<Longrightarrow> (\<exists>x>y. count M x < count N x)"
    69     **: "\<And>y. count N y < count M y \<Longrightarrow> (\<exists>x>y. count M x < count N x)"
    70     by (simp_all add: less_multiset\<^sub>H\<^sub>O_def)
    70     by (simp_all add: less_multiset\<^sub>H\<^sub>O_def)
    71   from step(2) obtain M0 a K where
    71   from step(2) obtain M0 a K where
    72     *: "P = M0 + {#a#}" "N = M0 + K" "a \<notin># K" "\<And>b. b \<in># K \<Longrightarrow> b < a"
    72     *: "P = add_mset a M0" "N = M0 + K" "a \<notin># K" "\<And>b. b \<in># K \<Longrightarrow> b < a"
    73     by (blast elim: mult1_lessE)
    73     by (blast elim: mult1_lessE)
    74   from \<open>M \<noteq> N\<close> ** *(1,2,3) have "M \<noteq> P" by (force dest: *(4) elim!: less_asym split: if_splits )
    74   from \<open>M \<noteq> N\<close> ** *(1,2,3) have "M \<noteq> P" by (force dest: *(4) elim!: less_asym split: if_splits )
    75   moreover
    75   moreover
    76   { assume "count P a \<le> count M a"
    76   { assume "count P a \<le> count M a"
    77     with \<open>a \<notin># K\<close> have "count N a < count M a" unfolding *(1,2)
    77     with \<open>a \<notin># K\<close> have "count N a < count M a" unfolding *(1,2)
   178   shows "M \<le># N \<Longrightarrow> M \<le> N"
   178   shows "M \<le># N \<Longrightarrow> M \<le> N"
   179   unfolding less_eq_multiset_def less_multiset\<^sub>H\<^sub>O
   179   unfolding less_eq_multiset_def less_multiset\<^sub>H\<^sub>O
   180   by (simp add: less_le_not_le subseteq_mset_def)
   180   by (simp add: less_le_not_le subseteq_mset_def)
   181 
   181 
   182 lemma le_multiset_right_total:
   182 lemma le_multiset_right_total:
   183   shows "M < M + {#x#}"
   183   shows "M < add_mset x M"
   184   unfolding less_eq_multiset_def less_multiset\<^sub>H\<^sub>O by simp
   184   unfolding less_eq_multiset_def less_multiset\<^sub>H\<^sub>O by simp
   185 
   185 
   186 lemma less_eq_multiset_empty_left[simp]:
   186 lemma less_eq_multiset_empty_left[simp]:
   187   shows "{#} \<le> M"
   187   shows "{#} \<le> M"
   188   by (simp add: subset_eq_imp_le_multiset)
   188   by (simp add: subset_eq_imp_le_multiset)
   226     le_multiset_plus_left_nonempty: "M \<noteq> {#} \<Longrightarrow> N < M + N" and
   226     le_multiset_plus_left_nonempty: "M \<noteq> {#} \<Longrightarrow> N < M + N" and
   227     le_multiset_plus_right_nonempty: "N \<noteq> {#} \<Longrightarrow> M < M + N"
   227     le_multiset_plus_right_nonempty: "N \<noteq> {#} \<Longrightarrow> M < M + N"
   228     by simp_all
   228     by simp_all
   229 
   229 
   230 end
   230 end
       
   231 
       
   232 
       
   233 subsection \<open>Simprocs\<close>
       
   234 
       
   235 lemma mset_le_add_iff1:
       
   236   "j \<le> (i::nat) \<Longrightarrow> (repeat_mset i u + m \<le> repeat_mset j u + n) = (repeat_mset (i-j) u + m \<le> n)"
       
   237 proof -
       
   238   assume "j \<le> i"
       
   239   then have "j + (i - j) = i"
       
   240     using le_add_diff_inverse by blast
       
   241   then show ?thesis
       
   242     by (metis (no_types) add_le_cancel_left left_add_mult_distrib_mset)
       
   243 qed
       
   244 
       
   245 lemma mset_le_add_iff2:
       
   246   "i \<le> (j::nat) \<Longrightarrow> (repeat_mset i u + m \<le> repeat_mset j u + n) = (m \<le> repeat_mset (j-i) u + n)"
       
   247 proof -
       
   248   assume "i \<le> j"
       
   249   then have "i + (j - i) = j"
       
   250     using le_add_diff_inverse by blast
       
   251   then show ?thesis
       
   252     by (metis (no_types) add_le_cancel_left left_add_mult_distrib_mset)
       
   253 qed
       
   254 
       
   255 lemma mset_less_add_iff1:
       
   256   "j \<le> (i::nat) \<Longrightarrow> (repeat_mset i u + m < repeat_mset j u + n) = (repeat_mset (i-j) u + m < n)"
       
   257   by (simp add: less_le_not_le mset_le_add_iff1 mset_le_add_iff2)
       
   258 
       
   259 lemma mset_less_add_iff2:
       
   260      "i \<le> (j::nat) \<Longrightarrow> (repeat_mset i u + m < repeat_mset j u + n) = (m < repeat_mset (j-i) u + n)"
       
   261   by (simp add: less_le_not_le mset_le_add_iff1 mset_le_add_iff2)
       
   262 
       
   263 ML_file "multiset_order_simprocs.ML"
       
   264 
       
   265 simproc_setup msetless_cancel_numerals
       
   266   ("(l::'a::preorder multiset) + m < n" | "(l::'a multiset) < m + n" |
       
   267    "add_mset a m < n" | "m < add_mset a n") =
       
   268   \<open>fn phi => Multiset_Order_Simprocs.less_cancel_msets\<close>
       
   269 
       
   270 simproc_setup msetle_cancel_numerals
       
   271   ("(l::'a::preorder multiset) + m \<le> n" | "(l::'a multiset) \<le> m + n" |
       
   272    "add_mset a m \<le> n" | "m \<le> add_mset a n") =
       
   273   \<open>fn phi => Multiset_Order_Simprocs.le_cancel_msets\<close>
       
   274 
       
   275 
       
   276 subsection \<open>Additional facts and instantiations\<close>
   231 
   277 
   232 lemma ex_gt_count_imp_le_multiset:
   278 lemma ex_gt_count_imp_le_multiset:
   233   "(\<forall>y :: 'a :: order. y \<in># M + N \<longrightarrow> y \<le> x) \<Longrightarrow> count M x < count N x \<Longrightarrow> M < N"
   279   "(\<forall>y :: 'a :: order. y \<in># M + N \<longrightarrow> y \<le> x) \<Longrightarrow> count M x < count N x \<Longrightarrow> M < N"
   234   unfolding less_multiset\<^sub>H\<^sub>O
   280   unfolding less_multiset\<^sub>H\<^sub>O
   235   by (metis count_greater_zero_iff le_imp_less_or_eq less_imp_not_less not_gr_zero union_iff)
   281   by (metis count_greater_zero_iff le_imp_less_or_eq less_imp_not_less not_gr_zero union_iff)