src/HOL/Orderings.thy
changeset 56545 8f1e7596deb7
parent 56509 e050d42dc21d
child 57447 87429bdecad5
equal deleted inserted replaced
56544:b60d5d119489 56545:8f1e7596deb7
   268 by (intro_locales, rule dual_preorder) (unfold_locales, rule antisym)
   268 by (intro_locales, rule dual_preorder) (unfold_locales, rule antisym)
   269 
   269 
   270 end
   270 end
   271 
   271 
   272 
   272 
       
   273 text {* Alternative introduction rule with bias towards strict order *}
       
   274 
       
   275 lemma order_strictI:
       
   276   fixes less (infix "\<sqsubset>" 50)
       
   277     and less_eq (infix "\<sqsubseteq>" 50)
       
   278   assumes less_eq_less: "\<And>a b. a \<sqsubseteq> b \<longleftrightarrow> a \<sqsubset> b \<or> a = b"
       
   279     assumes asym: "\<And>a b. a \<sqsubset> b \<Longrightarrow> \<not> b \<sqsubset> a"
       
   280   assumes irrefl: "\<And>a. \<not> a \<sqsubset> a"
       
   281   assumes trans: "\<And>a b c. a \<sqsubset> b \<Longrightarrow> b \<sqsubset> c \<Longrightarrow> a \<sqsubset> c"
       
   282   shows "class.order less_eq less"
       
   283 proof
       
   284   fix a b
       
   285   show "a \<sqsubset> b \<longleftrightarrow> a \<sqsubseteq> b \<and> \<not> b \<sqsubseteq> a"
       
   286     by (auto simp add: less_eq_less asym irrefl)
       
   287 next
       
   288   fix a
       
   289   show "a \<sqsubseteq> a"
       
   290     by (auto simp add: less_eq_less)
       
   291 next
       
   292   fix a b c
       
   293   assume "a \<sqsubseteq> b" and "b \<sqsubseteq> c" then show "a \<sqsubseteq> c"
       
   294     by (auto simp add: less_eq_less intro: trans)
       
   295 next
       
   296   fix a b
       
   297   assume "a \<sqsubseteq> b" and "b \<sqsubseteq> a" then show "a = b"
       
   298     by (auto simp add: less_eq_less asym)
       
   299 qed
       
   300 
       
   301 
   273 subsection {* Linear (total) orders *}
   302 subsection {* Linear (total) orders *}
   274 
   303 
   275 class linorder = order +
   304 class linorder = order +
   276   assumes linear: "x \<le> y \<or> y \<le> x"
   305   assumes linear: "x \<le> y \<or> y \<le> x"
   277 begin
   306 begin
   337 lemma dual_linorder:
   366 lemma dual_linorder:
   338   "class.linorder (op \<ge>) (op >)"
   367   "class.linorder (op \<ge>) (op >)"
   339 by (rule class.linorder.intro, rule dual_order) (unfold_locales, rule linear)
   368 by (rule class.linorder.intro, rule dual_order) (unfold_locales, rule linear)
   340 
   369 
   341 end
   370 end
       
   371 
       
   372 
       
   373 text {* Alternative introduction rule with bias towards strict order *}
       
   374 
       
   375 lemma linorder_strictI:
       
   376   fixes less (infix "\<sqsubset>" 50)
       
   377     and less_eq (infix "\<sqsubseteq>" 50)
       
   378   assumes "class.order less_eq less"
       
   379   assumes trichotomy: "\<And>a b. a \<sqsubset> b \<or> a = b \<or> b \<sqsubset> a"
       
   380   shows "class.linorder less_eq less"
       
   381 proof -
       
   382   interpret order less_eq less
       
   383     by (fact `class.order less_eq less`)
       
   384   show ?thesis
       
   385   proof
       
   386     fix a b
       
   387     show "a \<sqsubseteq> b \<or> b \<sqsubseteq> a"
       
   388       using trichotomy by (auto simp add: le_less)
       
   389   qed
       
   390 qed
   342 
   391 
   343 
   392 
   344 subsection {* Reasoning tools setup *}
   393 subsection {* Reasoning tools setup *}
   345 
   394 
   346 ML {*
   395 ML {*