11376
|
1 |
(* Title: HOL/NanoJava/Equivalence.thy
|
|
2 |
ID: $Id$
|
|
3 |
Author: David von Oheimb
|
|
4 |
Copyright 2001 Technische Universitaet Muenchen
|
|
5 |
*)
|
|
6 |
|
|
7 |
header "Equivalence of Operational and Axiomatic Semantics"
|
|
8 |
|
|
9 |
theory Equivalence = OpSem + AxSem:
|
|
10 |
|
|
11 |
subsection "Validity"
|
|
12 |
|
|
13 |
constdefs
|
|
14 |
valid :: "[assn,stmt,assn] => bool" ("|= {(1_)}/ (_)/ {(1_)}" [3,90,3] 60)
|
|
15 |
"|= {P} c {Q} \<equiv> \<forall>s t. P s --> (\<exists>n. s -c-n-> t) --> Q t"
|
|
16 |
|
|
17 |
nvalid :: "[nat, triple ] => bool" ("|=_: _" [61,61] 60)
|
|
18 |
"|=n: t \<equiv> let (P,c,Q) = t in \<forall>s t. s -c-n-> t --> P s --> Q t"
|
|
19 |
|
|
20 |
nvalids :: "[nat, triple set] => bool" ("||=_: _" [61,61] 60)
|
|
21 |
"||=n: T \<equiv> \<forall>t\<in>T. |=n: t"
|
|
22 |
|
|
23 |
cnvalids :: "[triple set,triple set] => bool" ("_ ||=/ _"[61,61] 60)
|
|
24 |
"A ||= C \<equiv> \<forall>n. ||=n: A --> ||=n: C"
|
|
25 |
|
|
26 |
syntax (xsymbols)
|
|
27 |
valid :: "[assn,stmt,assn] => bool" ("\<Turnstile> {(1_)}/ (_)/ {(1_)}" [3,90,3] 60)
|
|
28 |
nvalid :: "[nat, triple ] => bool" ("\<Turnstile>_: _" [61,61] 60)
|
|
29 |
nvalids :: "[nat, triple set] => bool" ("|\<Turnstile>_: _" [61,61] 60)
|
|
30 |
cnvalids :: "[triple set,triple set] => bool" ("_ |\<Turnstile>/ _" [61,61] 60)
|
|
31 |
|
|
32 |
syntax
|
|
33 |
nvalid1::"[nat, assn,stmt,assn] => bool" ( "|=_:.{(1_)}/ (_)/ {(1_)}"
|
|
34 |
[61,3,90,3] 60)
|
|
35 |
cnvalid1::"[triple set, assn,stmt,assn] => bool" ("_ ||=.{(1_)}/ (_)/ {(1_)}"
|
|
36 |
[61,3,90,3] 60)
|
|
37 |
syntax (xsymbols)
|
|
38 |
nvalid1::"[nat, assn,stmt,assn] => bool" ( "\<Turnstile>_:.{(1_)}/ (_)/ {(1_)}"
|
|
39 |
[61,3,90,3] 60)
|
|
40 |
cnvalid1::"[triple set, assn,stmt,assn] => bool" ( "_ |\<Turnstile>.{(1_)}/ (_)/ {(1_)}"
|
|
41 |
[61,3,90,3] 60)
|
|
42 |
translations
|
|
43 |
" \<Turnstile>n:.{P} c {Q}" \<rightleftharpoons> " \<Turnstile>n: (P,c,Q)"
|
|
44 |
"A |\<Turnstile>.{P} c {Q}" \<rightleftharpoons> "A |\<Turnstile> {(P,c,Q)}"
|
|
45 |
|
|
46 |
lemma nvalid1_def2: "\<Turnstile>n:.{P} c {Q} \<equiv> \<forall>s t. s -c-n\<rightarrow> t \<longrightarrow> P s \<longrightarrow> Q t"
|
|
47 |
by (simp add: nvalid_def Let_def)
|
|
48 |
|
|
49 |
lemma cnvalid1_def2:
|
|
50 |
"A |\<Turnstile>.{P} c {Q} \<equiv> \<forall>n. |\<Turnstile>n: A \<longrightarrow> (\<forall>s t. s -c-n\<rightarrow> t \<longrightarrow> P s \<longrightarrow> Q t)"
|
|
51 |
by(simp add: nvalid1_def2 nvalids_def cnvalids_def)
|
|
52 |
|
|
53 |
lemma valid_def2: "\<Turnstile> {P} c {Q} = (\<forall>n. \<Turnstile>n:.{P} c {Q})"
|
|
54 |
apply (simp add: valid_def nvalid1_def2)
|
|
55 |
apply blast
|
|
56 |
done
|
|
57 |
|
|
58 |
|
|
59 |
subsection "Soundness"
|
|
60 |
|
|
61 |
declare exec_elim_cases [elim!]
|
|
62 |
|
|
63 |
lemma Impl_nvalid_0: "\<Turnstile>0:.{P} Impl C m {Q}"
|
|
64 |
by (clarsimp simp add: nvalid1_def2)
|
|
65 |
|
|
66 |
lemma Impl_nvalid_Suc: "\<Turnstile>n:.{P} body C m {Q} \<Longrightarrow> \<Turnstile>Suc n:.{P} Impl C m {Q}"
|
|
67 |
by (clarsimp simp add: nvalid1_def2)
|
|
68 |
|
|
69 |
lemma nvalid_SucD: "\<And>t. \<Turnstile>Suc n:t \<Longrightarrow> \<Turnstile>n:t"
|
|
70 |
by (force simp add: split_paired_all nvalid1_def2 intro: exec_mono)
|
|
71 |
|
|
72 |
lemma nvalids_SucD: "Ball A (nvalid (Suc n)) \<Longrightarrow> Ball A (nvalid n)"
|
|
73 |
by (fast intro: nvalid_SucD)
|
|
74 |
|
|
75 |
lemma Loop_sound_lemma [rule_format (no_asm)]:
|
|
76 |
"\<lbrakk>\<forall>s t. s -c-n\<rightarrow> t \<longrightarrow> P s \<and> s<e> \<noteq> Null \<longrightarrow> P t; s -c0-n0\<rightarrow> t\<rbrakk> \<Longrightarrow>
|
|
77 |
P s \<longrightarrow> c0 = While (e) c \<longrightarrow> n0 = n \<longrightarrow> P t \<and> t<e> = Null"
|
|
78 |
apply (erule exec.induct)
|
|
79 |
apply clarsimp+
|
|
80 |
done
|
|
81 |
|
|
82 |
lemma Impl_sound_lemma:
|
|
83 |
"\<lbrakk>\<forall>n. Ball (A \<union> B) (nvalid n) \<longrightarrow> Ball (\<Union>z. split (f z) ` ms) (nvalid n);
|
|
84 |
(C, m) \<in> ms; Ball A (nvalid na); Ball B (nvalid na)\<rbrakk> \<Longrightarrow> nvalid na (f z C m)"
|
|
85 |
by blast
|
|
86 |
|
|
87 |
lemma hoare_sound_main: "A |\<turnstile> C \<Longrightarrow> A |\<Turnstile> C"
|
|
88 |
apply (erule hoare.induct)
|
|
89 |
apply (simp_all only: cnvalid1_def2)
|
|
90 |
apply clarsimp
|
|
91 |
apply clarsimp
|
|
92 |
apply (clarsimp split add: split_if_asm)
|
|
93 |
apply (clarsimp,tactic "smp_tac 1 1",erule(2) Loop_sound_lemma,(rule HOL.refl)+)
|
|
94 |
apply clarsimp
|
|
95 |
apply clarsimp
|
|
96 |
apply clarsimp
|
|
97 |
apply clarsimp
|
|
98 |
apply (clarsimp del: Meth_elim_cases) (* Call *)
|
|
99 |
apply (clarsimp del: Impl_elim_cases) (* Meth *)
|
|
100 |
defer
|
|
101 |
apply blast (* Conseq *)
|
|
102 |
apply (simp_all (no_asm_use) only: cnvalids_def nvalids_def)
|
|
103 |
apply blast
|
|
104 |
apply blast
|
|
105 |
apply blast
|
|
106 |
(* Impl *)
|
|
107 |
apply (erule thin_rl)
|
|
108 |
apply (rule allI)
|
|
109 |
apply (induct_tac "n")
|
|
110 |
apply (clarify intro!: Impl_nvalid_0)
|
|
111 |
apply (clarify intro!: Impl_nvalid_Suc)
|
|
112 |
apply (drule nvalids_SucD)
|
|
113 |
apply (erule (1) impE)
|
|
114 |
apply (drule (4) Impl_sound_lemma)
|
|
115 |
done
|
|
116 |
|
|
117 |
theorem hoare_sound: "{} \<turnstile> {P} c {Q} \<Longrightarrow> \<Turnstile> {P} c {Q}"
|
|
118 |
apply (simp only: valid_def2)
|
|
119 |
apply (drule hoare_sound_main)
|
|
120 |
apply (unfold cnvalids_def nvalids_def)
|
|
121 |
apply fast
|
|
122 |
done
|
|
123 |
|
|
124 |
|
|
125 |
subsection "(Relative) Completeness"
|
|
126 |
|
|
127 |
constdefs MGT :: "stmt => state => triple"
|
|
128 |
"MGT c z \<equiv> (\<lambda> s. z = s, c, %t. \<exists>n. z -c-n-> t)"
|
|
129 |
|
|
130 |
lemma MGF_implies_complete:
|
|
131 |
"\<forall>z. {} |\<turnstile> {MGT c z} \<Longrightarrow> \<Turnstile> {P} c {Q} \<Longrightarrow> {} \<turnstile> {P} c {Q}"
|
|
132 |
apply (simp only: valid_def2)
|
|
133 |
apply (unfold MGT_def)
|
|
134 |
apply (erule hoare.Conseq)
|
|
135 |
apply (clarsimp simp add: nvalid1_def2)
|
|
136 |
done
|
|
137 |
|
|
138 |
|
|
139 |
declare exec.intros[intro!]
|
|
140 |
|
|
141 |
lemma MGF_Loop: "\<forall>z. A \<turnstile> {op = z} c {\<lambda>t. \<exists>n. z -c-n\<rightarrow> t} \<Longrightarrow>
|
|
142 |
A \<turnstile> {op = z} While (e) c {\<lambda>t. \<exists>n. z -While (e) c-n\<rightarrow> t}"
|
|
143 |
apply (rule_tac P' = "\<lambda>z s. (z,s) \<in> ({(s,t). \<exists>n. s<e> \<noteq> Null \<and> s -c-n\<rightarrow> t})^*"
|
|
144 |
in hoare.Conseq)
|
|
145 |
apply (rule allI)
|
|
146 |
apply (rule hoare.Loop)
|
|
147 |
apply (erule hoare.Conseq)
|
|
148 |
apply clarsimp
|
|
149 |
apply (blast intro:rtrancl_into_rtrancl)
|
|
150 |
apply (erule thin_rl)
|
|
151 |
apply clarsimp
|
|
152 |
apply (erule_tac x = z in allE)
|
|
153 |
apply clarsimp
|
|
154 |
apply (erule converse_rtrancl_induct)
|
|
155 |
apply blast
|
|
156 |
apply clarsimp
|
|
157 |
apply (drule (1) exec_max2)
|
|
158 |
apply (blast del: exec_elim_cases)
|
|
159 |
done
|
|
160 |
|
|
161 |
lemma MGF_lemma[rule_format]:
|
|
162 |
"(\<forall>C m z. A |\<turnstile> {MGT (Impl C m) z}) \<longrightarrow> (\<forall>z. A |\<turnstile> {MGT c z})"
|
|
163 |
apply (simp add: MGT_def)
|
|
164 |
apply (induct_tac c)
|
|
165 |
apply (tactic "ALLGOALS Clarify_tac")
|
|
166 |
|
|
167 |
apply (rule Conseq1 [OF hoare.Skip])
|
|
168 |
apply blast
|
|
169 |
|
|
170 |
apply (rule hoare.Comp)
|
|
171 |
apply (erule spec)
|
|
172 |
apply (erule hoare.Conseq)
|
|
173 |
apply (erule thin_rl, erule thin_rl)
|
|
174 |
apply clarsimp
|
|
175 |
apply (drule (1) exec_max2)
|
|
176 |
apply blast
|
|
177 |
|
|
178 |
apply (rule hoare.Cond)
|
|
179 |
apply (erule hoare.Conseq)
|
|
180 |
apply (erule thin_rl, erule thin_rl)
|
|
181 |
apply force
|
|
182 |
apply (erule hoare.Conseq)
|
|
183 |
apply (erule thin_rl, erule thin_rl)
|
|
184 |
apply force
|
|
185 |
|
|
186 |
apply (erule MGF_Loop)
|
|
187 |
|
|
188 |
apply (rule Conseq1 [OF hoare.NewC])
|
|
189 |
apply blast
|
|
190 |
|
|
191 |
apply (rule Conseq1 [OF hoare.Cast])
|
|
192 |
apply blast
|
|
193 |
|
|
194 |
apply (rule Conseq1 [OF hoare.FAcc])
|
|
195 |
apply blast
|
|
196 |
|
|
197 |
apply (rule Conseq1 [OF hoare.FAss])
|
|
198 |
apply blast
|
|
199 |
|
|
200 |
apply (rule hoare.Call)
|
|
201 |
apply (rule allI)
|
|
202 |
apply (rule hoare.Meth)
|
|
203 |
apply (rule allI)
|
|
204 |
apply (drule spec, drule spec, erule hoare.Conseq)
|
|
205 |
apply blast
|
|
206 |
|
|
207 |
apply (rule hoare.Meth)
|
|
208 |
apply (rule allI)
|
|
209 |
apply (drule spec, drule spec, erule hoare.Conseq)
|
|
210 |
apply blast
|
|
211 |
|
|
212 |
apply blast
|
|
213 |
done
|
|
214 |
|
|
215 |
lemma MGF_Impl: "{} |\<turnstile> {MGT (Impl C m) z}"
|
|
216 |
apply (unfold MGT_def)
|
|
217 |
apply (rule Impl1)
|
|
218 |
apply (rule_tac [2] UNIV_I)
|
|
219 |
apply clarsimp
|
|
220 |
apply (rule hoare.ConjI)
|
|
221 |
apply clarsimp
|
|
222 |
apply (rule ssubst [OF Impl_body_eq])
|
|
223 |
apply (fold MGT_def)
|
|
224 |
apply (rule MGF_lemma)
|
|
225 |
apply (rule hoare.Asm)
|
|
226 |
apply force
|
|
227 |
done
|
|
228 |
|
|
229 |
theorem hoare_relative_complete: "\<Turnstile> {P} c {Q} \<Longrightarrow> {} \<turnstile> {P} c {Q}"
|
|
230 |
apply (rule MGF_implies_complete)
|
|
231 |
apply (erule_tac [2] asm_rl)
|
|
232 |
apply (rule allI)
|
|
233 |
apply (rule MGF_lemma)
|
|
234 |
apply (rule MGF_Impl)
|
|
235 |
done
|
|
236 |
|
|
237 |
end
|