diff -r de505273c971 -r 00d4a435777f src/HOL/Bali/Conform.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Bali/Conform.thy Mon Jan 28 17:00:19 2002 +0100 @@ -0,0 +1,447 @@ +(* Title: isabelle/Bali/Conform.thy + ID: $Id$ + Author: David von Oheimb + Copyright 1997 Technische Universitaet Muenchen +*) + +header {* Conformance notions for the type soundness proof for Java *} + +theory Conform = State: + +text {* +design issues: +\begin{itemize} +\item lconf allows for (arbitrary) inaccessible values +\item ''conforms'' does not directly imply that the dynamic types of all + objects on the heap are indeed existing classes. Yet this can be + inferred for all referenced objs. +\end{itemize} +*} + +types env_ = "prog \ (lname, ty) table" (* same as env of WellType.thy *) + + +section "extension of global store" + +constdefs + + gext :: "st \ st \ bool"    ("_\|_"    [71,71] 70) + "s\|s' \ \r. \obj\globs s r: \obj'\globs s' r: tag obj'= tag obj" + +lemma gext_objD: +"\s\|s'; globs s r = Some obj\ +\ \obj'. globs s' r = Some obj' \ tag obj' = tag obj" +apply (simp only: gext_def) +by force + +lemma rev_gext_objD: +"\globs s r = Some obj; s\|s'\ + \ \obj'. globs s' r = Some obj' \ tag obj' = tag obj" +by (auto elim: gext_objD) + +lemma init_class_obj_inited: + "init_class_obj G C s1\|s2 \ inited C (globs s2)" +apply (unfold inited_def init_obj_def) +apply (auto dest!: gext_objD) +done + +lemma gext_refl [intro!, simp]: "s\|s" +apply (unfold gext_def) +apply (fast del: fst_splitE) +done + +lemma gext_gupd [simp, elim!]: "\s. globs s r = None \ s\|gupd(r\x)s" +by (auto simp: gext_def) + +lemma gext_new [simp, elim!]: "\s. globs s r = None \ s\|init_obj G oi r s" +apply (simp only: init_obj_def) +apply (erule_tac gext_gupd) +done + +lemma gext_trans [elim]: "\X. \s\|s'; s'\|s''\ \ s\|s''" +by (force simp: gext_def) + +lemma gext_upd_gobj [intro!]: "s\|upd_gobj r n v s" +apply (simp only: gext_def) +apply auto +apply (case_tac "ra = r") +apply auto +apply (case_tac "globs s r = None") +apply auto +done + +lemma gext_cong1 [simp]: "set_locals l s1\|s2 = s1\|s2" +by (auto simp: gext_def) + +lemma gext_cong2 [simp]: "s1\|set_locals l s2 = s1\|s2" +by (auto simp: gext_def) + + +lemma gext_lupd1 [simp]: "lupd(vn\v)s1\|s2 = s1\|s2" +by (auto simp: gext_def) + +lemma gext_lupd2 [simp]: "s1\|lupd(vn\v)s2 = s1\|s2" +by (auto simp: gext_def) + + +lemma inited_gext: "\inited C (globs s); s\|s'\ \ inited C (globs s')" +apply (unfold inited_def) +apply (auto dest: gext_objD) +done + + +section "value conformance" + +constdefs + + conf :: "prog \ st \ val \ ty \ bool" ("_,_\_\\_" [71,71,71,71] 70) + "G,s\v\\T \ \T'\typeof (\a. option_map obj_ty (heap s a)) v:G\T'\T" + +lemma conf_cong [simp]: "G,set_locals l s\v\\T = G,s\v\\T" +by (auto simp: conf_def) + +lemma conf_lupd [simp]: "G,lupd(vn\va)s\v\\T = G,s\v\\T" +by (auto simp: conf_def) + +lemma conf_PrimT [simp]: "\dt. typeof dt v = Some (PrimT t) \ G,s\v\\PrimT t" +apply (simp add: conf_def) +done + +lemma conf_litval [rule_format (no_asm)]: + "typeof (\a. None) v = Some T \ G,s\v\\T" +apply (unfold conf_def) +apply (rule val.induct) +apply auto +done + +lemma conf_Null [simp]: "G,s\Null\\T = G\NT\T" +by (simp add: conf_def) + +lemma conf_Addr: + "G,s\Addr a\\T = (\obj. heap s a = Some obj \ G\obj_ty obj\T)" +by (auto simp: conf_def) + +lemma conf_AddrI:"\heap s a = Some obj; G\obj_ty obj\T\ \ G,s\Addr a\\T" +apply (rule conf_Addr [THEN iffD2]) +by fast + +lemma defval_conf [rule_format (no_asm), elim]: + "is_type G T \ G,s\default_val T\\T" +apply (unfold conf_def) +apply (induct "T") +apply (auto intro: prim_ty.induct) +done + +lemma conf_widen [rule_format (no_asm), elim]: + "G\T\T' \ G,s\x\\T \ ws_prog G \ G,s\x\\T'" +apply (unfold conf_def) +apply (rule val.induct) +apply (auto elim: ws_widen_trans) +done + +lemma conf_gext [rule_format (no_asm), elim]: + "G,s\v\\T \ s\|s' \ G,s'\v\\T" +apply (unfold gext_def conf_def) +apply (rule val.induct) +apply force+ +done + + +lemma conf_list_widen [rule_format (no_asm)]: +"ws_prog G \ + \Ts Ts'. list_all2 (conf G s) vs Ts + \ G\Ts[\] Ts' \ list_all2 (conf G s) vs Ts'" +apply (unfold widens_def) +apply (rule list_all2_trans) +apply auto +done + +lemma conf_RefTD [rule_format (no_asm)]: + "G,s\a'\\RefT T + \ a' = Null \ (\a obj T'. a' = Addr a \ heap s a = Some obj \ + obj_ty obj = T' \ G\T'\RefT T)" +apply (unfold conf_def) +apply (induct_tac "a'") +apply (auto dest: widen_PrimT) +done + + +section "value list conformance" + +constdefs + + lconf :: "prog \ st \ ('a, val) table \ ('a, ty) table \ bool" + ("_,_\_[\\]_" [71,71,71,71] 70) + "G,s\vs[\\]Ts \ \n. \T\Ts n: \v\vs n: G,s\v\\T" + +lemma lconfD: "\G,s\vs[\\]Ts; Ts n = Some T\ \ G,s\(the (vs n))\\T" +by (force simp: lconf_def) + + +lemma lconf_cong [simp]: "\s. G,set_locals x s\l[\\]L = G,s\l[\\]L" +by (auto simp: lconf_def) + +lemma lconf_lupd [simp]: "G,lupd(vn\v)s\l[\\]L = G,s\l[\\]L" +by (auto simp: lconf_def) + +(* unused *) +lemma lconf_new: "\L vn = None; G,s\l[\\]L\ \ G,s\l(vn\v)[\\]L" +by (auto simp: lconf_def) + +lemma lconf_upd: "\G,s\l[\\]L; G,s\v\\T; L vn = Some T\ \ + G,s\l(vn\v)[\\]L" +by (auto simp: lconf_def) + +lemma lconf_ext: "\G,s\l[\\]L; G,s\v\\T\ \ G,s\l(vn\v)[\\]L(vn\T)" +by (auto simp: lconf_def) + +lemma lconf_map_sum [simp]: + "G,s\l1 (+) l2[\\]L1 (+) L2 = (G,s\l1[\\]L1 \ G,s\l2[\\]L2)" +apply (unfold lconf_def) +apply safe +apply (case_tac [3] "n") +apply (force split add: sum.split)+ +done + +lemma lconf_ext_list [rule_format (no_asm)]: " + \X. \G,s\l[\\]L\ \ + \vs Ts. nodups vns \ length Ts = length vns + \ list_all2 (conf G s) vs Ts \ G,s\l(vns[\]vs)[\\]L(vns[\]Ts)" +apply (unfold lconf_def) +apply (induct_tac "vns") +apply clarsimp +apply clarsimp +apply (frule list_all2_lengthD) +apply clarsimp +done + + +lemma lconf_deallocL: "\G,s\l[\\]L(vn\T); L vn = None\ \ G,s\l[\\]L" +apply (simp only: lconf_def) +apply safe +apply (drule spec) +apply (drule ospec) +apply auto +done + + +lemma lconf_gext [elim]: "\G,s\l[\\]L; s\|s'\ \ G,s'\l[\\]L" +apply (simp only: lconf_def) +apply fast +done + +lemma lconf_empty [simp, intro!]: "G,s\vs[\\]empty" +apply (unfold lconf_def) +apply force +done + +lemma lconf_init_vals [intro!]: + " \n. \T\fs n:is_type G T \ G,s\init_vals fs[\\]fs" +apply (unfold lconf_def) +apply force +done + + +section "object conformance" + +constdefs + + oconf :: "prog \ st \ obj \ oref \ bool" ("_,_\_\\\_" [71,71,71,71] 70) + "G,s\obj\\\r \ G,s\values obj[\\]var_tys G (tag obj) r \ + (case r of + Heap a \ is_type G (obj_ty obj) + | Stat C \ True)" +(* +lemma oconf_def2: "G,s\\tag=oi,values=fs\\\\r = + (G,s\fs[\\]var_tys G oi r \ + (case r of Heap a \ is_type G (obj_ty \tag=oi,values=fs\) | Stat C \ True))" +by (simp add: oconf_def Let_def) +*) +(* +lemma oconf_def2: "G,s\obj\\\r = + (G,s\values obj[\\]var_tys G (tag obj) r \ + (case r of Heap a \ is_type G (obj_ty obj) | Stat C \ True))" +by (simp add: oconf_def Let_def) +*) +lemma oconf_is_type: "G,s\obj\\\Heap a \ is_type G (obj_ty obj)" +by (auto simp: oconf_def Let_def) + +lemma oconf_lconf: "G,s\obj\\\r \ G,s\values obj[\\]var_tys G (tag obj) r" +by (simp add: oconf_def) + +lemma oconf_cong [simp]: "G,set_locals l s\obj\\\r = G,s\obj\\\r" +by (auto simp: oconf_def Let_def) + +lemma oconf_init_obj_lemma: +"\\C c. class G C = Some c \ unique (DeclConcepts.fields G C); + \C c f fld. \class G C = Some c; + table_of (DeclConcepts.fields G C) f = Some fld \ + \ is_type G (type fld); + (case r of + Heap a \ is_type G (obj_ty obj) + | Stat C \ is_class G C) +\ \ G,s\obj \values:=init_vals (var_tys G (tag obj) r)\\\\r" +apply (auto simp add: oconf_def) +apply (drule_tac var_tys_Some_eq [THEN iffD1]) +defer +apply (subst obj_ty_cong) +apply(auto dest!: fields_table_SomeD obj_ty_CInst1 obj_ty_Arr1 + split add: sum.split_asm obj_tag.split_asm) +done + +(* +lemma oconf_init_obj_lemma: +"\\C c. class G C = Some c \ unique (fields G C); + \C c f fld. \class G C = Some c; table_of (fields G C) f = Some fld \ + \ is_type G (type fld); + (case r of + Heap a \ is_type G (obj_ty \tag=oi,values=fs\) + | Stat C \ is_class G C) +\ \ G,s\\tag=oi, values=init_vals (var_tys G oi r)\\\\r" +apply (auto simp add: oconf_def) +apply (drule_tac var_tys_Some_eq [THEN iffD1]) +defer +apply (subst obj_ty_eq) +apply(auto dest!: fields_table_SomeD split add: sum.split_asm obj_tag.split_asm) +done +*) + + +section "state conformance" + +constdefs + + conforms :: "state \ env_ \ bool"  (  "_\\_" [71,71] 70) + "xs\\E \ let (G, L) = E; s = snd xs; l = locals s in + (\r. \obj\globs s r: G,s\obj \\\r) \ + \ G,s\l [\\]L\ \ + (\a. fst xs=Some(Xcpt (Loc a)) \ G,s\Addr a\\ Class (SXcpt Throwable))" + +section "conforms" + +lemma conforms_globsD: +"\(x, s)\\(G, L); globs s r = Some obj\ \ G,s\obj\\\r" +by (auto simp: conforms_def Let_def) + +lemma conforms_localD: "(x, s)\\(G, L) \ G,s\locals s[\\]L" +by (auto simp: conforms_def Let_def) + +lemma conforms_XcptLocD: "\(x, s)\\(G, L); x = Some (Xcpt (Loc a))\ \ + G,s\Addr a\\ Class (SXcpt Throwable)" +by (auto simp: conforms_def Let_def) + +lemma conforms_RefTD: + "\G,s\a'\\RefT t; a' \ Null; (x,s) \\(G, L)\ \ + \a obj. a' = Addr a \ globs s (Inl a) = Some obj \ + G\obj_ty obj\RefT t \ is_type G (obj_ty obj)" +apply (drule_tac conf_RefTD) +apply clarsimp +apply (rule conforms_globsD [THEN oconf_is_type]) +apply auto +done + +lemma conforms_Jump [iff]: + "((Some (Jump j), s)\\(G, L)) = (Norm s\\(G, L))" +by (auto simp: conforms_def) + +lemma conforms_StdXcpt [iff]: + "((Some (Xcpt (Std xn)), s)\\(G, L)) = (Norm s\\(G, L))" +by (auto simp: conforms_def) + +lemma conforms_raise_if [iff]: + "((raise_if c xn x, s)\\(G, L)) = ((x, s)\\(G, L))" +by (auto simp: abrupt_if_def) + + +lemma conforms_NormI: "(x, s)\\(G, L) \ Norm s\\(G, L)" +by (auto simp: conforms_def Let_def) + + +lemma conforms_absorb [rule_format]: + "(a, b)\\(G, L) \ (absorb j a, b)\\(G, L)" +apply (rule impI) +apply ( case_tac a) +apply (case_tac "absorb j a") +apply auto +apply (case_tac "absorb j (Some a)",auto) +apply (erule conforms_NormI) +done + +lemma conformsI: "\\r. \obj\globs s r: G,s\obj\\\r; + G,s\locals s[\\]L; + \a. x = Some (Xcpt (Loc a)) \ G,s\Addr a\\ Class (SXcpt Throwable)\ \ + (x, s)\\(G, L)" +by (auto simp: conforms_def Let_def) + +lemma conforms_xconf: "\(x, s)\\(G,L); + \a. x' = Some (Xcpt (Loc a)) \ G,s\Addr a\\ Class (SXcpt Throwable)\ \ + (x',s)\\(G,L)" +by (fast intro: conformsI elim: conforms_globsD conforms_localD) + +lemma conforms_lupd: + "\(x, s)\\(G, L); L vn = Some T; G,s\v\\T\ \ (x, lupd(vn\v)s)\\(G, L)" +by (force intro: conformsI lconf_upd dest: conforms_globsD conforms_localD + conforms_XcptLocD simp: oconf_def) + + +lemmas conforms_allocL_aux = conforms_localD [THEN lconf_ext] + +lemma conforms_allocL: + "\(x, s)\\(G, L); G,s\v\\T\ \ (x, lupd(vn\v)s)\\(G, L(vn\T))" +by (force intro: conformsI dest: conforms_globsD + elim: conforms_XcptLocD conforms_allocL_aux simp: oconf_def) + +lemmas conforms_deallocL_aux = conforms_localD [THEN lconf_deallocL] + +lemma conforms_deallocL: "\s.\s\\(G, L(vn\T)); L vn = None\ \ s\\(G,L)" +by (fast intro: conformsI dest: conforms_globsD + elim: conforms_XcptLocD conforms_deallocL_aux) + +lemma conforms_gext: "\(x, s)\\(G,L); s\|s'; + \r. \obj\globs s' r: G,s'\obj\\\r; + locals s'=locals s\ \ (x,s')\\(G,L)" +by (force intro!: conformsI dest: conforms_localD conforms_XcptLocD) + + +lemma conforms_xgext: + "\(x ,s)\\(G,L); (x', s')\\(G, L); s'\|s\ \ (x',s)\\(G,L)" +apply (erule_tac conforms_xconf) +apply (fast dest: conforms_XcptLocD) +done + +lemma conforms_gupd: "\obj. \(x, s)\\(G, L); G,s\obj\\\r; s\|gupd(r\obj)s\ +\ (x, gupd(r\obj)s)\\(G, L)" +apply (rule conforms_gext) +apply auto +apply (force dest: conforms_globsD simp add: oconf_def)+ +done + +lemma conforms_upd_gobj: "\(x,s)\\(G, L); globs s r = Some obj; + var_tys G (tag obj) r n = Some T; G,s\v\\T\ \ (x,upd_gobj r n v s)\\(G,L)" +apply (rule conforms_gext) +apply auto +apply (drule (1) conforms_globsD) +apply (simp add: oconf_def) +apply safe +apply (rule lconf_upd) +apply auto +apply (simp only: obj_ty_cong) +apply (force dest: conforms_globsD intro!: lconf_upd + simp add: oconf_def cong del: sum.weak_case_cong) +done + +lemma conforms_set_locals: + "\(x,s)\\(G, L'); G,s\l[\\]L\ \ (x,set_locals l s)\\(G,L)" +apply (auto intro!: conformsI dest: conforms_globsD + elim!: conforms_XcptLocD simp add: oconf_def) +done + +lemma conforms_return: "\s'. \(x,s)\\(G, L); (x',s')\\(G, L'); s\|s'\ \ + (x',set_locals (locals s) s')\\(G, L)" +apply (rule conforms_xconf) +prefer 2 apply (force dest: conforms_XcptLocD) +apply (erule conforms_gext) +apply (force dest: conforms_globsD)+ +done + +end