diff -r 1c358879bfd3 -r e293216df994 src/HOL/Library/Multiset.thy --- a/src/HOL/Library/Multiset.thy Mon Jan 23 13:31:07 2023 +0100 +++ b/src/HOL/Library/Multiset.thy Mon Jan 23 14:34:07 2023 +0100 @@ -3390,7 +3390,7 @@ by (rule mult_cancel_max[to_pred]) -subsubsection \Partial-order properties\ +subsubsection \Strict partial-order properties\ lemma mult1_lessE: assumes "(N, M) \ mult1 {(a, b). r a b}" and "asymp r" @@ -3490,6 +3490,93 @@ by (metis wfPUNIVI wfP_induct) +subsubsection \Strict total-order properties\ + +lemma total_on_mult: + assumes "total_on A r" and "trans r" and "\M. M \ B \ set_mset M \ A" + shows "total_on B (mult r)" +proof (rule total_onI) + fix M1 M2 assume "M1 \ B" and "M2 \ B" and "M1 \ M2" + let ?I = "M1 \# M2" + show "(M1, M2) \ mult r \ (M2, M1) \ mult r" + proof (cases "M1 - ?I = {#} \ M2 - ?I = {#}") + case True + with \M1 \ M2\ show ?thesis + by (metis Diff_eq_empty_iff_mset diff_intersect_left_idem diff_intersect_right_idem + subset_implies_mult subset_mset.less_le) + next + case False + from assms(1) have "total_on (set_mset (M1 - ?I)) r" + by (meson \M1 \ B\ assms(3) diff_subset_eq_self set_mset_mono total_on_subset) + with False obtain greatest1 where + greatest1_in: "greatest1 \# M1 - ?I" and + greatest1_greatest: "\x \# M1 - ?I. greatest1 \ x \ (x, greatest1) \ r" + using Multiset.bex_greatest_element[to_set, of "M1 - ?I" r] + by (metis assms(2) subset_UNIV trans_on_subset) + + from assms(1) have "total_on (set_mset (M2 - ?I)) r" + by (meson \M2 \ B\ assms(3) diff_subset_eq_self set_mset_mono total_on_subset) + with False obtain greatest2 where + greatest2_in: "greatest2 \# M2 - ?I" and + greatest2_greatest: "\x \# M2 - ?I. greatest2 \ x \ (x, greatest2) \ r" + using Multiset.bex_greatest_element[to_set, of "M2 - ?I" r] + by (metis assms(2) subset_UNIV trans_on_subset) + + have "greatest1 \ greatest2" + using greatest1_in \greatest2 \# M2 - ?I\ + by (metis diff_intersect_left_idem diff_intersect_right_idem dual_order.eq_iff in_diff_count + in_diff_countE le_add_same_cancel2 less_irrefl zero_le) + hence "(greatest1, greatest2) \ r \ (greatest2, greatest1) \ r" + using \total_on A r\[unfolded total_on_def, rule_format, of greatest1 greatest2] + \M1 \ B\ \M2 \ B\ greatest1_in greatest2_in assms(3) + by (meson in_diffD in_mono) + thus ?thesis + proof (elim disjE) + assume "(greatest1, greatest2) \ r" + have "(?I + (M1 - ?I), ?I + (M2 - ?I)) \ mult r" + proof (rule one_step_implies_mult[of "M2 - ?I" "M1 - ?I" r ?I]) + show "M2 - ?I \ {#}" + using False by force + next + show "\k\#M1 - ?I. \j\#M2 - ?I. (k, j) \ r" + using \(greatest1, greatest2) \ r\ greatest2_in greatest1_greatest + by (metis assms(2) transD) + qed + hence "(M1, M2) \ mult r" + by (metis subset_mset.add_diff_inverse subset_mset.inf.cobounded1 + subset_mset.inf.cobounded2) + thus "(M1, M2) \ mult r \ (M2, M1) \ mult r" .. + next + assume "(greatest2, greatest1) \ r" + have "(?I + (M2 - ?I), ?I + (M1 - ?I)) \ mult r" + proof (rule one_step_implies_mult[of "M1 - ?I" "M2 - ?I" r ?I]) + show "M1 - M1 \# M2 \ {#}" + using False by force + next + show "\k\#M2 - ?I. \j\#M1 - ?I. (k, j) \ r" + using \(greatest2, greatest1) \ r\ greatest1_in greatest2_greatest + by (metis assms(2) transD) + qed + hence "(M2, M1) \ mult r" + by (metis subset_mset.add_diff_inverse subset_mset.inf.cobounded1 + subset_mset.inf.cobounded2) + thus "(M1, M2) \ mult r \ (M2, M1) \ mult r" .. + qed + qed +qed + +lemma total_mult: "total r \ trans r \ total (mult r)" + by (rule total_on_mult[of UNIV r UNIV, simplified]) + +lemma totalp_on_multp: + "totalp_on A R \ transp R \ (\M. M \ B \ set_mset M \ A) \ totalp_on B (multp R)" + using total_on_mult[of A "{(x,y). R x y}" B, to_pred] + by (simp add: multp_def total_on_def totalp_on_def) + +lemma totalp_multp: "totalp R \ transp R \ totalp (multp R)" + by (rule totalp_on_multp[of UNIV R UNIV, simplified]) + + subsection \Quasi-executable version of the multiset extension\ text \