diff -r 22dce9134953 -r a0b16d42d489 src/HOL/Bali/Conform.thy --- a/src/HOL/Bali/Conform.thy Wed Oct 30 12:44:18 2002 +0100 +++ b/src/HOL/Bali/Conform.thy Thu Oct 31 18:27:10 2002 +0100 @@ -115,6 +115,13 @@ apply (simp add: conf_def) done +lemma conf_Boolean: "G,s\v\\PrimT Boolean \ \ b. v=Bool b" +by (cases v) + (auto simp: conf_def obj_ty_def + dest: widen_Boolean2 + split: obj_tag.splits) + + lemma conf_litval [rule_format (no_asm)]: "typeof (\a. None) v = Some T \ G,s\v\\T" apply (unfold conf_def) @@ -249,6 +256,97 @@ apply force done +section "weak value list conformance" + +text {* Only if the value is defined it has to conform to its type. + This is the contribution of the definite assignment analysis to + the notion of conformance. The definite assignment analysis ensures + that the program only attempts to access local variables that + actually have a defined value in the state. + So conformance must only ensure that the + defined values are of the right type, and not also that the value + is defined. +*} + + +constdefs + + wlconf :: "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 wlconfD: "\G,s\vs[\\\]Ts; Ts n = Some T; vs n = Some v\ \ G,s\v\\T" +by (auto simp: wlconf_def) + + +lemma wlconf_cong [simp]: "\s. G,set_locals x s\l[\\\]L = G,s\l[\\\]L" +by (auto simp: wlconf_def) + +lemma wlconf_lupd [simp]: "G,lupd(vn\v)s\l[\\\]L = G,s\l[\\\]L" +by (auto simp: wlconf_def) + + +lemma wlconf_upd: "\G,s\l[\\\]L; G,s\v\\T; L vn = Some T\ \ + G,s\l(vn\v)[\\\]L" +by (auto simp: wlconf_def) + +lemma wlconf_ext: "\G,s\l[\\\]L; G,s\v\\T\ \ G,s\l(vn\v)[\\\]L(vn\T)" +by (auto simp: wlconf_def) + +lemma wlconf_map_sum [simp]: + "G,s\l1 (+) l2[\\\]L1 (+) L2 = (G,s\l1[\\\]L1 \ G,s\l2[\\\]L2)" +apply (unfold wlconf_def) +apply safe +apply (case_tac [3] "n") +apply (force split add: sum.split)+ +done + +lemma wlconf_ext_list [rule_format (no_asm)]: " + \X. \G,s\l[\\\]L\ \ + \vs Ts. distinct vns \ length Ts = length vns + \ list_all2 (conf G s) vs Ts \ G,s\l(vns[\]vs)[\\\]L(vns[\]Ts)" +apply (unfold wlconf_def) +apply (induct_tac "vns") +apply clarsimp +apply clarsimp +apply (frule list_all2_lengthD) +apply clarsimp +done + + +lemma wlconf_deallocL: "\G,s\l[\\\]L(vn\T); L vn = None\ \ G,s\l[\\\]L" +apply (simp only: wlconf_def) +apply safe +apply (drule spec) +apply (drule ospec) +defer +apply (drule ospec ) +apply auto +done + + +lemma wlconf_gext [elim]: "\G,s\l[\\\]L; s\|s'\ \ G,s'\l[\\\]L" +apply (simp only: wlconf_def) +apply fast +done + +lemma wlconf_empty [simp, intro!]: "G,s\vs[\\\]empty" +apply (unfold wlconf_def) +apply force +done + +lemma wlconf_empty_vals: "G,s\empty[\\\]ts" + by (simp add: wlconf_def) + +lemma wlconf_init_vals [intro!]: + " \n. \T\fs n:is_type G T \ G,s\init_vals fs[\\\]fs" +apply (unfold wlconf_def) +apply force +done + +lemma lconf_wlconf: + "G,s\l[\\]L \ G,s\l[\\\]L" +by (force simp add: lconf_def wlconf_def) section "object conformance" @@ -259,18 +357,8 @@ (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) @@ -297,33 +385,16 @@ 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))" + (\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)) \ + (fst xs=Some(Jump Ret) \ l Result \ None)" section "conforms" @@ -331,13 +402,17 @@ "\(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" +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_RetD: "\(x, s)\\(G, L); x = Some (Jump Ret)\ \ + (locals s) Result \ None" +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 \ @@ -349,8 +424,9 @@ done lemma conforms_Jump [iff]: - "((Some (Jump j), s)\\(G, L)) = (Norm s\\(G, L))" -by (auto simp: conforms_def) + "j=Ret \ locals s Result \ None + \ ((Some (Jump j), s)\\(G, L)) = (Norm s\\(G, L))" +by (auto simp: conforms_def Let_def) lemma conforms_StdXcpt [iff]: "((Some (Xcpt (Std xn)), s)\\(G, L)) = (Norm s\\(G, L))" @@ -382,45 +458,61 @@ 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)\ \ + G,s\locals s[\\\]L; + \a. x = Some (Xcpt (Loc a)) \ G,s\Addr a\\ Class (SXcpt Throwable); + x = Some (Jump Ret)\ locals s Result \ None\ \ (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)\ \ + \a. x' = Some (Xcpt (Loc a)) \ G,s\Addr a\\ Class (SXcpt Throwable); + x' = Some (Jump Ret) \ locals s Result \ None\ \ (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) +by (force intro: conformsI wlconf_upd dest: conforms_globsD conforms_localD + conforms_XcptLocD conforms_RetD + simp: oconf_def) -lemmas conforms_allocL_aux = conforms_localD [THEN lconf_ext] +lemmas conforms_allocL_aux = conforms_localD [THEN wlconf_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) +by (force intro: conformsI dest: conforms_globsD conforms_RetD + elim: conforms_XcptLocD conforms_allocL_aux + simp: oconf_def) -lemmas conforms_deallocL_aux = conforms_localD [THEN lconf_deallocL] +lemmas conforms_deallocL_aux = conforms_localD [THEN wlconf_deallocL] lemma conforms_deallocL: "\s.\s\\(G, L(vn\T)); L vn = None\ \ s\\(G,L)" -by (fast intro: conformsI dest: conforms_globsD +by (fast intro: conformsI dest: conforms_globsD conforms_RetD 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) +apply (rule conformsI) +apply assumption +apply (drule conforms_localD) apply force +apply (intro strip) +apply (drule (1) conforms_XcptLocD) apply force +apply (intro strip) +apply (drule (1) conforms_RetD) apply force +done + lemma conforms_xgext: - "\(x ,s)\\(G,L); (x', s')\\(G, L); s'\|s\ \ (x',s)\\(G,L)" + "\(x ,s)\\(G,L); (x', s')\\(G, L); s'\|s;dom (locals s') \ dom (locals s)\ + \ (x',s)\\(G,L)" apply (erule_tac conforms_xconf) -apply (fast dest: conforms_XcptLocD) +apply (fast dest: conforms_XcptLocD) +apply (intro strip) +apply (drule (1) conforms_RetD) +apply (auto dest: domI) done lemma conforms_gupd: "\obj. \(x, s)\\(G, L); G,s\obj\\\r; s\|gupd(r\obj)s\ @@ -445,17 +537,29 @@ 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) + "\(x,s)\\(G, L'); G,s\l[\\\]L; x=Some (Jump Ret) \ l Result \ None\ + \ (x,set_locals l s)\\(G,L)" +apply (rule conformsI) +apply (intro strip) +apply simp +apply (drule (2) conforms_globsD) +apply simp +apply (intro strip) +apply (drule (1) conforms_XcptLocD) +apply simp +apply (intro strip) +apply (drule (1) conforms_RetD) +apply simp done -lemma conforms_locals [rule_format]: - "(a,b)\\(G, L) \ L x = Some T \ G,b\the (locals b x)\\T" -apply (force simp: conforms_def Let_def lconf_def) +lemma conforms_locals: + "\(a,b)\\(G, L); L x = Some T;locals b x \None\ + \ G,b\the (locals b x)\\T" +apply (force simp: conforms_def Let_def wlconf_def) done -lemma conforms_return: "\s'. \(x,s)\\(G, L); (x',s')\\(G, L'); s\|s'\ \ +lemma conforms_return: +"\s'. \(x,s)\\(G, L); (x',s')\\(G, L'); s\|s';x'\Some (Jump Ret)\ \ (x',set_locals (locals s) s')\\(G, L)" apply (rule conforms_xconf) prefer 2 apply (force dest: conforms_XcptLocD)