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 [simp]: "None ⊔ A = None ∧ A ⊔ None = None" (*<*)by(simp add:hyperset_defs)(*>*)
lemma [simp]: "a ∈∈ None ∧ None ⊖ a = None" (*<*)by(simp add:hyperset_defs)(*>*)
lemma hyper_isin_union: "x ∈∈⌊A⌋==> x ∈∈⌊A⌋⊔ B" by(case_tac B, auto simp: hyper_isin_def)
lemma hyperUn_assoc: "(A ⊔ B) ⊔ C = A ⊔ (B ⊔ C)" (*<*)by(simp add:hyperset_defs Un_assoc)(*>*)
lemma hyper_insert_comm: "A ⊔⌊{a}⌋ = ⌊{a}⌋⊔ A ∧ A ⊔ (⌊{a}⌋⊔ B) = ⌊{a}⌋⊔ (A ⊔ B)" (*<*)by(simp add:hyperset_defs)(*>*)
lemma hyper_comm: "A ⊔ B = B ⊔ A ∧ A ⊔ B ⊔ C = B ⊔ A ⊔ C" (*<*) proof(cases A) case SomeA: Some thenshow ?thesis proof(cases B) case SomeB: Some with SomeA show ?thesis proof(cases C) case SomeC: Some with SomeA SomeB show ?thesis by(simp add: Un_left_commute Un_commute) qed (simp add: Un_commute) qed simp qed simp (*>*)
subsection"Definite assignment"
primrec A :: "'a exp ==> 'a hyperset" andAs :: "'a exp list ==> 'a hyperset" where "A (new C) = ⌊{}⌋"
| "A (Cast C e) = A e"
| "A (Val v) = ⌊{}⌋"
| "A (e1«bop¬ e2) = A e1⊔A e2"
| "A (Var V) = ⌊{}⌋"
| "A (LAss V e) = ⌊{V}⌋⊔A e"
| "A (e∙F{D}) = A e"
| "A (C∙sF{D}) = ⌊{}⌋"
| "A (e1∙F{D}:=e2) = A e1⊔A e2"
| "A (C∙sF{D}:=e2) = A e2"
| "A (e∙M(es)) = A e ⊔As es"
| "A (C∙sM(es)) = As es"
| "A ({V:T; e}) = A e ⊖ V"
| "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)"
| "A (INIT C (Cs,b) ← e) = ⌊{}⌋"
| "A (RI (C,e);Cs ← e') = A e"
| "As ([]) = ⌊{}⌋"
| "As (e#es) = A e ⊔As es"
primrec D :: "'a exp ==> 'a hyperset ==> bool" andDs :: "'a exp list ==> 'a hyperset ==> bool" where "D (new C) A = True"
| "D (Cast C e) A = D e A"
| "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 (e∙F{D}) A = D e A"
| "D (C∙sF{D}) A = True"
| "D (e1∙F{D}:=e2) A = (D e1 A ∧D e2 (A ⊔A e1))"
| "D (C∙sF{D}:=e2) A = D e2 A"
| "D (e∙M(es)) A = (D e A ∧Ds es (A ⊔A e))"
| "D (C∙sM(es)) A = Ds es A"
| "D ({V:T; e}) A = D e (A ⊖ V)"
| "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}⌋))"
| "D (INIT C (Cs,b) ← e) A = D e A"
| "D (RI (C,e);Cs ← e') A = (D e A ∧D e' A)"
| "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)(*>*)
lemma A_fv: "∧A. A e = ⌊A⌋==> A ⊆ fv e" and"∧A. As es = ⌊A⌋==> A ⊆ fvs es" (*<*) by (induct e and es rule: A.induct As.induct)
(fastforce simp add:hyperset_defs)+ (*>*)
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 *) lemma D_mono: "∧A A'. A ⊑ A' ==>D e A ==>D (e::'a exp) A'" and Ds_mono: "∧A A'. A ⊑ A' ==>Ds es A ==>Ds (es::'a exp list) A'" (*<*) proof(induct e and es rule: D.induct Ds.induct) case BinOp thenshow ?caseby simp (iprover dest:sqUn_lem) next case Var thenshow ?caseby (fastforce simp add:hyperset_defs) next case FAss thenshow ?caseby simp (iprover dest:sqUn_lem) next case Call thenshow ?caseby simp (iprover dest:sqUn_lem) next case Block thenshow ?caseby simp (iprover dest:diff_lem) next case Seq thenshow ?caseby simp (iprover dest:sqUn_lem) next case Cond thenshow ?caseby simp (iprover dest:sqUn_lem) next case While thenshow ?caseby simp (iprover dest:sqUn_lem) next case TryCatch thenshow ?caseby simp (iprover dest:sqUn_lem) next case Cons_exp thenshow ?caseby simp (iprover dest:sqUn_lem) qed simp_all (*>*)
(* 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)(*>*)
lemma Ds_Vals: "Ds (map Val vs) A"by(induct vs, auto)
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.