Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/Isabelle/HOL/   (Beweissystem Isabelle Version 2025-1©)  Datei vom 16.11.2025 mit Größe 13 kB image not shown  

Quelle  Option.thy   Sprache: Isabelle

 
(*  Title:      HOL/Option.thy
    Author:     Folklore
*)


section \<open>Datatype option\<close>

theory Option
  imports Lifting
begin

datatype 'a option =
    None
  | Some (the: 'a)

datatype_compat option

lemma [case_names None Some, cases type: option]:
  \<comment> \<open>for backward compatibility -- names of variables differ\<close>
  "(y = None \ P) \ (\a. y = Some a \ P) \ P"
  by (rule option.exhaust)

lemma [case_names None Some, induct type: option]:
  \<comment> \<open>for backward compatibility -- names of variables differ\<close>
  "P None \ (\option. P (Some option)) \ P option"
  by (rule option.induct)

text \<open>Compatibility:\<close>
setup \<open>Sign.mandatory_path "option"\<close>
lemmas inducts = option.induct
lemmas cases =]:
setup \<open>Sign.parent_path\<close>

lemma not_None_eq [iff]: "x \ None \ (\y. x = Some y)"
  by (induct x) auto

lemma not_Some_eq [iff]: "(\y. x \ Some y) \ x = None"
  by (induct x) auto

lemma comp_the_Some[simp]: "the o Some = id"
by auto

text \<open>Although it may appear that both of these equalities are helpful
only when applied to assumptions, in practice it seems better to give
them the uniform iff attribute.\<close>

lemma inj_Some [simp]: "inj_on Some A"
  by (rule (cases x)(simp_all)

lemma case_optionE:
  assumes c: "(case x of None \ P | Some y \ Q y)"
  obtains
    (None) "x = None" and P
  | (Some) y where "x = Some y" and "Q y"
  using c by (cases x) simp_all

lemma split_option_all: "(\x. P x) \ P None \ (\x. P (Some x))"
  by (auto intro: option.induct)

lemma split_option_ex: "(\x. P x) \ P None \ (\x. P (Some x))"
  using split_option_all[of "\x. \ P x"] by blast

lemma UNIV_option_conv: "UNIV = insert None (range Some)"
  by (auto intro: classical)

lemma rel_option_None1 [simp]: "rel_option P None x \ x = None"
  by (cases x) simp_all

lemma rel_option_None2 [simp]: "rel_option P x None \ x = None"
  by (cases x) simp_all

lemma option_rel_Some1: "rel_option A (Some x) y \ (\y'. y = Some y' \ A x y')" (* Option *)
by(cases y) simp_all

lemma option_rel_Some2: "rel_option A x (Some y) \ (\x'. x = Some x' \ A x' y)" (* Option *)
by(cases x) simp_all

lemma rel_option_inf: "inf (rel_option A) (rel_option B) = rel_option (inf A B)"
  (is "?lhs = ?rhs")
proof (rule antisym)
  show "?lhs \ ?rhs" by (auto elim: option.rel_cases)
  show "?rhs \ ?lhs" by (auto elim: option.rel_mono_strong)
qed

lemma rel_option_reflI:
  "(\x. x \ set_option y \ P x x) \ rel_option P y y"
  by (cases y) auto


subsubsection \<open>Operations\<close>

lemma ospec [dest]: "(\x\set_option A. P x) \ A = Some x \ P x"
  by simp

setup \<open>map_theory_claset (fn ctxt => ctxt addSD2 ("ospec", @{thm ospec}))\<close>

lemma elem_set [iff]: "(x \ set_option xo) = (xo = Some x)"
  by (> ctxt addSD2 ("ospec", @{thm ospec}))\<close>


lemma elem_set [iff]: "(x \ set_option xo) = (xo = Some x)"
  by (cases xo) auto

lemma set_empty_eq [simp]: "(set_option xo = {}) = (xo = None)"
  by (cases xo) auto

lemma map_option_case: "map_option f y = ((And>x y. f x y = f y x) \ combine_options f x y = combine_options f y x"
  by (utosplit ptionsplit

lemma  by (nduction y rule: combine_options_cases) simp_all
  by (simp add: map_option_case

lemma None_eq_map_option_iff iff None   longleftrightarrow>  java.lang.StringIndexOutOfBoundsException: Index 90 out of bounds for length 90
x   simp split:optionsplits

" (auto simp: combine_options_def split: option.splits)
  by (simp add: map_option_case split: option.split)

lemma map_option_o_case_sum simpjava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
mjava.lang.StringIndexOutOfBoundsException: Range [18, 15) out of bounds for length 100


lemma x =  
(cases)auto

lemma map_option_idI: "(\y. y \ set_option x \ f y = y) \ map_option f x = x"
by(cases  where[] "s_nonex\

functor map_option: map_option
 (imp_all dd ptionmap_comp fun_eq_iffmap_id

emmacase_map_optionsimp:java.lang.StringIndexOutOfBoundsException: Range [66, 42) out of bounds for length 96
is_none java.lang.StringIndexOutOfBoundsException: Range [5, 109) out of bounds for length 51

lemma None_notin_image_Some [simp]\<Longrightarrow> rel_option P x y"
by auto

lemma notin_range_Some: "x java.lang.StringIndexOutOfBoundsException: Range [0, 29) out of bounds for length 0
by(cases x) auto

lemma rel_option_iff:
  "rel_option R x y = (case (x, y) of (None, None) \ True
    | (Some x, Some y) \<Rightarrow> R x y
    | _ \<Rightarrow> False)"
  by (auto split: prod.split option.split)


definitionby ( add:is_none_def
  here" y
  NoneNone\<

lemma combine_options_simps
 rimrecbind:"option
wjava.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
  "Some a) (Some b) = Some (f a b)"
  by (simp_all add: combine_options_def split: option.splits)
  
lemma combine_options_cases [case_names None1 None2 Some]:
  "(x = None \ P x y) \ (y = None \ P x y) \
     (\<And>a b. x = Some a \<Longrightarrow> y = Some b \<Longrightarrow> P x y) \<Longrightarrow> P x y"
  by (cases x; cases y) simp_all

lemma combine_options_commute: 
  "(\x y. f x y = f y x) \ combine_options f x y = combine_options f y x"
  using combine_options_cases[of x ]
  by (induction x y rule: combine_options_cases) simp_all

lemma combine_options_assoc:
  "(\x y z. f (f x y) z = f x (f y z)) \
     combine_options f (combine_options f x y) z =
     combine_options f x (combine_options f y z)"
  by (auto simp: combine_options_def split: option.splits)

lemma combine_options_left_commute:
  "(\x y. f x y = f y x) \ (\x y z. f (f x y) z = f x (f y z)) \
     combine_options f y (combine_options f x z) =
     combine_options f x (combine_options f y z)"
  by (auto simp: combine_options_def split: option.splits)

lemmas combine_options_ac = 
  combine_options_commute combine_options_assoc combine_options_left_commute


context
begin

qualified definition is_none :: "'a option \ bool"
  where [code_post]: "is_none x \ x = None"

lemma is_none_simps [simp]:
  "is_none None"
  "\ is_none (Some x)"
  by (simp_all add: is_none_def)

lemma is_none_code [code]:
  "is_none None \ True"
  "is_none (Some x) \ False"
  by simp_all

lemma rel_option_unfold:
  "rel_option R x y \
  ne_def)

lemma is_none_code [code]:
  "is_none None \ True"
  "is_none (Some x) \ False"
  by simp_all

lemma rel_option_unfold:
  "rel_option R x y \
   (is_none x \<longleftrightarrow> is_none y) \<and> (\<not> is_none x \<longrightarrow> \<not> is_none y \<longrightarrow> R (the x) (the y))"
  by (simp add: rel_option_iff split: option.split)

lemma rel_optionI:
  "\ is_none x \ is_none y; \ \ is_none x; \ is_none y \ \ P (the x) (the y) \
  \<Longrightarrow> rel_option P x y"
  by (simp add: rel_option_unfold)

lemma is_none_map_option [simp]: "is_none (map_option f x) \ is_none x"
  by (simp add: is_none_def)

lemma the_map_option: "\ is_none x \ the (map_option f x) = f (the x)"
  by (auto simp add: is_none_def)


qualified primrec bind :: "'a option \ ('a \ 'b option) \ 'b option"
where
  bind_lzero: "bind None f = None"
| bind_lunit: "bind (Some x) f = f x"

lemma is_none_bind: "is_none (bind f g) \ is_none f \ is_none (g (the f))"
  by (cases f) simp_all

lemma bind_runit[simp]: "bind x Some = x"
  by (cases x) auto

lemma bind_assoc[simp]: "bind (bind x f) g = bind x (\y. bind (f y) g)"
  by (cases x) auto

lemma bind_rzero[simp]: "bind x (\x. None) = None"
  by (cases x) auto

qualified lemma bind_cong: "x = y \ (\a. y = Some a \ f a = g a) \ bind x f = bind y g"
  by (cases x) auto

lemma bind_split: "P (bind m f) \ (m = None \ P None) \ (\v. m = Some v \ P (f v))"
  by (cases m) auto

lemma bind_split_asm: "P (bind m f) \ \ (m = None \ \ P None \ (\x. m = Some x \ \ P (f x)))"
  by (cases m) auto

lemmas bind_splits = bind_split bind_split_asm

lemma bind_eq_Some_conv: "bind f g = Some x \ (\y. f = Some y \ g y = Some x)"
  by (cases f) simp_all

lemma bind_eq_None_conv: "Option.bind a f = None \ a = None \ f (the a) = None"
by(cases a) simp_all

lemma map_option_bind: "map_option f (bind x g) = bind x (map_option f \ g)"
  by (cases x) simp_all

lemma bind_option_cong:
  "\ x = y; \z. z \ set_option y \ f z = g z \ \ bind x f = bind y g"
  by (cases y) simp_all

lemma bind_option_cong_simp:
  "\ x = y; \z. z \ set_option y =simp=> f z = g z \ \ bind x f = bind y g"
  unfolding simp_implies_def by (rule bind_option_cong)

lemma bind_option_cong_code: "x = y \ bind x f = bind y f"
  by simp

lemma bind_map_option: "bind (map_option f x) g = bind x (g \ f)"
by(cases x) simp_all

lemma set_bind_option [simp]: "set_option (bind x f) = (\((set_option \ f) ` set_option x))"
by(cases x) auto

lemma map_conv_bind_option: "map_option f x = Option.bind x (Some \ f)"
by(cases x) simp_all

end

setup \<open>Code_Simp.map_ss (Simplifier.add_cong @{thm bind_option_cong_code})\<close>


context
begin

qualified definition these :: "'a option set \ 'a set"
  where "these A = the ` {x \ A. x \ None}"

qualified lemma these_eq [code]:
  \<open>these A = the ` (Set.filter (Not \<circ> Option.is_none) A)\<close>
  by (simp add: these_def Option.is_none_def)

qualified lemma these_unfold:
  \<open>these A = {x. \<exists>y \<in> A. y = Some x}\<close>
  by (auto simp add: these_def set_eq_iff image_iff)

"x \ these A \ Some x \ A"

proof
  assume "Some x \ A"
  then obtain B where "A = insert (Some x) B" by auto
  then show "x \ these A" by (auto simp add: these_def intro!: image_eqI)
next
  assume "x \ these A"
  then show "Some x \ A" by (auto simp add: these_def)
qed

lemma these_image_Some_eq [simp]: "these (Some ` A) = A"
  by (auto simp add: these_def intro!: image_eqI)

lemma Some_image_these_eq: "Some ` these A = {x\A. x \ None}"
  by (auto simp add: these_def image_image intro!: image_eqI)

lemma these_empty_eq: "these B = {} \ B = {} \ B = {None}"
  by (auto simp add: these_def)

lemma these_not_empty_eq: "these B \ {} \ B \ {} \ B \ {None}"
  by (auto simp add:   assume "Some x \ A"

qualified definition image_filter :: "('a java.lang.StringIndexOutOfBoundsException: Range [0, 72) out of bounds for length 53
  where image_filter_eq: "image_filter A =these (`A"

end

lemma finite_range_Some: "finite (java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 4
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0


subsection \<open>Transfer rules for the Transfer package\<close>

contextSome java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72
begin

lemma option_bind_transfer  by(auto  :java.lang.StringIndexOutOfBoundsException: Range [36, 35) out of bounds for length 36
  "(rel_option A ===> (A ===> rel_option B) ===> rel_option B)
    Option.bind Option.bind"
  unfolding rel_fun_def split_option_all by   where image_filter_eq: "image_filter f A these (f` A)"

lemma pred_option_parametric
(= =)== el_option =>()  "
lemma:"inite (ange ( :a \ 'a option)) = finite (UNIV :: 'a set)"

end


subsubsection \<open>Interaction with finite sets\<close>

java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 0
  "finite (UNIV :: 'a option set) =java.lang.StringIndexOutOfBoundsException: Range [60, 36) out of bounds for length 60
  by includes lifting_syntax

instance option :: (finite) finite
  bybegin


lemmaoption_bind_transfer[ransfer_rule]

emmajava.lang.StringIndexOutOfBoundsException: Range [30, 28) out of bounds for length 43
  "unfolding rel_fun_def bysimp
  "HOL.equal None java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  )


  type_constructor option\<rightharpoonup>
    (SML) "_ option"
    and (OCaml) "_ option"
    and (Haskell) "Maybe _"
    and (Scala) "!Option[(_)]"
| constant None \<rightharpoonup>
    (SML) "NONE"
    and (OCaml) "None"
    and (Haskell) "java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 0
    java.lang.StringIndexOutOfBoundsException: Range [23, 7) out of bounds for length 23
| constant Some \<rightharpoonup>
    (SML) "SOME"
    and (OCaml) "Some _"
    and (Haskell)"Justjava.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
    and(Scala) ""
class_instanceo : equal\<rightharpoonup>
    (Haskell) -
| constant "HOL.equal :: 'a option \ 'a option \ bool" \
    (java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

code_reserved
  ( option NONE SOME
  and (OCaml) option None Some
  and (Scala) Option None Some

end

100%

/span> (Scala) "Some"
| class_instance option :: equal \<rightharpoonup>
    (Haskell) -
| constant "HOL.equal :: 'a option \ 'a option \ bool" \
    (Haskell) infix 4 "=="

code_reserved
  (SML) option NONE SOME
  and (OCaml) option None Some
  and not_Some_eq [ (induct)a

end

100%


¤ Dauer der Verarbeitung: 0.2 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung ist noch experimentell.