diff -r 3395fe5e3893 -r a095acd4cfbf src/HOL/Library/Multiset.thy --- a/src/HOL/Library/Multiset.thy Tue Jul 05 10:26:23 2016 +0200 +++ b/src/HOL/Library/Multiset.thy Tue Jul 05 13:05:04 2016 +0200 @@ -2500,21 +2500,20 @@ ultimately show thesis by (auto intro: that) qed -definition less_multiset :: "'a::order multiset \ 'a multiset \ bool" (infix "#\#" 50) - where "M' #\# M \ (M', M) \ mult {(x', x). x' < x}" - -definition le_multiset :: "'a::order multiset \ 'a multiset \ bool" (infix "#\#" 50) - where "M' #\# M \ M' #\# M \ M' = M" - -notation (ASCII) - less_multiset (infix "#<#" 50) and - le_multiset (infix "#<=#" 50) - -interpretation multiset_order: order le_multiset less_multiset +instantiation multiset :: (order) order +begin + +definition less_multiset :: "'a multiset \ 'a multiset \ bool" + where "M' < M \ (M', M) \ mult {(x', x). x' < x}" + +definition less_eq_multiset :: "'a multiset \ 'a multiset \ bool" + where "less_eq_multiset M' M \ M' < M \ M' = M" + +instance proof - - have irrefl: "\ M #\# M" for M :: "'a multiset" + have irrefl: "\ M < M" for M :: "'a multiset" proof - assume "M #\# M" + assume "M < M" then have MM: "(M, M) \ mult {(x, y). x < y}" by (simp add: less_multiset_def) have "trans {(x'::'a, x). x' < x}" by (rule transI) simp @@ -2531,15 +2530,16 @@ 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" + have trans: "K < M \ M < N \ K < N" for K M N :: "'a multiset" unfolding less_multiset_def mult_def by (blast intro: trancl_trans) - show "class.order (le_multiset :: 'a multiset \ _) less_multiset" - by standard (auto simp add: le_multiset_def irrefl dest: trans) -qed \ \FIXME avoid junk stemming from type class interpretation\ - -lemma mult_less_irrefl [elim!]: + show "OFCLASS('a multiset, order_class)" + by standard (auto simp add: less_eq_multiset_def irrefl dest: trans) +qed +end \ \FIXME avoid junk stemming from type class interpretation\ + +lemma mset_le_irrefl [elim!]: fixes M :: "'a::order multiset" - shows "M #\# M \ R" + shows "M < M \ R" by simp @@ -2553,27 +2553,29 @@ apply (simp add: add.assoc) done -lemma union_less_mono2: "B #\# D \ C + B #\# C + (D::'a::order multiset)" +lemma union_le_mono2: "B < D \ C + B < C + (D::'a::order multiset)" apply (unfold less_multiset_def mult_def) apply (erule trancl_induct) apply (blast intro: mult1_union) apply (blast intro: mult1_union trancl_trans) done -lemma union_less_mono1: "B #\# D \ B + C #\# D + (C::'a::order multiset)" +lemma union_le_mono1: "B < D \ B + C < D + (C::'a::order multiset)" apply (subst add.commute [of B C]) apply (subst add.commute [of D C]) -apply (erule union_less_mono2) +apply (erule union_le_mono2) done lemma union_less_mono: fixes A B C D :: "'a::order multiset" - shows "A #\# C \ B #\# D \ A + B #\# C + D" - by (blast intro!: union_less_mono1 union_less_mono2 multiset_order.less_trans) - -interpretation multiset_order: ordered_ab_semigroup_add plus le_multiset less_multiset - by standard (auto simp add: le_multiset_def intro: union_less_mono2) - + shows "A < C \ B < D \ A + B < C + D" + by (blast intro!: union_le_mono1 union_le_mono2 less_trans) + +instantiation multiset :: (order) ordered_ab_semigroup_add +begin +instance + by standard (auto simp add: less_eq_multiset_def intro: union_le_mono2) +end subsubsection \Termination proofs with multiset orders\ @@ -2767,17 +2769,17 @@ multiset_inter_assoc multiset_inter_left_commute -lemma mult_less_not_refl: "\ M #\# (M::'a::order multiset)" - by (fact multiset_order.less_irrefl) - -lemma mult_less_trans: "K #\# M \ M #\# N \ K #\# (N::'a::order multiset)" - by (fact multiset_order.less_trans) - -lemma mult_less_not_sym: "M #\# N \ \ N #\# (M::'a::order multiset)" - by (fact multiset_order.less_not_sym) - -lemma mult_less_asym: "M #\# N \ (\ P \ N #\# (M::'a::order multiset)) \ P" - by (fact multiset_order.less_asym) +lemma mset_le_not_refl: "\ M < (M::'a::order multiset)" + by (fact less_irrefl) + +lemma mset_le_trans: "K < M \ M < N \ K < (N::'a::order multiset)" + by (fact less_trans) + +lemma mset_le_not_sym: "M < N \ \ N < (M::'a::order multiset)" + by (fact less_not_sym) + +lemma mset_le_asym: "M < N \ (\ P \ N < (M::'a::order multiset)) \ P" + by (fact less_asym) declaration \ let @@ -2951,8 +2953,8 @@ qed text \ - Exercise for the casual reader: add implementations for @{const le_multiset} - and @{const less_multiset} (multiset order). + Exercise for the casual reader: add implementations for @{term "op \"} + and @{term "op <"} (multiset order). \ text \Quickcheck generators\