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 {* |