src/HOL/Nominal/Examples/Class.thy
changeset 26966 071f40487734
parent 26932 c398a3866082
child 27117 97e9dae57284
equal deleted inserted replaced
26965:003b5781b845 26966:071f40487734
    28 by (rule TrueI)+
    28 by (rule TrueI)+
    29 
    29 
    30 lemma ty_cases:
    30 lemma ty_cases:
    31   fixes T::ty
    31   fixes T::ty
    32   shows "(\<exists>s. T=PR s) \<or> (\<exists>T'. T=NOT T') \<or> (\<exists>S U. T=S OR U) \<or> (\<exists>S U. T=S AND U) \<or> (\<exists>S U. T=S IMP U)"
    32   shows "(\<exists>s. T=PR s) \<or> (\<exists>T'. T=NOT T') \<or> (\<exists>S U. T=S OR U) \<or> (\<exists>S U. T=S AND U) \<or> (\<exists>S U. T=S IMP U)"
    33 by (induct T rule:ty.weak_induct) (auto)
    33 by (induct T rule:ty.induct) (auto)
    34 
    34 
    35 lemma fresh_ty:
    35 lemma fresh_ty:
    36   fixes a::"coname"
    36   fixes a::"coname"
    37   and   x::"name"
    37   and   x::"name"
    38   and   T::"ty"
    38   and   T::"ty"
    39   shows "a\<sharp>T" and "x\<sharp>T"
    39   shows "a\<sharp>T" and "x\<sharp>T"
    40 by (nominal_induct T rule: ty.induct)
    40 by (nominal_induct T rule: ty.strong_induct)
    41    (auto simp add: fresh_string)
    41    (auto simp add: fresh_string)
    42 
    42 
    43 text {* terms *}
    43 text {* terms *}
    44 
    44 
    45 nominal_datatype trm = 
    45 nominal_datatype trm = 
   115 lemmas eq_bij = pt_bij[OF pt_name_inst, OF at_name_inst] pt_bij[OF pt_coname_inst, OF at_coname_inst]
   115 lemmas eq_bij = pt_bij[OF pt_name_inst, OF at_name_inst] pt_bij[OF pt_coname_inst, OF at_coname_inst]
   116 
   116 
   117 lemma crename_name_eqvt[eqvt]:
   117 lemma crename_name_eqvt[eqvt]:
   118   fixes pi::"name prm"
   118   fixes pi::"name prm"
   119   shows "pi\<bullet>(M[d\<turnstile>c>e]) = (pi\<bullet>M)[(pi\<bullet>d)\<turnstile>c>(pi\<bullet>e)]"
   119   shows "pi\<bullet>(M[d\<turnstile>c>e]) = (pi\<bullet>M)[(pi\<bullet>d)\<turnstile>c>(pi\<bullet>e)]"
   120 apply(nominal_induct M avoiding: d e rule: trm.induct)
   120 apply(nominal_induct M avoiding: d e rule: trm.strong_induct)
   121 apply(auto simp add: fresh_bij eq_bij)
   121 apply(auto simp add: fresh_bij eq_bij)
   122 done
   122 done
   123 
   123 
   124 lemma crename_coname_eqvt[eqvt]:
   124 lemma crename_coname_eqvt[eqvt]:
   125   fixes pi::"coname prm"
   125   fixes pi::"coname prm"
   126   shows "pi\<bullet>(M[d\<turnstile>c>e]) = (pi\<bullet>M)[(pi\<bullet>d)\<turnstile>c>(pi\<bullet>e)]"
   126   shows "pi\<bullet>(M[d\<turnstile>c>e]) = (pi\<bullet>M)[(pi\<bullet>d)\<turnstile>c>(pi\<bullet>e)]"
   127 apply(nominal_induct M avoiding: d e rule: trm.induct)
   127 apply(nominal_induct M avoiding: d e rule: trm.strong_induct)
   128 apply(auto simp add: fresh_bij eq_bij)
   128 apply(auto simp add: fresh_bij eq_bij)
   129 done
   129 done
   130 
   130 
   131 lemma nrename_name_eqvt[eqvt]:
   131 lemma nrename_name_eqvt[eqvt]:
   132   fixes pi::"name prm"
   132   fixes pi::"name prm"
   133   shows "pi\<bullet>(M[x\<turnstile>n>y]) = (pi\<bullet>M)[(pi\<bullet>x)\<turnstile>n>(pi\<bullet>y)]"
   133   shows "pi\<bullet>(M[x\<turnstile>n>y]) = (pi\<bullet>M)[(pi\<bullet>x)\<turnstile>n>(pi\<bullet>y)]"
   134 apply(nominal_induct M avoiding: x y rule: trm.induct)
   134 apply(nominal_induct M avoiding: x y rule: trm.strong_induct)
   135 apply(auto simp add: fresh_bij eq_bij)
   135 apply(auto simp add: fresh_bij eq_bij)
   136 done
   136 done
   137 
   137 
   138 lemma nrename_coname_eqvt[eqvt]:
   138 lemma nrename_coname_eqvt[eqvt]:
   139   fixes pi::"coname prm"
   139   fixes pi::"coname prm"
   140   shows "pi\<bullet>(M[x\<turnstile>n>y]) = (pi\<bullet>M)[(pi\<bullet>x)\<turnstile>n>(pi\<bullet>y)]"
   140   shows "pi\<bullet>(M[x\<turnstile>n>y]) = (pi\<bullet>M)[(pi\<bullet>x)\<turnstile>n>(pi\<bullet>y)]"
   141 apply(nominal_induct M avoiding: x y rule: trm.induct)
   141 apply(nominal_induct M avoiding: x y rule: trm.strong_induct)
   142 apply(auto simp add: fresh_bij eq_bij)
   142 apply(auto simp add: fresh_bij eq_bij)
   143 done
   143 done
   144 
   144 
   145 lemmas rename_eqvts = crename_name_eqvt crename_coname_eqvt
   145 lemmas rename_eqvts = crename_name_eqvt crename_coname_eqvt
   146                       nrename_name_eqvt nrename_coname_eqvt
   146                       nrename_name_eqvt nrename_coname_eqvt
   147 lemma nrename_fresh:
   147 lemma nrename_fresh:
   148   assumes a: "x\<sharp>M"
   148   assumes a: "x\<sharp>M"
   149   shows "M[x\<turnstile>n>y] = M"
   149   shows "M[x\<turnstile>n>y] = M"
   150 using a
   150 using a
   151 by (nominal_induct M avoiding: x y rule: trm.induct)
   151 by (nominal_induct M avoiding: x y rule: trm.strong_induct)
   152    (auto simp add: trm.inject fresh_atm abs_fresh fin_supp abs_supp)
   152    (auto simp add: trm.inject fresh_atm abs_fresh fin_supp abs_supp)
   153 
   153 
   154 lemma crename_fresh:
   154 lemma crename_fresh:
   155   assumes a: "a\<sharp>M"
   155   assumes a: "a\<sharp>M"
   156   shows "M[a\<turnstile>c>b] = M"
   156   shows "M[a\<turnstile>c>b] = M"
   157 using a
   157 using a
   158 by (nominal_induct M avoiding: a b rule: trm.induct)
   158 by (nominal_induct M avoiding: a b rule: trm.strong_induct)
   159    (auto simp add: trm.inject fresh_atm abs_fresh)
   159    (auto simp add: trm.inject fresh_atm abs_fresh)
   160 
   160 
   161 lemma nrename_nfresh:
   161 lemma nrename_nfresh:
   162   fixes x::"name"
   162   fixes x::"name"
   163   shows "x\<sharp>y\<Longrightarrow>x\<sharp>M[x\<turnstile>n>y]"
   163   shows "x\<sharp>y\<Longrightarrow>x\<sharp>M[x\<turnstile>n>y]"
   164 by (nominal_induct M avoiding: x y rule: trm.induct)
   164 by (nominal_induct M avoiding: x y rule: trm.strong_induct)
   165    (auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
   165    (auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
   166 
   166 
   167  lemma crename_nfresh:
   167  lemma crename_nfresh:
   168   fixes x::"name"
   168   fixes x::"name"
   169   shows "x\<sharp>M\<Longrightarrow>x\<sharp>M[a\<turnstile>c>b]"
   169   shows "x\<sharp>M\<Longrightarrow>x\<sharp>M[a\<turnstile>c>b]"
   170 by (nominal_induct M avoiding: a b rule: trm.induct)
   170 by (nominal_induct M avoiding: a b rule: trm.strong_induct)
   171    (auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
   171    (auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
   172 
   172 
   173 lemma crename_cfresh:
   173 lemma crename_cfresh:
   174   fixes a::"coname"
   174   fixes a::"coname"
   175   shows "a\<sharp>b\<Longrightarrow>a\<sharp>M[a\<turnstile>c>b]"
   175   shows "a\<sharp>b\<Longrightarrow>a\<sharp>M[a\<turnstile>c>b]"
   176 by (nominal_induct M avoiding: a b rule: trm.induct)
   176 by (nominal_induct M avoiding: a b rule: trm.strong_induct)
   177    (auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
   177    (auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
   178 
   178 
   179 lemma nrename_cfresh:
   179 lemma nrename_cfresh:
   180   fixes c::"coname"
   180   fixes c::"coname"
   181   shows "c\<sharp>M\<Longrightarrow>c\<sharp>M[x\<turnstile>n>y]"
   181   shows "c\<sharp>M\<Longrightarrow>c\<sharp>M[x\<turnstile>n>y]"
   182 by (nominal_induct M avoiding: x y rule: trm.induct)
   182 by (nominal_induct M avoiding: x y rule: trm.strong_induct)
   183    (auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
   183    (auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
   184 
   184 
   185 lemma nrename_nfresh':
   185 lemma nrename_nfresh':
   186   fixes x::"name"
   186   fixes x::"name"
   187   shows "x\<sharp>(M,z,y)\<Longrightarrow>x\<sharp>M[z\<turnstile>n>y]"
   187   shows "x\<sharp>(M,z,y)\<Longrightarrow>x\<sharp>M[z\<turnstile>n>y]"
   188 by (nominal_induct M avoiding: x z y rule: trm.induct)
   188 by (nominal_induct M avoiding: x z y rule: trm.strong_induct)
   189    (auto simp add: fresh_prod fresh_atm abs_fresh abs_supp fin_supp)
   189    (auto simp add: fresh_prod fresh_atm abs_fresh abs_supp fin_supp)
   190 
   190 
   191 lemma crename_cfresh':
   191 lemma crename_cfresh':
   192   fixes a::"coname"
   192   fixes a::"coname"
   193   shows "a\<sharp>(M,b,c)\<Longrightarrow>a\<sharp>M[b\<turnstile>c>c]"
   193   shows "a\<sharp>(M,b,c)\<Longrightarrow>a\<sharp>M[b\<turnstile>c>c]"
   194 by (nominal_induct M avoiding: a b c rule: trm.induct)
   194 by (nominal_induct M avoiding: a b c rule: trm.strong_induct)
   195    (auto simp add: fresh_prod fresh_atm abs_fresh abs_supp fin_supp)
   195    (auto simp add: fresh_prod fresh_atm abs_fresh abs_supp fin_supp)
   196 
   196 
   197 lemma nrename_rename:
   197 lemma nrename_rename:
   198   assumes a: "x'\<sharp>M"
   198   assumes a: "x'\<sharp>M"
   199   shows "([(x',x)]\<bullet>M)[x'\<turnstile>n>y]= M[x\<turnstile>n>y]"
   199   shows "([(x',x)]\<bullet>M)[x'\<turnstile>n>y]= M[x\<turnstile>n>y]"
   200 using a
   200 using a
   201 apply(nominal_induct M avoiding: x x' y rule: trm.induct)
   201 apply(nominal_induct M avoiding: x x' y rule: trm.strong_induct)
   202 apply(auto simp add: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp)
   202 apply(auto simp add: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp)
   203 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)
   203 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)
   204 done
   204 done
   205 
   205 
   206 lemma crename_rename:
   206 lemma crename_rename:
   207   assumes a: "a'\<sharp>M"
   207   assumes a: "a'\<sharp>M"
   208   shows "([(a',a)]\<bullet>M)[a'\<turnstile>c>b]= M[a\<turnstile>c>b]"
   208   shows "([(a',a)]\<bullet>M)[a'\<turnstile>c>b]= M[a\<turnstile>c>b]"
   209 using a
   209 using a
   210 apply(nominal_induct M avoiding: a a' b rule: trm.induct)
   210 apply(nominal_induct M avoiding: a a' b rule: trm.strong_induct)
   211 apply(auto simp add: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp)
   211 apply(auto simp add: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp)
   212 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)
   212 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)
   213 done
   213 done
   214 
   214 
   215 lemmas rename_fresh = nrename_fresh crename_fresh 
   215 lemmas rename_fresh = nrename_fresh crename_fresh 
   269     by simp
   269     by simp
   270 qed
   270 qed
   271 
   271 
   272 lemma crename_id:
   272 lemma crename_id:
   273   shows "M[a\<turnstile>c>a] = M"
   273   shows "M[a\<turnstile>c>a] = M"
   274 by (nominal_induct M avoiding: a rule: trm.induct) (auto)
   274 by (nominal_induct M avoiding: a rule: trm.strong_induct) (auto)
   275 
   275 
   276 lemma nrename_id:
   276 lemma nrename_id:
   277   shows "M[x\<turnstile>n>x] = M"
   277   shows "M[x\<turnstile>n>x] = M"
   278 by (nominal_induct M avoiding: x rule: trm.induct) (auto)
   278 by (nominal_induct M avoiding: x rule: trm.strong_induct) (auto)
   279 
   279 
   280 lemma nrename_swap:
   280 lemma nrename_swap:
   281   shows "x\<sharp>M \<Longrightarrow> [(x,y)]\<bullet>M = M[y\<turnstile>n>x]"
   281   shows "x\<sharp>M \<Longrightarrow> [(x,y)]\<bullet>M = M[y\<turnstile>n>x]"
   282 by (nominal_induct M avoiding: x y rule: trm.induct) 
   282 by (nominal_induct M avoiding: x y rule: trm.strong_induct) 
   283    (simp_all add: calc_atm fresh_atm trm.inject alpha abs_fresh abs_supp fin_supp)
   283    (simp_all add: calc_atm fresh_atm trm.inject alpha abs_fresh abs_supp fin_supp)
   284 
   284 
   285 lemma crename_swap:
   285 lemma crename_swap:
   286   shows "a\<sharp>M \<Longrightarrow> [(a,b)]\<bullet>M = M[b\<turnstile>c>a]"
   286   shows "a\<sharp>M \<Longrightarrow> [(a,b)]\<bullet>M = M[b\<turnstile>c>a]"
   287 by (nominal_induct M avoiding: a b rule: trm.induct) 
   287 by (nominal_induct M avoiding: a b rule: trm.strong_induct) 
   288    (simp_all add: calc_atm fresh_atm trm.inject alpha abs_fresh abs_supp fin_supp)
   288    (simp_all add: calc_atm fresh_atm trm.inject alpha abs_fresh abs_supp fin_supp)
   289 
   289 
   290 lemma crename_ax:
   290 lemma crename_ax:
   291   assumes a: "M[a\<turnstile>c>b] = Ax x c" "c\<noteq>a" "c\<noteq>b"
   291   assumes a: "M[a\<turnstile>c>b] = Ax x c" "c\<noteq>a" "c\<noteq>b"
   292   shows "M = Ax x c"
   292   shows "M = Ax x c"
   293 using a
   293 using a
   294 apply(nominal_induct M avoiding: a b x c rule: trm.induct)
   294 apply(nominal_induct M avoiding: a b x c rule: trm.strong_induct)
   295 apply(simp_all add: trm.inject split: if_splits)
   295 apply(simp_all add: trm.inject split: if_splits)
   296 done
   296 done
   297 
   297 
   298 lemma nrename_ax:
   298 lemma nrename_ax:
   299   assumes a: "M[x\<turnstile>n>y] = Ax z a" "z\<noteq>x" "z\<noteq>y"
   299   assumes a: "M[x\<turnstile>n>y] = Ax z a" "z\<noteq>x" "z\<noteq>y"
   300   shows "M = Ax z a"
   300   shows "M = Ax z a"
   301 using a
   301 using a
   302 apply(nominal_induct M avoiding: x y z a rule: trm.induct)
   302 apply(nominal_induct M avoiding: x y z a rule: trm.strong_induct)
   303 apply(simp_all add: trm.inject split: if_splits)
   303 apply(simp_all add: trm.inject split: if_splits)
   304 done
   304 done
   305 
   305 
   306 text {* substitution functions *}
   306 text {* substitution functions *}
   307 
   307 
   915 lemma csubst_eqvt[eqvt]:
   915 lemma csubst_eqvt[eqvt]:
   916   fixes pi1::"name prm"
   916   fixes pi1::"name prm"
   917   and   pi2::"coname prm"
   917   and   pi2::"coname prm"
   918   shows "pi1\<bullet>(M{c:=(x).N}) = (pi1\<bullet>M){(pi1\<bullet>c):=(pi1\<bullet>x).(pi1\<bullet>N)}"
   918   shows "pi1\<bullet>(M{c:=(x).N}) = (pi1\<bullet>M){(pi1\<bullet>c):=(pi1\<bullet>x).(pi1\<bullet>N)}"
   919   and   "pi2\<bullet>(M{c:=(x).N}) = (pi2\<bullet>M){(pi2\<bullet>c):=(pi2\<bullet>x).(pi2\<bullet>N)}"
   919   and   "pi2\<bullet>(M{c:=(x).N}) = (pi2\<bullet>M){(pi2\<bullet>c):=(pi2\<bullet>x).(pi2\<bullet>N)}"
   920 apply(nominal_induct M avoiding: c x N rule: trm.induct)
   920 apply(nominal_induct M avoiding: c x N rule: trm.strong_induct)
   921 apply(auto simp add: eq_bij fresh_bij eqvts)
   921 apply(auto simp add: eq_bij fresh_bij eqvts)
   922 apply(perm_simp)+
   922 apply(perm_simp)+
   923 done
   923 done
   924 
   924 
   925 lemma nsubst_eqvt[eqvt]:
   925 lemma nsubst_eqvt[eqvt]:
   926   fixes pi1::"name prm"
   926   fixes pi1::"name prm"
   927   and   pi2::"coname prm"
   927   and   pi2::"coname prm"
   928   shows "pi1\<bullet>(M{x:=<c>.N}) = (pi1\<bullet>M){(pi1\<bullet>x):=<(pi1\<bullet>c)>.(pi1\<bullet>N)}"
   928   shows "pi1\<bullet>(M{x:=<c>.N}) = (pi1\<bullet>M){(pi1\<bullet>x):=<(pi1\<bullet>c)>.(pi1\<bullet>N)}"
   929   and   "pi2\<bullet>(M{x:=<c>.N}) = (pi2\<bullet>M){(pi2\<bullet>x):=<(pi2\<bullet>c)>.(pi2\<bullet>N)}"
   929   and   "pi2\<bullet>(M{x:=<c>.N}) = (pi2\<bullet>M){(pi2\<bullet>x):=<(pi2\<bullet>c)>.(pi2\<bullet>N)}"
   930 apply(nominal_induct M avoiding: c x N rule: trm.induct)
   930 apply(nominal_induct M avoiding: c x N rule: trm.strong_induct)
   931 apply(auto simp add: eq_bij fresh_bij eqvts)
   931 apply(auto simp add: eq_bij fresh_bij eqvts)
   932 apply(perm_simp)+
   932 apply(perm_simp)+
   933 done
   933 done
   934 
   934 
   935 lemma supp_subst1:
   935 lemma supp_subst1:
   936   shows "supp (M{y:=<c>.P}) \<subseteq> ((supp M) - {y}) \<union> (supp P)"
   936   shows "supp (M{y:=<c>.P}) \<subseteq> ((supp M) - {y}) \<union> (supp P)"
   937 apply(nominal_induct M avoiding: y P c rule: trm.induct)
   937 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct)
   938 apply(auto)
   938 apply(auto)
   939 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
   939 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
   940 apply(blast)+
   940 apply(blast)+
   941 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)")
   941 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)")
   942 apply(erule exE)
   942 apply(erule exE)
  1061 apply(blast)+
  1061 apply(blast)+
  1062 done
  1062 done
  1063 
  1063 
  1064 lemma supp_subst2:
  1064 lemma supp_subst2:
  1065   shows "supp (M{y:=<c>.P}) \<subseteq> supp (M) \<union> ((supp P) - {c})"
  1065   shows "supp (M{y:=<c>.P}) \<subseteq> supp (M) \<union> ((supp P) - {c})"
  1066 apply(nominal_induct M avoiding: y P c rule: trm.induct)
  1066 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct)
  1067 apply(auto)
  1067 apply(auto)
  1068 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1068 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1069 apply(blast)+
  1069 apply(blast)+
  1070 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)")
  1070 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)")
  1071 apply(erule exE)
  1071 apply(erule exE)
  1174 apply(blast)+
  1174 apply(blast)+
  1175 done
  1175 done
  1176 
  1176 
  1177 lemma supp_subst3:
  1177 lemma supp_subst3:
  1178   shows "supp (M{c:=(x).P}) \<subseteq> ((supp M) - {c}) \<union> (supp P)"
  1178   shows "supp (M{c:=(x).P}) \<subseteq> ((supp M) - {c}) \<union> (supp P)"
  1179 apply(nominal_induct M avoiding: x P c rule: trm.induct)
  1179 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct)
  1180 apply(auto)
  1180 apply(auto)
  1181 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1181 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1182 apply(blast)+
  1182 apply(blast)+
  1183 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)")
  1183 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)")
  1184 apply(erule exE)
  1184 apply(erule exE)
  1302 apply(blast)+
  1302 apply(blast)+
  1303 done
  1303 done
  1304 
  1304 
  1305 lemma supp_subst4:
  1305 lemma supp_subst4:
  1306   shows "supp (M{c:=(x).P}) \<subseteq> (supp M) \<union> ((supp P) - {x})"
  1306   shows "supp (M{c:=(x).P}) \<subseteq> (supp M) \<union> ((supp P) - {x})"
  1307 apply(nominal_induct M avoiding: x P c rule: trm.induct)
  1307 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct)
  1308 apply(auto)
  1308 apply(auto)
  1309 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1309 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1310 apply(blast)+
  1310 apply(blast)+
  1311 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)")
  1311 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)")
  1312 apply(erule exE)
  1312 apply(erule exE)
  1407 apply(blast)+
  1407 apply(blast)+
  1408 done
  1408 done
  1409 
  1409 
  1410 lemma supp_subst5:
  1410 lemma supp_subst5:
  1411   shows "(supp M - {y}) \<subseteq> supp (M{y:=<c>.P})"
  1411   shows "(supp M - {y}) \<subseteq> supp (M{y:=<c>.P})"
  1412 apply(nominal_induct M avoiding: y P c rule: trm.induct)
  1412 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct)
  1413 apply(auto)
  1413 apply(auto)
  1414 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1414 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1415 apply(blast)+
  1415 apply(blast)+
  1416 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)")
  1416 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)")
  1417 apply(erule exE)
  1417 apply(erule exE)
  1474 apply(blast)
  1474 apply(blast)
  1475 done
  1475 done
  1476 
  1476 
  1477 lemma supp_subst6:
  1477 lemma supp_subst6:
  1478   shows "(supp M) \<subseteq> ((supp (M{y:=<c>.P}))::coname set)"
  1478   shows "(supp M) \<subseteq> ((supp (M{y:=<c>.P}))::coname set)"
  1479 apply(nominal_induct M avoiding: y P c rule: trm.induct)
  1479 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct)
  1480 apply(auto)
  1480 apply(auto)
  1481 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1481 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1482 apply(blast)+
  1482 apply(blast)+
  1483 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)")
  1483 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)")
  1484 apply(erule exE)
  1484 apply(erule exE)
  1541 apply(blast)
  1541 apply(blast)
  1542 done
  1542 done
  1543 
  1543 
  1544 lemma supp_subst7:
  1544 lemma supp_subst7:
  1545   shows "(supp M - {c}) \<subseteq>  supp (M{c:=(x).P})"
  1545   shows "(supp M - {c}) \<subseteq>  supp (M{c:=(x).P})"
  1546 apply(nominal_induct M avoiding: x P c rule: trm.induct)
  1546 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct)
  1547 apply(auto)
  1547 apply(auto)
  1548 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1548 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1549 apply(blast)+
  1549 apply(blast)+
  1550 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)")
  1550 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)")
  1551 apply(erule exE)
  1551 apply(erule exE)
  1600 apply(blast)
  1600 apply(blast)
  1601 done
  1601 done
  1602 
  1602 
  1603 lemma supp_subst8:
  1603 lemma supp_subst8:
  1604   shows "(supp M) \<subseteq> ((supp (M{c:=(x).P}))::name set)"
  1604   shows "(supp M) \<subseteq> ((supp (M{c:=(x).P}))::name set)"
  1605 apply(nominal_induct M avoiding: x P c rule: trm.induct)
  1605 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct)
  1606 apply(auto)
  1606 apply(auto)
  1607 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1607 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1608 apply(blast)+
  1608 apply(blast)+
  1609 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)")
  1609 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)")
  1610 apply(erule exE)
  1610 apply(erule exE)
  1679 done
  1679 done
  1680 
  1680 
  1681 lemma forget:
  1681 lemma forget:
  1682   shows "x\<sharp>M \<Longrightarrow> M{x:=<c>.P} = M"
  1682   shows "x\<sharp>M \<Longrightarrow> M{x:=<c>.P} = M"
  1683   and   "c\<sharp>M \<Longrightarrow> M{c:=(x).P} = M"
  1683   and   "c\<sharp>M \<Longrightarrow> M{c:=(x).P} = M"
  1684 apply(nominal_induct M avoiding: x c P rule: trm.induct)
  1684 apply(nominal_induct M avoiding: x c P rule: trm.strong_induct)
  1685 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
  1685 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
  1686 done
  1686 done
  1687 
  1687 
  1688 lemma substc_rename1:
  1688 lemma substc_rename1:
  1689   assumes a: "c\<sharp>(M,a)"
  1689   assumes a: "c\<sharp>(M,a)"
  1690   shows "M{a:=(x).N} = ([(c,a)]\<bullet>M){c:=(x).N}"
  1690   shows "M{a:=(x).N} = ([(c,a)]\<bullet>M){c:=(x).N}"
  1691 using a
  1691 using a
  1692 proof(nominal_induct M avoiding: c a x N rule: trm.induct)
  1692 proof(nominal_induct M avoiding: c a x N rule: trm.strong_induct)
  1693   case (Ax z d)
  1693   case (Ax z d)
  1694   then show ?case by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha)
  1694   then show ?case by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha)
  1695 next
  1695 next
  1696   case NotL
  1696   case NotL
  1697   then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1697   then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1782 
  1782 
  1783 lemma substc_rename2:
  1783 lemma substc_rename2:
  1784   assumes a: "y\<sharp>(N,x)"
  1784   assumes a: "y\<sharp>(N,x)"
  1785   shows "M{a:=(x).N} = M{a:=(y).([(y,x)]\<bullet>N)}"
  1785   shows "M{a:=(x).N} = M{a:=(y).([(y,x)]\<bullet>N)}"
  1786 using a
  1786 using a
  1787 proof(nominal_induct M avoiding: a x y N rule: trm.induct)
  1787 proof(nominal_induct M avoiding: a x y N rule: trm.strong_induct)
  1788   case (Ax z d)
  1788   case (Ax z d)
  1789   then show ?case 
  1789   then show ?case 
  1790     by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left)
  1790     by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left)
  1791 next
  1791 next
  1792   case NotL
  1792   case NotL
  1870 
  1870 
  1871 lemma substn_rename3:
  1871 lemma substn_rename3:
  1872   assumes a: "y\<sharp>(M,x)"
  1872   assumes a: "y\<sharp>(M,x)"
  1873   shows "M{x:=<a>.N} = ([(y,x)]\<bullet>M){y:=<a>.N}"
  1873   shows "M{x:=<a>.N} = ([(y,x)]\<bullet>M){y:=<a>.N}"
  1874 using a
  1874 using a
  1875 proof(nominal_induct M avoiding: a x y N rule: trm.induct)
  1875 proof(nominal_induct M avoiding: a x y N rule: trm.strong_induct)
  1876   case (Ax z d)
  1876   case (Ax z d)
  1877   then show ?case by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha)
  1877   then show ?case by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha)
  1878 next
  1878 next
  1879   case NotR
  1879   case NotR
  1880   then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1880   then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1960 
  1960 
  1961 lemma substn_rename4:
  1961 lemma substn_rename4:
  1962   assumes a: "c\<sharp>(N,a)"
  1962   assumes a: "c\<sharp>(N,a)"
  1963   shows "M{x:=<a>.N} = M{x:=<c>.([(c,a)]\<bullet>N)}"
  1963   shows "M{x:=<a>.N} = M{x:=<c>.([(c,a)]\<bullet>N)}"
  1964 using a
  1964 using a
  1965 proof(nominal_induct M avoiding: x c a N rule: trm.induct)
  1965 proof(nominal_induct M avoiding: x c a N rule: trm.strong_induct)
  1966   case (Ax z d)
  1966   case (Ax z d)
  1967   then show ?case 
  1967   then show ?case 
  1968     by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left)
  1968     by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left)
  1969 next
  1969 next
  1970   case NotR
  1970   case NotR
  2423 
  2423 
  2424 lemma substn_crename_comm:
  2424 lemma substn_crename_comm:
  2425   assumes a: "c\<noteq>a" "c\<noteq>b"
  2425   assumes a: "c\<noteq>a" "c\<noteq>b"
  2426   shows "M{x:=<c>.P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{x:=<c>.(P[a\<turnstile>c>b])}"
  2426   shows "M{x:=<c>.P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{x:=<c>.(P[a\<turnstile>c>b])}"
  2427 using a
  2427 using a
  2428 apply(nominal_induct M avoiding: x c P a b rule: trm.induct)
  2428 apply(nominal_induct M avoiding: x c P a b rule: trm.strong_induct)
  2429 apply(auto simp add: subst_fresh rename_fresh trm.inject)
  2429 apply(auto simp add: subst_fresh rename_fresh trm.inject)
  2430 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,x,c)")
  2430 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,x,c)")
  2431 apply(erule exE)
  2431 apply(erule exE)
  2432 apply(subgoal_tac "Cut <c>.P (x).Ax x a = Cut <c>.P (x').Ax x' a")
  2432 apply(subgoal_tac "Cut <c>.P (x).Ax x a = Cut <c>.P (x').Ax x' a")
  2433 apply(simp)
  2433 apply(simp)
  2515 
  2515 
  2516 lemma substc_crename_comm:
  2516 lemma substc_crename_comm:
  2517   assumes a: "c\<noteq>a" "c\<noteq>b"
  2517   assumes a: "c\<noteq>a" "c\<noteq>b"
  2518   shows "M{c:=(x).P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{c:=(x).(P[a\<turnstile>c>b])}"
  2518   shows "M{c:=(x).P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{c:=(x).(P[a\<turnstile>c>b])}"
  2519 using a
  2519 using a
  2520 apply(nominal_induct M avoiding: x c P a b rule: trm.induct)
  2520 apply(nominal_induct M avoiding: x c P a b rule: trm.strong_induct)
  2521 apply(auto simp add: subst_fresh rename_fresh trm.inject)
  2521 apply(auto simp add: subst_fresh rename_fresh trm.inject)
  2522 apply(rule trans)
  2522 apply(rule trans)
  2523 apply(rule better_crename_Cut)
  2523 apply(rule better_crename_Cut)
  2524 apply(simp add: fresh_atm fresh_prod)
  2524 apply(simp add: fresh_atm fresh_prod)
  2525 apply(simp add: rename_fresh fresh_atm)
  2525 apply(simp add: rename_fresh fresh_atm)
  2589 
  2589 
  2590 lemma substn_nrename_comm:
  2590 lemma substn_nrename_comm:
  2591   assumes a: "x\<noteq>y" "x\<noteq>z"
  2591   assumes a: "x\<noteq>y" "x\<noteq>z"
  2592   shows "M{x:=<c>.P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{x:=<c>.(P[y\<turnstile>n>z])}"
  2592   shows "M{x:=<c>.P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{x:=<c>.(P[y\<turnstile>n>z])}"
  2593 using a
  2593 using a
  2594 apply(nominal_induct M avoiding: x c P y z rule: trm.induct)
  2594 apply(nominal_induct M avoiding: x c P y z rule: trm.strong_induct)
  2595 apply(auto simp add: subst_fresh rename_fresh trm.inject)
  2595 apply(auto simp add: subst_fresh rename_fresh trm.inject)
  2596 apply(rule trans)
  2596 apply(rule trans)
  2597 apply(rule better_nrename_Cut)
  2597 apply(rule better_nrename_Cut)
  2598 apply(simp add: fresh_prod fresh_atm)
  2598 apply(simp add: fresh_prod fresh_atm)
  2599 apply(simp add: trm.inject)
  2599 apply(simp add: trm.inject)
  2661 
  2661 
  2662 lemma substc_nrename_comm:
  2662 lemma substc_nrename_comm:
  2663   assumes a: "x\<noteq>y" "x\<noteq>z"
  2663   assumes a: "x\<noteq>y" "x\<noteq>z"
  2664   shows "M{c:=(x).P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{c:=(x).(P[y\<turnstile>n>z])}"
  2664   shows "M{c:=(x).P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{c:=(x).(P[y\<turnstile>n>z])}"
  2665 using a
  2665 using a
  2666 apply(nominal_induct M avoiding: x c P y z rule: trm.induct)
  2666 apply(nominal_induct M avoiding: x c P y z rule: trm.strong_induct)
  2667 apply(auto simp add: subst_fresh rename_fresh trm.inject)
  2667 apply(auto simp add: subst_fresh rename_fresh trm.inject)
  2668 apply(rule trans)
  2668 apply(rule trans)
  2669 apply(rule better_nrename_Cut)
  2669 apply(rule better_nrename_Cut)
  2670 apply(simp add: fresh_atm fresh_prod)
  2670 apply(simp add: fresh_atm fresh_prod)
  2671 apply(simp add: rename_fresh fresh_atm)
  2671 apply(simp add: rename_fresh fresh_atm)
  3029 
  3029 
  3030 lemma not_fin_subst1:
  3030 lemma not_fin_subst1:
  3031   assumes a: "\<not>(fin M x)" 
  3031   assumes a: "\<not>(fin M x)" 
  3032   shows "\<not>(fin (M{c:=(y).P}) x)"
  3032   shows "\<not>(fin (M{c:=(y).P}) x)"
  3033 using a
  3033 using a
  3034 apply(nominal_induct M avoiding: x c y P rule: trm.induct)
  3034 apply(nominal_induct M avoiding: x c y P rule: trm.strong_induct)
  3035 apply(auto)
  3035 apply(auto)
  3036 apply(drule fin_elims, simp)
  3036 apply(drule fin_elims, simp)
  3037 apply(drule fin_elims, simp)
  3037 apply(drule fin_elims, simp)
  3038 apply(drule fin_elims, simp)
  3038 apply(drule fin_elims, simp)
  3039 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(trm{coname:=(y).P},P,x)")
  3039 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(trm{coname:=(y).P},P,x)")
  3114 
  3114 
  3115 lemma not_fin_subst2:
  3115 lemma not_fin_subst2:
  3116   assumes a: "\<not>(fin M x)" 
  3116   assumes a: "\<not>(fin M x)" 
  3117   shows "\<not>(fin (M{y:=<c>.P}) x)"
  3117   shows "\<not>(fin (M{y:=<c>.P}) x)"
  3118 using a
  3118 using a
  3119 apply(nominal_induct M avoiding: x c y P rule: trm.induct)
  3119 apply(nominal_induct M avoiding: x c y P rule: trm.strong_induct)
  3120 apply(auto)
  3120 apply(auto)
  3121 apply(erule fin.cases, simp_all add: trm.inject)
  3121 apply(erule fin.cases, simp_all add: trm.inject)
  3122 apply(erule fin.cases, simp_all add: trm.inject)
  3122 apply(erule fin.cases, simp_all add: trm.inject)
  3123 apply(erule fin.cases, simp_all add: trm.inject)
  3123 apply(erule fin.cases, simp_all add: trm.inject)
  3124 apply(erule fin.cases, simp_all add: trm.inject)
  3124 apply(erule fin.cases, simp_all add: trm.inject)
  3202 
  3202 
  3203 lemma fin_subst1:
  3203 lemma fin_subst1:
  3204   assumes a: "fin M x" "x\<noteq>y" "x\<sharp>P"
  3204   assumes a: "fin M x" "x\<noteq>y" "x\<sharp>P"
  3205   shows "fin (M{y:=<c>.P}) x"
  3205   shows "fin (M{y:=<c>.P}) x"
  3206 using a
  3206 using a
  3207 apply(nominal_induct M avoiding: x y c P rule: trm.induct)
  3207 apply(nominal_induct M avoiding: x y c P rule: trm.strong_induct)
  3208 apply(auto dest!: fin_elims simp add: subst_fresh abs_fresh)
  3208 apply(auto dest!: fin_elims simp add: subst_fresh abs_fresh)
  3209 apply(rule fin.intros, simp add: subst_fresh abs_fresh)
  3209 apply(rule fin.intros, simp add: subst_fresh abs_fresh)
  3210 apply(rule fin.intros, simp add: subst_fresh abs_fresh)
  3210 apply(rule fin.intros, simp add: subst_fresh abs_fresh)
  3211 apply(rule fin.intros, simp add: subst_fresh abs_fresh)
  3211 apply(rule fin.intros, simp add: subst_fresh abs_fresh)
  3212 apply(rule fin.intros, simp add: subst_fresh abs_fresh)
  3212 apply(rule fin.intros, simp add: subst_fresh abs_fresh)
  3219 
  3219 
  3220 lemma fin_subst2:
  3220 lemma fin_subst2:
  3221   assumes a: "fin M y" "x\<noteq>y" "y\<sharp>P" "M\<noteq>Ax y c" 
  3221   assumes a: "fin M y" "x\<noteq>y" "y\<sharp>P" "M\<noteq>Ax y c" 
  3222   shows "fin (M{c:=(x).P}) y"
  3222   shows "fin (M{c:=(x).P}) y"
  3223 using a
  3223 using a
  3224 apply(nominal_induct M avoiding: x y c P rule: trm.induct)
  3224 apply(nominal_induct M avoiding: x y c P rule: trm.strong_induct)
  3225 apply(drule fin_elims)
  3225 apply(drule fin_elims)
  3226 apply(simp add: trm.inject)
  3226 apply(simp add: trm.inject)
  3227 apply(rule fin.intros)
  3227 apply(rule fin.intros)
  3228 apply(drule fin_elims, simp)
  3228 apply(drule fin_elims, simp)
  3229 apply(drule fin_elims, simp)
  3229 apply(drule fin_elims, simp)
  3266 
  3266 
  3267 lemma fin_substn_nrename:
  3267 lemma fin_substn_nrename:
  3268   assumes a: "fin M x" "x\<noteq>y" "x\<sharp>P"
  3268   assumes a: "fin M x" "x\<noteq>y" "x\<sharp>P"
  3269   shows "M[x\<turnstile>n>y]{y:=<c>.P} = Cut <c>.P (x).(M{y:=<c>.P})"
  3269   shows "M[x\<turnstile>n>y]{y:=<c>.P} = Cut <c>.P (x).(M{y:=<c>.P})"
  3270 using a
  3270 using a
  3271 apply(nominal_induct M avoiding: x y c P rule: trm.induct)
  3271 apply(nominal_induct M avoiding: x y c P rule: trm.strong_induct)
  3272 apply(drule fin_Ax_elim)
  3272 apply(drule fin_Ax_elim)
  3273 apply(simp)
  3273 apply(simp)
  3274 apply(simp add: trm.inject)
  3274 apply(simp add: trm.inject)
  3275 apply(simp add: alpha calc_atm fresh_atm)
  3275 apply(simp add: alpha calc_atm fresh_atm)
  3276 apply(simp)
  3276 apply(simp)
  3452 
  3452 
  3453 lemma not_fic_subst1:
  3453 lemma not_fic_subst1:
  3454   assumes a: "\<not>(fic M a)" 
  3454   assumes a: "\<not>(fic M a)" 
  3455   shows "\<not>(fic (M{y:=<c>.P}) a)"
  3455   shows "\<not>(fic (M{y:=<c>.P}) a)"
  3456 using a
  3456 using a
  3457 apply(nominal_induct M avoiding: a c y P rule: trm.induct)
  3457 apply(nominal_induct M avoiding: a c y P rule: trm.strong_induct)
  3458 apply(auto)
  3458 apply(auto)
  3459 apply(drule fic_elims, simp)
  3459 apply(drule fic_elims, simp)
  3460 apply(drule fic_elims, simp)
  3460 apply(drule fic_elims, simp)
  3461 apply(drule fic_elims, simp)
  3461 apply(drule fic_elims, simp)
  3462 apply(drule fic_elims)
  3462 apply(drule fic_elims)
  3528 
  3528 
  3529 lemma not_fic_subst2:
  3529 lemma not_fic_subst2:
  3530   assumes a: "\<not>(fic M a)" 
  3530   assumes a: "\<not>(fic M a)" 
  3531   shows "\<not>(fic (M{c:=(y).P}) a)"
  3531   shows "\<not>(fic (M{c:=(y).P}) a)"
  3532 using a
  3532 using a
  3533 apply(nominal_induct M avoiding: a c y P rule: trm.induct)
  3533 apply(nominal_induct M avoiding: a c y P rule: trm.strong_induct)
  3534 apply(auto)
  3534 apply(auto)
  3535 apply(drule fic_elims, simp)
  3535 apply(drule fic_elims, simp)
  3536 apply(drule fic_elims, simp)
  3536 apply(drule fic_elims, simp)
  3537 apply(drule fic_elims, simp)
  3537 apply(drule fic_elims, simp)
  3538 apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(trm{coname:=(y).P},P,a)")
  3538 apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(trm{coname:=(y).P},P,a)")
  3610 
  3610 
  3611 lemma fic_subst1:
  3611 lemma fic_subst1:
  3612   assumes a: "fic M a" "a\<noteq>b" "a\<sharp>P"
  3612   assumes a: "fic M a" "a\<noteq>b" "a\<sharp>P"
  3613   shows "fic (M{b:=(x).P}) a"
  3613   shows "fic (M{b:=(x).P}) a"
  3614 using a
  3614 using a
  3615 apply(nominal_induct M avoiding: x b a P rule: trm.induct)
  3615 apply(nominal_induct M avoiding: x b a P rule: trm.strong_induct)
  3616 apply(drule fic_elims)
  3616 apply(drule fic_elims)
  3617 apply(simp add: fic.intros)
  3617 apply(simp add: fic.intros)
  3618 apply(drule fic_elims, simp)
  3618 apply(drule fic_elims, simp)
  3619 apply(drule fic_elims, simp)
  3619 apply(drule fic_elims, simp)
  3620 apply(rule fic.intros)
  3620 apply(rule fic.intros)
  3653 
  3653 
  3654 lemma fic_subst2:
  3654 lemma fic_subst2:
  3655   assumes a: "fic M a" "c\<noteq>a" "a\<sharp>P" "M\<noteq>Ax x a" 
  3655   assumes a: "fic M a" "c\<noteq>a" "a\<sharp>P" "M\<noteq>Ax x a" 
  3656   shows "fic (M{x:=<c>.P}) a"
  3656   shows "fic (M{x:=<c>.P}) a"
  3657 using a
  3657 using a
  3658 apply(nominal_induct M avoiding: x a c P rule: trm.induct)
  3658 apply(nominal_induct M avoiding: x a c P rule: trm.strong_induct)
  3659 apply(drule fic_elims)
  3659 apply(drule fic_elims)
  3660 apply(simp add: trm.inject)
  3660 apply(simp add: trm.inject)
  3661 apply(rule fic.intros)
  3661 apply(rule fic.intros)
  3662 apply(drule fic_elims, simp)
  3662 apply(drule fic_elims, simp)
  3663 apply(drule fic_elims, simp)
  3663 apply(drule fic_elims, simp)
  3697 
  3697 
  3698 lemma fic_substc_crename:
  3698 lemma fic_substc_crename:
  3699   assumes a: "fic M a" "a\<noteq>b" "a\<sharp>P"
  3699   assumes a: "fic M a" "a\<noteq>b" "a\<sharp>P"
  3700   shows "M[a\<turnstile>c>b]{b:=(y).P} = Cut <a>.(M{b:=(y).P}) (y).P"
  3700   shows "M[a\<turnstile>c>b]{b:=(y).P} = Cut <a>.(M{b:=(y).P}) (y).P"
  3701 using a
  3701 using a
  3702 apply(nominal_induct M avoiding: a b  y P rule: trm.induct)
  3702 apply(nominal_induct M avoiding: a b  y P rule: trm.strong_induct)
  3703 apply(drule fic_Ax_elim)
  3703 apply(drule fic_Ax_elim)
  3704 apply(simp)
  3704 apply(simp)
  3705 apply(simp add: trm.inject)
  3705 apply(simp add: trm.inject)
  3706 apply(simp add: alpha calc_atm fresh_atm trm.inject)
  3706 apply(simp add: alpha calc_atm fresh_atm trm.inject)
  3707 apply(simp)
  3707 apply(simp)
  5453 
  5453 
  5454 text {* Substitution *}
  5454 text {* Substitution *}
  5455 
  5455 
  5456 lemma subst_not_fin1:
  5456 lemma subst_not_fin1:
  5457   shows "\<not>fin(M{x:=<c>.P}) x"
  5457   shows "\<not>fin(M{x:=<c>.P}) x"
  5458 apply(nominal_induct M avoiding: x c P rule: trm.induct)
  5458 apply(nominal_induct M avoiding: x c P rule: trm.strong_induct)
  5459 apply(auto)
  5459 apply(auto)
  5460 apply(drule fin_elims, simp)
  5460 apply(drule fin_elims, simp)
  5461 apply(drule fin_elims, simp)
  5461 apply(drule fin_elims, simp)
  5462 apply(erule fin.cases, simp_all add: trm.inject)
  5462 apply(erule fin.cases, simp_all add: trm.inject)
  5463 apply(erule fin.cases, simp_all add: trm.inject)
  5463 apply(erule fin.cases, simp_all add: trm.inject)
  5510 
  5510 
  5511 lemma subst_not_fin2:
  5511 lemma subst_not_fin2:
  5512   assumes a: "\<not>fin M y"
  5512   assumes a: "\<not>fin M y"
  5513   shows "\<not>fin(M{c:=(x).P}) y" 
  5513   shows "\<not>fin(M{c:=(x).P}) y" 
  5514 using a
  5514 using a
  5515 apply(nominal_induct M avoiding: x c P y rule: trm.induct)
  5515 apply(nominal_induct M avoiding: x c P y rule: trm.strong_induct)
  5516 apply(auto)
  5516 apply(auto)
  5517 apply(drule fin_elims, simp)
  5517 apply(drule fin_elims, simp)
  5518 apply(drule fin_elims, simp)
  5518 apply(drule fin_elims, simp)
  5519 apply(drule fin_elims, simp)
  5519 apply(drule fin_elims, simp)
  5520 apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(trm{coname:=(x).P},P)")
  5520 apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(trm{coname:=(x).P},P)")
  5585 apply(simp add: fin.intros abs_fresh)
  5585 apply(simp add: fin.intros abs_fresh)
  5586 done
  5586 done
  5587 
  5587 
  5588 lemma subst_not_fic1:
  5588 lemma subst_not_fic1:
  5589   shows "\<not>fic (M{a:=(x).P}) a"
  5589   shows "\<not>fic (M{a:=(x).P}) a"
  5590 apply(nominal_induct M avoiding: a x P rule: trm.induct)
  5590 apply(nominal_induct M avoiding: a x P rule: trm.strong_induct)
  5591 apply(auto)
  5591 apply(auto)
  5592 apply(erule fic.cases, simp_all add: trm.inject)
  5592 apply(erule fic.cases, simp_all add: trm.inject)
  5593 apply(erule fic.cases, simp_all add: trm.inject)
  5593 apply(erule fic.cases, simp_all add: trm.inject)
  5594 apply(erule fic.cases, simp_all add: trm.inject)
  5594 apply(erule fic.cases, simp_all add: trm.inject)
  5595 apply(erule fic.cases, simp_all add: trm.inject)
  5595 apply(erule fic.cases, simp_all add: trm.inject)
  5642 
  5642 
  5643 lemma subst_not_fic2:
  5643 lemma subst_not_fic2:
  5644   assumes a: "\<not>fic M a"
  5644   assumes a: "\<not>fic M a"
  5645   shows "\<not>fic(M{x:=<b>.P}) a" 
  5645   shows "\<not>fic(M{x:=<b>.P}) a" 
  5646 using a
  5646 using a
  5647 apply(nominal_induct M avoiding: x a P b rule: trm.induct)
  5647 apply(nominal_induct M avoiding: x a P b rule: trm.strong_induct)
  5648 apply(auto)
  5648 apply(auto)
  5649 apply(drule fic_elims, simp)
  5649 apply(drule fic_elims, simp)
  5650 apply(drule fic_elims, simp)
  5650 apply(drule fic_elims, simp)
  5651 apply(drule fic_elims, simp)
  5651 apply(drule fic_elims, simp)
  5652 apply(drule fic_elims, simp)
  5652 apply(drule fic_elims, simp)
  5856 
  5856 
  5857 text {* substitution properties *}
  5857 text {* substitution properties *}
  5858 
  5858 
  5859 lemma subst_with_ax1:
  5859 lemma subst_with_ax1:
  5860   shows "M{x:=<a>.Ax y a} \<longrightarrow>\<^isub>a* M[x\<turnstile>n>y]"
  5860   shows "M{x:=<a>.Ax y a} \<longrightarrow>\<^isub>a* M[x\<turnstile>n>y]"
  5861 proof(nominal_induct M avoiding: x a y rule: trm.induct)
  5861 proof(nominal_induct M avoiding: x a y rule: trm.strong_induct)
  5862   case (Ax z b x a y)
  5862   case (Ax z b x a y)
  5863   show "(Ax z b){x:=<a>.Ax y a} \<longrightarrow>\<^isub>a* (Ax z b)[x\<turnstile>n>y]"
  5863   show "(Ax z b){x:=<a>.Ax y a} \<longrightarrow>\<^isub>a* (Ax z b)[x\<turnstile>n>y]"
  5864   proof (cases "z=x")
  5864   proof (cases "z=x")
  5865     case True
  5865     case True
  5866     assume eq: "z=x"
  5866     assume eq: "z=x"
  6113   qed
  6113   qed
  6114 qed
  6114 qed
  6115 
  6115 
  6116 lemma subst_with_ax2:
  6116 lemma subst_with_ax2:
  6117   shows "M{b:=(x).Ax x a} \<longrightarrow>\<^isub>a* M[b\<turnstile>c>a]"
  6117   shows "M{b:=(x).Ax x a} \<longrightarrow>\<^isub>a* M[b\<turnstile>c>a]"
  6118 proof(nominal_induct M avoiding: b a x rule: trm.induct)
  6118 proof(nominal_induct M avoiding: b a x rule: trm.strong_induct)
  6119   case (Ax z c b a x)
  6119   case (Ax z c b a x)
  6120   show "(Ax z c){b:=(x).Ax x a} \<longrightarrow>\<^isub>a* (Ax z c)[b\<turnstile>c>a]"
  6120   show "(Ax z c){b:=(x).Ax x a} \<longrightarrow>\<^isub>a* (Ax z c)[b\<turnstile>c>a]"
  6121   proof (cases "c=b")
  6121   proof (cases "c=b")
  6122     case True
  6122     case True
  6123     assume eq: "c=b"
  6123     assume eq: "c=b"
  6369 
  6369 
  6370 text {* substitution lemmas *}
  6370 text {* substitution lemmas *}
  6371 
  6371 
  6372 lemma not_Ax1:
  6372 lemma not_Ax1:
  6373   shows "\<not>(b\<sharp>M) \<Longrightarrow> M{b:=(y).Q} \<noteq> Ax x a"
  6373   shows "\<not>(b\<sharp>M) \<Longrightarrow> M{b:=(y).Q} \<noteq> Ax x a"
  6374 apply(nominal_induct M avoiding: b y Q x a rule: trm.induct)
  6374 apply(nominal_induct M avoiding: b y Q x a rule: trm.strong_induct)
  6375 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
  6375 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
  6376 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(y).Q},Q)")
  6376 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(y).Q},Q)")
  6377 apply(erule exE)
  6377 apply(erule exE)
  6378 apply(simp add: fresh_prod)
  6378 apply(simp add: fresh_prod)
  6379 apply(erule conjE)+
  6379 apply(erule conjE)+
  6441 apply(rule exists_fresh'(2)[OF fs_coname1])
  6441 apply(rule exists_fresh'(2)[OF fs_coname1])
  6442 done
  6442 done
  6443 
  6443 
  6444 lemma not_Ax2:
  6444 lemma not_Ax2:
  6445   shows "\<not>(x\<sharp>M) \<Longrightarrow> M{x:=<b>.Q} \<noteq> Ax y a"
  6445   shows "\<not>(x\<sharp>M) \<Longrightarrow> M{x:=<b>.Q} \<noteq> Ax y a"
  6446 apply(nominal_induct M avoiding: b y Q x a rule: trm.induct)
  6446 apply(nominal_induct M avoiding: b y Q x a rule: trm.strong_induct)
  6447 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
  6447 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
  6448 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{x:=<b>.Q},Q)")
  6448 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{x:=<b>.Q},Q)")
  6449 apply(erule exE)
  6449 apply(erule exE)
  6450 apply(simp add: fresh_prod)
  6450 apply(simp add: fresh_prod)
  6451 apply(erule conjE)+
  6451 apply(erule conjE)+
  6521 
  6521 
  6522 lemma interesting_subst1:
  6522 lemma interesting_subst1:
  6523   assumes a: "x\<noteq>y" "x\<sharp>P" "y\<sharp>P" 
  6523   assumes a: "x\<noteq>y" "x\<sharp>P" "y\<sharp>P" 
  6524   shows "N{y:=<c>.P}{x:=<c>.P} = N{x:=<c>.Ax y c}{y:=<c>.P}"
  6524   shows "N{y:=<c>.P}{x:=<c>.P} = N{x:=<c>.Ax y c}{y:=<c>.P}"
  6525 using a
  6525 using a
  6526 proof(nominal_induct N avoiding: x y c P rule: trm.induct)
  6526 proof(nominal_induct N avoiding: x y c P rule: trm.strong_induct)
  6527   case Ax
  6527   case Ax
  6528   then show ?case
  6528   then show ?case
  6529     by (auto simp add: abs_fresh fresh_atm forget trm.inject)
  6529     by (auto simp add: abs_fresh fresh_atm forget trm.inject)
  6530 next 
  6530 next 
  6531   case (Cut d M u M' x' y' c P)
  6531   case (Cut d M u M' x' y' c P)
  6829 
  6829 
  6830 lemma interesting_subst2:
  6830 lemma interesting_subst2:
  6831   assumes a: "a\<noteq>b" "a\<sharp>P" "b\<sharp>P" 
  6831   assumes a: "a\<noteq>b" "a\<sharp>P" "b\<sharp>P" 
  6832   shows "N{a:=(y).P}{b:=(y).P} = N{b:=(y).Ax y a}{a:=(y).P}"
  6832   shows "N{a:=(y).P}{b:=(y).P} = N{b:=(y).Ax y a}{a:=(y).P}"
  6833 using a
  6833 using a
  6834 proof(nominal_induct N avoiding: a b y P rule: trm.induct)
  6834 proof(nominal_induct N avoiding: a b y P rule: trm.strong_induct)
  6835   case Ax
  6835   case Ax
  6836   then show ?case
  6836   then show ?case
  6837     by (auto simp add: abs_fresh fresh_atm forget trm.inject)
  6837     by (auto simp add: abs_fresh fresh_atm forget trm.inject)
  6838 next 
  6838 next 
  6839   case (Cut d M u M' x' y' c P)
  6839   case (Cut d M u M' x' y' c P)
  7116 
  7116 
  7117 lemma subst_subst1:
  7117 lemma subst_subst1:
  7118   assumes a: "a\<sharp>(Q,b)" "x\<sharp>(y,P,Q)" "b\<sharp>Q" "y\<sharp>P" 
  7118   assumes a: "a\<sharp>(Q,b)" "x\<sharp>(y,P,Q)" "b\<sharp>Q" "y\<sharp>P" 
  7119   shows "M{x:=<a>.P}{b:=(y).Q} = M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}"
  7119   shows "M{x:=<a>.P}{b:=(y).Q} = M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}"
  7120 using a
  7120 using a
  7121 proof(nominal_induct M avoiding: x a P b y Q rule: trm.induct)
  7121 proof(nominal_induct M avoiding: x a P b y Q rule: trm.strong_induct)
  7122   case (Ax z c)
  7122   case (Ax z c)
  7123   have fs: "a\<sharp>(Q,b)" "x\<sharp>(y,P,Q)" "b\<sharp>Q" "y\<sharp>P" by fact+
  7123   have fs: "a\<sharp>(Q,b)" "x\<sharp>(y,P,Q)" "b\<sharp>Q" "y\<sharp>P" by fact+
  7124   { assume asm: "z=x \<and> c=b"
  7124   { assume asm: "z=x \<and> c=b"
  7125     have "(Ax x b){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (x).Ax x b){b:=(y).Q}" using fs by simp
  7125     have "(Ax x b){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (x).Ax x b){b:=(y).Q}" using fs by simp
  7126     also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).Q"
  7126     also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).Q"
  7405 
  7405 
  7406 lemma subst_subst2:
  7406 lemma subst_subst2:
  7407   assumes a: "a\<sharp>(b,P,N)" "x\<sharp>(y,P,M)" "b\<sharp>(M,N)" "y\<sharp>P"
  7407   assumes a: "a\<sharp>(b,P,N)" "x\<sharp>(y,P,M)" "b\<sharp>(M,N)" "y\<sharp>P"
  7408   shows "M{a:=(x).N}{y:=<b>.P} = M{y:=<b>.P}{a:=(x).N{y:=<b>.P}}"
  7408   shows "M{a:=(x).N}{y:=<b>.P} = M{y:=<b>.P}{a:=(x).N{y:=<b>.P}}"
  7409 using a
  7409 using a
  7410 proof(nominal_induct M avoiding: a x N y b P rule: trm.induct)
  7410 proof(nominal_induct M avoiding: a x N y b P rule: trm.strong_induct)
  7411   case (Ax z c)
  7411   case (Ax z c)
  7412   then show ?case
  7412   then show ?case
  7413     by (auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7413     by (auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7414 next
  7414 next
  7415   case (Cut d M' u M'')
  7415   case (Cut d M' u M'')
  7689 
  7689 
  7690 lemma subst_subst3:
  7690 lemma subst_subst3:
  7691   assumes a: "a\<sharp>(P,N,c)" "c\<sharp>(M,N)" "x\<sharp>(y,P,M)" "y\<sharp>(P,x)" "M\<noteq>Ax y a"
  7691   assumes a: "a\<sharp>(P,N,c)" "c\<sharp>(M,N)" "x\<sharp>(y,P,M)" "y\<sharp>(P,x)" "M\<noteq>Ax y a"
  7692   shows "N{x:=<a>.M}{y:=<c>.P} = N{y:=<c>.P}{x:=<a>.(M{y:=<c>.P})}"
  7692   shows "N{x:=<a>.M}{y:=<c>.P} = N{y:=<c>.P}{x:=<a>.(M{y:=<c>.P})}"
  7693 using a
  7693 using a
  7694 proof(nominal_induct N avoiding: x y a c M P rule: trm.induct)
  7694 proof(nominal_induct N avoiding: x y a c M P rule: trm.strong_induct)
  7695   case (Ax z c)
  7695   case (Ax z c)
  7696   then show ?case
  7696   then show ?case
  7697     by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7697     by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7698 next
  7698 next
  7699   case (Cut d M' u M'')
  7699   case (Cut d M' u M'')
  7958 
  7958 
  7959 lemma subst_subst4:
  7959 lemma subst_subst4:
  7960   assumes a: "x\<sharp>(P,N,y)" "y\<sharp>(M,N)" "a\<sharp>(c,P,M)" "c\<sharp>(P,a)" "M\<noteq>Ax x c"
  7960   assumes a: "x\<sharp>(P,N,y)" "y\<sharp>(M,N)" "a\<sharp>(c,P,M)" "c\<sharp>(P,a)" "M\<noteq>Ax x c"
  7961   shows "N{a:=(x).M}{c:=(y).P} = N{c:=(y).P}{a:=(x).(M{c:=(y).P})}"
  7961   shows "N{a:=(x).M}{c:=(y).P} = N{c:=(y).P}{a:=(x).(M{c:=(y).P})}"
  7962 using a
  7962 using a
  7963 proof(nominal_induct N avoiding: x y a c M P rule: trm.induct)
  7963 proof(nominal_induct N avoiding: x y a c M P rule: trm.strong_induct)
  7964   case (Ax z c)
  7964   case (Ax z c)
  7965   then show ?case
  7965   then show ?case
  7966     by (auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7966     by (auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7967 next
  7967 next
  7968   case (Cut d M' u M'')
  7968   case (Cut d M' u M'')
 11175 where
 11175 where
 11176   "\<parallel><B>\<parallel> \<equiv> NEGc B (\<parallel>(B)\<parallel>)"
 11176   "\<parallel><B>\<parallel> \<equiv> NEGc B (\<parallel>(B)\<parallel>)"
 11177 
 11177 
 11178 lemma NEGn_decreasing:
 11178 lemma NEGn_decreasing:
 11179   shows "X\<subseteq>Y \<Longrightarrow> NEGn B Y \<subseteq> NEGn B X"
 11179   shows "X\<subseteq>Y \<Longrightarrow> NEGn B Y \<subseteq> NEGn B X"
 11180 by (nominal_induct B rule: ty.induct)
 11180 by (nominal_induct B rule: ty.strong_induct)
 11181    (auto dest: BINDINGn_decreasing)
 11181    (auto dest: BINDINGn_decreasing)
 11182 
 11182 
 11183 lemma NEGc_decreasing:
 11183 lemma NEGc_decreasing:
 11184   shows "X\<subseteq>Y \<Longrightarrow> NEGc B Y \<subseteq> NEGc B X"
 11184   shows "X\<subseteq>Y \<Longrightarrow> NEGc B Y \<subseteq> NEGc B X"
 11185 by (nominal_induct B rule: ty.induct)
 11185 by (nominal_induct B rule: ty.strong_induct)
 11186    (auto dest: BINDINGc_decreasing)
 11186    (auto dest: BINDINGc_decreasing)
 11187 
 11187 
 11188 lemma mono_NEGn_NEGc:
 11188 lemma mono_NEGn_NEGc:
 11189   shows "mono (NEGn B \<circ> NEGc B)"
 11189   shows "mono (NEGn B \<circ> NEGc B)"
 11190   and   "mono (NEGc B \<circ> NEGn B)"
 11190   and   "mono (NEGc B \<circ> NEGn B)"
 11244 lemma AXIOMS_in_CANDs:
 11244 lemma AXIOMS_in_CANDs:
 11245   shows "AXIOMSn B \<subseteq> (\<parallel>(B)\<parallel>)"
 11245   shows "AXIOMSn B \<subseteq> (\<parallel>(B)\<parallel>)"
 11246   and   "AXIOMSc B \<subseteq> (\<parallel><B>\<parallel>)"
 11246   and   "AXIOMSc B \<subseteq> (\<parallel><B>\<parallel>)"
 11247 proof -
 11247 proof -
 11248   have "AXIOMSn B \<subseteq> NEGn B (\<parallel><B>\<parallel>)"
 11248   have "AXIOMSn B \<subseteq> NEGn B (\<parallel><B>\<parallel>)"
 11249     by (nominal_induct B rule: ty.induct) (auto)
 11249     by (nominal_induct B rule: ty.strong_induct) (auto)
 11250   then show "AXIOMSn B \<subseteq> \<parallel>(B)\<parallel>" using NEG_simp by blast
 11250   then show "AXIOMSn B \<subseteq> \<parallel>(B)\<parallel>" using NEG_simp by blast
 11251 next
 11251 next
 11252   have "AXIOMSc B \<subseteq> NEGc B (\<parallel>(B)\<parallel>)"
 11252   have "AXIOMSc B \<subseteq> NEGc B (\<parallel>(B)\<parallel>)"
 11253     by (nominal_induct B rule: ty.induct) (auto)
 11253     by (nominal_induct B rule: ty.strong_induct) (auto)
 11254   then show "AXIOMSc B \<subseteq> \<parallel><B>\<parallel>" using NEG_simp by blast
 11254   then show "AXIOMSc B \<subseteq> \<parallel><B>\<parallel>" using NEG_simp by blast
 11255 qed
 11255 qed
 11256 
 11256 
 11257 lemma Ax_in_CANDs:
 11257 lemma Ax_in_CANDs:
 11258   shows "(y):Ax x a \<in> \<parallel>(B)\<parallel>"
 11258   shows "(y):Ax x a \<in> \<parallel>(B)\<parallel>"
 11443 
 11443 
 11444 lemma CAND_eqvt_name:
 11444 lemma CAND_eqvt_name:
 11445   fixes pi::"name prm"
 11445   fixes pi::"name prm"
 11446   shows   "(pi\<bullet>(\<parallel>(B)\<parallel>)) = (\<parallel>(B)\<parallel>)"
 11446   shows   "(pi\<bullet>(\<parallel>(B)\<parallel>)) = (\<parallel>(B)\<parallel>)"
 11447   and     "(pi\<bullet>(\<parallel><B>\<parallel>)) = (\<parallel><B>\<parallel>)"
 11447   and     "(pi\<bullet>(\<parallel><B>\<parallel>)) = (\<parallel><B>\<parallel>)"
 11448 proof (nominal_induct B rule: ty.induct)
 11448 proof (nominal_induct B rule: ty.strong_induct)
 11449   case (PR X)
 11449   case (PR X)
 11450   { case 1 show ?case 
 11450   { case 1 show ?case 
 11451       apply -
 11451       apply -
 11452       apply(simp add: lfp_eqvt)
 11452       apply(simp add: lfp_eqvt)
 11453       apply(simp add: perm_fun_def [where 'a="ntrm \<Rightarrow> bool"])
 11453       apply(simp add: perm_fun_def [where 'a="ntrm \<Rightarrow> bool"])
 11553 
 11553 
 11554 lemma CAND_eqvt_coname:
 11554 lemma CAND_eqvt_coname:
 11555   fixes pi::"coname prm"
 11555   fixes pi::"coname prm"
 11556   shows   "(pi\<bullet>(\<parallel>(B)\<parallel>)) = (\<parallel>(B)\<parallel>)"
 11556   shows   "(pi\<bullet>(\<parallel>(B)\<parallel>)) = (\<parallel>(B)\<parallel>)"
 11557   and     "(pi\<bullet>(\<parallel><B>\<parallel>)) = (\<parallel><B>\<parallel>)"
 11557   and     "(pi\<bullet>(\<parallel><B>\<parallel>)) = (\<parallel><B>\<parallel>)"
 11558 proof (nominal_induct B rule: ty.induct)
 11558 proof (nominal_induct B rule: ty.strong_induct)
 11559   case (PR X)
 11559   case (PR X)
 11560   { case 1 show ?case 
 11560   { case 1 show ?case 
 11561       apply -
 11561       apply -
 11562       apply(simp add: lfp_eqvt)
 11562       apply(simp add: lfp_eqvt)
 11563       apply(simp add: perm_fun_def [where 'a="ntrm \<Rightarrow> bool"])
 11563       apply(simp add: perm_fun_def [where 'a="ntrm \<Rightarrow> bool"])
 12737 
 12737 
 12738 lemma CAND_NotR_elim:
 12738 lemma CAND_NotR_elim:
 12739   assumes a: "<a>:NotR (x).M a \<in> (\<parallel><B>\<parallel>)" "<a>:NotR (x).M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)"
 12739   assumes a: "<a>:NotR (x).M a \<in> (\<parallel><B>\<parallel>)" "<a>:NotR (x).M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)"
 12740   shows "\<exists>B'. B = NOT B' \<and> (x):M \<in> (\<parallel>(B')\<parallel>)" 
 12740   shows "\<exists>B'. B = NOT B' \<and> (x):M \<in> (\<parallel>(B')\<parallel>)" 
 12741 using a
 12741 using a
 12742 apply(nominal_induct B rule: ty.induct)
 12742 apply(nominal_induct B rule: ty.strong_induct)
 12743 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha)
 12743 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha)
 12744 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 12744 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 12745 apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
 12745 apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
 12746 apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha)
 12746 apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha)
 12747 done
 12747 done
 12748 
 12748 
 12749 lemma CAND_NotL_elim_aux:
 12749 lemma CAND_NotL_elim_aux:
 12750   assumes a: "(x):NotL <a>.M x \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):NotL <a>.M x \<notin> BINDINGn B (\<parallel><B>\<parallel>)"
 12750   assumes a: "(x):NotL <a>.M x \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):NotL <a>.M x \<notin> BINDINGn B (\<parallel><B>\<parallel>)"
 12751   shows "\<exists>B'. B = NOT B' \<and> <a>:M \<in> (\<parallel><B'>\<parallel>)" 
 12751   shows "\<exists>B'. B = NOT B' \<and> <a>:M \<in> (\<parallel><B'>\<parallel>)" 
 12752 using a
 12752 using a
 12753 apply(nominal_induct B rule: ty.induct)
 12753 apply(nominal_induct B rule: ty.strong_induct)
 12754 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha)
 12754 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha)
 12755 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 12755 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 12756 apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
 12756 apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
 12757 apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha)
 12757 apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha)
 12758 done
 12758 done
 12761 
 12761 
 12762 lemma CAND_AndR_elim:
 12762 lemma CAND_AndR_elim:
 12763   assumes a: "<a>:AndR <b>.M <c>.N a \<in> (\<parallel><B>\<parallel>)" "<a>:AndR <b>.M <c>.N a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)"
 12763   assumes a: "<a>:AndR <b>.M <c>.N a \<in> (\<parallel><B>\<parallel>)" "<a>:AndR <b>.M <c>.N a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)"
 12764   shows "\<exists>B1 B2. B = B1 AND B2 \<and> <b>:M \<in> (\<parallel><B1>\<parallel>) \<and> <c>:N \<in> (\<parallel><B2>\<parallel>)" 
 12764   shows "\<exists>B1 B2. B = B1 AND B2 \<and> <b>:M \<in> (\<parallel><B1>\<parallel>) \<and> <c>:N \<in> (\<parallel><B2>\<parallel>)" 
 12765 using a
 12765 using a
 12766 apply(nominal_induct B rule: ty.induct)
 12766 apply(nominal_induct B rule: ty.strong_induct)
 12767 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha)
 12767 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha)
 12768 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 12768 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 12769 apply(drule_tac pi="[(a,ca)]" and x="<a>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
 12769 apply(drule_tac pi="[(a,ca)]" and x="<a>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
 12770 apply(simp add: CAND_eqvt_coname calc_atm)
 12770 apply(simp add: CAND_eqvt_coname calc_atm)
 12771 apply(auto intro: CANDs_alpha)[1]
 12771 apply(auto intro: CANDs_alpha)[1]
 12842 
 12842 
 12843 lemma CAND_OrR1_elim:
 12843 lemma CAND_OrR1_elim:
 12844   assumes a: "<a>:OrR1 <b>.M a \<in> (\<parallel><B>\<parallel>)" "<a>:OrR1 <b>.M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)"
 12844   assumes a: "<a>:OrR1 <b>.M a \<in> (\<parallel><B>\<parallel>)" "<a>:OrR1 <b>.M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)"
 12845   shows "\<exists>B1 B2. B = B1 OR B2 \<and> <b>:M \<in> (\<parallel><B1>\<parallel>)" 
 12845   shows "\<exists>B1 B2. B = B1 OR B2 \<and> <b>:M \<in> (\<parallel><B1>\<parallel>)" 
 12846 using a
 12846 using a
 12847 apply(nominal_induct B rule: ty.induct)
 12847 apply(nominal_induct B rule: ty.strong_induct)
 12848 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha)
 12848 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha)
 12849 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 12849 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 12850 apply(drule_tac pi="[(a,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
 12850 apply(drule_tac pi="[(a,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
 12851 apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha)
 12851 apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha)
 12852 apply(case_tac "a=aa")
 12852 apply(case_tac "a=aa")
 12863 
 12863 
 12864 lemma CAND_OrR2_elim:
 12864 lemma CAND_OrR2_elim:
 12865   assumes a: "<a>:OrR2 <b>.M a \<in> (\<parallel><B>\<parallel>)" "<a>:OrR2 <b>.M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)"
 12865   assumes a: "<a>:OrR2 <b>.M a \<in> (\<parallel><B>\<parallel>)" "<a>:OrR2 <b>.M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)"
 12866   shows "\<exists>B1 B2. B = B1 OR B2 \<and> <b>:M \<in> (\<parallel><B2>\<parallel>)" 
 12866   shows "\<exists>B1 B2. B = B1 OR B2 \<and> <b>:M \<in> (\<parallel><B2>\<parallel>)" 
 12867 using a
 12867 using a
 12868 apply(nominal_induct B rule: ty.induct)
 12868 apply(nominal_induct B rule: ty.strong_induct)
 12869 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha)
 12869 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha)
 12870 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 12870 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 12871 apply(drule_tac pi="[(a,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
 12871 apply(drule_tac pi="[(a,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst])
 12872 apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha)
 12872 apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha)
 12873 apply(case_tac "a=aa")
 12873 apply(case_tac "a=aa")
 12884 
 12884 
 12885 lemma CAND_OrL_elim_aux:
 12885 lemma CAND_OrL_elim_aux:
 12886   assumes a: "(x):(OrL (y).M (z).N x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(OrL (y).M (z).N x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)"
 12886   assumes a: "(x):(OrL (y).M (z).N x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(OrL (y).M (z).N x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)"
 12887   shows "\<exists>B1 B2. B = B1 OR B2 \<and> (y):M \<in> (\<parallel>(B1)\<parallel>) \<and> (z):N \<in> (\<parallel>(B2)\<parallel>)" 
 12887   shows "\<exists>B1 B2. B = B1 OR B2 \<and> (y):M \<in> (\<parallel>(B1)\<parallel>) \<and> (z):N \<in> (\<parallel>(B2)\<parallel>)" 
 12888 using a
 12888 using a
 12889 apply(nominal_induct B rule: ty.induct)
 12889 apply(nominal_induct B rule: ty.strong_induct)
 12890 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha)
 12890 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha)
 12891 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 12891 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 12892 apply(drule_tac pi="[(x,za)]" and x="(x):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
 12892 apply(drule_tac pi="[(x,za)]" and x="(x):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
 12893 apply(simp add: CAND_eqvt_name calc_atm)
 12893 apply(simp add: CAND_eqvt_name calc_atm)
 12894 apply(auto intro: CANDs_alpha)[1]
 12894 apply(auto intro: CANDs_alpha)[1]
 12967 
 12967 
 12968 lemma CAND_AndL1_elim_aux:
 12968 lemma CAND_AndL1_elim_aux:
 12969   assumes a: "(x):(AndL1 (y).M x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(AndL1 (y).M x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)"
 12969   assumes a: "(x):(AndL1 (y).M x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(AndL1 (y).M x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)"
 12970   shows "\<exists>B1 B2. B = B1 AND B2 \<and> (y):M \<in> (\<parallel>(B1)\<parallel>)" 
 12970   shows "\<exists>B1 B2. B = B1 AND B2 \<and> (y):M \<in> (\<parallel>(B1)\<parallel>)" 
 12971 using a
 12971 using a
 12972 apply(nominal_induct B rule: ty.induct)
 12972 apply(nominal_induct B rule: ty.strong_induct)
 12973 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha)
 12973 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha)
 12974 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 12974 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 12975 apply(drule_tac pi="[(x,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
 12975 apply(drule_tac pi="[(x,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
 12976 apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha)
 12976 apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha)
 12977 apply(case_tac "x=xa")
 12977 apply(case_tac "x=xa")
 12990 
 12990 
 12991 lemma CAND_AndL2_elim_aux:
 12991 lemma CAND_AndL2_elim_aux:
 12992   assumes a: "(x):(AndL2 (y).M x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(AndL2 (y).M x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)"
 12992   assumes a: "(x):(AndL2 (y).M x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(AndL2 (y).M x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)"
 12993   shows "\<exists>B1 B2. B = B1 AND B2 \<and> (y):M \<in> (\<parallel>(B2)\<parallel>)" 
 12993   shows "\<exists>B1 B2. B = B1 AND B2 \<and> (y):M \<in> (\<parallel>(B2)\<parallel>)" 
 12994 using a
 12994 using a
 12995 apply(nominal_induct B rule: ty.induct)
 12995 apply(nominal_induct B rule: ty.strong_induct)
 12996 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha)
 12996 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha)
 12997 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 12997 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 12998 apply(drule_tac pi="[(x,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
 12998 apply(drule_tac pi="[(x,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
 12999 apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha)
 12999 apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha)
 13000 apply(case_tac "x=xa")
 13000 apply(case_tac "x=xa")
 13013 
 13013 
 13014 lemma CAND_ImpL_elim_aux:
 13014 lemma CAND_ImpL_elim_aux:
 13015   assumes a: "(x):(ImpL <a>.M (z).N x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(ImpL <a>.M (z).N x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)"
 13015   assumes a: "(x):(ImpL <a>.M (z).N x) \<in> NEGn B (\<parallel><B>\<parallel>)" "(x):(ImpL <a>.M (z).N x) \<notin> BINDINGn B (\<parallel><B>\<parallel>)"
 13016   shows "\<exists>B1 B2. B = B1 IMP B2 \<and> <a>:M \<in> (\<parallel><B1>\<parallel>) \<and> (z):N \<in> (\<parallel>(B2)\<parallel>)" 
 13016   shows "\<exists>B1 B2. B = B1 IMP B2 \<and> <a>:M \<in> (\<parallel><B1>\<parallel>) \<and> (z):N \<in> (\<parallel>(B2)\<parallel>)" 
 13017 using a
 13017 using a
 13018 apply(nominal_induct B rule: ty.induct)
 13018 apply(nominal_induct B rule: ty.strong_induct)
 13019 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha)
 13019 apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha)
 13020 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 13020 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm)
 13021 apply(drule_tac pi="[(x,y)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
 13021 apply(drule_tac pi="[(x,y)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
 13022 apply(simp add: CAND_eqvt_name calc_atm)
 13022 apply(simp add: CAND_eqvt_name calc_atm)
 13023 apply(auto intro: CANDs_alpha)[1]
 13023 apply(auto intro: CANDs_alpha)[1]
 13050   assumes a: "<a>:ImpR (x).<b>.M a \<in> (\<parallel><B>\<parallel>)" "<a>:ImpR (x).<b>.M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)"
 13050   assumes a: "<a>:ImpR (x).<b>.M a \<in> (\<parallel><B>\<parallel>)" "<a>:ImpR (x).<b>.M a \<notin> BINDINGc B (\<parallel>(B)\<parallel>)"
 13051   shows "\<exists>B1 B2. B = B1 IMP B2 \<and> 
 13051   shows "\<exists>B1 B2. B = B1 IMP B2 \<and> 
 13052                  (\<forall>z P. x\<sharp>(z,P) \<and> (z):P \<in> \<parallel>(B2)\<parallel> \<longrightarrow> (x):(M{b:=(z).P}) \<in> \<parallel>(B1)\<parallel>) \<and>
 13052                  (\<forall>z P. x\<sharp>(z,P) \<and> (z):P \<in> \<parallel>(B2)\<parallel> \<longrightarrow> (x):(M{b:=(z).P}) \<in> \<parallel>(B1)\<parallel>) \<and>
 13053                  (\<forall>c Q. b\<sharp>(c,Q) \<and> <c>:Q \<in> \<parallel><B1>\<parallel> \<longrightarrow> <b>:(M{x:=<c>.Q}) \<in> \<parallel><B2>\<parallel>)" 
 13053                  (\<forall>c Q. b\<sharp>(c,Q) \<and> <c>:Q \<in> \<parallel><B1>\<parallel> \<longrightarrow> <b>:(M{x:=<c>.Q}) \<in> \<parallel><B2>\<parallel>)" 
 13054 using a
 13054 using a
 13055 apply(nominal_induct B rule: ty.induct)
 13055 apply(nominal_induct B rule: ty.strong_induct)
 13056 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha)
 13056 apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha)
 13057 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm fresh_prod fresh_bij)
 13057 apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm fresh_prod fresh_bij)
 13058 apply(generate_fresh "name") 
 13058 apply(generate_fresh "name") 
 13059 apply(generate_fresh "coname")
 13059 apply(generate_fresh "coname")
 13060 apply(drule_tac a="ca" and z="c" in alpha_name_coname)
 13060 apply(drule_tac a="ca" and z="c" in alpha_name_coname)
 13455 done
 13455 done
 13456 
 13456 
 13457 lemma CANDs_imply_SNa:
 13457 lemma CANDs_imply_SNa:
 13458   shows "<a>:M \<in> \<parallel><B>\<parallel> \<Longrightarrow> SNa M"
 13458   shows "<a>:M \<in> \<parallel><B>\<parallel> \<Longrightarrow> SNa M"
 13459   and   "(x):M \<in> \<parallel>(B)\<parallel> \<Longrightarrow> SNa M"
 13459   and   "(x):M \<in> \<parallel>(B)\<parallel> \<Longrightarrow> SNa M"
 13460 proof(induct B arbitrary: a x M rule: ty.weak_induct)
 13460 proof(induct B arbitrary: a x M rule: ty.induct)
 13461   case (PR X)
 13461   case (PR X)
 13462   { case 1 
 13462   { case 1 
 13463     have "<a>:M \<in> \<parallel><PR X>\<parallel>" by fact
 13463     have "<a>:M \<in> \<parallel><PR X>\<parallel>" by fact
 13464     then have "<a>:M \<in> NEGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp
 13464     then have "<a>:M \<in> NEGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp
 13465     then have "<a>:M \<in> AXIOMSc (PR X) \<union> BINDINGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp
 13465     then have "<a>:M \<in> AXIOMSc (PR X) \<union> BINDINGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp
 13762 qed
 13762 qed
 13763     
 13763     
 13764 lemma CANDs_preserved:
 13764 lemma CANDs_preserved:
 13765   shows "<a>:M \<in> \<parallel><B>\<parallel> \<Longrightarrow> M \<longrightarrow>\<^isub>a* M' \<Longrightarrow> <a>:M' \<in> \<parallel><B>\<parallel>"
 13765   shows "<a>:M \<in> \<parallel><B>\<parallel> \<Longrightarrow> M \<longrightarrow>\<^isub>a* M' \<Longrightarrow> <a>:M' \<in> \<parallel><B>\<parallel>"
 13766   and   "(x):M \<in> \<parallel>(B)\<parallel> \<Longrightarrow> M \<longrightarrow>\<^isub>a* M' \<Longrightarrow> (x):M' \<in> \<parallel>(B)\<parallel>" 
 13766   and   "(x):M \<in> \<parallel>(B)\<parallel> \<Longrightarrow> M \<longrightarrow>\<^isub>a* M' \<Longrightarrow> (x):M' \<in> \<parallel>(B)\<parallel>" 
 13767 proof(nominal_induct B arbitrary: a x M M' rule: ty.induct) 
 13767 proof(nominal_induct B arbitrary: a x M M' rule: ty.strong_induct) 
 13768   case (PR X)
 13768   case (PR X)
 13769   { case 1 
 13769   { case 1 
 13770     have asm: "M \<longrightarrow>\<^isub>a* M'" by fact
 13770     have asm: "M \<longrightarrow>\<^isub>a* M'" by fact
 13771     have "<a>:M \<in> \<parallel><PR X>\<parallel>" by fact
 13771     have "<a>:M \<in> \<parallel><PR X>\<parallel>" by fact
 13772     then have "<a>:M \<in> NEGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp
 13772     then have "<a>:M \<in> NEGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp
 14133 lemma fic_CANDS:
 14133 lemma fic_CANDS:
 14134   assumes a: "\<not>fic M a"
 14134   assumes a: "\<not>fic M a"
 14135   and     b: "<a>:M \<in> \<parallel><B>\<parallel>"
 14135   and     b: "<a>:M \<in> \<parallel><B>\<parallel>"
 14136   shows "<a>:M \<in> AXIOMSc B \<or> <a>:M \<in> BINDINGc B (\<parallel>(B)\<parallel>)"
 14136   shows "<a>:M \<in> AXIOMSc B \<or> <a>:M \<in> BINDINGc B (\<parallel>(B)\<parallel>)"
 14137 using a b
 14137 using a b
 14138 apply(nominal_induct B rule: ty.induct)
 14138 apply(nominal_induct B rule: ty.strong_induct)
 14139 apply(simp)
 14139 apply(simp)
 14140 apply(simp)
 14140 apply(simp)
 14141 apply(erule disjE)
 14141 apply(erule disjE)
 14142 apply(simp)
 14142 apply(simp)
 14143 apply(erule disjE)
 14143 apply(erule disjE)
 14200 lemma fin_CANDS_aux:
 14200 lemma fin_CANDS_aux:
 14201   assumes a: "\<not>fin M x"
 14201   assumes a: "\<not>fin M x"
 14202   and     b: "(x):M \<in> (NEGn B (\<parallel><B>\<parallel>))"
 14202   and     b: "(x):M \<in> (NEGn B (\<parallel><B>\<parallel>))"
 14203   shows "(x):M \<in> AXIOMSn B \<or> (x):M \<in> BINDINGn B (\<parallel><B>\<parallel>)"
 14203   shows "(x):M \<in> AXIOMSn B \<or> (x):M \<in> BINDINGn B (\<parallel><B>\<parallel>)"
 14204 using a b
 14204 using a b
 14205 apply(nominal_induct B rule: ty.induct)
 14205 apply(nominal_induct B rule: ty.strong_induct)
 14206 apply(simp)
 14206 apply(simp)
 14207 apply(simp)
 14207 apply(simp)
 14208 apply(erule disjE)
 14208 apply(erule disjE)
 14209 apply(simp)
 14209 apply(simp)
 14210 apply(erule disjE)
 14210 apply(erule disjE)
 14276 
 14276 
 14277 lemma BINDING_implies_CAND:
 14277 lemma BINDING_implies_CAND:
 14278   shows "<c>:M \<in> BINDINGc B (\<parallel>(B)\<parallel>) \<Longrightarrow> <c>:M \<in> (\<parallel><B>\<parallel>)"
 14278   shows "<c>:M \<in> BINDINGc B (\<parallel>(B)\<parallel>) \<Longrightarrow> <c>:M \<in> (\<parallel><B>\<parallel>)"
 14279   and   "(x):N \<in> BINDINGn B (\<parallel><B>\<parallel>) \<Longrightarrow> (x):N \<in> (\<parallel>(B)\<parallel>)"
 14279   and   "(x):N \<in> BINDINGn B (\<parallel><B>\<parallel>) \<Longrightarrow> (x):N \<in> (\<parallel>(B)\<parallel>)"
 14280 apply -
 14280 apply -
 14281 apply(nominal_induct B rule: ty.induct)
 14281 apply(nominal_induct B rule: ty.strong_induct)
 14282 apply(auto)
 14282 apply(auto)
 14283 apply(rule NEG_intro)
 14283 apply(rule NEG_intro)
 14284 apply(nominal_induct B rule: ty.induct)
 14284 apply(nominal_induct B rule: ty.strong_induct)
 14285 apply(auto)
 14285 apply(auto)
 14286 done
 14286 done
 14287 
 14287 
 14288 text {* 3rd Main Lemma *}
 14288 text {* 3rd Main Lemma *}
 14289 
 14289 
 14342 
 14342 
 14343 lemma not_fic_crename_aux:
 14343 lemma not_fic_crename_aux:
 14344   assumes a: "fic M c" "c\<sharp>(a,b)"
 14344   assumes a: "fic M c" "c\<sharp>(a,b)"
 14345   shows "fic (M[a\<turnstile>c>b]) c" 
 14345   shows "fic (M[a\<turnstile>c>b]) c" 
 14346 using a
 14346 using a
 14347 apply(nominal_induct M avoiding: c a b rule: trm.induct)
 14347 apply(nominal_induct M avoiding: c a b rule: trm.strong_induct)
 14348 apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh)
 14348 apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh)
 14349 done
 14349 done
 14350 
 14350 
 14351 lemma not_fic_crename:
 14351 lemma not_fic_crename:
 14352   assumes a: "\<not>(fic (M[a\<turnstile>c>b]) c)" "c\<sharp>(a,b)"
 14352   assumes a: "\<not>(fic (M[a\<turnstile>c>b]) c)" "c\<sharp>(a,b)"
 14357 
 14357 
 14358 lemma not_fin_crename_aux:
 14358 lemma not_fin_crename_aux:
 14359   assumes a: "fin M y"
 14359   assumes a: "fin M y"
 14360   shows "fin (M[a\<turnstile>c>b]) y" 
 14360   shows "fin (M[a\<turnstile>c>b]) y" 
 14361 using a
 14361 using a
 14362 apply(nominal_induct M avoiding: a b rule: trm.induct)
 14362 apply(nominal_induct M avoiding: a b rule: trm.strong_induct)
 14363 apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh)
 14363 apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh)
 14364 done
 14364 done
 14365 
 14365 
 14366 lemma not_fin_crename:
 14366 lemma not_fin_crename:
 14367   assumes a: "\<not>(fin (M[a\<turnstile>c>b]) y)" 
 14367   assumes a: "\<not>(fin (M[a\<turnstile>c>b]) y)" 
 14373 lemma crename_fresh_interesting1:
 14373 lemma crename_fresh_interesting1:
 14374   fixes c::"coname"
 14374   fixes c::"coname"
 14375   assumes a: "c\<sharp>(M[a\<turnstile>c>b])" "c\<sharp>(a,b)"
 14375   assumes a: "c\<sharp>(M[a\<turnstile>c>b])" "c\<sharp>(a,b)"
 14376   shows "c\<sharp>M"
 14376   shows "c\<sharp>M"
 14377 using a
 14377 using a
 14378 apply(nominal_induct M avoiding: c a b rule: trm.induct)
 14378 apply(nominal_induct M avoiding: c a b rule: trm.strong_induct)
 14379 apply(auto split: if_splits simp add: abs_fresh)
 14379 apply(auto split: if_splits simp add: abs_fresh)
 14380 done
 14380 done
 14381 
 14381 
 14382 lemma crename_fresh_interesting2:
 14382 lemma crename_fresh_interesting2:
 14383   fixes x::"name"
 14383   fixes x::"name"
 14384   assumes a: "x\<sharp>(M[a\<turnstile>c>b])" 
 14384   assumes a: "x\<sharp>(M[a\<turnstile>c>b])" 
 14385   shows "x\<sharp>M"
 14385   shows "x\<sharp>M"
 14386 using a
 14386 using a
 14387 apply(nominal_induct M avoiding: x a b rule: trm.induct)
 14387 apply(nominal_induct M avoiding: x a b rule: trm.strong_induct)
 14388 apply(auto split: if_splits simp add: abs_fresh abs_supp fin_supp fresh_atm)
 14388 apply(auto split: if_splits simp add: abs_fresh abs_supp fin_supp fresh_atm)
 14389 done
 14389 done
 14390 
 14390 
 14391 
 14391 
 14392 lemma fic_crename:
 14392 lemma fic_crename:
 14393   assumes a: "fic (M[a\<turnstile>c>b]) c" "c\<sharp>(a,b)"
 14393   assumes a: "fic (M[a\<turnstile>c>b]) c" "c\<sharp>(a,b)"
 14394   shows "fic M c" 
 14394   shows "fic M c" 
 14395 using a
 14395 using a
 14396 apply(nominal_induct M avoiding: c a b rule: trm.induct)
 14396 apply(nominal_induct M avoiding: c a b rule: trm.strong_induct)
 14397 apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh
 14397 apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh
 14398            split: if_splits)
 14398            split: if_splits)
 14399 apply(auto dest: crename_fresh_interesting1 simp add: fresh_prod fresh_atm)
 14399 apply(auto dest: crename_fresh_interesting1 simp add: fresh_prod fresh_atm)
 14400 done
 14400 done
 14401 
 14401 
 14402 lemma fin_crename:
 14402 lemma fin_crename:
 14403   assumes a: "fin (M[a\<turnstile>c>b]) x"
 14403   assumes a: "fin (M[a\<turnstile>c>b]) x"
 14404   shows "fin M x" 
 14404   shows "fin M x" 
 14405 using a
 14405 using a
 14406 apply(nominal_induct M avoiding: x a b rule: trm.induct)
 14406 apply(nominal_induct M avoiding: x a b rule: trm.strong_induct)
 14407 apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh
 14407 apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh
 14408            split: if_splits)
 14408            split: if_splits)
 14409 apply(auto dest: crename_fresh_interesting2 simp add: fresh_prod fresh_atm)
 14409 apply(auto dest: crename_fresh_interesting2 simp add: fresh_prod fresh_atm)
 14410 done
 14410 done
 14411 
 14411 
 14412 lemma crename_Cut:
 14412 lemma crename_Cut:
 14413   assumes a: "R[a\<turnstile>c>b] = Cut <c>.M (x).N" "c\<sharp>(a,b,N,R)" "x\<sharp>(M,R)"
 14413   assumes a: "R[a\<turnstile>c>b] = Cut <c>.M (x).N" "c\<sharp>(a,b,N,R)" "x\<sharp>(M,R)"
 14414   shows "\<exists>M' N'. R = Cut <c>.M' (x).N' \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> x\<sharp>M'"
 14414   shows "\<exists>M' N'. R = Cut <c>.M' (x).N' \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> x\<sharp>M'"
 14415 using a
 14415 using a
 14416 apply(nominal_induct R avoiding: a b c x M N rule: trm.induct)
 14416 apply(nominal_induct R avoiding: a b c x M N rule: trm.strong_induct)
 14417 apply(auto split: if_splits)
 14417 apply(auto split: if_splits)
 14418 apply(simp add: trm.inject)
 14418 apply(simp add: trm.inject)
 14419 apply(auto simp add: alpha)
 14419 apply(auto simp add: alpha)
 14420 apply(rule_tac x="[(name,x)]\<bullet>trm2" in exI)
 14420 apply(rule_tac x="[(name,x)]\<bullet>trm2" in exI)
 14421 apply(perm_simp)
 14421 apply(perm_simp)
 14450 
 14450 
 14451 lemma crename_NotR:
 14451 lemma crename_NotR:
 14452   assumes a: "R[a\<turnstile>c>b] = NotR (x).N c" "x\<sharp>R" "c\<sharp>(a,b)"
 14452   assumes a: "R[a\<turnstile>c>b] = NotR (x).N c" "x\<sharp>R" "c\<sharp>(a,b)"
 14453   shows "\<exists>N'. (R = NotR (x).N' c) \<and> N'[a\<turnstile>c>b] = N" 
 14453   shows "\<exists>N'. (R = NotR (x).N' c) \<and> N'[a\<turnstile>c>b] = N" 
 14454 using a
 14454 using a
 14455 apply(nominal_induct R avoiding: a b c x N rule: trm.induct)
 14455 apply(nominal_induct R avoiding: a b c x N rule: trm.strong_induct)
 14456 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14456 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14457 apply(rule_tac x="[(name,x)]\<bullet>trm" in exI)
 14457 apply(rule_tac x="[(name,x)]\<bullet>trm" in exI)
 14458 apply(perm_simp)
 14458 apply(perm_simp)
 14459 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14459 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14460 apply(drule sym)
 14460 apply(drule sym)
 14464 
 14464 
 14465 lemma crename_NotR':
 14465 lemma crename_NotR':
 14466   assumes a: "R[a\<turnstile>c>b] = NotR (x).N c" "x\<sharp>R" "c\<sharp>a"
 14466   assumes a: "R[a\<turnstile>c>b] = NotR (x).N c" "x\<sharp>R" "c\<sharp>a"
 14467   shows "(\<exists>N'. (R = NotR (x).N' c) \<and> N'[a\<turnstile>c>b] = N) \<or> (\<exists>N'. (R = NotR (x).N' a) \<and> b=c \<and> N'[a\<turnstile>c>b] = N)"
 14467   shows "(\<exists>N'. (R = NotR (x).N' c) \<and> N'[a\<turnstile>c>b] = N) \<or> (\<exists>N'. (R = NotR (x).N' a) \<and> b=c \<and> N'[a\<turnstile>c>b] = N)"
 14468 using a
 14468 using a
 14469 apply(nominal_induct R avoiding: a b c x N rule: trm.induct)
 14469 apply(nominal_induct R avoiding: a b c x N rule: trm.strong_induct)
 14470 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject)
 14470 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject)
 14471 apply(rule_tac x="[(name,x)]\<bullet>trm" in exI)
 14471 apply(rule_tac x="[(name,x)]\<bullet>trm" in exI)
 14472 apply(perm_simp)
 14472 apply(perm_simp)
 14473 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14473 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14474 apply(drule sym)
 14474 apply(drule sym)
 14484 
 14484 
 14485 lemma crename_NotR_aux:
 14485 lemma crename_NotR_aux:
 14486   assumes a: "R[a\<turnstile>c>b] = NotR (x).N c" 
 14486   assumes a: "R[a\<turnstile>c>b] = NotR (x).N c" 
 14487   shows "(a=c \<and> a=b) \<or> (a\<noteq>c)" 
 14487   shows "(a=c \<and> a=b) \<or> (a\<noteq>c)" 
 14488 using a
 14488 using a
 14489 apply(nominal_induct R avoiding: a b c x N rule: trm.induct)
 14489 apply(nominal_induct R avoiding: a b c x N rule: trm.strong_induct)
 14490 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14490 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14491 done
 14491 done
 14492 
 14492 
 14493 lemma crename_NotL:
 14493 lemma crename_NotL:
 14494   assumes a: "R[a\<turnstile>c>b] = NotL <c>.N y" "c\<sharp>(R,a,b)"
 14494   assumes a: "R[a\<turnstile>c>b] = NotL <c>.N y" "c\<sharp>(R,a,b)"
 14495   shows "\<exists>N'. (R = NotL <c>.N' y) \<and> N'[a\<turnstile>c>b] = N" 
 14495   shows "\<exists>N'. (R = NotL <c>.N' y) \<and> N'[a\<turnstile>c>b] = N" 
 14496 using a
 14496 using a
 14497 apply(nominal_induct R avoiding: a b c y N rule: trm.induct)
 14497 apply(nominal_induct R avoiding: a b c y N rule: trm.strong_induct)
 14498 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14498 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14499 apply(rule_tac x="[(coname,c)]\<bullet>trm" in exI)
 14499 apply(rule_tac x="[(coname,c)]\<bullet>trm" in exI)
 14500 apply(perm_simp)
 14500 apply(perm_simp)
 14501 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14501 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14502 apply(drule sym)
 14502 apply(drule sym)
 14506 
 14506 
 14507 lemma crename_AndL1:
 14507 lemma crename_AndL1:
 14508   assumes a: "R[a\<turnstile>c>b] = AndL1 (x).N y" "x\<sharp>R"
 14508   assumes a: "R[a\<turnstile>c>b] = AndL1 (x).N y" "x\<sharp>R"
 14509   shows "\<exists>N'. (R = AndL1 (x).N' y) \<and> N'[a\<turnstile>c>b] = N" 
 14509   shows "\<exists>N'. (R = AndL1 (x).N' y) \<and> N'[a\<turnstile>c>b] = N" 
 14510 using a
 14510 using a
 14511 apply(nominal_induct R avoiding: a b x y N rule: trm.induct)
 14511 apply(nominal_induct R avoiding: a b x y N rule: trm.strong_induct)
 14512 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14512 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14513 apply(rule_tac x="[(name1,x)]\<bullet>trm" in exI)
 14513 apply(rule_tac x="[(name1,x)]\<bullet>trm" in exI)
 14514 apply(perm_simp)
 14514 apply(perm_simp)
 14515 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14515 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14516 apply(drule sym)
 14516 apply(drule sym)
 14520 
 14520 
 14521 lemma crename_AndL2:
 14521 lemma crename_AndL2:
 14522   assumes a: "R[a\<turnstile>c>b] = AndL2 (x).N y" "x\<sharp>R"
 14522   assumes a: "R[a\<turnstile>c>b] = AndL2 (x).N y" "x\<sharp>R"
 14523   shows "\<exists>N'. (R = AndL2 (x).N' y) \<and> N'[a\<turnstile>c>b] = N" 
 14523   shows "\<exists>N'. (R = AndL2 (x).N' y) \<and> N'[a\<turnstile>c>b] = N" 
 14524 using a
 14524 using a
 14525 apply(nominal_induct R avoiding: a b x y N rule: trm.induct)
 14525 apply(nominal_induct R avoiding: a b x y N rule: trm.strong_induct)
 14526 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14526 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14527 apply(rule_tac x="[(name1,x)]\<bullet>trm" in exI)
 14527 apply(rule_tac x="[(name1,x)]\<bullet>trm" in exI)
 14528 apply(perm_simp)
 14528 apply(perm_simp)
 14529 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14529 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14530 apply(drule sym)
 14530 apply(drule sym)
 14534 
 14534 
 14535 lemma crename_AndR_aux:
 14535 lemma crename_AndR_aux:
 14536   assumes a: "R[a\<turnstile>c>b] = AndR <c>.M <d>.N e" 
 14536   assumes a: "R[a\<turnstile>c>b] = AndR <c>.M <d>.N e" 
 14537   shows "(a=e \<and> a=b) \<or> (a\<noteq>e)" 
 14537   shows "(a=e \<and> a=b) \<or> (a\<noteq>e)" 
 14538 using a
 14538 using a
 14539 apply(nominal_induct R avoiding: a b c d e M N rule: trm.induct)
 14539 apply(nominal_induct R avoiding: a b c d e M N rule: trm.strong_induct)
 14540 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14540 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14541 done
 14541 done
 14542 
 14542 
 14543 lemma crename_AndR:
 14543 lemma crename_AndR:
 14544   assumes a: "R[a\<turnstile>c>b] = AndR <c>.M <d>.N e" "c\<sharp>(a,b,d,e,N,R)" "d\<sharp>(a,b,c,e,M,R)" "e\<sharp>(a,b)"
 14544   assumes a: "R[a\<turnstile>c>b] = AndR <c>.M <d>.N e" "c\<sharp>(a,b,d,e,N,R)" "d\<sharp>(a,b,c,e,M,R)" "e\<sharp>(a,b)"
 14545   shows "\<exists>M' N'. R = AndR <c>.M' <d>.N' e \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> d\<sharp>M'"
 14545   shows "\<exists>M' N'. R = AndR <c>.M' <d>.N' e \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> d\<sharp>M'"
 14546 using a
 14546 using a
 14547 apply(nominal_induct R avoiding: a b c d e M N rule: trm.induct)
 14547 apply(nominal_induct R avoiding: a b c d e M N rule: trm.strong_induct)
 14548 apply(auto split: if_splits simp add: trm.inject alpha)
 14548 apply(auto split: if_splits simp add: trm.inject alpha)
 14549 apply(simp add: fresh_atm fresh_prod)
 14549 apply(simp add: fresh_atm fresh_prod)
 14550 apply(rule_tac x="[(coname2,d)]\<bullet>trm2" in exI)
 14550 apply(rule_tac x="[(coname2,d)]\<bullet>trm2" in exI)
 14551 apply(perm_simp)
 14551 apply(perm_simp)
 14552 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1]
 14552 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1]
 14579 lemma crename_AndR':
 14579 lemma crename_AndR':
 14580   assumes a: "R[a\<turnstile>c>b] = AndR <c>.M <d>.N e" "c\<sharp>(a,b,d,e,N,R)" "d\<sharp>(a,b,c,e,M,R)" "e\<sharp>a"
 14580   assumes a: "R[a\<turnstile>c>b] = AndR <c>.M <d>.N e" "c\<sharp>(a,b,d,e,N,R)" "d\<sharp>(a,b,c,e,M,R)" "e\<sharp>a"
 14581   shows "(\<exists>M' N'. R = AndR <c>.M' <d>.N' e \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> d\<sharp>M') \<or>
 14581   shows "(\<exists>M' N'. R = AndR <c>.M' <d>.N' e \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> d\<sharp>M') \<or>
 14582          (\<exists>M' N'. R = AndR <c>.M' <d>.N' a \<and> b=e \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> d\<sharp>M')"
 14582          (\<exists>M' N'. R = AndR <c>.M' <d>.N' a \<and> b=e \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> d\<sharp>M')"
 14583 using a
 14583 using a
 14584 apply(nominal_induct R avoiding: a b c d e M N rule: trm.induct)
 14584 apply(nominal_induct R avoiding: a b c d e M N rule: trm.strong_induct)
 14585 apply(auto split: if_splits simp add: trm.inject alpha)[1]
 14585 apply(auto split: if_splits simp add: trm.inject alpha)[1]
 14586 apply(auto split: if_splits simp add: trm.inject alpha)[1]
 14586 apply(auto split: if_splits simp add: trm.inject alpha)[1]
 14587 apply(auto split: if_splits simp add: trm.inject alpha)[1]
 14587 apply(auto split: if_splits simp add: trm.inject alpha)[1]
 14588 apply(auto split: if_splits simp add: trm.inject alpha)[1]
 14588 apply(auto split: if_splits simp add: trm.inject alpha)[1]
 14589 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm trm.inject alpha)[1]
 14589 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm trm.inject alpha)[1]
 14619 
 14619 
 14620 lemma crename_OrR1_aux:
 14620 lemma crename_OrR1_aux:
 14621   assumes a: "R[a\<turnstile>c>b] = OrR1 <c>.M e" 
 14621   assumes a: "R[a\<turnstile>c>b] = OrR1 <c>.M e" 
 14622   shows "(a=e \<and> a=b) \<or> (a\<noteq>e)" 
 14622   shows "(a=e \<and> a=b) \<or> (a\<noteq>e)" 
 14623 using a
 14623 using a
 14624 apply(nominal_induct R avoiding: a b c e M rule: trm.induct)
 14624 apply(nominal_induct R avoiding: a b c e M rule: trm.strong_induct)
 14625 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14625 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14626 done
 14626 done
 14627 
 14627 
 14628 lemma crename_OrR1:
 14628 lemma crename_OrR1:
 14629   assumes a: "R[a\<turnstile>c>b] = OrR1 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>(a,b)"
 14629   assumes a: "R[a\<turnstile>c>b] = OrR1 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>(a,b)"
 14630   shows "\<exists>N'. (R = OrR1 <c>.N' d) \<and> N'[a\<turnstile>c>b] = N" 
 14630   shows "\<exists>N'. (R = OrR1 <c>.N' d) \<and> N'[a\<turnstile>c>b] = N" 
 14631 using a
 14631 using a
 14632 apply(nominal_induct R avoiding: a b c d N rule: trm.induct)
 14632 apply(nominal_induct R avoiding: a b c d N rule: trm.strong_induct)
 14633 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14633 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14634 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI)
 14634 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI)
 14635 apply(perm_simp)
 14635 apply(perm_simp)
 14636 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14636 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14637 apply(drule sym)
 14637 apply(drule sym)
 14642 lemma crename_OrR1':
 14642 lemma crename_OrR1':
 14643   assumes a: "R[a\<turnstile>c>b] = OrR1 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>a"
 14643   assumes a: "R[a\<turnstile>c>b] = OrR1 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>a"
 14644   shows "(\<exists>N'. (R = OrR1 <c>.N' d) \<and> N'[a\<turnstile>c>b] = N) \<or>
 14644   shows "(\<exists>N'. (R = OrR1 <c>.N' d) \<and> N'[a\<turnstile>c>b] = N) \<or>
 14645          (\<exists>N'. (R = OrR1 <c>.N' a) \<and> b=d \<and> N'[a\<turnstile>c>b] = N)" 
 14645          (\<exists>N'. (R = OrR1 <c>.N' a) \<and> b=d \<and> N'[a\<turnstile>c>b] = N)" 
 14646 using a
 14646 using a
 14647 apply(nominal_induct R avoiding: a b c d N rule: trm.induct)
 14647 apply(nominal_induct R avoiding: a b c d N rule: trm.strong_induct)
 14648 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14648 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14649 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI)
 14649 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI)
 14650 apply(perm_simp)
 14650 apply(perm_simp)
 14651 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14651 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14652 apply(drule sym)
 14652 apply(drule sym)
 14662 
 14662 
 14663 lemma crename_OrR2_aux:
 14663 lemma crename_OrR2_aux:
 14664   assumes a: "R[a\<turnstile>c>b] = OrR2 <c>.M e" 
 14664   assumes a: "R[a\<turnstile>c>b] = OrR2 <c>.M e" 
 14665   shows "(a=e \<and> a=b) \<or> (a\<noteq>e)" 
 14665   shows "(a=e \<and> a=b) \<or> (a\<noteq>e)" 
 14666 using a
 14666 using a
 14667 apply(nominal_induct R avoiding: a b c e M rule: trm.induct)
 14667 apply(nominal_induct R avoiding: a b c e M rule: trm.strong_induct)
 14668 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14668 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14669 done
 14669 done
 14670 
 14670 
 14671 lemma crename_OrR2:
 14671 lemma crename_OrR2:
 14672   assumes a: "R[a\<turnstile>c>b] = OrR2 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>(a,b)"
 14672   assumes a: "R[a\<turnstile>c>b] = OrR2 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>(a,b)"
 14673   shows "\<exists>N'. (R = OrR2 <c>.N' d) \<and> N'[a\<turnstile>c>b] = N" 
 14673   shows "\<exists>N'. (R = OrR2 <c>.N' d) \<and> N'[a\<turnstile>c>b] = N" 
 14674 using a
 14674 using a
 14675 apply(nominal_induct R avoiding: a b c d N rule: trm.induct)
 14675 apply(nominal_induct R avoiding: a b c d N rule: trm.strong_induct)
 14676 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14676 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14677 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI)
 14677 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI)
 14678 apply(perm_simp)
 14678 apply(perm_simp)
 14679 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14679 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14680 apply(drule sym)
 14680 apply(drule sym)
 14685 lemma crename_OrR2':
 14685 lemma crename_OrR2':
 14686   assumes a: "R[a\<turnstile>c>b] = OrR2 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>a"
 14686   assumes a: "R[a\<turnstile>c>b] = OrR2 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>a"
 14687   shows "(\<exists>N'. (R = OrR2 <c>.N' d) \<and> N'[a\<turnstile>c>b] = N) \<or>
 14687   shows "(\<exists>N'. (R = OrR2 <c>.N' d) \<and> N'[a\<turnstile>c>b] = N) \<or>
 14688          (\<exists>N'. (R = OrR2 <c>.N' a) \<and> b=d \<and> N'[a\<turnstile>c>b] = N)" 
 14688          (\<exists>N'. (R = OrR2 <c>.N' a) \<and> b=d \<and> N'[a\<turnstile>c>b] = N)" 
 14689 using a
 14689 using a
 14690 apply(nominal_induct R avoiding: a b c d N rule: trm.induct)
 14690 apply(nominal_induct R avoiding: a b c d N rule: trm.strong_induct)
 14691 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14691 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14692 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI)
 14692 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI)
 14693 apply(perm_simp)
 14693 apply(perm_simp)
 14694 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14694 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14695 apply(drule sym)
 14695 apply(drule sym)
 14705 
 14705 
 14706 lemma crename_OrL:
 14706 lemma crename_OrL:
 14707   assumes a: "R[a\<turnstile>c>b] = OrL (x).M (y).N z" "x\<sharp>(y,z,N,R)" "y\<sharp>(x,z,M,R)"
 14707   assumes a: "R[a\<turnstile>c>b] = OrL (x).M (y).N z" "x\<sharp>(y,z,N,R)" "y\<sharp>(x,z,M,R)"
 14708   shows "\<exists>M' N'. R = OrL (x).M' (y).N' z \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> x\<sharp>N' \<and> y\<sharp>M'"
 14708   shows "\<exists>M' N'. R = OrL (x).M' (y).N' z \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> x\<sharp>N' \<and> y\<sharp>M'"
 14709 using a
 14709 using a
 14710 apply(nominal_induct R avoiding: a b x y z M N rule: trm.induct)
 14710 apply(nominal_induct R avoiding: a b x y z M N rule: trm.strong_induct)
 14711 apply(auto split: if_splits simp add: trm.inject alpha)
 14711 apply(auto split: if_splits simp add: trm.inject alpha)
 14712 apply(rule_tac x="[(name2,y)]\<bullet>trm2" in exI)
 14712 apply(rule_tac x="[(name2,y)]\<bullet>trm2" in exI)
 14713 apply(perm_simp)
 14713 apply(perm_simp)
 14714 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1]
 14714 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1]
 14715 apply(rule_tac x="[(name1,x)]\<bullet>trm1" in exI)
 14715 apply(rule_tac x="[(name1,x)]\<bullet>trm1" in exI)
 14731 
 14731 
 14732 lemma crename_ImpL:
 14732 lemma crename_ImpL:
 14733   assumes a: "R[a\<turnstile>c>b] = ImpL <c>.M (y).N z" "c\<sharp>(a,b,N,R)" "y\<sharp>(z,M,R)"
 14733   assumes a: "R[a\<turnstile>c>b] = ImpL <c>.M (y).N z" "c\<sharp>(a,b,N,R)" "y\<sharp>(z,M,R)"
 14734   shows "\<exists>M' N'. R = ImpL <c>.M' (y).N' z \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> y\<sharp>M'"
 14734   shows "\<exists>M' N'. R = ImpL <c>.M' (y).N' z \<and> M'[a\<turnstile>c>b] = M \<and> N'[a\<turnstile>c>b] = N \<and> c\<sharp>N' \<and> y\<sharp>M'"
 14735 using a
 14735 using a
 14736 apply(nominal_induct R avoiding: a b c y z M N rule: trm.induct)
 14736 apply(nominal_induct R avoiding: a b c y z M N rule: trm.strong_induct)
 14737 apply(auto split: if_splits simp add: trm.inject alpha)
 14737 apply(auto split: if_splits simp add: trm.inject alpha)
 14738 apply(rule_tac x="[(name1,y)]\<bullet>trm2" in exI)
 14738 apply(rule_tac x="[(name1,y)]\<bullet>trm2" in exI)
 14739 apply(perm_simp)
 14739 apply(perm_simp)
 14740 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1]
 14740 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1]
 14741 apply(rule_tac x="[(coname,c)]\<bullet>trm1" in exI)
 14741 apply(rule_tac x="[(coname,c)]\<bullet>trm1" in exI)
 14757 
 14757 
 14758 lemma crename_ImpR_aux:
 14758 lemma crename_ImpR_aux:
 14759   assumes a: "R[a\<turnstile>c>b] = ImpR (x).<c>.M e" 
 14759   assumes a: "R[a\<turnstile>c>b] = ImpR (x).<c>.M e" 
 14760   shows "(a=e \<and> a=b) \<or> (a\<noteq>e)" 
 14760   shows "(a=e \<and> a=b) \<or> (a\<noteq>e)" 
 14761 using a
 14761 using a
 14762 apply(nominal_induct R avoiding: x a b c e M rule: trm.induct)
 14762 apply(nominal_induct R avoiding: x a b c e M rule: trm.strong_induct)
 14763 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14763 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 14764 done
 14764 done
 14765 
 14765 
 14766 lemma crename_ImpR:
 14766 lemma crename_ImpR:
 14767   assumes a: "R[a\<turnstile>c>b] = ImpR (x).<c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>(a,b)" "x\<sharp>R" 
 14767   assumes a: "R[a\<turnstile>c>b] = ImpR (x).<c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>(a,b)" "x\<sharp>R" 
 14768   shows "\<exists>N'. (R = ImpR (x).<c>.N' d) \<and> N'[a\<turnstile>c>b] = N" 
 14768   shows "\<exists>N'. (R = ImpR (x).<c>.N' d) \<and> N'[a\<turnstile>c>b] = N" 
 14769 using a
 14769 using a
 14770 apply(nominal_induct R avoiding: a b x c d N rule: trm.induct)
 14770 apply(nominal_induct R avoiding: a b x c d N rule: trm.strong_induct)
 14771 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_perm alpha abs_fresh trm.inject)
 14771 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_perm alpha abs_fresh trm.inject)
 14772 apply(rule_tac x="[(name,x)]\<bullet>trm" in exI)
 14772 apply(rule_tac x="[(name,x)]\<bullet>trm" in exI)
 14773 apply(perm_simp)
 14773 apply(perm_simp)
 14774 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14774 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 14775 apply(simp add: calc_atm)
 14775 apply(simp add: calc_atm)
 14785 lemma crename_ImpR':
 14785 lemma crename_ImpR':
 14786   assumes a: "R[a\<turnstile>c>b] = ImpR (x).<c>.N d" "c\<sharp>(R,a,b)" "x\<sharp>R" "d\<sharp>a"
 14786   assumes a: "R[a\<turnstile>c>b] = ImpR (x).<c>.N d" "c\<sharp>(R,a,b)" "x\<sharp>R" "d\<sharp>a"
 14787   shows "(\<exists>N'. (R = ImpR (x).<c>.N' d) \<and> N'[a\<turnstile>c>b] = N) \<or>
 14787   shows "(\<exists>N'. (R = ImpR (x).<c>.N' d) \<and> N'[a\<turnstile>c>b] = N) \<or>
 14788          (\<exists>N'. (R = ImpR (x).<c>.N' a) \<and> b=d \<and> N'[a\<turnstile>c>b] = N)" 
 14788          (\<exists>N'. (R = ImpR (x).<c>.N' a) \<and> b=d \<and> N'[a\<turnstile>c>b] = N)" 
 14789 using a
 14789 using a
 14790 apply(nominal_induct R avoiding: x a b c d N rule: trm.induct)
 14790 apply(nominal_induct R avoiding: x a b c d N rule: trm.strong_induct)
 14791 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject abs_perm calc_atm)
 14791 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject abs_perm calc_atm)
 14792 apply(rule_tac x="[(name,x)]\<bullet>[(coname1,c)]\<bullet>trm" in exI)
 14792 apply(rule_tac x="[(name,x)]\<bullet>[(coname1,c)]\<bullet>trm" in exI)
 14793 apply(perm_simp)
 14793 apply(perm_simp)
 14794 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod abs_supp fin_supp)
 14794 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod abs_supp fin_supp)
 14795 apply(drule sym)
 14795 apply(drule sym)
 14807 
 14807 
 14808 lemma crename_ax2:
 14808 lemma crename_ax2:
 14809   assumes a: "N[a\<turnstile>c>b] = Ax x c"
 14809   assumes a: "N[a\<turnstile>c>b] = Ax x c"
 14810   shows "\<exists>d. N = Ax x d"
 14810   shows "\<exists>d. N = Ax x d"
 14811 using a
 14811 using a
 14812 apply(nominal_induct N avoiding: a b rule: trm.induct)
 14812 apply(nominal_induct N avoiding: a b rule: trm.strong_induct)
 14813 apply(auto split: if_splits)
 14813 apply(auto split: if_splits)
 14814 apply(simp add: trm.inject)
 14814 apply(simp add: trm.inject)
 14815 done
 14815 done
 14816 
 14816 
 14817 lemma crename_interesting1:
 14817 lemma crename_interesting1:
 14818   assumes a: "distinct [a,b,c]"
 14818   assumes a: "distinct [a,b,c]"
 14819   shows "M[a\<turnstile>c>c][c\<turnstile>c>b] = M[c\<turnstile>c>b][a\<turnstile>c>b]"
 14819   shows "M[a\<turnstile>c>c][c\<turnstile>c>b] = M[c\<turnstile>c>b][a\<turnstile>c>b]"
 14820 using a
 14820 using a
 14821 apply(nominal_induct M avoiding: a c b rule: trm.induct)
 14821 apply(nominal_induct M avoiding: a c b rule: trm.strong_induct)
 14822 apply(auto simp add: rename_fresh simp add: trm.inject alpha)
 14822 apply(auto simp add: rename_fresh simp add: trm.inject alpha)
 14823 apply(blast)
 14823 apply(blast)
 14824 apply(rotate_tac 12)
 14824 apply(rotate_tac 12)
 14825 apply(drule_tac x="a" in meta_spec)
 14825 apply(drule_tac x="a" in meta_spec)
 14826 apply(rotate_tac 15)
 14826 apply(rotate_tac 15)
 14834 
 14834 
 14835 lemma crename_interesting2:
 14835 lemma crename_interesting2:
 14836   assumes a: "a\<noteq>c" "a\<noteq>d" "a\<noteq>b" "c\<noteq>d" "b\<noteq>c"
 14836   assumes a: "a\<noteq>c" "a\<noteq>d" "a\<noteq>b" "c\<noteq>d" "b\<noteq>c"
 14837   shows "M[a\<turnstile>c>b][c\<turnstile>c>d] = M[c\<turnstile>c>d][a\<turnstile>c>b]"
 14837   shows "M[a\<turnstile>c>b][c\<turnstile>c>d] = M[c\<turnstile>c>d][a\<turnstile>c>b]"
 14838 using a
 14838 using a
 14839 apply(nominal_induct M avoiding: a c b d rule: trm.induct)
 14839 apply(nominal_induct M avoiding: a c b d rule: trm.strong_induct)
 14840 apply(auto simp add: rename_fresh simp add: trm.inject alpha)
 14840 apply(auto simp add: rename_fresh simp add: trm.inject alpha)
 14841 done
 14841 done
 14842 
 14842 
 14843 lemma crename_interesting3:
 14843 lemma crename_interesting3:
 14844   shows "M[a\<turnstile>c>c][x\<turnstile>n>y] = M[x\<turnstile>n>y][a\<turnstile>c>c]"
 14844   shows "M[a\<turnstile>c>c][x\<turnstile>n>y] = M[x\<turnstile>n>y][a\<turnstile>c>c]"
 14845 apply(nominal_induct M avoiding: a c x y rule: trm.induct)
 14845 apply(nominal_induct M avoiding: a c x y rule: trm.strong_induct)
 14846 apply(auto simp add: rename_fresh simp add: trm.inject alpha)
 14846 apply(auto simp add: rename_fresh simp add: trm.inject alpha)
 14847 done
 14847 done
 14848 
 14848 
 14849 lemma crename_credu:
 14849 lemma crename_credu:
 14850   assumes a: "(M[a\<turnstile>c>b]) \<longrightarrow>\<^isub>c M'"
 14850   assumes a: "(M[a\<turnstile>c>b]) \<longrightarrow>\<^isub>c M'"
 15450 
 15450 
 15451 lemma nrename_interesting1:
 15451 lemma nrename_interesting1:
 15452   assumes a: "distinct [x,y,z]"
 15452   assumes a: "distinct [x,y,z]"
 15453   shows "M[x\<turnstile>n>z][z\<turnstile>n>y] = M[z\<turnstile>n>y][x\<turnstile>n>y]"
 15453   shows "M[x\<turnstile>n>z][z\<turnstile>n>y] = M[z\<turnstile>n>y][x\<turnstile>n>y]"
 15454 using a
 15454 using a
 15455 apply(nominal_induct M avoiding: x y z rule: trm.induct)
 15455 apply(nominal_induct M avoiding: x y z rule: trm.strong_induct)
 15456 apply(auto simp add: rename_fresh simp add: trm.inject alpha)
 15456 apply(auto simp add: rename_fresh simp add: trm.inject alpha)
 15457 apply(blast)
 15457 apply(blast)
 15458 apply(blast)
 15458 apply(blast)
 15459 apply(rotate_tac 12)
 15459 apply(rotate_tac 12)
 15460 apply(drule_tac x="x" in meta_spec)
 15460 apply(drule_tac x="x" in meta_spec)
 15474 
 15474 
 15475 lemma nrename_interesting2:
 15475 lemma nrename_interesting2:
 15476   assumes a: "x\<noteq>z" "x\<noteq>u" "x\<noteq>y" "z\<noteq>u" "y\<noteq>z"
 15476   assumes a: "x\<noteq>z" "x\<noteq>u" "x\<noteq>y" "z\<noteq>u" "y\<noteq>z"
 15477   shows "M[x\<turnstile>n>y][z\<turnstile>n>u] = M[z\<turnstile>n>u][x\<turnstile>n>y]"
 15477   shows "M[x\<turnstile>n>y][z\<turnstile>n>u] = M[z\<turnstile>n>u][x\<turnstile>n>y]"
 15478 using a
 15478 using a
 15479 apply(nominal_induct M avoiding: x y z u rule: trm.induct)
 15479 apply(nominal_induct M avoiding: x y z u rule: trm.strong_induct)
 15480 apply(auto simp add: rename_fresh simp add: trm.inject alpha)
 15480 apply(auto simp add: rename_fresh simp add: trm.inject alpha)
 15481 done
 15481 done
 15482 
 15482 
 15483 lemma not_fic_nrename_aux:
 15483 lemma not_fic_nrename_aux:
 15484   assumes a: "fic M c" 
 15484   assumes a: "fic M c" 
 15485   shows "fic (M[x\<turnstile>n>y]) c" 
 15485   shows "fic (M[x\<turnstile>n>y]) c" 
 15486 using a
 15486 using a
 15487 apply(nominal_induct M avoiding: c x y rule: trm.induct)
 15487 apply(nominal_induct M avoiding: c x y rule: trm.strong_induct)
 15488 apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh)
 15488 apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh)
 15489 done
 15489 done
 15490 
 15490 
 15491 lemma not_fic_nrename:
 15491 lemma not_fic_nrename:
 15492   assumes a: "\<not>(fic (M[x\<turnstile>n>y]) c)" 
 15492   assumes a: "\<not>(fic (M[x\<turnstile>n>y]) c)" 
 15497 
 15497 
 15498 lemma fin_nrename:
 15498 lemma fin_nrename:
 15499   assumes a: "fin M z" "z\<sharp>(x,y)"
 15499   assumes a: "fin M z" "z\<sharp>(x,y)"
 15500   shows "fin (M[x\<turnstile>n>y]) z" 
 15500   shows "fin (M[x\<turnstile>n>y]) z" 
 15501 using a
 15501 using a
 15502 apply(nominal_induct M avoiding: x y z rule: trm.induct)
 15502 apply(nominal_induct M avoiding: x y z rule: trm.strong_induct)
 15503 apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh
 15503 apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh
 15504            split: if_splits)
 15504            split: if_splits)
 15505 done
 15505 done
 15506 
 15506 
 15507 lemma nrename_fresh_interesting1:
 15507 lemma nrename_fresh_interesting1:
 15508   fixes z::"name"
 15508   fixes z::"name"
 15509   assumes a: "z\<sharp>(M[x\<turnstile>n>y])" "z\<sharp>(x,y)"
 15509   assumes a: "z\<sharp>(M[x\<turnstile>n>y])" "z\<sharp>(x,y)"
 15510   shows "z\<sharp>M"
 15510   shows "z\<sharp>M"
 15511 using a
 15511 using a
 15512 apply(nominal_induct M avoiding: x y z rule: trm.induct)
 15512 apply(nominal_induct M avoiding: x y z rule: trm.strong_induct)
 15513 apply(auto split: if_splits simp add: abs_fresh abs_supp fin_supp)
 15513 apply(auto split: if_splits simp add: abs_fresh abs_supp fin_supp)
 15514 done
 15514 done
 15515 
 15515 
 15516 lemma nrename_fresh_interesting2:
 15516 lemma nrename_fresh_interesting2:
 15517   fixes c::"coname"
 15517   fixes c::"coname"
 15518   assumes a: "c\<sharp>(M[x\<turnstile>n>y])" 
 15518   assumes a: "c\<sharp>(M[x\<turnstile>n>y])" 
 15519   shows "c\<sharp>M"
 15519   shows "c\<sharp>M"
 15520 using a
 15520 using a
 15521 apply(nominal_induct M avoiding: x y c rule: trm.induct)
 15521 apply(nominal_induct M avoiding: x y c rule: trm.strong_induct)
 15522 apply(auto split: if_splits simp add: abs_fresh abs_supp fin_supp fresh_atm)
 15522 apply(auto split: if_splits simp add: abs_fresh abs_supp fin_supp fresh_atm)
 15523 done
 15523 done
 15524 
 15524 
 15525 lemma fin_nrename2:
 15525 lemma fin_nrename2:
 15526   assumes a: "fin (M[x\<turnstile>n>y]) z" "z\<sharp>(x,y)"
 15526   assumes a: "fin (M[x\<turnstile>n>y]) z" "z\<sharp>(x,y)"
 15527   shows "fin M z" 
 15527   shows "fin M z" 
 15528 using a
 15528 using a
 15529 apply(nominal_induct M avoiding: x y z rule: trm.induct)
 15529 apply(nominal_induct M avoiding: x y z rule: trm.strong_induct)
 15530 apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh
 15530 apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh
 15531            split: if_splits)
 15531            split: if_splits)
 15532 apply(auto dest: nrename_fresh_interesting1 simp add: fresh_atm fresh_prod)
 15532 apply(auto dest: nrename_fresh_interesting1 simp add: fresh_atm fresh_prod)
 15533 done
 15533 done
 15534 
 15534 
 15535 lemma nrename_Cut:
 15535 lemma nrename_Cut:
 15536   assumes a: "R[x\<turnstile>n>y] = Cut <c>.M (z).N" "c\<sharp>(N,R)" "z\<sharp>(x,y,M,R)"
 15536   assumes a: "R[x\<turnstile>n>y] = Cut <c>.M (z).N" "c\<sharp>(N,R)" "z\<sharp>(x,y,M,R)"
 15537   shows "\<exists>M' N'. R = Cut <c>.M' (z).N' \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N \<and> c\<sharp>N' \<and> z\<sharp>M'"
 15537   shows "\<exists>M' N'. R = Cut <c>.M' (z).N' \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N \<and> c\<sharp>N' \<and> z\<sharp>M'"
 15538 using a
 15538 using a
 15539 apply(nominal_induct R avoiding: c y x z M N rule: trm.induct)
 15539 apply(nominal_induct R avoiding: c y x z M N rule: trm.strong_induct)
 15540 apply(auto split: if_splits)
 15540 apply(auto split: if_splits)
 15541 apply(simp add: trm.inject)
 15541 apply(simp add: trm.inject)
 15542 apply(auto simp add: alpha fresh_atm)
 15542 apply(auto simp add: alpha fresh_atm)
 15543 apply(rule_tac x="[(coname,c)]\<bullet>trm1" in exI)
 15543 apply(rule_tac x="[(coname,c)]\<bullet>trm1" in exI)
 15544 apply(perm_simp)
 15544 apply(perm_simp)
 15559 
 15559 
 15560 lemma nrename_NotR:
 15560 lemma nrename_NotR:
 15561   assumes a: "R[x\<turnstile>n>y] = NotR (z).N c" "z\<sharp>(R,x,y)" 
 15561   assumes a: "R[x\<turnstile>n>y] = NotR (z).N c" "z\<sharp>(R,x,y)" 
 15562   shows "\<exists>N'. (R = NotR (z).N' c) \<and> N'[x\<turnstile>n>y] = N" 
 15562   shows "\<exists>N'. (R = NotR (z).N' c) \<and> N'[x\<turnstile>n>y] = N" 
 15563 using a
 15563 using a
 15564 apply(nominal_induct R avoiding: x y c z N rule: trm.induct)
 15564 apply(nominal_induct R avoiding: x y c z N rule: trm.strong_induct)
 15565 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15565 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15566 apply(rule_tac x="[(name,z)]\<bullet>trm" in exI)
 15566 apply(rule_tac x="[(name,z)]\<bullet>trm" in exI)
 15567 apply(perm_simp)
 15567 apply(perm_simp)
 15568 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15568 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15569 apply(drule sym)
 15569 apply(drule sym)
 15573 
 15573 
 15574 lemma nrename_NotL:
 15574 lemma nrename_NotL:
 15575   assumes a: "R[x\<turnstile>n>y] = NotL <c>.N z" "c\<sharp>R" "z\<sharp>(x,y)"
 15575   assumes a: "R[x\<turnstile>n>y] = NotL <c>.N z" "c\<sharp>R" "z\<sharp>(x,y)"
 15576   shows "\<exists>N'. (R = NotL <c>.N' z) \<and> N'[x\<turnstile>n>y] = N" 
 15576   shows "\<exists>N'. (R = NotL <c>.N' z) \<and> N'[x\<turnstile>n>y] = N" 
 15577 using a
 15577 using a
 15578 apply(nominal_induct R avoiding: x y c z N rule: trm.induct)
 15578 apply(nominal_induct R avoiding: x y c z N rule: trm.strong_induct)
 15579 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15579 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15580 apply(rule_tac x="[(coname,c)]\<bullet>trm" in exI)
 15580 apply(rule_tac x="[(coname,c)]\<bullet>trm" in exI)
 15581 apply(perm_simp)
 15581 apply(perm_simp)
 15582 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15582 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15583 apply(drule sym)
 15583 apply(drule sym)
 15587 
 15587 
 15588 lemma nrename_NotL':
 15588 lemma nrename_NotL':
 15589   assumes a: "R[x\<turnstile>n>y] = NotL <c>.N u" "c\<sharp>R" "x\<noteq>y" 
 15589   assumes a: "R[x\<turnstile>n>y] = NotL <c>.N u" "c\<sharp>R" "x\<noteq>y" 
 15590   shows "(\<exists>N'. (R = NotL <c>.N' u) \<and> N'[x\<turnstile>n>y] = N) \<or> (\<exists>N'. (R = NotL <c>.N' x) \<and> y=u \<and> N'[x\<turnstile>n>y] = N)"
 15590   shows "(\<exists>N'. (R = NotL <c>.N' u) \<and> N'[x\<turnstile>n>y] = N) \<or> (\<exists>N'. (R = NotL <c>.N' x) \<and> y=u \<and> N'[x\<turnstile>n>y] = N)"
 15591 using a
 15591 using a
 15592 apply(nominal_induct R avoiding: y u c x N rule: trm.induct)
 15592 apply(nominal_induct R avoiding: y u c x N rule: trm.strong_induct)
 15593 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject)
 15593 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject)
 15594 apply(rule_tac x="[(coname,c)]\<bullet>trm" in exI)
 15594 apply(rule_tac x="[(coname,c)]\<bullet>trm" in exI)
 15595 apply(perm_simp)
 15595 apply(perm_simp)
 15596 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15596 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15597 apply(drule sym)
 15597 apply(drule sym)
 15607 
 15607 
 15608 lemma nrename_NotL_aux:
 15608 lemma nrename_NotL_aux:
 15609   assumes a: "R[x\<turnstile>n>y] = NotL <c>.N u" 
 15609   assumes a: "R[x\<turnstile>n>y] = NotL <c>.N u" 
 15610   shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" 
 15610   shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" 
 15611 using a
 15611 using a
 15612 apply(nominal_induct R avoiding: y u c x N rule: trm.induct)
 15612 apply(nominal_induct R avoiding: y u c x N rule: trm.strong_induct)
 15613 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15613 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15614 done
 15614 done
 15615 
 15615 
 15616 lemma nrename_AndL1:
 15616 lemma nrename_AndL1:
 15617   assumes a: "R[x\<turnstile>n>y] = AndL1 (z).N u" "z\<sharp>(R,x,y)" "u\<sharp>(x,y)"
 15617   assumes a: "R[x\<turnstile>n>y] = AndL1 (z).N u" "z\<sharp>(R,x,y)" "u\<sharp>(x,y)"
 15618   shows "\<exists>N'. (R = AndL1 (z).N' u) \<and> N'[x\<turnstile>n>y] = N" 
 15618   shows "\<exists>N'. (R = AndL1 (z).N' u) \<and> N'[x\<turnstile>n>y] = N" 
 15619 using a
 15619 using a
 15620 apply(nominal_induct R avoiding: z u x y N rule: trm.induct)
 15620 apply(nominal_induct R avoiding: z u x y N rule: trm.strong_induct)
 15621 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15621 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15622 apply(rule_tac x="[(name1,z)]\<bullet>trm" in exI)
 15622 apply(rule_tac x="[(name1,z)]\<bullet>trm" in exI)
 15623 apply(perm_simp)
 15623 apply(perm_simp)
 15624 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15624 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15625 apply(drule sym)
 15625 apply(drule sym)
 15629 
 15629 
 15630 lemma nrename_AndL1':
 15630 lemma nrename_AndL1':
 15631   assumes a: "R[x\<turnstile>n>y] = AndL1 (v).N u" "v\<sharp>(R,u,x,y)" "x\<noteq>y" 
 15631   assumes a: "R[x\<turnstile>n>y] = AndL1 (v).N u" "v\<sharp>(R,u,x,y)" "x\<noteq>y" 
 15632   shows "(\<exists>N'. (R = AndL1 (v).N' u) \<and> N'[x\<turnstile>n>y] = N) \<or> (\<exists>N'. (R = AndL1 (v).N' x) \<and> y=u \<and> N'[x\<turnstile>n>y] = N)"
 15632   shows "(\<exists>N'. (R = AndL1 (v).N' u) \<and> N'[x\<turnstile>n>y] = N) \<or> (\<exists>N'. (R = AndL1 (v).N' x) \<and> y=u \<and> N'[x\<turnstile>n>y] = N)"
 15633 using a
 15633 using a
 15634 apply(nominal_induct R avoiding: y u v x N rule: trm.induct)
 15634 apply(nominal_induct R avoiding: y u v x N rule: trm.strong_induct)
 15635 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject)
 15635 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject)
 15636 apply(rule_tac x="[(name1,v)]\<bullet>trm" in exI)
 15636 apply(rule_tac x="[(name1,v)]\<bullet>trm" in exI)
 15637 apply(perm_simp)
 15637 apply(perm_simp)
 15638 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15638 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15639 apply(drule sym)
 15639 apply(drule sym)
 15649 
 15649 
 15650 lemma nrename_AndL1_aux:
 15650 lemma nrename_AndL1_aux:
 15651   assumes a: "R[x\<turnstile>n>y] = AndL1 (v).N u" 
 15651   assumes a: "R[x\<turnstile>n>y] = AndL1 (v).N u" 
 15652   shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" 
 15652   shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" 
 15653 using a
 15653 using a
 15654 apply(nominal_induct R avoiding: y u v x N rule: trm.induct)
 15654 apply(nominal_induct R avoiding: y u v x N rule: trm.strong_induct)
 15655 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15655 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15656 done
 15656 done
 15657 
 15657 
 15658 lemma nrename_AndL2:
 15658 lemma nrename_AndL2:
 15659   assumes a: "R[x\<turnstile>n>y] = AndL2 (z).N u" "z\<sharp>(R,x,y)" "u\<sharp>(x,y)"
 15659   assumes a: "R[x\<turnstile>n>y] = AndL2 (z).N u" "z\<sharp>(R,x,y)" "u\<sharp>(x,y)"
 15660   shows "\<exists>N'. (R = AndL2 (z).N' u) \<and> N'[x\<turnstile>n>y] = N" 
 15660   shows "\<exists>N'. (R = AndL2 (z).N' u) \<and> N'[x\<turnstile>n>y] = N" 
 15661 using a
 15661 using a
 15662 apply(nominal_induct R avoiding: z u x y N rule: trm.induct)
 15662 apply(nominal_induct R avoiding: z u x y N rule: trm.strong_induct)
 15663 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15663 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15664 apply(rule_tac x="[(name1,z)]\<bullet>trm" in exI)
 15664 apply(rule_tac x="[(name1,z)]\<bullet>trm" in exI)
 15665 apply(perm_simp)
 15665 apply(perm_simp)
 15666 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15666 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15667 apply(drule sym)
 15667 apply(drule sym)
 15671 
 15671 
 15672 lemma nrename_AndL2':
 15672 lemma nrename_AndL2':
 15673   assumes a: "R[x\<turnstile>n>y] = AndL2 (v).N u" "v\<sharp>(R,u,x,y)" "x\<noteq>y" 
 15673   assumes a: "R[x\<turnstile>n>y] = AndL2 (v).N u" "v\<sharp>(R,u,x,y)" "x\<noteq>y" 
 15674   shows "(\<exists>N'. (R = AndL2 (v).N' u) \<and> N'[x\<turnstile>n>y] = N) \<or> (\<exists>N'. (R = AndL2 (v).N' x) \<and> y=u \<and> N'[x\<turnstile>n>y] = N)"
 15674   shows "(\<exists>N'. (R = AndL2 (v).N' u) \<and> N'[x\<turnstile>n>y] = N) \<or> (\<exists>N'. (R = AndL2 (v).N' x) \<and> y=u \<and> N'[x\<turnstile>n>y] = N)"
 15675 using a
 15675 using a
 15676 apply(nominal_induct R avoiding: y u v x N rule: trm.induct)
 15676 apply(nominal_induct R avoiding: y u v x N rule: trm.strong_induct)
 15677 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject)
 15677 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject)
 15678 apply(rule_tac x="[(name1,v)]\<bullet>trm" in exI)
 15678 apply(rule_tac x="[(name1,v)]\<bullet>trm" in exI)
 15679 apply(perm_simp)
 15679 apply(perm_simp)
 15680 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15680 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15681 apply(drule sym)
 15681 apply(drule sym)
 15691 
 15691 
 15692 lemma nrename_AndL2_aux:
 15692 lemma nrename_AndL2_aux:
 15693   assumes a: "R[x\<turnstile>n>y] = AndL2 (v).N u" 
 15693   assumes a: "R[x\<turnstile>n>y] = AndL2 (v).N u" 
 15694   shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" 
 15694   shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" 
 15695 using a
 15695 using a
 15696 apply(nominal_induct R avoiding: y u v x N rule: trm.induct)
 15696 apply(nominal_induct R avoiding: y u v x N rule: trm.strong_induct)
 15697 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15697 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15698 done
 15698 done
 15699 
 15699 
 15700 lemma nrename_AndR:
 15700 lemma nrename_AndR:
 15701   assumes a: "R[x\<turnstile>n>y] = AndR <c>.M <d>.N e" "c\<sharp>(d,e,N,R)" "d\<sharp>(c,e,M,R)" 
 15701   assumes a: "R[x\<turnstile>n>y] = AndR <c>.M <d>.N e" "c\<sharp>(d,e,N,R)" "d\<sharp>(c,e,M,R)" 
 15702   shows "\<exists>M' N'. R = AndR <c>.M' <d>.N' e \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N \<and> c\<sharp>N' \<and> d\<sharp>M'"
 15702   shows "\<exists>M' N'. R = AndR <c>.M' <d>.N' e \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N \<and> c\<sharp>N' \<and> d\<sharp>M'"
 15703 using a
 15703 using a
 15704 apply(nominal_induct R avoiding: x y c d e M N rule: trm.induct)
 15704 apply(nominal_induct R avoiding: x y c d e M N rule: trm.strong_induct)
 15705 apply(auto split: if_splits simp add: trm.inject alpha)
 15705 apply(auto split: if_splits simp add: trm.inject alpha)
 15706 apply(simp add: fresh_atm fresh_prod)
 15706 apply(simp add: fresh_atm fresh_prod)
 15707 apply(rule_tac x="[(coname1,c)]\<bullet>trm1" in exI)
 15707 apply(rule_tac x="[(coname1,c)]\<bullet>trm1" in exI)
 15708 apply(perm_simp)
 15708 apply(perm_simp)
 15709 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1]
 15709 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1]
 15723 
 15723 
 15724 lemma nrename_OrR1:
 15724 lemma nrename_OrR1:
 15725   assumes a: "R[x\<turnstile>n>y] = OrR1 <c>.N d" "c\<sharp>(R,d)" 
 15725   assumes a: "R[x\<turnstile>n>y] = OrR1 <c>.N d" "c\<sharp>(R,d)" 
 15726   shows "\<exists>N'. (R = OrR1 <c>.N' d) \<and> N'[x\<turnstile>n>y] = N" 
 15726   shows "\<exists>N'. (R = OrR1 <c>.N' d) \<and> N'[x\<turnstile>n>y] = N" 
 15727 using a
 15727 using a
 15728 apply(nominal_induct R avoiding: x y c d N rule: trm.induct)
 15728 apply(nominal_induct R avoiding: x y c d N rule: trm.strong_induct)
 15729 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15729 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15730 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI)
 15730 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI)
 15731 apply(perm_simp)
 15731 apply(perm_simp)
 15732 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15732 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15733 apply(drule sym)
 15733 apply(drule sym)
 15737 
 15737 
 15738 lemma nrename_OrR2:
 15738 lemma nrename_OrR2:
 15739   assumes a: "R[x\<turnstile>n>y] = OrR2 <c>.N d" "c\<sharp>(R,d)" 
 15739   assumes a: "R[x\<turnstile>n>y] = OrR2 <c>.N d" "c\<sharp>(R,d)" 
 15740   shows "\<exists>N'. (R = OrR2 <c>.N' d) \<and> N'[x\<turnstile>n>y] = N" 
 15740   shows "\<exists>N'. (R = OrR2 <c>.N' d) \<and> N'[x\<turnstile>n>y] = N" 
 15741 using a
 15741 using a
 15742 apply(nominal_induct R avoiding: x y c d N rule: trm.induct)
 15742 apply(nominal_induct R avoiding: x y c d N rule: trm.strong_induct)
 15743 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15743 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15744 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI)
 15744 apply(rule_tac x="[(coname1,c)]\<bullet>trm" in exI)
 15745 apply(perm_simp)
 15745 apply(perm_simp)
 15746 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15746 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15747 apply(drule sym)
 15747 apply(drule sym)
 15751 
 15751 
 15752 lemma nrename_OrL:
 15752 lemma nrename_OrL:
 15753   assumes a: "R[u\<turnstile>n>v] = OrL (x).M (y).N z" "x\<sharp>(y,z,u,v,N,R)" "y\<sharp>(x,z,u,v,M,R)" "z\<sharp>(u,v)"
 15753   assumes a: "R[u\<turnstile>n>v] = OrL (x).M (y).N z" "x\<sharp>(y,z,u,v,N,R)" "y\<sharp>(x,z,u,v,M,R)" "z\<sharp>(u,v)"
 15754   shows "\<exists>M' N'. R = OrL (x).M' (y).N' z \<and> M'[u\<turnstile>n>v] = M \<and> N'[u\<turnstile>n>v] = N \<and> x\<sharp>N' \<and> y\<sharp>M'"
 15754   shows "\<exists>M' N'. R = OrL (x).M' (y).N' z \<and> M'[u\<turnstile>n>v] = M \<and> N'[u\<turnstile>n>v] = N \<and> x\<sharp>N' \<and> y\<sharp>M'"
 15755 using a
 15755 using a
 15756 apply(nominal_induct R avoiding: u v x y z M N rule: trm.induct)
 15756 apply(nominal_induct R avoiding: u v x y z M N rule: trm.strong_induct)
 15757 apply(auto split: if_splits simp add: trm.inject alpha fresh_prod fresh_atm)
 15757 apply(auto split: if_splits simp add: trm.inject alpha fresh_prod fresh_atm)
 15758 apply(rule_tac x="[(name1,x)]\<bullet>trm1" in exI)
 15758 apply(rule_tac x="[(name1,x)]\<bullet>trm1" in exI)
 15759 apply(perm_simp)
 15759 apply(perm_simp)
 15760 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1]
 15760 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1]
 15761 apply(rule_tac x="[(name2,y)]\<bullet>trm2" in exI)
 15761 apply(rule_tac x="[(name2,y)]\<bullet>trm2" in exI)
 15772 lemma nrename_OrL':
 15772 lemma nrename_OrL':
 15773   assumes a: "R[x\<turnstile>n>y] = OrL (v).M (w).N u" "v\<sharp>(R,N,u,x,y)" "w\<sharp>(R,M,u,x,y)" "x\<noteq>y" 
 15773   assumes a: "R[x\<turnstile>n>y] = OrL (v).M (w).N u" "v\<sharp>(R,N,u,x,y)" "w\<sharp>(R,M,u,x,y)" "x\<noteq>y" 
 15774   shows "(\<exists>M' N'. (R = OrL (v).M' (w).N' u) \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N) \<or> 
 15774   shows "(\<exists>M' N'. (R = OrL (v).M' (w).N' u) \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N) \<or> 
 15775          (\<exists>M' N'. (R = OrL (v).M' (w).N' x) \<and> y=u \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N)"
 15775          (\<exists>M' N'. (R = OrL (v).M' (w).N' x) \<and> y=u \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N)"
 15776 using a
 15776 using a
 15777 apply(nominal_induct R avoiding: y x u v w M N rule: trm.induct)
 15777 apply(nominal_induct R avoiding: y x u v w M N rule: trm.strong_induct)
 15778 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject)
 15778 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject)
 15779 apply(rule_tac x="[(name1,v)]\<bullet>trm1" in exI)
 15779 apply(rule_tac x="[(name1,v)]\<bullet>trm1" in exI)
 15780 apply(perm_simp)
 15780 apply(perm_simp)
 15781 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15781 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15782 apply(rule_tac x="[(name2,w)]\<bullet>trm2" in exI)
 15782 apply(rule_tac x="[(name2,w)]\<bullet>trm2" in exI)
 15806 
 15806 
 15807 lemma nrename_OrL_aux:
 15807 lemma nrename_OrL_aux:
 15808   assumes a: "R[x\<turnstile>n>y] = OrL (v).M (w).N u" 
 15808   assumes a: "R[x\<turnstile>n>y] = OrL (v).M (w).N u" 
 15809   shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" 
 15809   shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" 
 15810 using a
 15810 using a
 15811 apply(nominal_induct R avoiding: y x w u v M N rule: trm.induct)
 15811 apply(nominal_induct R avoiding: y x w u v M N rule: trm.strong_induct)
 15812 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15812 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15813 done
 15813 done
 15814 
 15814 
 15815 lemma nrename_ImpL:
 15815 lemma nrename_ImpL:
 15816   assumes a: "R[x\<turnstile>n>y] = ImpL <c>.M (u).N z" "c\<sharp>(N,R)" "u\<sharp>(y,x,z,M,R)" "z\<sharp>(x,y)"
 15816   assumes a: "R[x\<turnstile>n>y] = ImpL <c>.M (u).N z" "c\<sharp>(N,R)" "u\<sharp>(y,x,z,M,R)" "z\<sharp>(x,y)"
 15817   shows "\<exists>M' N'. R = ImpL <c>.M' (u).N' z \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N \<and> c\<sharp>N' \<and> u\<sharp>M'"
 15817   shows "\<exists>M' N'. R = ImpL <c>.M' (u).N' z \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N \<and> c\<sharp>N' \<and> u\<sharp>M'"
 15818 using a
 15818 using a
 15819 apply(nominal_induct R avoiding: u x c y z M N rule: trm.induct)
 15819 apply(nominal_induct R avoiding: u x c y z M N rule: trm.strong_induct)
 15820 apply(auto split: if_splits simp add: trm.inject alpha fresh_prod fresh_atm)
 15820 apply(auto split: if_splits simp add: trm.inject alpha fresh_prod fresh_atm)
 15821 apply(rule_tac x="[(coname,c)]\<bullet>trm1" in exI)
 15821 apply(rule_tac x="[(coname,c)]\<bullet>trm1" in exI)
 15822 apply(perm_simp)
 15822 apply(perm_simp)
 15823 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1]
 15823 apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1]
 15824 apply(rule_tac x="[(name1,u)]\<bullet>trm2" in exI)
 15824 apply(rule_tac x="[(name1,u)]\<bullet>trm2" in exI)
 15835 lemma nrename_ImpL':
 15835 lemma nrename_ImpL':
 15836   assumes a: "R[x\<turnstile>n>y] = ImpL <c>.M (w).N u" "c\<sharp>(R,N)" "w\<sharp>(R,M,u,x,y)" "x\<noteq>y" 
 15836   assumes a: "R[x\<turnstile>n>y] = ImpL <c>.M (w).N u" "c\<sharp>(R,N)" "w\<sharp>(R,M,u,x,y)" "x\<noteq>y" 
 15837   shows "(\<exists>M' N'. (R = ImpL <c>.M' (w).N' u) \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N) \<or> 
 15837   shows "(\<exists>M' N'. (R = ImpL <c>.M' (w).N' u) \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N) \<or> 
 15838          (\<exists>M' N'. (R = ImpL <c>.M' (w).N' x) \<and> y=u \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N)"
 15838          (\<exists>M' N'. (R = ImpL <c>.M' (w).N' x) \<and> y=u \<and> M'[x\<turnstile>n>y] = M \<and> N'[x\<turnstile>n>y] = N)"
 15839 using a
 15839 using a
 15840 apply(nominal_induct R avoiding: y x u c w M N rule: trm.induct)
 15840 apply(nominal_induct R avoiding: y x u c w M N rule: trm.strong_induct)
 15841 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject)
 15841 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject)
 15842 apply(rule_tac x="[(coname,c)]\<bullet>trm1" in exI)
 15842 apply(rule_tac x="[(coname,c)]\<bullet>trm1" in exI)
 15843 apply(perm_simp)
 15843 apply(perm_simp)
 15844 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15844 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15845 apply(rule_tac x="[(name1,w)]\<bullet>trm2" in exI)
 15845 apply(rule_tac x="[(name1,w)]\<bullet>trm2" in exI)
 15869 
 15869 
 15870 lemma nrename_ImpL_aux:
 15870 lemma nrename_ImpL_aux:
 15871   assumes a: "R[x\<turnstile>n>y] = ImpL <c>.M (w).N u" 
 15871   assumes a: "R[x\<turnstile>n>y] = ImpL <c>.M (w).N u" 
 15872   shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" 
 15872   shows "(x=u \<and> x=y) \<or> (x\<noteq>u)" 
 15873 using a
 15873 using a
 15874 apply(nominal_induct R avoiding: y x w u c M N rule: trm.induct)
 15874 apply(nominal_induct R avoiding: y x w u c M N rule: trm.strong_induct)
 15875 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15875 apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject)
 15876 done
 15876 done
 15877 
 15877 
 15878 lemma nrename_ImpR:
 15878 lemma nrename_ImpR:
 15879   assumes a: "R[u\<turnstile>n>v] = ImpR (x).<c>.N d" "c\<sharp>(R,d)" "x\<sharp>(R,u,v)" 
 15879   assumes a: "R[u\<turnstile>n>v] = ImpR (x).<c>.N d" "c\<sharp>(R,d)" "x\<sharp>(R,u,v)" 
 15880   shows "\<exists>N'. (R = ImpR (x).<c>.N' d) \<and> N'[u\<turnstile>n>v] = N" 
 15880   shows "\<exists>N'. (R = ImpR (x).<c>.N' d) \<and> N'[u\<turnstile>n>v] = N" 
 15881 using a
 15881 using a
 15882 apply(nominal_induct R avoiding: u v x c d N rule: trm.induct)
 15882 apply(nominal_induct R avoiding: u v x c d N rule: trm.strong_induct)
 15883 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_perm alpha abs_fresh trm.inject)
 15883 apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_perm alpha abs_fresh trm.inject)
 15884 apply(rule_tac x="[(name,x)]\<bullet>trm" in exI)
 15884 apply(rule_tac x="[(name,x)]\<bullet>trm" in exI)
 15885 apply(perm_simp)
 15885 apply(perm_simp)
 15886 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15886 apply(simp add: abs_fresh fresh_left calc_atm fresh_prod)
 15887 apply(simp add: calc_atm)
 15887 apply(simp add: calc_atm)
 15927 
 15927 
 15928 lemma nrename_ax2:
 15928 lemma nrename_ax2:
 15929   assumes a: "N[x\<turnstile>n>y] = Ax z c"
 15929   assumes a: "N[x\<turnstile>n>y] = Ax z c"
 15930   shows "\<exists>z. N = Ax z c"
 15930   shows "\<exists>z. N = Ax z c"
 15931 using a
 15931 using a
 15932 apply(nominal_induct N avoiding: x y rule: trm.induct)
 15932 apply(nominal_induct N avoiding: x y rule: trm.strong_induct)
 15933 apply(auto split: if_splits)
 15933 apply(auto split: if_splits)
 15934 apply(simp add: trm.inject)
 15934 apply(simp add: trm.inject)
 15935 done
 15935 done
 15936 
 15936 
 15937 lemma fic_nrename:
 15937 lemma fic_nrename:
 15938   assumes a: "fic (M[x\<turnstile>n>y]) c" 
 15938   assumes a: "fic (M[x\<turnstile>n>y]) c" 
 15939   shows "fic M c" 
 15939   shows "fic M c" 
 15940 using a
 15940 using a
 15941 apply(nominal_induct M avoiding: c x y rule: trm.induct)
 15941 apply(nominal_induct M avoiding: c x y rule: trm.strong_induct)
 15942 apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh
 15942 apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh
 15943            split: if_splits)
 15943            split: if_splits)
 15944 apply(auto dest: nrename_fresh_interesting2 simp add: fresh_prod fresh_atm)
 15944 apply(auto dest: nrename_fresh_interesting2 simp add: fresh_prod fresh_atm)
 15945 done
 15945 done
 15946 
 15946 
 17863   fixes pi1::"name prm"
 17863   fixes pi1::"name prm"
 17864   and   pi2::"coname prm"
 17864   and   pi2::"coname prm"
 17865   shows "(pi1\<bullet>(stn M \<theta>n)) = stn (pi1\<bullet>M) (pi1\<bullet>\<theta>n)"
 17865   shows "(pi1\<bullet>(stn M \<theta>n)) = stn (pi1\<bullet>M) (pi1\<bullet>\<theta>n)"
 17866   and   "(pi2\<bullet>(stn M \<theta>n)) = stn (pi2\<bullet>M) (pi2\<bullet>\<theta>n)"
 17866   and   "(pi2\<bullet>(stn M \<theta>n)) = stn (pi2\<bullet>M) (pi2\<bullet>\<theta>n)"
 17867 apply -
 17867 apply -
 17868 apply(nominal_induct M avoiding: \<theta>n rule: trm.induct)
 17868 apply(nominal_induct M avoiding: \<theta>n rule: trm.strong_induct)
 17869 apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm)
 17869 apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm)
 17870 apply(nominal_induct M avoiding: \<theta>n rule: trm.induct)
 17870 apply(nominal_induct M avoiding: \<theta>n rule: trm.strong_induct)
 17871 apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm)
 17871 apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm)
 17872 done
 17872 done
 17873 
 17873 
 17874 lemma stc_eqvt[eqvt]:
 17874 lemma stc_eqvt[eqvt]:
 17875   fixes pi1::"name prm"
 17875   fixes pi1::"name prm"
 17876   and   pi2::"coname prm"
 17876   and   pi2::"coname prm"
 17877   shows "(pi1\<bullet>(stc M \<theta>c)) = stc (pi1\<bullet>M) (pi1\<bullet>\<theta>c)"
 17877   shows "(pi1\<bullet>(stc M \<theta>c)) = stc (pi1\<bullet>M) (pi1\<bullet>\<theta>c)"
 17878   and   "(pi2\<bullet>(stc M \<theta>c)) = stc (pi2\<bullet>M) (pi2\<bullet>\<theta>c)"
 17878   and   "(pi2\<bullet>(stc M \<theta>c)) = stc (pi2\<bullet>M) (pi2\<bullet>\<theta>c)"
 17879 apply -
 17879 apply -
 17880 apply(nominal_induct M avoiding: \<theta>c rule: trm.induct)
 17880 apply(nominal_induct M avoiding: \<theta>c rule: trm.strong_induct)
 17881 apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm)
 17881 apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm)
 17882 apply(nominal_induct M avoiding: \<theta>c rule: trm.induct)
 17882 apply(nominal_induct M avoiding: \<theta>c rule: trm.strong_induct)
 17883 apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm)
 17883 apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm)
 17884 done
 17884 done
 17885 
 17885 
 17886 lemma stn_fresh:
 17886 lemma stn_fresh:
 17887   fixes a::"coname"
 17887   fixes a::"coname"
 17888   and   x::"name"
 17888   and   x::"name"
 17889   shows "a\<sharp>(\<theta>n,M) \<Longrightarrow> a\<sharp>stn M \<theta>n"
 17889   shows "a\<sharp>(\<theta>n,M) \<Longrightarrow> a\<sharp>stn M \<theta>n"
 17890   and   "x\<sharp>(\<theta>n,M) \<Longrightarrow> x\<sharp>stn M \<theta>n"
 17890   and   "x\<sharp>(\<theta>n,M) \<Longrightarrow> x\<sharp>stn M \<theta>n"
 17891 apply(nominal_induct M avoiding: \<theta>n a x rule: trm.induct)
 17891 apply(nominal_induct M avoiding: \<theta>n a x rule: trm.strong_induct)
 17892 apply(auto simp add: abs_fresh fresh_prod fresh_atm)
 17892 apply(auto simp add: abs_fresh fresh_prod fresh_atm)
 17893 apply(rule lookupc_freshness)
 17893 apply(rule lookupc_freshness)
 17894 apply(simp add: fresh_atm)
 17894 apply(simp add: fresh_atm)
 17895 apply(rule lookupc_freshness)
 17895 apply(rule lookupc_freshness)
 17896 apply(simp add: fresh_atm)
 17896 apply(simp add: fresh_atm)
 17899 lemma stc_fresh:
 17899 lemma stc_fresh:
 17900   fixes a::"coname"
 17900   fixes a::"coname"
 17901   and   x::"name"
 17901   and   x::"name"
 17902   shows "a\<sharp>(\<theta>c,M) \<Longrightarrow> a\<sharp>stc M \<theta>c"
 17902   shows "a\<sharp>(\<theta>c,M) \<Longrightarrow> a\<sharp>stc M \<theta>c"
 17903   and   "x\<sharp>(\<theta>c,M) \<Longrightarrow> x\<sharp>stc M \<theta>c"
 17903   and   "x\<sharp>(\<theta>c,M) \<Longrightarrow> x\<sharp>stc M \<theta>c"
 17904 apply(nominal_induct M avoiding: \<theta>c a x rule: trm.induct)
 17904 apply(nominal_induct M avoiding: \<theta>c a x rule: trm.strong_induct)
 17905 apply(auto simp add: abs_fresh fresh_prod fresh_atm)
 17905 apply(auto simp add: abs_fresh fresh_prod fresh_atm)
 17906 apply(rule lookupd_freshness)
 17906 apply(rule lookupd_freshness)
 17907 apply(simp add: fresh_atm)
 17907 apply(simp add: fresh_atm)
 17908 apply(rule lookupd_freshness)
 17908 apply(rule lookupd_freshness)
 17909 apply(simp add: fresh_atm)
 17909 apply(simp add: fresh_atm)
 18126 lemma psubst_eqvt[eqvt]:
 18126 lemma psubst_eqvt[eqvt]:
 18127   fixes pi1::"name prm"
 18127   fixes pi1::"name prm"
 18128   and   pi2::"coname prm"
 18128   and   pi2::"coname prm"
 18129   shows "pi1\<bullet>(\<theta>n,\<theta>c<M>) = (pi1\<bullet>\<theta>n),(pi1\<bullet>\<theta>c)<(pi1\<bullet>M)>"
 18129   shows "pi1\<bullet>(\<theta>n,\<theta>c<M>) = (pi1\<bullet>\<theta>n),(pi1\<bullet>\<theta>c)<(pi1\<bullet>M)>"
 18130   and   "pi2\<bullet>(\<theta>n,\<theta>c<M>) = (pi2\<bullet>\<theta>n),(pi2\<bullet>\<theta>c)<(pi2\<bullet>M)>"
 18130   and   "pi2\<bullet>(\<theta>n,\<theta>c<M>) = (pi2\<bullet>\<theta>n),(pi2\<bullet>\<theta>c)<(pi2\<bullet>M)>"
 18131 apply(nominal_induct M avoiding: \<theta>n \<theta>c rule: trm.induct)
 18131 apply(nominal_induct M avoiding: \<theta>n \<theta>c rule: trm.strong_induct)
 18132 apply(auto simp add: eq_bij fresh_bij eqvts perm_pi_simp)
 18132 apply(auto simp add: eq_bij fresh_bij eqvts perm_pi_simp)
 18133 apply(rule case_cong)
 18133 apply(rule case_cong)
 18134 apply(rule find_maps)
 18134 apply(rule find_maps)
 18135 apply(simp)
 18135 apply(simp)
 18136 apply(perm_simp add: eqvts)
 18136 apply(perm_simp add: eqvts)
 18215 lemma ax_psubst:
 18215 lemma ax_psubst:
 18216   assumes a: "\<theta>n,\<theta>c<M> = Ax x a"
 18216   assumes a: "\<theta>n,\<theta>c<M> = Ax x a"
 18217   and     b: "a\<sharp>(\<theta>n,\<theta>c)" "x\<sharp>(\<theta>n,\<theta>c)"
 18217   and     b: "a\<sharp>(\<theta>n,\<theta>c)" "x\<sharp>(\<theta>n,\<theta>c)"
 18218   shows "M = Ax x a"
 18218   shows "M = Ax x a"
 18219 using a b
 18219 using a b
 18220 apply(nominal_induct M avoiding: \<theta>n \<theta>c rule: trm.induct)
 18220 apply(nominal_induct M avoiding: \<theta>n \<theta>c rule: trm.strong_induct)
 18221 apply(auto)
 18221 apply(auto)
 18222 apply(drule lookup_unicity)
 18222 apply(drule lookup_unicity)
 18223 apply(simp)+
 18223 apply(simp)+
 18224 apply(case_tac "findc \<theta>c coname")
 18224 apply(case_tac "findc \<theta>c coname")
 18225 apply(simp)
 18225 apply(simp)
 18406 lemma psubst_fresh_name:
 18406 lemma psubst_fresh_name:
 18407   fixes x::"name"
 18407   fixes x::"name"
 18408   assumes a: "x\<sharp>\<theta>n" "x\<sharp>\<theta>c" "x\<sharp>M"
 18408   assumes a: "x\<sharp>\<theta>n" "x\<sharp>\<theta>c" "x\<sharp>M"
 18409   shows "x\<sharp>\<theta>n,\<theta>c<M>"
 18409   shows "x\<sharp>\<theta>n,\<theta>c<M>"
 18410 using a
 18410 using a
 18411 apply(nominal_induct M avoiding: x \<theta>n \<theta>c rule: trm.induct)
 18411 apply(nominal_induct M avoiding: x \<theta>n \<theta>c rule: trm.strong_induct)
 18412 apply(simp add: lookup_freshness)
 18412 apply(simp add: lookup_freshness)
 18413 apply(auto simp add: abs_fresh)[1]
 18413 apply(auto simp add: abs_fresh)[1]
 18414 apply(simp add: lookupc_freshness)
 18414 apply(simp add: lookupc_freshness)
 18415 apply(simp add: lookupc_freshness)
 18415 apply(simp add: lookupc_freshness)
 18416 apply(simp add: lookupc_freshness)
 18416 apply(simp add: lookupc_freshness)
 18492 lemma psubst_fresh_coname:
 18492 lemma psubst_fresh_coname:
 18493   fixes a::"coname"
 18493   fixes a::"coname"
 18494   assumes a: "a\<sharp>\<theta>n" "a\<sharp>\<theta>c" "a\<sharp>M"
 18494   assumes a: "a\<sharp>\<theta>n" "a\<sharp>\<theta>c" "a\<sharp>M"
 18495   shows "a\<sharp>\<theta>n,\<theta>c<M>"
 18495   shows "a\<sharp>\<theta>n,\<theta>c<M>"
 18496 using a
 18496 using a
 18497 apply(nominal_induct M avoiding: a \<theta>n \<theta>c rule: trm.induct)
 18497 apply(nominal_induct M avoiding: a \<theta>n \<theta>c rule: trm.strong_induct)
 18498 apply(simp add: lookup_freshness)
 18498 apply(simp add: lookup_freshness)
 18499 apply(auto simp add: abs_fresh)[1]
 18499 apply(auto simp add: abs_fresh)[1]
 18500 apply(simp add: lookupd_freshness)
 18500 apply(simp add: lookupd_freshness)
 18501 apply(simp add: lookupd_freshness)
 18501 apply(simp add: lookupd_freshness)
 18502 apply(simp add: lookupc_freshness)
 18502 apply(simp add: lookupc_freshness)
 18577 
 18577 
 18578 lemma psubst_csubst:
 18578 lemma psubst_csubst:
 18579   assumes a: "a\<sharp>(\<theta>n,\<theta>c)"
 18579   assumes a: "a\<sharp>(\<theta>n,\<theta>c)"
 18580   shows "\<theta>n,((a,x,P)#\<theta>c)<M> = ((\<theta>n,\<theta>c<M>){a:=(x).P})"
 18580   shows "\<theta>n,((a,x,P)#\<theta>c)<M> = ((\<theta>n,\<theta>c<M>){a:=(x).P})"
 18581 using a
 18581 using a
 18582 apply(nominal_induct M avoiding: a x \<theta>n \<theta>c P rule: trm.induct)
 18582 apply(nominal_induct M avoiding: a x \<theta>n \<theta>c P rule: trm.strong_induct)
 18583 apply(auto simp add: fresh_list_cons fresh_prod)[1]
 18583 apply(auto simp add: fresh_list_cons fresh_prod)[1]
 18584 apply(simp add: lookup_csubst)
 18584 apply(simp add: lookup_csubst)
 18585 apply(simp add: fresh_list_cons fresh_prod)
 18585 apply(simp add: fresh_list_cons fresh_prod)
 18586 apply(auto)[1]
 18586 apply(auto)[1]
 18587 apply(rule sym)
 18587 apply(rule sym)
 18864 
 18864 
 18865 lemma psubst_nsubst:
 18865 lemma psubst_nsubst:
 18866   assumes a: "x\<sharp>(\<theta>n,\<theta>c)"
 18866   assumes a: "x\<sharp>(\<theta>n,\<theta>c)"
 18867   shows "((x,a,P)#\<theta>n),\<theta>c<M> = ((\<theta>n,\<theta>c<M>){x:=<a>.P})"
 18867   shows "((x,a,P)#\<theta>n),\<theta>c<M> = ((\<theta>n,\<theta>c<M>){x:=<a>.P})"
 18868 using a
 18868 using a
 18869 apply(nominal_induct M avoiding: a x \<theta>n \<theta>c P rule: trm.induct)
 18869 apply(nominal_induct M avoiding: a x \<theta>n \<theta>c P rule: trm.strong_induct)
 18870 apply(auto simp add: fresh_list_cons fresh_prod)[1]
 18870 apply(auto simp add: fresh_list_cons fresh_prod)[1]
 18871 apply(simp add: lookup_fresh)
 18871 apply(simp add: lookup_fresh)
 18872 apply(rule lookupb_lookupa)
 18872 apply(rule lookupb_lookupa)
 18873 apply(simp)
 18873 apply(simp)
 18874 apply(rule sym)
 18874 apply(rule sym)
 19335 lemma ty_perm:
 19335 lemma ty_perm:
 19336   fixes pi1::"name prm"
 19336   fixes pi1::"name prm"
 19337   and   pi2::"coname prm"
 19337   and   pi2::"coname prm"
 19338   and   B::"ty"
 19338   and   B::"ty"
 19339   shows "pi1\<bullet>B=B" and "pi2\<bullet>B=B"
 19339   shows "pi1\<bullet>B=B" and "pi2\<bullet>B=B"
 19340 apply(nominal_induct B rule: ty.induct)
 19340 apply(nominal_induct B rule: ty.strong_induct)
 19341 apply(auto simp add: perm_string)
 19341 apply(auto simp add: perm_string)
 19342 done
 19342 done
 19343 
 19343 
 19344 lemma ctxt_perm:
 19344 lemma ctxt_perm:
 19345   fixes pi1::"name prm"
 19345   fixes pi1::"name prm"
 20392 apply(auto simp add: fresh_list_cons fresh_prod fresh_atm fresh_list_nil)
 20392 apply(auto simp add: fresh_list_cons fresh_prod fresh_atm fresh_list_nil)
 20393 done
 20393 done
 20394 
 20394 
 20395 lemma id_redu:
 20395 lemma id_redu:
 20396   shows "(idn \<Gamma> x),(idc \<Delta> a)<M> \<longrightarrow>\<^isub>a* M"
 20396   shows "(idn \<Gamma> x),(idc \<Delta> a)<M> \<longrightarrow>\<^isub>a* M"
 20397 apply(nominal_induct M avoiding: \<Gamma> \<Delta> x a rule: trm.induct)
 20397 apply(nominal_induct M avoiding: \<Gamma> \<Delta> x a rule: trm.strong_induct)
 20398 apply(auto)
 20398 apply(auto)
 20399 (* Ax *)
 20399 (* Ax *)
 20400 apply(case_tac "name\<sharp>(idn \<Gamma> x)")
 20400 apply(case_tac "name\<sharp>(idn \<Gamma> x)")
 20401 apply(simp add: lookup1)
 20401 apply(simp add: lookup1)
 20402 apply(case_tac "coname\<sharp>(idc \<Delta> a)")
 20402 apply(case_tac "coname\<sharp>(idc \<Delta> a)")