theory SmallStep imports Expr State WWellForm begin
fun blocks :: "vname list * ty list * val list * expr ==> expr" where "blocks(V#Vs, T#Ts, v#vs, e) = {V:T := Val v; blocks(Vs,Ts,vs,e)}"
|"blocks([],[],[],e) = e"
lemma [simp]: "[ size vs = size Vs; size Ts = size Vs ]==> fv(blocks(Vs,Ts,vs,e)) = fv e - set Vs" (*<*) by (induct rule:blocks_induct) auto (*>*)
lemma sub_RI_blocks_body[iff]: "length vs = length pns ==> length Ts = length pns ==> sub_RI (blocks (pns, Ts, vs, body)) ⟷ sub_RI body" proof(induct pns arbitrary: Ts vs) case Nil thenshow ?caseby simp next case Cons thenshow ?caseby(cases vs; cases Ts) auto qed
definition assigned :: "'a ==> 'a exp ==> bool" where "assigned V e ≡∃v e'. e = (V := Val v;; e')"
― ‹ expression is okay to go the right side of @{text INIT} or @{text "RI ←"}
or to have indicator Boolean be True (in latter case, given that class is
also verified initialized) › fun icheck :: "'m prog ==> cname ==> 'a exp ==> bool"where "icheck P C' (new C) = (C' = C)" | "icheck P D' (C∙sF{D}) = ((D' = D) ∧ (∃T. P ⊨ C has F,Static:T in D))" | "icheck P D' (C∙sF{D}:=(Val v)) = ((D' = D) ∧ (∃T. P ⊨ C has F,Static:T in D))" | "icheck P D (C∙sM(es)) = ((∃vs. es = map Val vs) ∧ (∃Ts T m. P ⊨ C sees M,Static:Ts→T = m in D))" | "icheck P _ _ = False"
lemma nicheck_SFAss_nonVal: "val_of e2 = None ==>¬icheck P C' (C∙sF{D} := (e2::'a exp))" by(rule notI, cases e2, auto)
inductive_set
red :: "J_prog ==> ((expr × state × bool) × (expr × state × bool)) set" and reds :: "J_prog ==> ((expr list × state × bool) × (expr list × state × bool)) set" and red' :: "J_prog ==> expr ==> state ==> bool ==> expr ==> state ==> bool ==> bool"
(‹_ ⊨ ((1⟨_,/_,/_⟩) →/ (1⟨_,/_,/_⟩))› [51,0,0,0,0,0,0] 81) and reds' :: "J_prog ==> expr list ==> state ==> bool ==> expr list ==> state ==> bool ==> bool"
(‹_ ⊨ ((1⟨_,/_,/_⟩) [→]/ (1⟨_,/_,/_⟩))› [51,0,0,0,0,0,0] 81) for P :: J_prog where
| RedFAccNone: "[ h a = Some(C,fs); ¬(∃b t. P ⊨ C has F,b:t in D) ] ==> P ⊨⟨(addr a)∙F{D},(h,l,sh),b⟩→⟨THROW NoSuchFieldError,(h,l,sh),b⟩"
| RedFAccStatic: "[ h a = Some(C,fs); P ⊨ C has F,Static:t in D ] ==> P ⊨⟨(addr a)∙F{D},(h,l,sh),b⟩→⟨THROW IncompatibleClassChangeError,(h,l,sh),b⟩"
| RedSFAcc: "[ P ⊨ C has F,Static:t in D; sh D = Some (sfs,i); sfs F = Some v ] ==> P ⊨⟨C∙sF{D},(h,l,sh),True⟩→⟨Val v,(h,l,sh),False⟩"
| SFAccInitDoneRed: "[ P ⊨ C has F,Static:t in D; sh D = Some (sfs,Done) ] ==> P ⊨⟨C∙sF{D},(h,l,sh),False⟩→⟨C∙sF{D},(h,l,sh),True⟩"
| SFAccInitRed: "[ P ⊨ C has F,Static:t in D; ∄sfs. sh D = Some (sfs,Done) ] ==> P ⊨⟨C∙sF{D},(h,l,sh),False⟩→⟨INIT D ([D],False) ← C∙sF{D},(h,l,sh),False⟩"
| RedSFAccNone: "¬(∃b t. P ⊨ C has F,b:t in D) ==> P ⊨⟨C∙sF{D},(h,l,sh),b⟩→⟨THROW NoSuchFieldError,(h,l,sh),False⟩"
| RedSFAccNonStatic: "P ⊨ C has F,NonStatic:t in D ==> P ⊨⟨C∙sF{D},(h,l,sh),b⟩→⟨THROW IncompatibleClassChangeError,(h,l,sh),False⟩"
| FAssRed1: "P ⊨⟨e,s,b⟩→⟨e',s',b'⟩==> P ⊨⟨e∙F{D}:=e2, s, b⟩→⟨e'∙F{D}:=e2, s', b'⟩"
| RedFAssNone: "[ h a = Some(C,fs); ¬(∃b t. P ⊨ C has F,b:t in D) ] ==> P ⊨⟨(addr a)∙F{D}:=(Val v),(h,l,sh),b⟩→⟨THROW NoSuchFieldError,(h,l,sh),b⟩"
| RedFAssStatic: "[ h a = Some(C,fs); P ⊨ C has F,Static:t in D ] ==> P ⊨⟨(addr a)∙F{D}:=(Val v),(h,l,sh),b⟩→⟨THROW IncompatibleClassChangeError,(h,l,sh),b⟩"
| SFAssRed: "P ⊨⟨e,s,b⟩→⟨e',s',b'⟩==> P ⊨⟨C∙sF{D}:=e, s, b⟩→⟨C∙sF{D}:=e', s', b'⟩"
| RedSFAss: "[ P ⊨ C has F,Static:t in D; sh D = Some(sfs,i); sfs' = sfs(F↦v); sh' = sh(D↦(sfs',i)) ] ==> P ⊨⟨C∙sF{D}:=(Val v),(h,l,sh),True⟩→⟨unit,(h,l,sh'),False⟩"
| SFAssInitDoneRed: "[ P ⊨ C has F,Static:t in D; sh D = Some(sfs,Done) ] ==> P ⊨⟨C∙sF{D}:=(Val v),(h,l,sh),False⟩→⟨C∙sF{D}:=(Val v),(h,l,sh),True⟩"
| SFAssInitRed: "[ P ⊨ C has F,Static:t in D; ∄sfs. sh D = Some(sfs,Done) ] ==> P ⊨⟨C∙sF{D}:=(Val v),(h,l,sh),False⟩→⟨INIT D ([D],False)← C∙sF{D}:=(Val v),(h,l,sh),False⟩"
| RedSFAssNone: "¬(∃b t. P ⊨ C has F,b:t in D) ==> P ⊨⟨C∙sF{D}:=(Val v),s,b⟩→⟨THROW NoSuchFieldError,s,False⟩"
| RedSFAssNonStatic: "P ⊨ C has F,NonStatic:t in D ==> P ⊨⟨C∙sF{D}:=(Val v),s,b⟩→⟨THROW IncompatibleClassChangeError,s,False⟩"
| CallObj: "P ⊨⟨e,s,b⟩→⟨e',s',b'⟩==> P ⊨⟨e∙M(es),s,b⟩→⟨e'∙M(es),s',b'⟩"
| CallParams: "P ⊨⟨es,s,b⟩ [→] ⟨es',s',b'⟩==> P ⊨⟨(Val v)∙M(es),s,b⟩→⟨(Val v)∙M(es'),s',b'⟩"
| RedCall: "[ h a = Some(C,fs); P ⊨ C sees M,NonStatic:Ts→T = (pns,body) in D; size vs = size pns; size Ts = size pns ] ==> P ⊨⟨(addr a)∙M(map Val vs), (h,l,sh), b⟩→⟨blocks(this#pns, Class D#Ts, Addr a#vs, body), (h,l,sh), b⟩"
| RedCallNull: "P ⊨⟨null∙M(map Val vs),s,b⟩→⟨THROW NullPointer,s,b⟩"
| RedCallNone: "[ h a = Some(C,fs); ¬(∃b Ts T m D. P ⊨ C sees M,b:Ts→T = m in D) ] ==> P ⊨⟨(addr a)∙M(map Val vs),(h,l,sh),b⟩→⟨THROW NoSuchMethodError,(h,l,sh),b⟩"
| RedCallStatic: "[ h a = Some(C,fs); P ⊨ C sees M,Static:Ts→T = m in D ] ==> P ⊨⟨(addr a)∙M(map Val vs),(h,l,sh),b⟩→⟨THROW IncompatibleClassChangeError,(h,l,sh),b⟩"
| SCallParams: "P ⊨⟨es,s,b⟩ [→] ⟨es',s',b'⟩==> P ⊨⟨C∙sM(es),s,b⟩→⟨C∙sM(es'),s',b'⟩"
| RedSCall: "[ P ⊨ C sees M,Static:Ts→T = (pns,body) in D; length vs = length pns; size Ts = size pns ] ==> P ⊨⟨C∙sM(map Val vs),s,True⟩→⟨blocks(pns, Ts, vs, body), s, False⟩"
| SCallInitDoneRed: "[ P ⊨ C sees M,Static:Ts→T = (pns,body) in D; sh D = Some(sfs,Done) ∨ (M = clinit ∧ sh D = Some(sfs,Processing)) ] ==> P ⊨⟨C∙sM(map Val vs),(h,l,sh), False⟩→⟨C∙sM(map Val vs),(h,l,sh), True⟩"
| SCallInitRed: "[ P ⊨ C sees M,Static:Ts→T = (pns,body) in D; ∄sfs. sh D = Some(sfs,Done); M ≠ clinit ] ==> P ⊨⟨C∙sM(map Val vs),(h,l,sh), False⟩→⟨INIT D ([D],False) ← C∙sM(map Val vs),(h,l,sh),False⟩"
| RedSCallNone: "[¬(∃b Ts T m D. P ⊨ C sees M,b:Ts→T = m in D) ] ==> P ⊨⟨C∙sM(map Val vs),s,b⟩→⟨THROW NoSuchMethodError,s,False⟩"
| RedSCallNonStatic: "[ P ⊨ C sees M,NonStatic:Ts→T = m in D ] ==> P ⊨⟨C∙sM(map Val vs),s,b⟩→⟨THROW IncompatibleClassChangeError,s,False⟩"
| BlockRedNone: "[ P ⊨⟨e, (h,l(V:=None),sh), b⟩→⟨e', (h',l',sh'), b'⟩; l' V = None; ¬ assigned V e] ==> P ⊨⟨{V:T; e}, (h,l,sh), b⟩→⟨{V:T; e'}, (h',l'(V := l V),sh'), b'⟩"
| BlockRedSome: "[ P ⊨⟨e, (h,l(V:=None),sh), b⟩→⟨e', (h',l',sh'), b'⟩; l' V = Some v;¬ assigned V e ] ==> P ⊨⟨{V:T; e}, (h,l,sh), b⟩→⟨{V:T := Val v; e'}, (h',l'(V := l V),sh'), b'⟩"
| InitBlockRed: "[ P ⊨⟨e, (h,l(V↦v),sh), b⟩→⟨e', (h',l',sh'), b'⟩; l' V = Some v' ] ==> P ⊨⟨{V:T := Val v; e}, (h,l,sh), b⟩→⟨{V:T := Val v'; e'}, (h',l'(V := l V),sh'), b'⟩"
| RedBlock: "P ⊨⟨{V:T; Val u}, s, b⟩→⟨Val u, s, b⟩"
| RedInitBlock: "P ⊨⟨{V:T := Val v; Val u}, s, b⟩→⟨Val u, s, b⟩"
| SeqRed: "P ⊨⟨e,s,b⟩→⟨e',s',b'⟩==> P ⊨⟨e;;e2, s, b⟩→⟨e';;e2, s', b'⟩"
| RedTryCatch: "[ hp s a = Some(D,fs); P ⊨ D ⪯* C ] ==> P ⊨⟨try (Throw a) catch(C V) e2, s, b⟩→⟨{V:Class C := addr a; e2}, s, b⟩"
| RedTryFail: "[ hp s a = Some(D,fs); ¬ P ⊨ D ⪯* C ] ==> P ⊨⟨try (Throw a) catch(C V) e2, s, b⟩→⟨Throw a, s, b⟩"
| ListRed1: "P ⊨⟨e,s,b⟩→⟨e',s',b'⟩==> P ⊨⟨e#es,s,b⟩ [→] ⟨e'#es,s',b'⟩"
| ListRed2: "P ⊨⟨es,s,b⟩ [→] ⟨es',s',b'⟩==> P ⊨⟨Val v # es,s,b⟩ [→] ⟨Val v # es',s',b'⟩"
― ‹Initialization procedure›
| RedInit: "¬sub_RI e ==> P ⊨⟨INIT C (Nil,b) ← e,s,b'⟩→⟨e,s,icheck P C e⟩"
| InitNoneRed: "sh C = None ==> P ⊨⟨INIT C' (C#Cs,False) ← e,(h,l,sh),b⟩→⟨INIT C' (C#Cs,False) ← e,(h,l,sh(C ↦(sblank P C, Prepared))),b⟩"
| RedInitDone: "sh C = Some(sfs,Done) ==> P ⊨⟨INIT C' (C#Cs,False) ← e,(h,l,sh),b⟩→⟨INIT C' (Cs,True) ← e,(h,l,sh),b⟩"
| RedInitProcessing: "sh C = Some(sfs,Processing) ==> P ⊨⟨INIT C' (C#Cs,False) ← e,(h,l,sh),b⟩→⟨INIT C' (Cs,True) ← e,(h,l,sh),b⟩"
| RedInitError: "sh C = Some(sfs,Error) ==> P ⊨⟨INIT C' (C#Cs,False) ← e,(h,l,sh),b⟩→⟨RI (C,THROW NoClassDefFoundError);Cs← e,(h,l,sh),b⟩"
| InitObjectRed: "[ sh C = Some(sfs,Prepared); C = Object; sh' = sh(C ↦ (sfs,Processing)) ] ==> P ⊨⟨INIT C' (C#Cs,False) ← e,(h,l,sh),b⟩→⟨INIT C' (C#Cs,True) ← e,(h,l,sh'),b⟩"
| InitNonObjectSuperRed: "[ sh C = Some(sfs,Prepared); C ≠ Object; class P C = Some (D,r); sh' = sh(C ↦ (sfs,Processing)) ] ==> P ⊨⟨INIT C' (C#Cs,False) ← e,(h,l,sh),b⟩→⟨INIT C' (D#C#Cs,False) ← e,(h,l,sh'),b⟩"
| RedRInit: "[ sh C = Some (sfs, i); sh' = sh(C ↦ (sfs,Done)); C' = last(C#Cs) ]==> P ⊨⟨RI (C, Val v);Cs ← e, (h,l,sh), b⟩→⟨INIT C' (Cs,True) ← e, (h,l,sh'), b⟩"
― ‹Exception propagation›
| CastThrow: "P ⊨⟨Cast C (throw e), s, b⟩→⟨throw e, s, b⟩"
| BinOpThrow1: "P ⊨⟨(throw e) «bop¬ e2, s, b⟩→⟨throw e, s, b⟩"
| BinOpThrow2: "P ⊨⟨(Val v1) «bop¬ (throw e), s, b⟩→⟨throw e, s, b⟩"
| LAssThrow: "P ⊨⟨V:=(throw e), s, b⟩→⟨throw e, s, b⟩"
| FAccThrow: "P ⊨⟨(throw e)∙F{D}, s, b⟩→⟨throw e, s, b⟩"
| FAssThrow1: "P ⊨⟨(throw e)∙F{D}:=e2, s, b⟩→⟨throw e, s, b⟩"
| FAssThrow2: "P ⊨⟨Val v∙F{D}:=(throw e), s, b⟩→⟨throw e, s, b⟩"
| SFAssThrow: "P ⊨⟨C∙sF{D}:=(throw e), s, b⟩→⟨throw e, s, b⟩"
| CallThrowObj: "P ⊨⟨(throw e)∙M(es), s, b⟩→⟨throw e, s, b⟩"
| CallThrowParams: "[ es = map Val vs @ throw e # es' ]==> P ⊨⟨(Val v)∙M(es), s, b⟩→⟨throw e, s, b⟩"
| SCallThrowParams: "[ es = map Val vs @ throw e # es' ]==> P ⊨⟨C∙sM(es), s, b⟩→⟨throw e, s, b⟩"
| BlockThrow: "P ⊨⟨{V:T; Throw a}, s, b⟩→⟨Throw a, s, b⟩"
| InitBlockThrow: "P ⊨⟨{V:T := Val v; Throw a}, s, b⟩→⟨Throw a, s, b⟩"
| SeqThrow: "P ⊨⟨(throw e);;e2, s, b⟩→⟨throw e, s, b⟩"
| CondThrow: "P ⊨⟨if (throw e) e1 else e2, s, b⟩→⟨throw e, s, b⟩"
| ThrowThrow: "P ⊨⟨throw(throw e), s, b⟩→⟨throw e, s, b⟩"
| RInitInitThrow: "[ sh C = Some(sfs,i); sh' = sh(C ↦ (sfs,Error)) ]==> P ⊨⟨RI (C,Throw a);D#Cs ← e,(h,l,sh),b⟩→⟨RI (D,Throw a);Cs ← e,(h,l,sh'),b⟩"
| RInitThrow: "[ sh C = Some(sfs, i); sh' = sh(C ↦ (sfs,Error)) ]==> P ⊨⟨RI (C,Throw a);Nil ← e,(h,l,sh),b⟩→⟨Throw a,(h,l,sh'),b⟩" (*<*) lemmas red_reds_induct = red_reds.induct [split_format (complete)] and red_reds_inducts = red_reds.inducts [split_format (complete)]
lemma converse_rtrancl_induct_red[consumes 1]: assumes"P ⊨⟨e,(h,l,sh),b⟩→* ⟨e',(h',l',sh'),b'⟩" and"∧e h l sh b. R e h l sh b e h l sh b" and"∧e0 h0 l0 sh0 b0 e1 h1 l1 sh1 b1 e' h' l' sh' b'. [ P ⊨⟨e0,(h0,l0,sh0),b0⟩→⟨e1,(h1,l1,sh1),b1⟩; R e1 h1 l1 sh1 b1 e' h' l' sh' b' ] ==> R e0 h0 l0 sh0 b0 e' h' l' sh' b'" shows"R e h l sh b e' h' l' sh' b'" (*<*) proof -
{ fix s s' assume reds: "P ⊨⟨e,s,b⟩→* ⟨e',s',b'⟩" and base: "∧e s b. R e (hp s) (lcl s) (shp s) b e (hp s) (lcl s) (shp s) b" and red1: "∧e0 s0 b0 e1 s1 b1 e' s' b'. [ P ⊨⟨e0,s0,b0⟩→⟨e1,s1,b1⟩; R e1 (hp s1) (lcl s1) (shp s1) b1 e' (hp s') (lcl s') (shp s') b' ] ==> R e0 (hp s0) (lcl s0) (shp s0) b0 e' (hp s') (lcl s') (shp s') b'" from reds have"R e (hp s) (lcl s) (shp s) b e' (hp s') (lcl s') (shp s') b'" proof (induct rule:converse_rtrancl_induct3) case refl show ?caseby(rule base) next case step thus ?caseby(blast intro:red1) qed
} with assms show ?thesis by fastforce qed (*>*)
subsection‹Some easy lemmas›
lemma [iff]: "¬ P ⊨⟨[],s,b⟩ [→] ⟨es',s',b'⟩" (*<*)by(blast elim: reds.cases)(*>*)
lemma [iff]: "¬ P ⊨⟨Val v,s,b⟩→⟨e',s',b'⟩" (*<*)by(fastforce elim: red.cases)(*>*)
lemma val_no_step: "val_of e = ⌊v⌋==>¬ P ⊨⟨e,s,b⟩→⟨e',s',b'⟩" (*<*)by(drule val_of_spec, simp)(*>*)
lemma [iff]: "¬ P ⊨⟨Throw a,s,b⟩→⟨e',s',b'⟩" (*<*)by(fastforce elim: red.cases)(*>*)
lemma map_Vals_no_step [iff]: "¬ P ⊨⟨map Val vs,s,b⟩ [→] ⟨es',s',b'⟩" (*<*) proof(induct vs arbitrary: es') case (Cons a vs)
{ assume"P ⊨⟨map Val (a # vs),s,b⟩ [→] ⟨es',s',b'⟩" thenhave False by(rule reds.cases) (insert Cons, auto)
} thenshow ?caseby clarsimp qed simp (*>*)
lemma vals_no_step: "map_vals_of es = ⌊vs⌋==>¬ P ⊨⟨es,s,b⟩ [→] ⟨es',s',b'⟩" (*<*)by(drule map_vals_of_spec, simp)(*>*)
lemma vals_throw_no_step [iff]: "¬ P ⊨⟨map Val vs @ Throw a # es,s,b⟩ [→] ⟨es',s',b'⟩" (*<*) proof(induct vs arbitrary: es') case Nil
{ assume"P ⊨⟨Throw a # es,s,b⟩ [→] ⟨es',s',b'⟩" thenhave False by(rule reds.cases) (insert Cons, auto)
} thenshow ?caseby clarsimp next case (Cons a' vs')
{ assume"P ⊨⟨map Val (a'#vs') @ Throw a # es,s,b⟩ [→] ⟨es',s',b'⟩" thenhave False by(rule reds.cases) (insert Cons, auto)
} thenshow ?caseby clarsimp qed (*>*)
lemma lass_val_of_red: "[ lass_val_of e = ⌊a⌋; P ⊨⟨e,(h, l, sh),b⟩→⟨e',(h', l', sh'),b'⟩] ==> e' = unit ∧ h' = h ∧ l' = l(fst a↦snd a) ∧ sh' = sh ∧ b = b'" (*<*)by(drule lass_val_of_spec, auto)(*>*)
lemma final_no_step [iff]: "final e ==>¬ P ⊨⟨e,s,b⟩→⟨e',s',b'⟩" (*<*)by(erule finalE, simp+)(*>*)
lemma finals_no_step [iff]: "finals es ==>¬ P ⊨⟨es,s,b⟩ [→] ⟨es',s',b'⟩" (*<*)by(erule finalsE, simp+)(*>*)
lemma reds_final_same: "P ⊨⟨e,s,b⟩→* ⟨e',s',b'⟩==> final e ==> e = e' ∧ s = s' ∧ b = b'" proof(induct rule:converse_rtrancl_induct3) case refl show ?caseby simp next case (step e0 s0 b0 e1 s1 b1) show ?case proof(rule finalE[OF step.prems(1)]) fix v assume"e0 = Val v"thenshow ?thesis using step by simp next fix a assume"e0 = Throw a"thenshow ?thesis using step by simp qed qed
lemma reds_throw: "P ⊨⟨e,s,b⟩→* ⟨e',s',b'⟩==> (∧et. throw_of e = ⌊et⌋==>∃et'. throw_of e' = ⌊et'⌋)" proof(induct rule:converse_rtrancl_induct3) case refl thenshow ?caseby simp next case (step e0 s0 b0 e1 s1 b1) thenshow ?caseby(auto elim: red.cases) qed
lemma red_hext_incr: "P ⊨⟨e,(h,l,sh),b⟩→⟨e',(h',l',sh'),b'⟩==> h ⊴ h'" and reds_hext_incr: "P ⊨⟨es,(h,l,sh),b⟩ [→] ⟨es',(h',l',sh'),b'⟩==> h ⊴ h'" (*<*) proof(induct rule:red_reds_inducts) case RedNew thus ?case by(fastforce dest:new_Addr_SomeD simp:hext_def split:if_splits) next case RedFAss thus ?caseby(simp add:hext_def split:if_splits) qed simp_all (*>*)
lemma red_lcl_incr: "P ⊨⟨e,(h0,l0,sh0),b⟩→⟨e',(h1,l1,sh1),b'⟩==> dom l0⊆ dom l1" and reds_lcl_incr: "P ⊨⟨es,(h0,l0,sh0),b⟩ [→] ⟨es',(h1,l1,sh1),b'⟩==> dom l0⊆ dom l1" (*<*)by(induct rule: red_reds_inducts)(auto simp del:fun_upd_apply)(*>*)
lemma red_lcl_add: "P ⊨⟨e,(h,l,sh),b⟩→⟨e',(h',l',sh'),b'⟩==> (∧l0. P ⊨⟨e,(h,l0++l,sh),b⟩→⟨e',(h',l0++l',sh'),b'⟩)" and reds_lcl_add: "P ⊨⟨es,(h,l,sh),b⟩ [→] ⟨es',(h',l',sh'),b'⟩==> (∧l0. P ⊨⟨es,(h,l0++l,sh),b⟩ [→] ⟨es',(h',l0++l',sh'),b'⟩)" (*<*) proof (induct rule:red_reds_inducts) case RedCast thus ?caseby(fastforce intro:red_reds.intros) next case RedCastFail thus ?caseby(force intro:red_reds.intros) next case RedFAcc thus ?caseby(fastforce intro:red_reds.intros) next case RedCall thus ?caseby(fastforce intro:red_reds.intros) next case (InitBlockRed e h l V v sh b e' h' l' sh' b' v' T l0) have IH: "∧l0. P ⊨⟨e,(h, l0 ++ l(V ↦ v), sh),b⟩→⟨e',(h', l0 ++ l', sh'),b'⟩" and l'V: "l' V = Some v'"by fact+ from IH have IH': "P ⊨⟨e,(h, (l0 ++ l)(V ↦ v), sh),b⟩→⟨e',(h', l0 ++ l', sh'),b'⟩" by simp have"(l0 ++ l')(V := (l0 ++ l) V) = l0 ++ l'(V := l V)" by(rule ext)(simp add:map_add_def) with red_reds.InitBlockRed[OF IH'] l'V show ?caseby(simp del:fun_upd_apply) next case (BlockRedNone e h l V sh b e' h' l' sh' b' T l0) have IH: "∧l0. P ⊨⟨e,(h, l0 ++ l(V := None), sh),b⟩→⟨e',(h', l0 ++ l', sh'),b'⟩" and l'V: "l' V = None"and unass: "¬ assigned V e"by fact+ have"l0(V := None) ++ l(V := None) = (l0 ++ l)(V := None)" by(simp add:fun_eq_iff map_add_def) hence IH': "P ⊨⟨e,(h, (l0++l)(V := None), sh),b⟩→⟨e',(h', l0(V := None) ++ l', sh'),b'⟩" using IH[of "l0(V := None)"] by simp have"(l0(V := None) ++ l')(V := (l0 ++ l) V) = l0 ++ l'(V := l V)" by(simp add:fun_eq_iff map_add_def) with red_reds.BlockRedNone[OF IH' _ unass] l'V show ?case by(simp add: map_add_def) next case (BlockRedSome e h l V sh b e' h' l' sh' b' v T l0) have IH: "∧l0. P ⊨⟨e,(h, l0 ++ l(V := None), sh),b⟩→⟨e',(h', l0 ++ l', sh'),b'⟩" and l'V: "l' V = Some v"and unass: "¬ assigned V e"by fact+ have"l0(V := None) ++ l(V := None) = (l0 ++ l)(V := None)" by(simp add:fun_eq_iff map_add_def) hence IH': "P ⊨⟨e,(h, (l0++l)(V := None), sh),b⟩→⟨e',(h', l0(V := None) ++ l', sh'),b'⟩" using IH[of "l0(V := None)"] by simp have"(l0(V := None) ++ l')(V := (l0 ++ l) V) = l0 ++ l'(V := l V)" by(simp add:fun_eq_iff map_add_def) with red_reds.BlockRedSome[OF IH' _ unass] l'V show ?case by(simp add:map_add_def) next case RedTryCatch thus ?caseby(fastforce intro:red_reds.intros) next case RedTryFail thus ?caseby(force intro!:red_reds.intros) qed (simp_all add:red_reds.intros) (*>*)
lemma Red_lcl_add: assumes"P ⊨⟨e,(h,l,sh), b⟩→* ⟨e',(h',l',sh'), b'⟩"shows"P ⊨⟨e,(h,l0++l,sh),b⟩→* ⟨e',(h',l0++l',sh'),b'⟩" (*<*) using assms proof(induct rule:converse_rtrancl_induct_red) case1thus ?caseby simp next case2thus ?case by (blast dest: red_lcl_add intro: converse_rtrancl_into_rtrancl) qed (*>*)
lemmaassumes wf: "wwf_J_prog P" shows red_proc_pres: "P ⊨⟨e,(h,l,sh),b⟩→⟨e',(h',l',sh'),b'⟩ ==> not_init C e ==> sh C = ⌊(sfs, Processing)⌋==> not_init C e' ∧ (∃sfs'. sh' C = ⌊(sfs', Processing)⌋)" and reds_proc_pres: "P ⊨⟨es,(h,l,sh),b⟩ [→] ⟨es',(h',l',sh'),b'⟩ ==> not_inits C es ==> sh C = ⌊(sfs, Processing)⌋==> not_inits C es' ∧ (∃sfs'. sh' C = ⌊(sfs', Processing)⌋)" (*<*) proof(induct rule:red_reds_inducts) case RedCall thenshow ?case using sees_wwf_nsub_RI[OF wf RedCall.hyps(2)] sub_RI_blocks_body nsub_RI_not_init by auto next case RedSCall thenshow ?case using sees_wwf_nsub_RI[OF wf RedSCall.hyps(1)] sub_RI_blocks_body nsub_RI_not_init by auto next case (RedInitDone sh C sfs C' Cs e h l b) thenshow ?caseby(cases Cs, auto) next case (RedInitProcessing sh C sfs C' Cs e h l b) thenshow ?caseby(cases Cs, auto) next case (RedRInit sh C sfs i sh' C' Cs v e h l b) thenshow ?caseby(cases Cs, auto) next case (CallThrowParams es vs e es' v M h l sh b) thenshow ?caseby(auto dest: not_inits_def') next case (SCallThrowParams es vs e es' C M h l sh b) thenshow ?caseby(auto dest: not_inits_def') qed(auto)
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.22 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.