161 [consumes 1, case_names t_Var t_App t_Lam t_Const t_Unit]: |
161 [consumes 1, case_names t_Var t_App t_Lam t_Const t_Unit]: |
162 fixes P::"'a::fs_name \<Rightarrow> (name\<times>ty) list \<Rightarrow> trm \<Rightarrow> ty \<Rightarrow>bool" |
162 fixes P::"'a::fs_name \<Rightarrow> (name\<times>ty) list \<Rightarrow> trm \<Rightarrow> ty \<Rightarrow>bool" |
163 and x :: "'a::fs_name" |
163 and x :: "'a::fs_name" |
164 assumes a: "\<Gamma> \<turnstile> e : T" |
164 assumes a: "\<Gamma> \<turnstile> e : T" |
165 and a1: "\<And>\<Gamma> x T c. \<lbrakk>valid \<Gamma>; (x,T)\<in>set \<Gamma>\<rbrakk> \<Longrightarrow> P c \<Gamma> (Var x) T" |
165 and a1: "\<And>\<Gamma> x T c. \<lbrakk>valid \<Gamma>; (x,T)\<in>set \<Gamma>\<rbrakk> \<Longrightarrow> P c \<Gamma> (Var x) T" |
166 and a2: "\<And>\<Gamma> e1 T1 T2 e2 c. |
166 and a2: "\<And>\<Gamma> e1 T1 T2 e2 c. \<lbrakk>\<And>c. P c \<Gamma> e1 (T1\<rightarrow>T2); \<And>c. P c \<Gamma> e2 T1\<rbrakk> |
167 \<lbrakk>\<Gamma> \<turnstile> e1 : T1\<rightarrow>T2 ; \<And>c. P c \<Gamma> e1 (T1\<rightarrow>T2); \<Gamma> \<turnstile> e2 : T1 ; \<And>c. P c \<Gamma> e2 T1\<rbrakk> |
|
168 \<Longrightarrow> P c \<Gamma> (App e1 e2) T2" |
167 \<Longrightarrow> P c \<Gamma> (App e1 e2) T2" |
169 and a3: "\<And>x \<Gamma> T1 t T2 c. |
168 and a3: "\<And>x \<Gamma> T1 t T2 c.\<lbrakk>x\<sharp>(\<Gamma>,c); \<And>c. P c ((x,T1)#\<Gamma>) t T2\<rbrakk> |
170 \<lbrakk>x\<sharp>(\<Gamma>,c); (x,T1)#\<Gamma> \<turnstile> t : T2 ; \<And>c. P c ((x,T1)#\<Gamma>) t T2\<rbrakk> |
|
171 \<Longrightarrow> P c \<Gamma> (Lam [x].t) (T1\<rightarrow>T2)" |
169 \<Longrightarrow> P c \<Gamma> (Lam [x].t) (T1\<rightarrow>T2)" |
172 and a4: "\<And>\<Gamma> n c. valid \<Gamma> \<Longrightarrow> P c \<Gamma> (Const n) TBase" |
170 and a4: "\<And>\<Gamma> n c. valid \<Gamma> \<Longrightarrow> P c \<Gamma> (Const n) TBase" |
173 and a5: "\<And>\<Gamma> c. valid \<Gamma> \<Longrightarrow> P c \<Gamma> Unit TUnit" |
171 and a5: "\<And>\<Gamma> c. valid \<Gamma> \<Longrightarrow> P c \<Gamma> Unit TUnit" |
174 shows "P c \<Gamma> e T" |
172 shows "P c \<Gamma> e T" |
175 proof - |
173 proof - |
176 from a have "\<And>(pi::name prm) c. P c (pi\<bullet>\<Gamma>) (pi\<bullet>e) T" |
174 from a have "\<And>(pi::name prm) c. P c (pi\<bullet>\<Gamma>) (pi\<bullet>e) (pi\<bullet>T)" |
177 proof (induct) |
175 proof (induct) |
178 case (t_Var \<Gamma> x T pi c) |
176 case (t_Var \<Gamma> x T pi c) |
179 have "valid \<Gamma>" by fact |
177 have "valid \<Gamma>" by fact |
180 then have "valid (pi\<bullet>\<Gamma>)" by (simp only: valid_eqvt) |
178 then have "valid (pi\<bullet>\<Gamma>)" by (simp only: eqvt) |
181 moreover |
179 moreover |
182 have "(x,T)\<in>set \<Gamma>" by fact |
180 have "(x,T)\<in>set \<Gamma>" by fact |
183 then have "pi\<bullet>(x,T)\<in>pi\<bullet>(set \<Gamma>)" by (simp only: pt_set_bij[OF pt_name_inst, OF at_name_inst]) |
181 then have "pi\<bullet>(x,T)\<in>pi\<bullet>(set \<Gamma>)" by (simp only: pt_set_bij[OF pt_name_inst, OF at_name_inst]) |
184 then have "(pi\<bullet>x,T)\<in>set (pi\<bullet>\<Gamma>)" by (simp add: set_eqvt) |
182 then have "(pi\<bullet>x,T)\<in>set (pi\<bullet>\<Gamma>)" by (simp add: set_eqvt) |
185 ultimately show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>(Var x)) T" using a1 by simp |
183 ultimately show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>(Var x)) (pi\<bullet>T)" using a1 by simp |
186 next |
184 next |
187 case (t_App \<Gamma> e1 T1 T2 e2 pi c) |
185 case (t_App \<Gamma> e1 T1 T2 e2 pi c) |
188 thus "P c (pi\<bullet>\<Gamma>) (pi\<bullet>(App e1 e2)) T2" using a2 by (simp, blast intro: typing_eqvt) |
186 thus "P c (pi\<bullet>\<Gamma>) (pi\<bullet>(App e1 e2)) (pi\<bullet>T2)" using a2 |
|
187 by (simp only: eqvt) (blast) |
189 next |
188 next |
190 case (t_Lam x \<Gamma> T1 t T2 pi c) |
189 case (t_Lam x \<Gamma> T1 t T2 pi c) |
191 obtain y::"name" where fs: "y\<sharp>(pi\<bullet>x,pi\<bullet>\<Gamma>,pi\<bullet>t,c)" by (erule exists_fresh[OF fs_name1]) |
190 obtain y::"name" where fs: "y\<sharp>(pi\<bullet>x,pi\<bullet>\<Gamma>,pi\<bullet>t,c)" by (erule exists_fresh[OF fs_name1]) |
192 let ?sw = "[(pi\<bullet>x,y)]" |
191 let ?sw = "[(pi\<bullet>x,y)]" |
193 let ?pi' = "?sw@pi" |
192 let ?pi' = "?sw@pi" |
194 have f0: "x\<sharp>\<Gamma>" by fact |
193 have f0: "x\<sharp>\<Gamma>" by fact |
195 have f1: "(pi\<bullet>x)\<sharp>(pi\<bullet>\<Gamma>)" using f0 by (simp add: fresh_bij) |
194 have f1: "(pi\<bullet>x)\<sharp>(pi\<bullet>\<Gamma>)" using f0 by (simp add: fresh_bij) |
196 have f2: "y\<sharp>?pi'\<bullet>\<Gamma>" by (auto simp add: pt_name2 fresh_left calc_atm perm_pi_simp) |
195 have f2: "y\<sharp>?pi'\<bullet>\<Gamma>" by (auto simp add: pt_name2 fresh_left calc_atm perm_pi_simp) |
197 have pr1: "(x,T1)#\<Gamma> \<turnstile> t : T2" by fact |
196 have ih1: "\<And>c. P c (?pi'\<bullet>((x,T1)#\<Gamma>)) (?pi'\<bullet>t) (?pi'\<bullet>T2)" by fact |
198 then have "(?pi'\<bullet>((x,T1)#\<Gamma>)) \<turnstile> (?pi'\<bullet>t) : T2" by (simp only: typing_eqvt) |
197 then have "P c (?pi'\<bullet>\<Gamma>) (Lam [y].(?pi'\<bullet>t)) (T1\<rightarrow>T2)" using fs f2 a3 |
199 moreover |
|
200 have ih1: "\<And>c. P c (?pi'\<bullet>((x,T1)#\<Gamma>)) (?pi'\<bullet>t) T2" by fact |
|
201 ultimately have "P c (?pi'\<bullet>\<Gamma>) (Lam [y].(?pi'\<bullet>t)) (T1\<rightarrow>T2)" using fs f2 a3 |
|
202 by (simp add: calc_atm) |
198 by (simp add: calc_atm) |
203 then have "P c (?sw\<bullet>pi\<bullet>\<Gamma>) (?sw\<bullet>(Lam [(pi\<bullet>x)].(pi\<bullet>t))) (T1\<rightarrow>T2)" |
199 then have "P c (?sw\<bullet>pi\<bullet>\<Gamma>) (?sw\<bullet>(Lam [(pi\<bullet>x)].(pi\<bullet>t))) (T1\<rightarrow>T2)" |
204 by (simp del: append_Cons add: calc_atm pt_name2) |
200 by (simp del: append_Cons add: calc_atm pt_name2) |
205 moreover have "(?sw\<bullet>pi\<bullet>\<Gamma>) = (pi\<bullet>\<Gamma>)" |
201 moreover have "(?sw\<bullet>pi\<bullet>\<Gamma>) = (pi\<bullet>\<Gamma>)" |
206 by (rule perm_fresh_fresh) (simp_all add: fs f1) |
202 by (rule perm_fresh_fresh) (simp_all add: fs f1) |
207 moreover have "(?sw\<bullet>(Lam [(pi\<bullet>x)].(pi\<bullet>t))) = Lam [(pi\<bullet>x)].(pi\<bullet>t)" |
203 moreover have "(?sw\<bullet>(Lam [(pi\<bullet>x)].(pi\<bullet>t))) = Lam [(pi\<bullet>x)].(pi\<bullet>t)" |
208 by (rule perm_fresh_fresh) (simp_all add: fs f1 fresh_atm abs_fresh) |
204 by (rule perm_fresh_fresh) (simp_all add: fs f1 fresh_atm abs_fresh) |
209 ultimately show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>(Lam [x].t)) (T1\<rightarrow>T2)" |
205 ultimately show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>(Lam [x].t)) (pi\<bullet>T1\<rightarrow>T2)" by simp |
210 by simp |
|
211 next |
206 next |
212 case (t_Const \<Gamma> n pi c) |
207 case (t_Const \<Gamma> n pi c) |
213 thus "P c (pi\<bullet>\<Gamma>) (pi\<bullet>(Const n)) (TBase)" using a4 by (simp, blast intro: valid_eqvt) |
208 thus "P c (pi\<bullet>\<Gamma>) (pi\<bullet>(Const n)) (pi\<bullet>TBase)" using a4 by (simp, blast intro: valid_eqvt) |
214 next |
209 next |
215 case (t_Unit \<Gamma> pi c) |
210 case (t_Unit \<Gamma> pi c) |
216 thus "P c (pi\<bullet>\<Gamma>) (pi\<bullet>Unit) (TUnit)" using a5 by (simp, blast intro: valid_eqvt) |
211 thus "P c (pi\<bullet>\<Gamma>) (pi\<bullet>Unit) (pi\<bullet>TUnit)" using a5 by (simp, blast intro: valid_eqvt) |
217 qed |
212 qed |
218 then have "P c (([]::name prm)\<bullet>\<Gamma>) (([]::name prm)\<bullet>e) T" by blast |
213 then have "P c (([]::name prm)\<bullet>\<Gamma>) (([]::name prm)\<bullet>e) (([]::name prm)\<bullet>T)" by blast |
219 then show "P c \<Gamma> e T" by simp |
214 then show "P c \<Gamma> e T" by simp |
220 qed |
215 qed |
221 |
216 |
222 text {* capture-avoiding substitution *} |
217 text {* capture-avoiding substitution *} |
223 |
218 |
224 fun |
219 fun |
225 lookup :: "(name\<times>trm) list \<Rightarrow> name \<Rightarrow> trm" |
220 lookup :: "(name\<times>trm) list \<Rightarrow> name \<Rightarrow> trm" |
369 lemma equiv_def_valid: |
364 lemma equiv_def_valid: |
370 assumes "\<Gamma> \<turnstile> t == s : T" |
365 assumes "\<Gamma> \<turnstile> t == s : T" |
371 shows "valid \<Gamma>" |
366 shows "valid \<Gamma>" |
372 using assms by (induct,auto elim:typing_valid) |
367 using assms by (induct,auto elim:typing_valid) |
373 |
368 |
374 lemma equiv_def_eqvt: |
369 lemma equiv_def_eqvt[eqvt]: |
375 fixes pi::"name prm" |
370 fixes pi::"name prm" |
376 assumes a: "\<Gamma> \<turnstile> s == t : T" |
371 assumes a: "\<Gamma> \<turnstile> s == t : T" |
377 shows "(pi\<bullet>\<Gamma>) \<turnstile> (pi\<bullet>s) == (pi\<bullet>t) : T" |
372 shows "(pi\<bullet>\<Gamma>) \<turnstile> (pi\<bullet>s) == (pi\<bullet>t) : (pi\<bullet>T)" |
378 using a |
373 using a |
379 apply(induct) |
374 apply(induct) |
380 apply(auto intro: typing_eqvt valid_eqvt simp add: fresh_bij subst_eqvt) |
375 apply(auto intro: typing_eqvt valid_eqvt simp add: fresh_bij subst_eqvt simp del: perm_ty) |
381 apply(rule_tac x="pi\<bullet>x" in Q_Ext) |
376 apply(rule_tac x="pi\<bullet>x" in Q_Ext) |
382 apply(simp add: fresh_bij)+ |
377 apply(simp add: fresh_bij)+ |
383 done |
378 done |
384 |
379 |
385 lemma equiv_def_strong_induct |
380 lemma equiv_def_strong_induct |
386 [consumes 1, case_names Q_Refl Q_Symm Q_Trans Q_Abs Q_App Q_Beta Q_Ext]: |
381 [consumes 1, case_names Q_Refl Q_Symm Q_Trans Q_Abs Q_App Q_Beta Q_Ext]: |
387 fixes c::"'a::fs_name" |
382 fixes c::"'a::fs_name" |
388 assumes a0: "\<Gamma> \<turnstile> s == t : T" |
383 assumes a0: "\<Gamma> \<turnstile> s == t : T" |
389 and a1: "\<And>\<Gamma> t T c. \<Gamma> \<turnstile> t : T \<Longrightarrow> P c \<Gamma> t t T" |
384 and a1: "\<And>\<Gamma> t T c. \<Gamma> \<turnstile> t : T \<Longrightarrow> P c \<Gamma> t t T" |
390 and a2: "\<And>\<Gamma> t s T c. \<lbrakk>\<Gamma> \<turnstile> t == s : T; \<And>d. P d \<Gamma> t s T\<rbrakk> \<Longrightarrow> P c \<Gamma> s t T" |
385 and a2: "\<And>\<Gamma> t s T c. \<lbrakk>\<And>d. P d \<Gamma> t s T\<rbrakk> \<Longrightarrow> P c \<Gamma> s t T" |
391 and a3: "\<And>\<Gamma> s t T u c. |
386 and a3: "\<And>\<Gamma> s t T u c. \<lbrakk>\<And>d. P d \<Gamma> s t T; \<And>d. P d \<Gamma> t u T\<rbrakk> |
392 \<lbrakk>\<Gamma> \<turnstile> s == t : T; \<And>d. P d \<Gamma> s t T; \<Gamma> \<turnstile> t == u : T; \<And>d. P d \<Gamma> t u T\<rbrakk> |
|
393 \<Longrightarrow> P c \<Gamma> s u T" |
387 \<Longrightarrow> P c \<Gamma> s u T" |
394 and a4: "\<And>x \<Gamma> T1 s2 t2 T2 c. \<lbrakk>x\<sharp>\<Gamma>; x\<sharp>c; (x,T1)#\<Gamma> \<turnstile> s2 == t2 : T2; \<And>d. P d ((x,T1)#\<Gamma>) s2 t2 T2\<rbrakk> |
388 and a4: "\<And>x \<Gamma> T1 s2 t2 T2 c. \<lbrakk>x\<sharp>\<Gamma>; x\<sharp>c; \<And>d. P d ((x,T1)#\<Gamma>) s2 t2 T2\<rbrakk> |
395 \<Longrightarrow> P c \<Gamma> (Lam [x].s2) (Lam [x].t2) (T1\<rightarrow>T2)" |
389 \<Longrightarrow> P c \<Gamma> (Lam [x].s2) (Lam [x].t2) (T1\<rightarrow>T2)" |
396 and a5: "\<And>\<Gamma> s1 t1 T1 T2 s2 t2 c. |
390 and a5: "\<And>\<Gamma> s1 t1 T1 T2 s2 t2 c. \<lbrakk>\<And>d. P d \<Gamma> s1 t1 (T1\<rightarrow>T2); \<And>d. P d \<Gamma> s2 t2 T1\<rbrakk> |
397 \<lbrakk>\<Gamma> \<turnstile> s1 == t1 : T1\<rightarrow>T2; \<And>d. P d \<Gamma> s1 t1 (T1\<rightarrow>T2); |
391 \<Longrightarrow> P c \<Gamma> (App s1 s2) (App t1 t2) T2" |
398 \<Gamma> \<turnstile> s2 == t2 : T1; \<And>d. P d \<Gamma> s2 t2 T1\<rbrakk> \<Longrightarrow> P c \<Gamma> (App s1 s2) (App t1 t2) T2" |
|
399 and a6: "\<And>x \<Gamma> T1 s12 t12 T2 s2 t2 c. |
392 and a6: "\<And>x \<Gamma> T1 s12 t12 T2 s2 t2 c. |
400 \<lbrakk>x\<sharp>(\<Gamma>,s2,t2); x\<sharp>c; (x,T1)#\<Gamma> \<turnstile> s12 == t12 : T2; \<And>d. P d ((x,T1)#\<Gamma>) s12 t12 T2; |
393 \<lbrakk>x\<sharp>(\<Gamma>,s2,t2); x\<sharp>c; \<And>d. P d ((x,T1)#\<Gamma>) s12 t12 T2; \<And>d. P d \<Gamma> s2 t2 T1\<rbrakk> |
401 \<Gamma> \<turnstile> s2 == t2 : T1; \<And>d. P d \<Gamma> s2 t2 T1\<rbrakk> |
|
402 \<Longrightarrow> P c \<Gamma> (App (Lam [x].s12) s2) (t12[x::=t2]) T2" |
394 \<Longrightarrow> P c \<Gamma> (App (Lam [x].s12) s2) (t12[x::=t2]) T2" |
403 and a7: "\<And>x \<Gamma> s t T1 T2 c. |
395 and a7: "\<And>x \<Gamma> s t T1 T2 c. |
404 \<lbrakk>x\<sharp>(\<Gamma>,s,t); (x,T1)#\<Gamma> \<turnstile> App s (Var x) == App t (Var x) : T2; |
396 \<lbrakk>x\<sharp>(\<Gamma>,s,t); \<And>d. P d ((x,T1)#\<Gamma>) (App s (Var x)) (App t (Var x)) T2\<rbrakk> |
405 \<And>d. P d ((x,T1)#\<Gamma>) (App s (Var x)) (App t (Var x)) T2\<rbrakk> |
|
406 \<Longrightarrow> P c \<Gamma> s t (T1\<rightarrow>T2)" |
397 \<Longrightarrow> P c \<Gamma> s t (T1\<rightarrow>T2)" |
407 shows "P c \<Gamma> s t T" |
398 shows "P c \<Gamma> s t T" |
408 proof - |
399 proof - |
409 from a0 have "\<And>(pi::name prm) c. P c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>t) T" |
400 from a0 have "\<And>(pi::name prm) c. P c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>t) (pi\<bullet>T)" |
410 proof(induct) |
401 proof(induct) |
411 case (Q_Refl \<Gamma> t T pi c) |
402 case (Q_Refl \<Gamma> t T pi c) |
412 then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>t) (pi\<bullet>t) T" using a1 by (simp add: typing_eqvt) |
403 then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>t) (pi\<bullet>t) (pi\<bullet>T)" using a1 by (simp only: eqvt) |
413 next |
404 next |
414 case (Q_Symm \<Gamma> t s T pi c) |
405 case (Q_Symm \<Gamma> t s T pi c) |
415 then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>t) T" using a2 by (simp only: equiv_def_eqvt) |
406 then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>t) (pi\<bullet>T)" using a2 by (simp only: equiv_def_eqvt) |
416 next |
407 next |
417 case (Q_Trans \<Gamma> s t T u pi c) |
408 case (Q_Trans \<Gamma> s t T u pi c) |
418 then show " P c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>u) T" using a3 by (blast intro: equiv_def_eqvt) |
409 then show " P c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>u) (pi\<bullet>T)" using a3 by (blast intro: equiv_def_eqvt) |
419 next |
410 next |
420 case (Q_App \<Gamma> s1 t1 T1 T2 s2 t2 pi c) |
411 case (Q_App \<Gamma> s1 t1 T1 T2 s2 t2 pi c) |
421 then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>App s1 s2) (pi\<bullet>App t1 t2) T2" using a5 |
412 then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>App s1 s2) (pi\<bullet>App t1 t2) (pi\<bullet>T2)" using a5 |
422 by (simp, blast intro: equiv_def_eqvt) |
413 by (simp only: eqvt) (blast) |
423 next |
414 next |
424 case (Q_Ext x \<Gamma> s t T1 T2 pi c) |
415 case (Q_Ext x \<Gamma> s t T1 T2 pi c) |
425 then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>t) (T1\<rightarrow>T2)" |
416 then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>t) (pi\<bullet>T1\<rightarrow>T2)" |
426 apply(auto intro!: a7 simp add: fresh_bij) |
417 by (auto intro!: a7 simp add: fresh_bij) |
427 apply(drule equiv_def_eqvt) |
|
428 apply(simp) |
|
429 done |
|
430 next |
418 next |
431 case (Q_Abs x \<Gamma> T1 s2 t2 T2 pi c) |
419 case (Q_Abs x \<Gamma> T1 s2 t2 T2 pi c) |
432 obtain y::"name" where fs: "y\<sharp>(pi\<bullet>x,pi\<bullet>s2,pi\<bullet>t2,pi\<bullet>\<Gamma>,c)" by (rule exists_fresh[OF fs_name1]) |
420 obtain y::"name" where fs: "y\<sharp>(pi\<bullet>x,pi\<bullet>s2,pi\<bullet>t2,pi\<bullet>\<Gamma>,c)" by (rule exists_fresh[OF fs_name1]) |
433 let ?sw="[(pi\<bullet>x,y)]" |
421 let ?sw="[(pi\<bullet>x,y)]" |
434 let ?pi'="?sw@pi" |
422 let ?pi'="?sw@pi" |
435 have f1: "x\<sharp>\<Gamma>" by fact |
423 have f1: "x\<sharp>\<Gamma>" by fact |
436 have f2: "(pi\<bullet>x)\<sharp>(pi\<bullet>\<Gamma>)" using f1 by (simp add: fresh_bij) |
424 have f2: "(pi\<bullet>x)\<sharp>(pi\<bullet>\<Gamma>)" using f1 by (simp add: fresh_bij) |
437 have f3: "y\<sharp>?pi'\<bullet>\<Gamma>" using f1 by (auto simp add: pt_name2 fresh_left calc_atm perm_pi_simp) |
425 have f3: "y\<sharp>?pi'\<bullet>\<Gamma>" using f1 by (auto simp add: pt_name2 fresh_left calc_atm perm_pi_simp) |
438 have pr1: "(x,T1)#\<Gamma> \<turnstile> s2 == t2 : T2" by fact |
426 have ih1: "\<And>c. P c (?pi'\<bullet>((x,T1)#\<Gamma>)) (?pi'\<bullet>s2) (?pi'\<bullet>t2) (?pi'\<bullet>T2)" by fact |
439 then have "?pi'\<bullet>((x,T1)#\<Gamma>) \<turnstile> (?pi'\<bullet>s2) == (?pi'\<bullet>t2) : T2" by (rule equiv_def_eqvt) |
|
440 then have "((y,T1)#(?pi'\<bullet>\<Gamma>)) \<turnstile> (?pi'\<bullet>s2) == (?pi'\<bullet>t2) : T2" by (simp add: calc_atm) |
|
441 moreover |
|
442 have ih1: "\<And>c. P c (?pi'\<bullet>((x,T1)#\<Gamma>)) (?pi'\<bullet>s2) (?pi'\<bullet>t2) T2" by fact |
|
443 then have "\<And>c. P c ((y,T1)#(?pi'\<bullet>\<Gamma>)) (?pi'\<bullet>s2) (?pi'\<bullet>t2) T2" by (simp add: calc_atm) |
427 then have "\<And>c. P c ((y,T1)#(?pi'\<bullet>\<Gamma>)) (?pi'\<bullet>s2) (?pi'\<bullet>t2) T2" by (simp add: calc_atm) |
444 ultimately have "P c (?pi'\<bullet>\<Gamma>) (?pi'\<bullet>Lam [x].s2) (?pi'\<bullet>Lam [x].t2) (T1\<rightarrow>T2)" using a4 f3 fs |
428 then have "P c (?pi'\<bullet>\<Gamma>) (?pi'\<bullet>Lam [x].s2) (?pi'\<bullet>Lam [x].t2) (T1\<rightarrow>T2)" using a4 f3 fs |
445 by (simp add: calc_atm) |
429 by (simp add: calc_atm) |
446 then have "P c (?sw\<bullet>pi\<bullet>\<Gamma>) (?sw\<bullet>Lam [(pi\<bullet>x)].(pi\<bullet>s2)) (?sw\<bullet>Lam [(pi\<bullet>x)].(pi\<bullet>t2)) (T1\<rightarrow>T2)" |
430 then have "P c (?sw\<bullet>pi\<bullet>\<Gamma>) (?sw\<bullet>Lam [(pi\<bullet>x)].(pi\<bullet>s2)) (?sw\<bullet>Lam [(pi\<bullet>x)].(pi\<bullet>t2)) (T1\<rightarrow>T2)" |
447 by (simp del: append_Cons add: calc_atm pt_name2) |
431 by (simp del: append_Cons add: calc_atm pt_name2) |
448 moreover have "(?sw\<bullet>(pi\<bullet>\<Gamma>)) = (pi\<bullet>\<Gamma>)" |
432 moreover have "(?sw\<bullet>(pi\<bullet>\<Gamma>)) = (pi\<bullet>\<Gamma>)" |
449 by (rule perm_fresh_fresh) (simp_all add: fs f2) |
433 by (rule perm_fresh_fresh) (simp_all add: fs f2) |
450 moreover have "(?sw\<bullet>(Lam [(pi\<bullet>x)].(pi\<bullet>s2))) = Lam [(pi\<bullet>x)].(pi\<bullet>s2)" |
434 moreover have "(?sw\<bullet>(Lam [(pi\<bullet>x)].(pi\<bullet>s2))) = Lam [(pi\<bullet>x)].(pi\<bullet>s2)" |
451 by (rule perm_fresh_fresh) (simp_all add: fs f2 abs_fresh) |
435 by (rule perm_fresh_fresh) (simp_all add: fs f2 abs_fresh) |
452 moreover have "(?sw\<bullet>(Lam [(pi\<bullet>x)].(pi\<bullet>t2))) = Lam [(pi\<bullet>x)].(pi\<bullet>t2)" |
436 moreover have "(?sw\<bullet>(Lam [(pi\<bullet>x)].(pi\<bullet>t2))) = Lam [(pi\<bullet>x)].(pi\<bullet>t2)" |
453 by (rule perm_fresh_fresh) (simp_all add: fs f2 abs_fresh) |
437 by (rule perm_fresh_fresh) (simp_all add: fs f2 abs_fresh) |
454 ultimately have "P c (pi\<bullet>\<Gamma>) (Lam [(pi\<bullet>x)].(pi\<bullet>s2)) (Lam [(pi\<bullet>x)].(pi\<bullet>t2)) (T1\<rightarrow>T2)" by simp |
438 ultimately have "P c (pi\<bullet>\<Gamma>) (Lam [(pi\<bullet>x)].(pi\<bullet>s2)) (Lam [(pi\<bullet>x)].(pi\<bullet>t2)) (T1\<rightarrow>T2)" by simp |
455 then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>Lam [x].s2) (pi\<bullet>Lam [x].t2) (T1\<rightarrow>T2)" by simp |
439 then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>Lam [x].s2) (pi\<bullet>Lam [x].t2) (pi\<bullet>T1\<rightarrow>T2)" by simp |
456 next |
440 next |
457 case (Q_Beta x \<Gamma> s2 t2 T1 s12 t12 T2 pi c) |
441 case (Q_Beta x \<Gamma> s2 t2 T1 s12 t12 T2 pi c) |
458 obtain y::"name" where fs: "y\<sharp>(pi\<bullet>x,pi\<bullet>s12,pi\<bullet>t12,pi\<bullet>s2,pi\<bullet>t2,pi\<bullet>\<Gamma>,c)" |
442 obtain y::"name" where fs: "y\<sharp>(pi\<bullet>x,pi\<bullet>s12,pi\<bullet>t12,pi\<bullet>s2,pi\<bullet>t2,pi\<bullet>\<Gamma>,c)" |
459 by (rule exists_fresh[OF fs_name1]) |
443 by (rule exists_fresh[OF fs_name1]) |
460 let ?sw="[(pi\<bullet>x,y)]" |
444 let ?sw="[(pi\<bullet>x,y)]" |
461 let ?pi'="?sw@pi" |
445 let ?pi'="?sw@pi" |
462 have f1: "x\<sharp>(\<Gamma>,s2,t2)" by fact |
446 have f1: "x\<sharp>(\<Gamma>,s2,t2)" by fact |
463 have f2: "(pi\<bullet>x)\<sharp>(pi\<bullet>(\<Gamma>,s2,t2))" using f1 by (simp add: fresh_bij) |
447 have f2: "(pi\<bullet>x)\<sharp>(pi\<bullet>(\<Gamma>,s2,t2))" using f1 by (simp add: fresh_bij) |
464 have f3: "y\<sharp>(?pi'\<bullet>(\<Gamma>,s2,t2))" using f1 |
448 have f3: "y\<sharp>(?pi'\<bullet>(\<Gamma>,s2,t2))" using f1 |
465 by (auto simp add: pt_name2 fresh_left calc_atm perm_pi_simp fresh_prod) |
449 by (auto simp add: pt_name2 fresh_left calc_atm perm_pi_simp fresh_prod) |
466 have pr1: "(x,T1)#\<Gamma> \<turnstile> s12 == t12 : T2" by fact |
450 have ih1: "\<And>c. P c (?pi'\<bullet>((x,T1)#\<Gamma>)) (?pi'\<bullet>s12) (?pi'\<bullet>t12) (?pi'\<bullet>T2)" by fact |
467 then have "?pi'\<bullet>((x,T1)#\<Gamma>) \<turnstile> (?pi'\<bullet>s12) == (?pi'\<bullet>t12) : T2" by (rule equiv_def_eqvt) |
451 then have "\<And>c. P c ((y,T1)#(?pi'\<bullet>\<Gamma>)) (?pi'\<bullet>s12) (?pi'\<bullet>t12) (?pi'\<bullet>T2)" by (simp add: calc_atm) |
468 then have "((y,T1)#(?pi'\<bullet>\<Gamma>)) \<turnstile> (?pi'\<bullet>s12) == (?pi'\<bullet>t12) : T2" by (simp add: calc_atm) |
|
469 moreover |
|
470 have ih1: "\<And>c. P c (?pi'\<bullet>((x,T1)#\<Gamma>)) (?pi'\<bullet>s12) (?pi'\<bullet>t12) T2" by fact |
|
471 then have "\<And>c. P c ((y,T1)#(?pi'\<bullet>\<Gamma>)) (?pi'\<bullet>s12) (?pi'\<bullet>t12) T2" by (simp add: calc_atm) |
|
472 moreover |
452 moreover |
473 have pr2: "\<Gamma> \<turnstile> s2 == t2 : T1" by fact |
453 have ih2: "\<And>c. P c (?pi'\<bullet>\<Gamma>) (?pi'\<bullet>s2) (?pi'\<bullet>t2) (?pi'\<bullet>T1)" by fact |
474 then have "(?pi'\<bullet>\<Gamma>) \<turnstile> (?pi'\<bullet>s2) == (?pi'\<bullet>t2) : T1" by (rule equiv_def_eqvt) |
454 ultimately have "P c (?pi'\<bullet>\<Gamma>) (?pi'\<bullet>(App (Lam [x].s12) s2)) (?pi'\<bullet>(t12[x::=t2])) (?pi'\<bullet>T2)" |
475 moreover |
455 using a6 f3 fs by (force simp add: subst_eqvt calc_atm del: perm_ty) |
476 have ih2: "\<And>c. P c (?pi'\<bullet>\<Gamma>) (?pi'\<bullet>s2) (?pi'\<bullet>t2) T1" by fact |
|
477 ultimately have "P c (?pi'\<bullet>\<Gamma>) (?pi'\<bullet>(App (Lam [x].s12) s2)) (?pi'\<bullet>(t12[x::=t2])) T2" |
|
478 using a6 f3 fs by (simp add: subst_eqvt calc_atm) |
|
479 then have "P c (?sw\<bullet>pi\<bullet>\<Gamma>) (?sw\<bullet>(App (Lam [(pi\<bullet>x)].(pi\<bullet>s12)) (pi\<bullet>s2))) |
456 then have "P c (?sw\<bullet>pi\<bullet>\<Gamma>) (?sw\<bullet>(App (Lam [(pi\<bullet>x)].(pi\<bullet>s12)) (pi\<bullet>s2))) |
480 (?sw\<bullet>((pi\<bullet>t12)[(pi\<bullet>x)::=(pi\<bullet>t2)])) T2" |
457 (?sw\<bullet>((pi\<bullet>t12)[(pi\<bullet>x)::=(pi\<bullet>t2)])) T2" |
481 by (simp del: append_Cons add: calc_atm pt_name2 subst_eqvt) |
458 by (simp del: append_Cons add: calc_atm pt_name2 subst_eqvt) |
482 moreover have "(?sw\<bullet>(pi\<bullet>\<Gamma>)) = (pi\<bullet>\<Gamma>)" |
459 moreover have "(?sw\<bullet>(pi\<bullet>\<Gamma>)) = (pi\<bullet>\<Gamma>)" |
483 by (rule perm_fresh_fresh) (simp_all add: fs[simplified] f2[simplified]) |
460 by (rule perm_fresh_fresh) (simp_all add: fs[simplified] f2[simplified]) |