420 and T::"ty" |
420 and T::"ty" |
421 shows "pi\<bullet>(T[X \<mapsto> T']\<^sub>\<tau>) = (pi\<bullet>T)[(pi\<bullet>X) \<mapsto> (pi\<bullet>T')]\<^sub>\<tau>" |
421 shows "pi\<bullet>(T[X \<mapsto> T']\<^sub>\<tau>) = (pi\<bullet>T)[(pi\<bullet>X) \<mapsto> (pi\<bullet>T')]\<^sub>\<tau>" |
422 by (nominal_induct T avoiding: X T' rule: ty.strong_induct) |
422 by (nominal_induct T avoiding: X T' rule: ty.strong_induct) |
423 (perm_simp add: fresh_left)+ |
423 (perm_simp add: fresh_left)+ |
424 |
424 |
425 lemma type_subst_fresh[fresh]: |
425 lemma type_subst_fresh: |
426 fixes X::"tyvrs" |
426 fixes X::"tyvrs" |
427 assumes "X \<sharp> T" and "X \<sharp> P" |
427 assumes "X \<sharp> T" and "X \<sharp> P" |
428 shows "X \<sharp> T[Y \<mapsto> P]\<^sub>\<tau>" |
428 shows "X \<sharp> T[Y \<mapsto> P]\<^sub>\<tau>" |
429 using assms |
429 using assms |
430 by (nominal_induct T avoiding: X Y P rule:ty.strong_induct) |
430 by (nominal_induct T avoiding: X Y P rule:ty.strong_induct) |
431 (auto simp add: abs_fresh) |
431 (auto simp add: abs_fresh) |
432 |
432 |
433 lemma fresh_type_subst_fresh[fresh]: |
433 lemma fresh_type_subst_fresh: |
434 assumes "X\<sharp>T'" |
434 assumes "X\<sharp>T'" |
435 shows "X\<sharp>T[X \<mapsto> T']\<^sub>\<tau>" |
435 shows "X\<sharp>T[X \<mapsto> T']\<^sub>\<tau>" |
436 using assms |
436 using assms |
437 by (nominal_induct T avoiding: X T' rule: ty.strong_induct) |
437 by (nominal_induct T avoiding: X T' rule: ty.strong_induct) |
438 (auto simp add: fresh_atm abs_fresh fresh_nat) |
438 (auto simp add: fresh_atm abs_fresh fresh_nat) |
456 where |
456 where |
457 "(TVarB X U)[Y \<mapsto> T]\<^sub>b = TVarB X (U[Y \<mapsto> T]\<^sub>\<tau>)" |
457 "(TVarB X U)[Y \<mapsto> T]\<^sub>b = TVarB X (U[Y \<mapsto> T]\<^sub>\<tau>)" |
458 | "(VarB X U)[Y \<mapsto> T]\<^sub>b = VarB X (U[Y \<mapsto> T]\<^sub>\<tau>)" |
458 | "(VarB X U)[Y \<mapsto> T]\<^sub>b = VarB X (U[Y \<mapsto> T]\<^sub>\<tau>)" |
459 by auto |
459 by auto |
460 |
460 |
461 lemma binding_subst_fresh[fresh]: |
461 lemma binding_subst_fresh: |
462 fixes X::"tyvrs" |
462 fixes X::"tyvrs" |
463 assumes "X \<sharp> a" |
463 assumes "X \<sharp> a" |
464 and "X \<sharp> P" |
464 and "X \<sharp> P" |
465 shows "X \<sharp> a[Y \<mapsto> P]\<^sub>b" |
465 shows "X \<sharp> a[Y \<mapsto> P]\<^sub>b" |
466 using assms |
466 using assms |
467 by (nominal_induct a rule:binding.strong_induct) |
467 by (nominal_induct a rule: binding.strong_induct) |
468 (auto simp add: freshs) |
468 (auto simp add: type_subst_fresh) |
469 |
469 |
470 lemma binding_subst_identity: "X \<sharp> B \<Longrightarrow> B[X \<mapsto> U]\<^sub>b = B" |
470 lemma binding_subst_identity: |
471 by (induct B rule: binding.induct) |
471 shows "X \<sharp> B \<Longrightarrow> B[X \<mapsto> U]\<^sub>b = B" |
472 (simp_all add: fresh_atm type_subst_identity) |
472 by (induct B rule: binding.induct) |
|
473 (simp_all add: fresh_atm type_subst_identity) |
473 |
474 |
474 consts |
475 consts |
475 subst_tyc :: "env \<Rightarrow> tyvrs \<Rightarrow> ty \<Rightarrow> env" ("_[_ \<mapsto> _]\<^sub>e" [100,100,100] 100) |
476 subst_tyc :: "env \<Rightarrow> tyvrs \<Rightarrow> ty \<Rightarrow> env" ("_[_ \<mapsto> _]\<^sub>e" [100,100,100] 100) |
476 |
477 |
477 primrec |
478 primrec |
478 "([])[Y \<mapsto> T]\<^sub>e= []" |
479 "([])[Y \<mapsto> T]\<^sub>e= []" |
479 "(B#\<Gamma>)[Y \<mapsto> T]\<^sub>e = (B[Y \<mapsto> T]\<^sub>b)#(\<Gamma>[Y \<mapsto> T]\<^sub>e)" |
480 "(B#\<Gamma>)[Y \<mapsto> T]\<^sub>e = (B[Y \<mapsto> T]\<^sub>b)#(\<Gamma>[Y \<mapsto> T]\<^sub>e)" |
480 |
481 |
481 lemma ctxt_subst_fresh'[fresh]: |
482 lemma ctxt_subst_fresh': |
482 fixes X::"tyvrs" |
483 fixes X::"tyvrs" |
483 assumes "X \<sharp> \<Gamma>" |
484 assumes "X \<sharp> \<Gamma>" |
484 and "X \<sharp> P" |
485 and "X \<sharp> P" |
485 shows "X \<sharp> \<Gamma>[Y \<mapsto> P]\<^sub>e" |
486 shows "X \<sharp> \<Gamma>[Y \<mapsto> P]\<^sub>e" |
486 using assms |
487 using assms |
487 by (induct \<Gamma>) |
488 by (induct \<Gamma>) |
488 (auto simp add: fresh_list_cons freshs) |
489 (auto simp add: fresh_list_cons binding_subst_fresh) |
489 |
490 |
490 lemma ctxt_subst_mem_TVarB: "TVarB X T \<in> set \<Gamma> \<Longrightarrow> TVarB X (T[Y \<mapsto> U]\<^sub>\<tau>) \<in> set (\<Gamma>[Y \<mapsto> U]\<^sub>e)" |
491 lemma ctxt_subst_mem_TVarB: "TVarB X T \<in> set \<Gamma> \<Longrightarrow> TVarB X (T[Y \<mapsto> U]\<^sub>\<tau>) \<in> set (\<Gamma>[Y \<mapsto> U]\<^sub>e)" |
491 by (induct \<Gamma>) auto |
492 by (induct \<Gamma>) auto |
492 |
493 |
493 lemma ctxt_subst_mem_VarB: "VarB x T \<in> set \<Gamma> \<Longrightarrow> VarB x (T[Y \<mapsto> U]\<^sub>\<tau>) \<in> set (\<Gamma>[Y \<mapsto> U]\<^sub>e)" |
494 lemma ctxt_subst_mem_VarB: "VarB x T \<in> set \<Gamma> \<Longrightarrow> VarB x (T[Y \<mapsto> U]\<^sub>\<tau>) \<in> set (\<Gamma>[Y \<mapsto> U]\<^sub>e)" |
1186 assumes "\<Gamma> \<turnstile> t : T" |
1187 assumes "\<Gamma> \<turnstile> t : T" |
1187 shows "\<turnstile> \<Gamma> ok" |
1188 shows "\<turnstile> \<Gamma> ok" |
1188 using assms by (induct, auto) |
1189 using assms by (induct, auto) |
1189 |
1190 |
1190 nominal_inductive typing |
1191 nominal_inductive typing |
1191 by (auto dest!: typing_ok intro: closed_in_fresh fresh_domain |
1192 by (auto dest!: typing_ok intro: closed_in_fresh fresh_domain type_subst_fresh |
1192 simp: abs_fresh fresh_prod fresh_atm freshs valid_ty_domain_fresh fresh_trm_domain) |
1193 simp: abs_fresh fresh_type_subst_fresh ty_vrs_fresh valid_ty_domain_fresh fresh_trm_domain) |
1193 |
1194 |
1194 lemma ok_imp_VarB_closed_in: |
1195 lemma ok_imp_VarB_closed_in: |
1195 assumes ok: "\<turnstile> \<Gamma> ok" |
1196 assumes ok: "\<turnstile> \<Gamma> ok" |
1196 shows "VarB x T \<in> set \<Gamma> \<Longrightarrow> T closed_in \<Gamma>" using ok |
1197 shows "VarB x T \<in> set \<Gamma> \<Longrightarrow> T closed_in \<Gamma>" using ok |
1197 by induct (auto simp add: binding.inject closed_in_def) |
1198 by induct (auto simp add: binding.inject closed_in_def) |