Theory Option_ord

Up to index of Isabelle/HOL/Library

theory Option_ord
imports ATP_Linkup
begin

(*  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)