definition hyperUn :: "'a hyperset ==> 'a hyperset ==> 'a hyperset" (infixl‹⊔›65) where "A ⊔ B ≡ case A of None ==> None | ⌊A⌋==> (case B of None ==> None | ⌊B⌋==>⌊A ∪ B⌋)"
definition hyperInt :: "'a hyperset ==> 'a hyperset ==> 'a hyperset" (infixl‹⊓›70) where "A ⊓ B ≡ case A of None ==> B | ⌊A⌋==> (case B of None ==>⌊A⌋ | ⌊B⌋==>⌊A ∩ B⌋)"
definition hyperDiff1 :: "'a hyperset ==> 'a ==> 'a hyperset" (infixl‹⊖›65) where "A ⊖ a ≡ case A of None ==> None | ⌊A⌋==>⌊A - {a}⌋"
definition hyper_isin :: "'a ==> 'a hyperset ==> bool" (infix‹∈∈›50) where "a ∈∈ A ≡ case A of None ==> True | ⌊A⌋==> a ∈ A"
definition hyper_subset :: "'a hyperset ==> 'a hyperset ==> bool" (infix‹⊑›50) where "A ⊑ B ≡ case B of None ==> True | ⌊B⌋==> (case A of None ==> False | ⌊A⌋==> A ⊆ B)"
lemma sqInt_lem: "A ⊑ A' ==> A ⊓ B ⊑ A' ⊓ B" by(auto simp add: hyperset_defs)
subsection"Definite assignment"
primrecA :: "('a,'b,'addr) exp ==> 'a hyperset" andAs :: "('a,'b,'addr) exp list ==> 'a hyperset" where "A (new C) = ⌊{}⌋"
| "A (newA T⌊e⌉) = A e"
| "A (Cast C e) = A e"
| "A (e instanceof T) = A e"
| "A (Val v) = ⌊{}⌋"
| "A (e1«bop¬ e2) = A e1⊔A e2"
| "A (Var V) = ⌊{}⌋"
| "A (LAss V e) = ⌊{V}⌋⊔A e"
| "A (a⌊i⌉) = A a ⊔A i"
| "A (a⌊i⌉ := e) = A a ⊔A i ⊔A e"
| "A (a∙length) = A a"
| "A (e∙F{D}) = A e"
| "A (e1∙F{D}:=e2) = A e1⊔A e2"
| "A (e1∙compareAndSwap(D∙F, e2, e3)) = A e1 ⊔A e2 ⊔A e3"
| "A (e∙M(es)) = A e ⊔As es"
| "A ({V:T=vo; e}) = A e ⊖ V"
| "A (sync (o') e) = A o' ⊔A e"
| "A (insync (a) e) = A e"
| "A (e1;;e2) = A e1⊔A e2"
| "A (if (e) e1 else e2) = A e ⊔ (A e1⊓A e2)"
| "A (while (b) e) = A b"
| "A (throw e) = None"
| "A (try e1 catch(C V) e2) = A e1⊓ (A e2⊖ V)"
| "As ([]) = ⌊{}⌋"
| "As (e#es) = A e ⊔As es"
primrecD :: "('a,'b,'addr) exp ==> 'a hyperset ==> bool" andDs :: "('a,'b,'addr) exp list ==> 'a hyperset ==> bool" where "D (new C) A = True"
| "D (newA T⌊e⌉) A = D e A"
| "D (Cast C e) A = D e A"
| "D (e instanceof T) = D e"
| "D (Val v) A = True"
| "D (e1«bop¬ e2) A = (D e1 A ∧D e2 (A ⊔A e1))"
| "D (Var V) A = (V ∈∈ A)"
| "D (LAss V e) A = D e A"
| "D (a⌊i⌉) A = (D a A ∧D i (A ⊔A a))"
| "D (a⌊i⌉ := e) A = (D a A ∧D i (A ⊔A a) ∧D e (A ⊔A a ⊔A i))"
| "D (a∙length) A = D a A"
| "D (e∙F{D}) A = D e A"
| "D (e1∙F{D}:=e2) A = (D e1 A ∧D e2 (A ⊔A e1))"
| "D (e1∙compareAndSwap(D∙F, e2, e3)) A = (D e1 A ∧D e2 (A ⊔A e1) ∧D e3 (A ⊔A e1 ⊔A e2))"
| "D (e∙M(es)) A = (D e A ∧Ds es (A ⊔A e))"
| "D ({V:T=vo; e}) A = (if vo = None then D e (A ⊖ V) else D e (A ⊔⌊{V}⌋))"
| "D (sync (o') e) A = (D o' A ∧D e (A ⊔A o'))"
| "D (insync (a) e) A = D e A"
| "D (e1;;e2) A = (D e1 A ∧D e2 (A ⊔A e1))"
| "D (if (e) e1 else e2) A = (D e A ∧D e1 (A ⊔A e) ∧D e2 (A ⊔A e))"
| "D (while (e) c) A = (D e A ∧D c (A ⊔A e))"
| "D (throw e) A = D e A"
| "D (try e1 catch(C V) e2) A = (D e1 A ∧D e2 (A ⊔⌊{V}⌋))"
| "Ds ([]) A = True"
| "Ds (e#es) A = (D e A ∧Ds es (A ⊔A e))"
lemma D_append[iff]: "∧A. Ds (es @ es') A = (Ds es A ∧Ds es' (A ⊔As es))" (*<*)by (induct es type:list) (auto simp:hyperUn_assoc)(*>*)
lemmafixes e :: "('a,'b,'addr) exp"and es :: "('a,'b,'addr) exp list" shows A_fv: "∧A. A e = ⌊A⌋==> A ⊆ fv e" and"∧A. As es = ⌊A⌋==> A ⊆ fvs es" apply(induct e and es rule: A.induct As.induct) apply (simp_all add:hyperset_defs) apply fast+ done
lemma sqUn_lem: "A ⊑ A' ==> A ⊔ B ⊑ A' ⊔ B" (*<*)by(simp add:hyperset_defs) blast(*>*)
lemma diff_lem: "A ⊑ A' ==> A ⊖ b ⊑ A' ⊖ b" (*<*)by(simp add:hyperset_defs) blast(*>*)
(* This order of the premises avoids looping of the simplifier *) lemmafixes e :: "('a, 'b, 'addr) exp"and es :: "('a, 'b, 'addr) exp list" shows D_mono: "∧A A'. A ⊑ A' ==>D e A ==>D e A'" and Ds_mono: "∧A A'. A ⊑ A' ==>Ds es A ==>Ds es A'" (*<*) apply(induct e and es rule: D.induct Ds.induct)
subgoal by simp
subgoal by simp
subgoal by simp
subgoal by simp
subgoal by simp
subgoal by simp (iprover dest:sqUn_lem)
subgoal by(fastforce simp add:hyperset_defs)
subgoal by simp
subgoal by simp (iprover dest:sqUn_lem)
subgoal by simp (iprover dest:sqUn_lem)
subgoal by simp
subgoal by simp
subgoal by simp (iprover dest:sqUn_lem)
subgoal by simp (iprover dest:sqUn_lem)
subgoal by simp (iprover dest: sqUn_lem)
subgoal apply(clarsimp split: if_split_asm) apply (iprover dest:diff_lem) apply(iprover dest: sqUn_lem) done
subgoal by simp (iprover dest:sqUn_lem)
subgoal by simp
subgoal by simp (iprover dest:sqUn_lem)
subgoal by simp (iprover dest:sqUn_lem)
subgoal by simp (iprover dest:sqUn_lem)
subgoal by simp
subgoal by simp (iprover dest:sqUn_lem)
subgoal by simp
subgoal by simp (iprover dest:sqUn_lem) done (*>*)
(* And this is the order of premises preferred during application: *) lemma D_mono': "D e A ==> A ⊑ A' ==>D e A'" and Ds_mono': "Ds es A ==> A ⊑ A' ==>Ds es A'" (*<*)by(blast intro:D_mono, blast intro:Ds_mono)(*>*)
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 und die Messung sind noch experimentell.