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)
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet am 2026-06-10)
¤
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.