1 (* Title: HOL/IMPP/Misc.ML
3 Author: David von Oheimb
7 section "state access";
9 Goalw [getlocs_def] "getlocs (st g l) = l";
13 Goalw [update_def] "s[Loc Y::=s<Y>] = s";
14 by (induct_tac "s" 1);
15 by (simp_tac (simpset() addsimps [getlocs_def2]) 1);
16 qed "update_Loc_idem2";
17 Addsimps[update_Loc_idem2];
19 Goalw [update_def] "s[X::=x][X::=y] = s[X::=y]";
20 by (induct_tac "X" 1);
22 by (ALLGOALS (induct_tac "s"));
24 by (ALLGOALS (rtac ext));
27 Addsimps[update_overwrt];
29 Goalw [update_def]"(s[Loc Y::=k])<Y'> = (if Y=Y' then k else s<Y'>)";
30 by (induct_tac "s" 1);
31 by (simp_tac (simpset() addsimps [getlocs_def2]) 1);
32 qed "getlocs_Loc_update";
33 Addsimps[getlocs_Loc_update];
35 Goalw [update_def] "getlocs (s[Glb Y::=k]) = getlocs s";
36 by (induct_tac "s" 1);
37 by (simp_tac (simpset() addsimps [getlocs_def2]) 1);
38 qed "getlocs_Glb_update";
39 Addsimps[getlocs_Glb_update];
41 Goalw [setlocs_def] "getlocs (setlocs s l) = l";
42 by (induct_tac "s" 1);
44 by (simp_tac (simpset() addsimps [getlocs_def2]) 1);
45 qed "getlocs_setlocs";
46 Addsimps[getlocs_setlocs];
48 Goal "getlocs (setlocs s (getlocs s')[Y::=k]) = getlocs (s'[Y::=k])";
49 by (induct_tac "Y" 1);
52 qed "getlocs_setlocs_lemma";
55 Goalw [hoare_valids_def]
56 "!v. G|={%Z s. P Z (s[Loc Y::=v]) & s<Y> = a (s[Loc Y::=v])}. \
57 \ c .{%Z s. Q Z (s[Loc Y::=v])} ==> G|={P}. LOCAL Y:=a IN c .{Q}";
58 by (full_simp_tac (simpset() addsimps [triple_valid_def2]) 1);
60 by (dres_inst_tac [("x","s<Y>")] spec 1);
63 by (dres_inst_tac [("x","s[Loc Y::=a s]")] spec 1);
68 qed "classic_Local_valid";
70 Goal "!v. G|-{%Z s. P Z (s[Loc Y::=v]) & s<Y> = a (s[Loc Y::=v])}. \
71 \ c .{%Z s. Q Z (s[Loc Y::=v])} ==> G|-{P}. LOCAL Y:=a IN c .{Q}";
74 br (hoare_derivs.Local RS conseq1) 1;
78 by (res_inst_tac [("P'","%Z s. s' = s & P Z (s[Loc Y::=a s][Loc Y::=s'<Y>]) & (s[Loc Y::=a s])<Y> = a (s[Loc Y::=a s][Loc Y::=s'<Y>])")] conseq1 1);
80 br hoare_derivs.Local 1;
85 Goal "[| Y~=Y'; G|-{P}. c .{%Z s. s<Y'>=d} |] ==> \
86 \ G|-{%Z s. P Z (s[Loc Y::=a s])}. LOCAL Y:=a IN c .{%Z s. s<Y'>=d}";
88 by (ALLGOALS Clarsimp_tac);
92 by (Asm_full_simp_tac 1);
93 qed "classic_Local_indep";
95 Goal "[| Y~=Y'; G|-{P}. c .{%Z s. s<Y'>=d} |] ==> \
96 \ G|-{%Z s. P Z (s[Loc Y::=a s])}. LOCAL Y:=a IN c .{%Z s. s<Y'>=d}";
98 br hoare_derivs.Local 1;
102 Goal "[| Y'~=Y; G|-{P}. c .{%Z s. s<Y'>=d} |] ==> \
103 \ G|-{%Z s. P Z (s[Loc Y::=a s])}. LOCAL Y:=a IN c .{%Z s. s<Y'>=d}";
105 by (ALLGOALS Clarsimp_tac);
106 qed "weak_Local_indep";
109 Goal "G|-{%Z s. Z = s<Y>}. LOCAL Y:=a IN c .{%Z s. Z = s<Y>}";
111 by (res_inst_tac [("P'","%Z s. s'=s & True"), ("Q'","%Z s. s'<Y> = s<Y>")] (conseq12) 1);
113 br hoare_derivs.Local 1;
116 qed "export_Local_invariant";
118 Goal "G|-{%Z s. Z = s<Y>}. LOCAL Y:=a IN c .{%Z s. Z = s<Y>}";
121 br (trueI RS conseq12) 1;
123 qed "classic_Local_invariant";
125 Goal "G|-{P}. BODY pn .{%Z s. Q Z (setlocs s (getlocs s')[X::=s<Res>])} ==> \
126 \ G|-{%Z s. s'=s & I Z (getlocs (s[X::=k Z])) & P Z (setlocs s newlocs[Loc Arg::=a s])}. \
127 \ X:=CALL pn (a) .{%Z s. I Z (getlocs (s[X::=k Z])) & Q Z s}";
128 by (res_inst_tac [("s'1","s'"),("Q'","%Z s. I Z (getlocs (s[X::=k Z])) = I Z (getlocs (s'[X::=k Z])) & Q Z s")] (hoare_derivs.Call RS conseq12) 1);
129 by (asm_simp_tac (simpset() addsimps [getlocs_setlocs_lemma]) 1);
131 qed "Call_invariant";