src/HOL/Nominal/Examples/Fsub.thy
changeset 30986 047fa04a9fe8
parent 30091 2fb0b721e9c2
child 32011 01da62fb4a20
equal deleted inserted replaced
30983:e54777ab68bd 30986:047fa04a9fe8
   243   apply (nominal_induct rule:binding.strong_induct) 
   243   apply (nominal_induct rule:binding.strong_induct) 
   244   apply (simp_all add: eqvts)
   244   apply (simp_all add: eqvts)
   245   apply (simp add: dj_perm_forget[OF dj_tyvrs_vrs])
   245   apply (simp add: dj_perm_forget[OF dj_tyvrs_vrs])
   246   done
   246   done
   247 
   247 
   248 lemma ty_vrs_fresh[fresh]:
   248 lemma ty_vrs_fresh:
   249   fixes x::"vrs"
   249   fixes x::"vrs"
   250   and   T::"ty"
   250   and   T::"ty"
   251   shows "x \<sharp> T"
   251   shows "x \<sharp> T"
   252 by (simp add: fresh_def supp_def ty_vrs_prm_simp)
   252 by (simp add: fresh_def supp_def ty_vrs_prm_simp)
   253 
   253 
   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)