src/HOL/Library/Multiset_Order.thy
changeset 63407 89dd1345a04f
parent 63388 a095acd4cfbf
child 63409 3f3223b90239
equal deleted inserted replaced
63406:32866eff1843 63407:89dd1345a04f
   221   by (auto simp: less_eq_multiset_def less_multiset\<^sub>H\<^sub>O)
   221   by (auto simp: less_eq_multiset_def less_multiset\<^sub>H\<^sub>O)
   222 
   222 
   223 lemma wf_less_multiset: "wf {(M :: ('a :: wellorder) multiset, N). M < N}"
   223 lemma wf_less_multiset: "wf {(M :: ('a :: wellorder) multiset, N). M < N}"
   224   unfolding less_multiset_def by (auto intro: wf_mult wf)
   224   unfolding less_multiset_def by (auto intro: wf_mult wf)
   225 
   225 
   226 lemma order_multiset: "class.order
   226 instantiation multiset :: (linorder) linorder
   227   (op \<le> :: ('a :: order) multiset \<Rightarrow> ('a :: order) multiset \<Rightarrow> bool)
   227 begin
   228   (op < :: ('a :: order) multiset \<Rightarrow> ('a :: order) multiset \<Rightarrow> bool)"
   228   instance by standard (metis less_eq_multiset\<^sub>H\<^sub>O not_less_iff_gr_or_eq)
   229   by unfold_locales
   229 end
   230 
   230 
   231 lemma linorder_multiset: "class.linorder
   231 instantiation multiset :: (wellorder) wellorder
   232   (op \<le> :: ('a :: linorder) multiset \<Rightarrow> ('a :: linorder) multiset \<Rightarrow> bool)
   232 begin
   233   (op < :: ('a :: linorder) multiset \<Rightarrow> ('a :: linorder) multiset \<Rightarrow> bool)"
   233   instance by standard (metis less_multiset_def wf wf_def wf_mult)
   234   by unfold_locales (fastforce simp add: less_multiset\<^sub>H\<^sub>O less_eq_multiset_def not_less_iff_gr_or_eq)
   234 end
   235 
       
   236 interpretation multiset_linorder: linorder
       
   237   "op \<le> :: ('a :: linorder) multiset \<Rightarrow> ('a :: linorder) multiset \<Rightarrow> bool"
       
   238   "op < :: ('a :: linorder) multiset \<Rightarrow> ('a :: linorder) multiset \<Rightarrow> bool"
       
   239   by (rule linorder_multiset)
       
   240 
       
   241 interpretation multiset_wellorder: wellorder
       
   242   "op \<le> :: ('a :: wellorder) multiset \<Rightarrow> ('a :: wellorder) multiset \<Rightarrow> bool"
       
   243   "op < :: ('a :: wellorder) multiset \<Rightarrow> ('a :: wellorder) multiset \<Rightarrow> bool"
       
   244   by unfold_locales (blast intro: wf_less_multiset [unfolded wf_def, simplified, rule_format])
       
   245 
   235 
   246 lemma less_eq_multiset_total:
   236 lemma less_eq_multiset_total:
   247   fixes M N :: "('a :: linorder) multiset"
   237   fixes M N :: "('a :: linorder) multiset"
   248   shows "\<not> M \<le> N \<Longrightarrow> N \<le> M"
   238   shows "\<not> M \<le> N \<Longrightarrow> N \<le> M"
   249   by (metis multiset_linorder.le_cases)
   239   by simp
   250 
   240 
   251 lemma subset_eq_imp_le_multiset:
   241 lemma subset_eq_imp_le_multiset:
   252   fixes M N :: "('a :: linorder) multiset"
   242   fixes M N :: "('a :: linorder) multiset"
   253   shows "M \<le># N \<Longrightarrow> M \<le> N"
   243   shows "M \<le># N \<Longrightarrow> M \<le> N"
   254   unfolding less_eq_multiset_def less_multiset\<^sub>H\<^sub>O
   244   unfolding less_eq_multiset_def less_multiset\<^sub>H\<^sub>O
   255   by (simp add: less_le_not_le subseteq_mset_def)
   245   by (simp add: less_le_not_le subseteq_mset_def)
   256 
   246 
   257 lemma le_multiset_right_total:
   247 lemma le_multiset_right_total:
   258   fixes M :: "('a :: linorder) multiset"
   248   fixes M :: "('a :: linorder) multiset"
   259   shows "M < M + {#undefined#}"
   249   shows "M < M + {#x#}"
   260   unfolding less_eq_multiset_def less_multiset\<^sub>H\<^sub>O by simp
   250   unfolding less_eq_multiset_def less_multiset\<^sub>H\<^sub>O by simp
   261 
   251 
   262 lemma less_eq_multiset_empty_left[simp]:
   252 lemma less_eq_multiset_empty_left[simp]:
   263   fixes M :: "('a :: linorder) multiset"
   253   fixes M :: "('a :: linorder) multiset"
   264   shows "{#} \<le> M"
   254   shows "{#} \<le> M"
   292     le_multiset_plus_plus_left_iff[simp]: "M + N < M' + N \<longleftrightarrow> M < M'" and
   282     le_multiset_plus_plus_left_iff[simp]: "M + N < M' + N \<longleftrightarrow> M < M'" and
   293     le_multiset_plus_plus_right_iff[simp]: "M + N < M + N' \<longleftrightarrow> N < N'"
   283     le_multiset_plus_plus_right_iff[simp]: "M + N < M + N' \<longleftrightarrow> N < N'"
   294   unfolding less_multiset\<^sub>H\<^sub>O by auto
   284   unfolding less_multiset\<^sub>H\<^sub>O by auto
   295 
   285 
   296 lemma add_eq_self_empty_iff: "M + N = M \<longleftrightarrow> N = {#}"
   286 lemma add_eq_self_empty_iff: "M + N = M \<longleftrightarrow> N = {#}"
   297   by (metis add.commute add_diff_cancel_right' monoid_add_class.add.left_neutral)
   287   by (rule cancel_comm_monoid_add_class.add_cancel_left_right)
   298 
   288 
   299 lemma
   289 lemma
   300   fixes M N :: "('a :: linorder) multiset"
   290   fixes M N :: "('a :: linorder) multiset"
   301   shows
   291   shows
   302     le_multiset_plus_left_nonempty[simp]: "M \<noteq> {#} \<Longrightarrow> N < M + N" and
   292     le_multiset_plus_left_nonempty[simp]: "M \<noteq> {#} \<Longrightarrow> N < M + N" and