# HG changeset patch # User desharna # Date 1638020700 -3600 # Node ID b5031a8f77180dc99232b40438db84c1de7df984 # Parent c256bba593f3beef6cfca564d9a26714bd526bb1 added lemmas irreflp_{less,greater} to preorder and {trans,irrefl}_mult{,p} to Multiset diff -r c256bba593f3 -r b5031a8f7718 src/HOL/Library/Multiset.thy --- a/src/HOL/Library/Multiset.thy Sat Nov 27 10:46:57 2021 +0100 +++ b/src/HOL/Library/Multiset.thy Sat Nov 27 14:45:00 2021 +0100 @@ -10,7 +10,7 @@ section \(Finite) Multisets\ theory Multiset -imports Cancellation + imports Cancellation begin subsection \The type of multisets\ @@ -3114,6 +3114,44 @@ ultimately show thesis by (auto intro: that) qed +lemma trans_mult: "trans r \ trans (mult r)" + by (simp add: mult_def) + +lemma transp_multp: "transp r \ transp (multp r)" + unfolding multp_def transp_trans_eq + by (fact trans_mult[of "{(x, y). r x y}" for r, folded transp_trans]) + +lemma irrefl_mult: + assumes "trans r" "irrefl r" + shows "irrefl (mult r)" +proof (intro irreflI notI) + fix M + assume "(M, M) \ mult r" + then obtain I J K where "M = I + J" and "M = I + K" + and "J \ {#}" and "(\k\set_mset K. \j\set_mset J. (k, j) \ r)" + using mult_implies_one_step[OF \trans r\] by blast + then have *: "K \ {#}" and **: "\k\set_mset K. \j\set_mset K. (k, j) \ r" by auto + have "finite (set_mset K)" by simp + hence "set_mset K = {}" + using ** + proof (induction rule: finite_induct) + case empty + thus ?case by simp + next + case (insert x F) + have False + using \irrefl r\[unfolded irrefl_def, rule_format] + using \trans r\[THEN transD] + by (metis equals0D insert.IH insert.prems insertE insertI1 insertI2) + thus ?case .. + qed + with * show False by simp +qed + +lemmas irreflp_multp = + irrefl_mult[of "{(x, y). r x y}" for r, + folded transp_trans_eq irreflp_irrefl_eq, simplified, folded multp_def] + instantiation multiset :: (preorder) order begin definition less_multiset :: "'a multiset \ 'a multiset \ bool" @@ -3123,30 +3161,29 @@ where "less_eq_multiset M N \ M < N \ M = N" instance -proof - - have irrefl: "\ M < M" for M :: "'a multiset" - proof - assume "M < M" - then have MM: "(M, M) \ mult {(x, y). x < y}" by (simp add: less_multiset_def multp_def) - have "trans {(x'::'a, x). x' < x}" - by (metis (mono_tags, lifting) case_prodD case_prodI less_trans mem_Collect_eq transI) - moreover note MM - ultimately have "\I J K. M = I + J \ M = I + K - \ J \ {#} \ (\k\set_mset K. \j\set_mset J. (k, j) \ {(x, y). x < y})" - by (rule mult_implies_one_step) - then obtain I J K where "M = I + J" and "M = I + K" - and "J \ {#}" and "(\k\set_mset K. \j\set_mset J. (k, j) \ {(x, y). x < y})" by blast - then have *: "K \ {#}" and **: "\k\set_mset K. \j\set_mset K. k < j" by auto - have "finite (set_mset K)" by simp - moreover note ** - ultimately have "set_mset K = {}" - by (induct rule: finite_induct) (auto intro: order_less_trans) - with * show False by simp - qed - have trans: "K < M \ M < N \ K < N" for K M N :: "'a multiset" - unfolding less_multiset_def multp_def mult_def by (blast intro: trancl_trans) - show "OFCLASS('a multiset, order_class)" - by standard (auto simp add: less_eq_multiset_def irrefl dest: trans) +proof intro_classes + fix M N :: "'a multiset" + show "(M < N) = (M \ N \ \ N \ M)" + unfolding less_eq_multiset_def less_multiset_def + by (metis irreflp_def irreflp_less irreflp_multp transpE transp_less transp_multp) +next + fix M :: "'a multiset" + show "M \ M" + unfolding less_eq_multiset_def + by simp +next + fix M1 M2 M3 :: "'a multiset" + show "M1 \ M2 \ M2 \ M3 \ M1 \ M3" + unfolding less_eq_multiset_def less_multiset_def + using transp_multp[OF transp_less, THEN transpD] + by blast +next + fix M N :: "'a multiset" + show "M \ N \ N \ M \ M = N" + unfolding less_eq_multiset_def less_multiset_def + using transp_multp[OF transp_less, THEN transpD] + using irreflp_multp[OF transp_less irreflp_less, unfolded irreflp_def, rule_format] + by blast qed end diff -r c256bba593f3 -r b5031a8f7718 src/HOL/Relation.thy --- a/src/HOL/Relation.thy Sat Nov 27 10:46:57 2021 +0100 +++ b/src/HOL/Relation.thy Sat Nov 27 14:45:00 2021 +0100 @@ -241,6 +241,11 @@ lemma irrefl_distinct [code]: "irrefl r \ (\(a, b) \ r. a \ b)" by (auto simp add: irrefl_def) +lemma (in preorder) irreflp_less[simp]: "irreflp (<)" + by (simp add: irreflpI) + +lemma (in preorder) irreflp_greater[simp]: "irreflp (>)" + by (simp add: irreflpI) subsubsection \Asymmetry\