188 assume *: "\<And>b ba. isValue b \<Longrightarrow> (lt1[ba ::= b])* = lt1*[ba ::= b+]" "\<And>b ba. isValue b \<Longrightarrow> (lt2[ba ::= b])* = lt2*[ba ::= b+]" |
188 assume *: "\<And>b ba. isValue b \<Longrightarrow> (lt1[ba ::= b])* = lt1*[ba ::= b+]" "\<And>b ba. isValue b \<Longrightarrow> (lt2[ba ::= b])* = lt2*[ba ::= b+]" |
189 "isValue V" |
189 "isValue V" |
190 obtain a :: name where a: "atom a \<sharp> (lt1[x ::= V], lt1, lt2[x ::= V], lt2, V, x)" using obtain_fresh by blast |
190 obtain a :: name where a: "atom a \<sharp> (lt1[x ::= V], lt1, lt2[x ::= V], lt2, V, x)" using obtain_fresh by blast |
191 obtain b :: name where b: "atom b \<sharp> (lt2[x ::= V], lt2, a, V, x)" using obtain_fresh by blast |
191 obtain b :: name where b: "atom b \<sharp> (lt2[x ::= V], lt2, a, V, x)" using obtain_fresh by blast |
192 obtain c :: name where c: "atom c \<sharp> (a, b, V, x)" using obtain_fresh by blast |
192 obtain c :: name where c: "atom c \<sharp> (a, b, V, x)" using obtain_fresh by blast |
193 show "((lt1 $ lt2)[x ::= V])* = (lt1 $ lt2)*[x ::= V+]" using * a b c |
193 show "((lt1 $$ lt2)[x ::= V])* = (lt1 $$ lt2)*[x ::= V+]" using * a b c |
194 by (simp add: fresh_at_base) |
194 by (simp add: fresh_at_base) |
195 qed |
195 qed |
196 |
196 |
197 lemma [simp]: "isValue V \<Longrightarrow> isValue (V+)" |
197 lemma [simp]: "isValue V \<Longrightarrow> isValue (V+)" |
198 by (nominal_induct V rule: lt.strong_induct, auto) |
198 by (nominal_induct V rule: lt.strong_induct, auto) |
199 |
199 |
200 lemma CPS_eval_Kapply: |
200 lemma CPS_eval_Kapply: |
201 assumes a: "isValue K" |
201 assumes a: "isValue K" |
202 shows "(M* $ K) \<longrightarrow>\<^isub>\<beta>\<^sup>* (M ; K)" |
202 shows "(M* $$ K) \<longrightarrow>\<^isub>\<beta>\<^sup>* (M ; K)" |
203 using a |
203 using a |
204 proof (nominal_induct M avoiding: K rule: lt.strong_induct, simp_all) |
204 proof (nominal_induct M avoiding: K rule: lt.strong_induct, simp_all) |
205 case (Var name K) |
205 case (Var name K) |
206 assume *: "isValue K" |
206 assume *: "isValue K" |
207 obtain a :: name where a: "atom a \<sharp> (name, K)" using obtain_fresh by blast |
207 obtain a :: name where a: "atom a \<sharp> (name, K)" using obtain_fresh by blast |
208 show "(name~)* $ K \<longrightarrow>\<^isub>\<beta>\<^sup>* K $ name~" using * a |
208 show "(name~)* $$ K \<longrightarrow>\<^isub>\<beta>\<^sup>* K $$ name~" using * a |
209 by simp (rule evbeta', simp_all add: fresh_at_base) |
209 by simp (rule evbeta', simp_all add: fresh_at_base) |
210 next |
210 next |
211 fix name :: name and lt K |
211 fix name :: name and lt K |
212 assume *: "atom name \<sharp> K" "\<And>b. isValue b \<Longrightarrow> lt* $ b \<longrightarrow>\<^isub>\<beta>\<^sup>* lt ; b" "isValue K" |
212 assume *: "atom name \<sharp> K" "\<And>b. isValue b \<Longrightarrow> lt* $$ b \<longrightarrow>\<^isub>\<beta>\<^sup>* lt ; b" "isValue K" |
213 obtain a :: name where a: "atom a \<sharp> (name, K, lt)" using obtain_fresh by blast |
213 obtain a :: name where a: "atom a \<sharp> (name, K, lt)" using obtain_fresh by blast |
214 then have b: "atom name \<sharp> a" using fresh_PairD(1) fresh_at_base atom_eq_iff by metis |
214 then have b: "atom name \<sharp> a" using fresh_PairD(1) fresh_at_base atom_eq_iff by metis |
215 show "Lam name lt* $ K \<longrightarrow>\<^isub>\<beta>\<^sup>* K $ Lam name (lt*)" using * a b |
215 show "Lam name lt* $$ K \<longrightarrow>\<^isub>\<beta>\<^sup>* K $$ Lam name (lt*)" using * a b |
216 by simp (rule evbeta', simp_all) |
216 by simp (rule evbeta', simp_all) |
217 next |
217 next |
218 fix lt1 lt2 K |
218 fix lt1 lt2 K |
219 assume *: "\<And>b. isValue b \<Longrightarrow> lt1* $ b \<longrightarrow>\<^isub>\<beta>\<^sup>* lt1 ; b" "\<And>b. isValue b \<Longrightarrow> lt2* $ b \<longrightarrow>\<^isub>\<beta>\<^sup>* lt2 ; b" "isValue K" |
219 assume *: "\<And>b. isValue b \<Longrightarrow> lt1* $$ b \<longrightarrow>\<^isub>\<beta>\<^sup>* lt1 ; b" "\<And>b. isValue b \<Longrightarrow> lt2* $$ b \<longrightarrow>\<^isub>\<beta>\<^sup>* lt2 ; b" "isValue K" |
220 obtain a :: name where a: "atom a \<sharp> (lt1, lt2, K)" using obtain_fresh by blast |
220 obtain a :: name where a: "atom a \<sharp> (lt1, lt2, K)" using obtain_fresh by blast |
221 obtain b :: name where b: "atom b \<sharp> (lt1, lt2, K, a)" using obtain_fresh by blast |
221 obtain b :: name where b: "atom b \<sharp> (lt1, lt2, K, a)" using obtain_fresh by blast |
222 obtain c :: name where c: "atom c \<sharp> (lt1, lt2, K, a, b)" using obtain_fresh by blast |
222 obtain c :: name where c: "atom c \<sharp> (lt1, lt2, K, a, b)" using obtain_fresh by blast |
223 have d: "atom a \<sharp> lt1" "atom a \<sharp> lt2" "atom a \<sharp> K" "atom b \<sharp> lt1" "atom b \<sharp> lt2" "atom b \<sharp> K" "atom b \<sharp> a" |
223 have d: "atom a \<sharp> lt1" "atom a \<sharp> lt2" "atom a \<sharp> K" "atom b \<sharp> lt1" "atom b \<sharp> lt2" "atom b \<sharp> K" "atom b \<sharp> a" |
224 "atom c \<sharp> lt1" "atom c \<sharp> lt2" "atom c \<sharp> K" "atom c \<sharp> a" "atom c \<sharp> b" using fresh_Pair a b c by simp_all |
224 "atom c \<sharp> lt1" "atom c \<sharp> lt2" "atom c \<sharp> K" "atom c \<sharp> a" "atom c \<sharp> b" using fresh_Pair a b c by simp_all |
225 have "(lt1 $ lt2)* $ K \<longrightarrow>\<^isub>\<beta>\<^sup>* lt1* $ Lam b (lt2* $ Lam c (b~ $ c~ $ K))" using * d |
225 have "(lt1 $$ lt2)* $$ K \<longrightarrow>\<^isub>\<beta>\<^sup>* lt1* $$ Lam b (lt2* $$ Lam c (b~ $$ c~ $$ K))" using * d |
226 by (simp add: fresh_at_base) (rule evbeta', simp_all add: fresh_at_base) |
226 by (simp add: fresh_at_base) (rule evbeta', simp_all add: fresh_at_base) |
227 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* lt1 $ lt2 ; K" proof (cases "isValue lt1") |
227 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* lt1 $$ lt2 ; K" proof (cases "isValue lt1") |
228 assume e: "isValue lt1" |
228 assume e: "isValue lt1" |
229 have "lt1* $ Lam b (lt2* $ Lam c (b~ $ c~ $ K)) \<longrightarrow>\<^isub>\<beta>\<^sup>* Lam b (lt2* $ Lam c (b~ $ c~ $ K)) $ lt1+" |
229 have "lt1* $$ Lam b (lt2* $$ Lam c (b~ $$ c~ $$ K)) \<longrightarrow>\<^isub>\<beta>\<^sup>* Lam b (lt2* $$ Lam c (b~ $$ c~ $$ K)) $$ lt1+" |
230 using * d e by simp |
230 using * d e by simp |
231 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* lt2* $ Lam c (lt1+ $ c~ $ K)" |
231 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* lt2* $$ Lam c (lt1+ $$ c~ $$ K)" |
232 by (rule evbeta')(simp_all add: * d e) |
232 by (rule evbeta')(simp_all add: * d e) |
233 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* lt1 $ lt2 ; K" proof (cases "isValue lt2") |
233 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* lt1 $$ lt2 ; K" proof (cases "isValue lt2") |
234 assume f: "isValue lt2" |
234 assume f: "isValue lt2" |
235 have "lt2* $ Lam c (lt1+ $ c~ $ K) \<longrightarrow>\<^isub>\<beta>\<^sup>* Lam c (lt1+ $ c~ $ K) $ lt2+" using * d e f by simp |
235 have "lt2* $$ Lam c (lt1+ $$ c~ $$ K) \<longrightarrow>\<^isub>\<beta>\<^sup>* Lam c (lt1+ $$ c~ $$ K) $$ lt2+" using * d e f by simp |
236 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* lt1+ $ lt2+ $ K" |
236 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* lt1+ $$ lt2+ $$ K" |
237 by (rule evbeta', simp_all add: d e f) |
237 by (rule evbeta', simp_all add: d e f) |
238 finally show ?thesis using * d e f by simp |
238 finally show ?thesis using * d e f by simp |
239 next |
239 next |
240 assume f: "\<not> isValue lt2" |
240 assume f: "\<not> isValue lt2" |
241 have "lt2* $ Lam c (lt1+ $ c~ $ K) \<longrightarrow>\<^isub>\<beta>\<^sup>* lt2 ; Lam c (lt1+ $ c~ $ K)" using * d e f by simp |
241 have "lt2* $$ Lam c (lt1+ $$ c~ $$ K) \<longrightarrow>\<^isub>\<beta>\<^sup>* lt2 ; Lam c (lt1+ $$ c~ $$ K)" using * d e f by simp |
242 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* lt2 ; Lam a (lt1+ $ a~ $ K)" using Kapply.simps(4) d e evs1 f by metis |
242 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* lt2 ; Lam a (lt1+ $$ a~ $$ K)" using Kapply.simps(4) d e evs1 f by metis |
243 finally show ?thesis using * d e f by simp |
243 finally show ?thesis using * d e f by simp |
244 qed |
244 qed |
245 finally show ?thesis . |
245 finally show ?thesis . |
246 qed (metis Kapply.simps(5) isValue.simps(2) * d) |
246 qed (metis Kapply.simps(5) isValue.simps(2) * d) |
247 finally show "(lt1 $ lt2)* $ K \<longrightarrow>\<^isub>\<beta>\<^sup>* lt1 $ lt2 ; K" . |
247 finally show "(lt1 $$ lt2)* $$ K \<longrightarrow>\<^isub>\<beta>\<^sup>* lt1 $$ lt2 ; K" . |
248 qed |
248 qed |
249 |
249 |
250 lemma Kapply_eval: |
250 lemma Kapply_eval: |
251 assumes a: "M \<longrightarrow>\<^isub>\<beta> N" "isValue K" |
251 assumes a: "M \<longrightarrow>\<^isub>\<beta> N" "isValue K" |
252 shows "(M; K) \<longrightarrow>\<^isub>\<beta>\<^sup>* (N; K)" |
252 shows "(M; K) \<longrightarrow>\<^isub>\<beta>\<^sup>* (N; K)" |
253 using assms |
253 using assms |
254 proof (induct arbitrary: K rule: eval.induct) |
254 proof (induct arbitrary: K rule: eval.induct) |
255 case (evbeta x V M) |
255 case (evbeta x V M) |
256 fix K |
256 fix K |
257 assume a: "isValue K" "isValue V" "atom x \<sharp> V" |
257 assume a: "isValue K" "isValue V" "atom x \<sharp> V" |
258 have "Lam x (M*) $ V+ $ K \<longrightarrow>\<^isub>\<beta>\<^sup>* (((M*)[x ::= V+]) $ K)" |
258 have "Lam x (M*) $$ V+ $$ K \<longrightarrow>\<^isub>\<beta>\<^sup>* (((M*)[x ::= V+]) $$ K)" |
259 by (rule evs2,rule ev2,rule Lt.evbeta) (simp_all add: fresh_def a[simplified fresh_def] evs1) |
259 by (rule evs2,rule ev2,rule Lt.evbeta) (simp_all add: fresh_def a[simplified fresh_def] evs1) |
260 also have "... = ((M[x ::= V])* $ K)" by (simp add: CPS_subst_fv a) |
260 also have "... = ((M[x ::= V])* $$ K)" by (simp add: CPS_subst_fv a) |
261 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* ((M[x ::= V]) ; K)" by (rule CPS_eval_Kapply, simp_all add: a) |
261 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* ((M[x ::= V]) ; K)" by (rule CPS_eval_Kapply, simp_all add: a) |
262 finally show "(Lam x M $ V ; K) \<longrightarrow>\<^isub>\<beta>\<^sup>* ((M[x ::= V]) ; K)" using a by simp |
262 finally show "(Lam x M $$ V ; K) \<longrightarrow>\<^isub>\<beta>\<^sup>* ((M[x ::= V]) ; K)" using a by simp |
263 next |
263 next |
264 case (ev1 V M N) |
264 case (ev1 V M N) |
265 fix V M N K |
265 fix V M N K |
266 assume a: "isValue V" "M \<longrightarrow>\<^isub>\<beta> N" "\<And>K. isValue K \<Longrightarrow> M ; K \<longrightarrow>\<^isub>\<beta>\<^sup>* N ; K" "isValue K" |
266 assume a: "isValue V" "M \<longrightarrow>\<^isub>\<beta> N" "\<And>K. isValue K \<Longrightarrow> M ; K \<longrightarrow>\<^isub>\<beta>\<^sup>* N ; K" "isValue K" |
267 obtain a :: name where b: "atom a \<sharp> (V, K, M, N)" using obtain_fresh by blast |
267 obtain a :: name where b: "atom a \<sharp> (V, K, M, N)" using obtain_fresh by blast |
268 show "V $ M ; K \<longrightarrow>\<^isub>\<beta>\<^sup>* V $ N ; K" proof (cases "isValue N") |
268 show "V $$ M ; K \<longrightarrow>\<^isub>\<beta>\<^sup>* V $$ N ; K" proof (cases "isValue N") |
269 assume "\<not> isValue N" |
269 assume "\<not> isValue N" |
270 then show "V $ M ; K \<longrightarrow>\<^isub>\<beta>\<^sup>* V $ N ; K" using a b by simp |
270 then show "V $$ M ; K \<longrightarrow>\<^isub>\<beta>\<^sup>* V $$ N ; K" using a b by simp |
271 next |
271 next |
272 assume n: "isValue N" |
272 assume n: "isValue N" |
273 have c: "M; Lam a (V+ $ a~ $ K) \<longrightarrow>\<^isub>\<beta>\<^sup>* Lam a (V+ $ a~ $ K) $ N+" using a b by (simp add: n) |
273 have c: "M; Lam a (V+ $$ a~ $$ K) \<longrightarrow>\<^isub>\<beta>\<^sup>* Lam a (V+ $$ a~ $$ K) $$ N+" using a b by (simp add: n) |
274 also have d: "... \<longrightarrow>\<^isub>\<beta>\<^sup>* V+ $ N+ $ K" by (rule evbeta') (simp_all add: a b n) |
274 also have d: "... \<longrightarrow>\<^isub>\<beta>\<^sup>* V+ $$ N+ $$ K" by (rule evbeta') (simp_all add: a b n) |
275 finally show "V $ M ; K \<longrightarrow>\<^isub>\<beta>\<^sup>* V $ N ; K" using a b by (simp add: n) |
275 finally show "V $$ M ; K \<longrightarrow>\<^isub>\<beta>\<^sup>* V $$ N ; K" using a b by (simp add: n) |
276 qed |
276 qed |
277 next |
277 next |
278 case (ev2 M M' N) |
278 case (ev2 M M' N) |
279 assume *: "M \<longrightarrow>\<^isub>\<beta> M'" "\<And>K. isValue K \<Longrightarrow> M ; K \<longrightarrow>\<^isub>\<beta>\<^sup>* M' ; K" "isValue K" |
279 assume *: "M \<longrightarrow>\<^isub>\<beta> M'" "\<And>K. isValue K \<Longrightarrow> M ; K \<longrightarrow>\<^isub>\<beta>\<^sup>* M' ; K" "isValue K" |
280 obtain a :: name where a: "atom a \<sharp> (K, M, N, M')" using obtain_fresh by blast |
280 obtain a :: name where a: "atom a \<sharp> (K, M, N, M')" using obtain_fresh by blast |
281 obtain b :: name where b: "atom b \<sharp> (a, K, M, N, M', N+)" using obtain_fresh by blast |
281 obtain b :: name where b: "atom b \<sharp> (a, K, M, N, M', N+)" using obtain_fresh by blast |
282 have d: "atom a \<sharp> K" "atom a \<sharp> M" "atom a \<sharp> N" "atom a \<sharp> M'" "atom b \<sharp> a" "atom b \<sharp> K" |
282 have d: "atom a \<sharp> K" "atom a \<sharp> M" "atom a \<sharp> N" "atom a \<sharp> M'" "atom b \<sharp> a" "atom b \<sharp> K" |
283 "atom b \<sharp> M" "atom b \<sharp> N" "atom b \<sharp> M'" using a b fresh_Pair by simp_all |
283 "atom b \<sharp> M" "atom b \<sharp> N" "atom b \<sharp> M'" using a b fresh_Pair by simp_all |
284 have "M $ N ; K \<longrightarrow>\<^isub>\<beta>\<^sup>* M' ; Lam a (N* $ Lam b (a~ $ b~ $ K))" using * d by simp |
284 have "M $$ N ; K \<longrightarrow>\<^isub>\<beta>\<^sup>* M' ; Lam a (N* $$ Lam b (a~ $$ b~ $$ K))" using * d by simp |
285 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* M' $ N ; K" proof (cases "isValue M'") |
285 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* M' $$ N ; K" proof (cases "isValue M'") |
286 assume "\<not> isValue M'" |
286 assume "\<not> isValue M'" |
287 then show ?thesis using * d by (simp_all add: evs1) |
287 then show ?thesis using * d by (simp_all add: evs1) |
288 next |
288 next |
289 assume e: "isValue M'" |
289 assume e: "isValue M'" |
290 then have "M' ; Lam a (N* $ Lam b (a~ $ b~ $ K)) = Lam a (N* $ Lam b (a~ $ b~ $ K)) $ M'+" by simp |
290 then have "M' ; Lam a (N* $$ Lam b (a~ $$ b~ $$ K)) = Lam a (N* $$ Lam b (a~ $$ b~ $$ K)) $$ M'+" by simp |
291 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* (N* $ Lam b (a~ $ b~ $ K))[a ::= M'+]" |
291 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* (N* $$ Lam b (a~ $$ b~ $$ K))[a ::= M'+]" |
292 by (rule evbeta') (simp_all add: fresh_at_base e d) |
292 by (rule evbeta') (simp_all add: fresh_at_base e d) |
293 also have "... = N* $ Lam b (M'+ $ b~ $ K)" using * d by (simp add: fresh_at_base) |
293 also have "... = N* $$ Lam b (M'+ $$ b~ $$ K)" using * d by (simp add: fresh_at_base) |
294 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* M' $ N ; K" proof (cases "isValue N") |
294 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* M' $$ N ; K" proof (cases "isValue N") |
295 assume f: "isValue N" |
295 assume f: "isValue N" |
296 have "N* $ Lam b (M'+ $ b~ $ K) \<longrightarrow>\<^isub>\<beta>\<^sup>* Lam b (M'+ $ b~ $ K) $ N+" |
296 have "N* $$ Lam b (M'+ $$ b~ $$ K) \<longrightarrow>\<^isub>\<beta>\<^sup>* Lam b (M'+ $$ b~ $$ K) $$ N+" |
297 by (rule eval_trans, rule CPS_eval_Kapply) (simp_all add: d e f * evs1) |
297 by (rule eval_trans, rule CPS_eval_Kapply) (simp_all add: d e f * evs1) |
298 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* M' $ N ; K" by (rule evbeta') (simp_all add: d e f evs1) |
298 also have "... \<longrightarrow>\<^isub>\<beta>\<^sup>* M' $$ N ; K" by (rule evbeta') (simp_all add: d e f evs1) |
299 finally show ?thesis . |
299 finally show ?thesis . |
300 next |
300 next |
301 assume "\<not> isValue N" |
301 assume "\<not> isValue N" |
302 then show ?thesis using d e |
302 then show ?thesis using d e |
303 by (metis CPS_eval_Kapply Kapply.simps(4) isValue.simps(2)) |
303 by (metis CPS_eval_Kapply Kapply.simps(4) isValue.simps(2)) |