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) |