(* Title: HOL/Library/Option_ord.thy ID: $Id: Option_ord.thy,v 1.4 2008/03/12 16:29:09 haftmann Exp $ Author: Florian Haftmann, TU Muenchen *) header {* Canonical order on option type *} theory Option_ord imports ATP_Linkup begin instantiation option :: (order) order begin definition less_eq_option where [code func del]: "x ≤ y <-> (case x of None => True | Some x => (case y of None => False | Some y => x ≤ y))" definition less_option where [code func del]: "x < y <-> (case y of None => False | Some y => (case x of None => True | Some x => x < y))" lemma less_eq_option_None [simp]: "None ≤ x" by (simp add: less_eq_option_def) lemma less_eq_option_None_code [code]: "None ≤ x <-> True" by simp lemma less_eq_option_None_is_None: "x ≤ None ==> x = None" by (cases x) (simp_all add: less_eq_option_def) lemma less_eq_option_Some_None [simp, code]: "Some x ≤ None <-> False" by (simp add: less_eq_option_def) lemma less_eq_option_Some [simp, code]: "Some x ≤ Some y <-> x ≤ y" by (simp add: less_eq_option_def) lemma less_option_None [simp, code]: "x < None <-> False" by (simp add: less_option_def) lemma less_option_None_is_Some: "None < x ==> ∃z. x = Some z" by (cases x) (simp_all add: less_option_def) lemma less_option_None_Some [simp]: "None < Some x" by (simp add: less_option_def) lemma less_option_None_Some_code [code]: "None < Some x <-> True" by simp lemma less_option_Some [simp, code]: "Some x < Some y <-> x < y" by (simp add: less_option_def) instance by default (auto simp add: less_eq_option_def less_option_def split: option.splits) end instance option :: (linorder) linorder by default (auto simp add: less_eq_option_def less_option_def split: option.splits) end
lemma less_eq_option_None:
None ≤ x
lemma less_eq_option_None_code:
(None ≤ x) = True
lemma less_eq_option_None_is_None:
x ≤ None ==> x = None
lemma less_eq_option_Some_None:
(Some x ≤ None) = False
lemma less_eq_option_Some:
(Some x ≤ Some y) = (x ≤ y)
lemma less_option_None:
(x < None) = False
lemma less_option_None_is_Some:
None < x ==> ∃z. x = Some z
lemma less_option_None_Some:
None < Some x
lemma less_option_None_Some_code:
(None < Some x) = True
lemma less_option_Some:
(Some x < Some y) = (x < y)