src/HOL/Nominal/Examples/Class1.thy
changeset 80138 a30a1385f7d0
parent 74101 d804e93ae9ff
child 80139 fec5a23017b5
equal deleted inserted replaced
80137:0c51e0a6bc37 80138:a30a1385f7d0
     1 theory Class1
     1 theory Class1
     2 imports "HOL-Nominal.Nominal" 
     2 imports "HOL-Nominal.Nominal"
     3 begin
     3 begin
     4 
     4 
     5 section \<open>Term-Calculus from Urban's PhD\<close>
     5 section \<open>Term-Calculus from Urban's PhD\<close>
     6 
     6 
     7 atom_decl name coname
     7 atom_decl name coname
    42   fixes a::"coname"
    42   fixes a::"coname"
    43   and   x::"name"
    43   and   x::"name"
    44   and   T::"ty"
    44   and   T::"ty"
    45   shows "a\<sharp>T" and "x\<sharp>T"
    45   shows "a\<sharp>T" and "x\<sharp>T"
    46 by (nominal_induct T rule: ty.strong_induct)
    46 by (nominal_induct T rule: ty.strong_induct)
    47    (auto simp add: fresh_string)
    47    (auto simp: fresh_string)
    48 
    48 
    49 text \<open>terms\<close>
    49 text \<open>terms\<close>                               
    50 
    50 
    51 nominal_datatype trm = 
    51 nominal_datatype trm = 
    52     Ax   "name" "coname"
    52     Ax   "name" "coname"
    53   | Cut  "\<guillemotleft>coname\<guillemotright>trm" "\<guillemotleft>name\<guillemotright>trm"            ("Cut <_>._ (_)._" [100,100,100,100] 100)
    53   | Cut  "\<guillemotleft>coname\<guillemotright>trm" "\<guillemotleft>name\<guillemotright>trm"            ("Cut <_>._ (_)._" [100,100,100,100] 100)
    54   | NotR "\<guillemotleft>name\<guillemotright>trm" "coname"                 ("NotR (_)._ _" [100,100,100] 100)
    54   | NotR "\<guillemotleft>name\<guillemotright>trm" "coname"                 ("NotR (_)._ _" [100,100,100] 100)
    87 | "a\<sharp>(d,e,b) \<Longrightarrow> (OrR2 <a>.M b)[d\<turnstile>c>e] = (if b=d then OrR2 <a>.(M[d\<turnstile>c>e]) e else OrR2 <a>.(M[d\<turnstile>c>e]) b)"
    87 | "a\<sharp>(d,e,b) \<Longrightarrow> (OrR2 <a>.M b)[d\<turnstile>c>e] = (if b=d then OrR2 <a>.(M[d\<turnstile>c>e]) e else OrR2 <a>.(M[d\<turnstile>c>e]) b)"
    88 | "\<lbrakk>x\<sharp>(N,z);y\<sharp>(M,z);y\<noteq>x\<rbrakk> \<Longrightarrow> (OrL (x).M (y).N z)[d\<turnstile>c>e] = OrL (x).(M[d\<turnstile>c>e]) (y).(N[d\<turnstile>c>e]) z"
    88 | "\<lbrakk>x\<sharp>(N,z);y\<sharp>(M,z);y\<noteq>x\<rbrakk> \<Longrightarrow> (OrL (x).M (y).N z)[d\<turnstile>c>e] = OrL (x).(M[d\<turnstile>c>e]) (y).(N[d\<turnstile>c>e]) z"
    89 | "a\<sharp>(d,e,b) \<Longrightarrow> (ImpR (x).<a>.M b)[d\<turnstile>c>e] = 
    89 | "a\<sharp>(d,e,b) \<Longrightarrow> (ImpR (x).<a>.M b)[d\<turnstile>c>e] = 
    90        (if b=d then ImpR (x).<a>.(M[d\<turnstile>c>e]) e else ImpR (x).<a>.(M[d\<turnstile>c>e]) b)"
    90        (if b=d then ImpR (x).<a>.(M[d\<turnstile>c>e]) e else ImpR (x).<a>.(M[d\<turnstile>c>e]) b)"
    91 | "\<lbrakk>a\<sharp>(d,e,N);x\<sharp>(M,y)\<rbrakk> \<Longrightarrow> (ImpL <a>.M (x).N y)[d\<turnstile>c>e] = ImpL <a>.(M[d\<turnstile>c>e]) (x).(N[d\<turnstile>c>e]) y"
    91 | "\<lbrakk>a\<sharp>(d,e,N);x\<sharp>(M,y)\<rbrakk> \<Longrightarrow> (ImpL <a>.M (x).N y)[d\<turnstile>c>e] = ImpL <a>.(M[d\<turnstile>c>e]) (x).(N[d\<turnstile>c>e]) y"
    92 apply(finite_guess)+
    92   by(finite_guess | simp add: abs_fresh abs_supp fin_supp | fresh_guess)+
    93 apply(rule TrueI)+
       
    94 apply(simp add: abs_fresh abs_supp fin_supp)+
       
    95 apply(fresh_guess)+
       
    96 done
       
    97 
    93 
    98 nominal_primrec (freshness_context: "(u::name,v::name)") 
    94 nominal_primrec (freshness_context: "(u::name,v::name)") 
    99   nrename :: "trm \<Rightarrow> name \<Rightarrow> name \<Rightarrow> trm"      ("_[_\<turnstile>n>_]" [100,100,100] 100) 
    95   nrename :: "trm \<Rightarrow> name \<Rightarrow> name \<Rightarrow> trm"      ("_[_\<turnstile>n>_]" [100,100,100] 100) 
   100 where
    96 where
   101   "(Ax x a)[u\<turnstile>n>v] = (if x=u then Ax v a else Ax x a)" 
    97   "(Ax x a)[u\<turnstile>n>v] = (if x=u then Ax v a else Ax x a)" 
   110 | "\<lbrakk>x\<sharp>(u,v,N,z);y\<sharp>(u,v,M,z);y\<noteq>x\<rbrakk> \<Longrightarrow> (OrL (x).M (y).N z)[u\<turnstile>n>v] = 
   106 | "\<lbrakk>x\<sharp>(u,v,N,z);y\<sharp>(u,v,M,z);y\<noteq>x\<rbrakk> \<Longrightarrow> (OrL (x).M (y).N z)[u\<turnstile>n>v] = 
   111         (if z=u then OrL (x).(M[u\<turnstile>n>v]) (y).(N[u\<turnstile>n>v]) v else OrL (x).(M[u\<turnstile>n>v]) (y).(N[u\<turnstile>n>v]) z)"
   107         (if z=u then OrL (x).(M[u\<turnstile>n>v]) (y).(N[u\<turnstile>n>v]) v else OrL (x).(M[u\<turnstile>n>v]) (y).(N[u\<turnstile>n>v]) z)"
   112 | "\<lbrakk>a\<sharp>b; x\<sharp>(u,v)\<rbrakk> \<Longrightarrow> (ImpR (x).<a>.M b)[u\<turnstile>n>v] = ImpR (x).<a>.(M[u\<turnstile>n>v]) b"
   108 | "\<lbrakk>a\<sharp>b; x\<sharp>(u,v)\<rbrakk> \<Longrightarrow> (ImpR (x).<a>.M b)[u\<turnstile>n>v] = ImpR (x).<a>.(M[u\<turnstile>n>v]) b"
   113 | "\<lbrakk>a\<sharp>N;x\<sharp>(u,v,M,y)\<rbrakk> \<Longrightarrow> (ImpL <a>.M (x).N y)[u\<turnstile>n>v] = 
   109 | "\<lbrakk>a\<sharp>N;x\<sharp>(u,v,M,y)\<rbrakk> \<Longrightarrow> (ImpL <a>.M (x).N y)[u\<turnstile>n>v] = 
   114         (if y=u then ImpL <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v]) v else ImpL <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v]) y)"
   110         (if y=u then ImpL <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v]) v else ImpL <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v]) y)"
   115 apply(finite_guess)+
   111   by(finite_guess | simp add: abs_fresh abs_supp fin_supp | fresh_guess)+
   116 apply(rule TrueI)+
       
   117 apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1)+
       
   118 apply(fresh_guess)+
       
   119 done
       
   120 
   112 
   121 lemmas eq_bij = pt_bij[OF pt_name_inst, OF at_name_inst] pt_bij[OF pt_coname_inst, OF at_coname_inst]
   113 lemmas eq_bij = pt_bij[OF pt_name_inst, OF at_name_inst] pt_bij[OF pt_coname_inst, OF at_coname_inst]
   122 
   114 
   123 lemma crename_name_eqvt[eqvt]:
   115 lemma crename_name_eqvt[eqvt]:
   124   fixes pi::"name prm"
   116   fixes pi::"name prm"
   125   shows "pi\<bullet>(M[d\<turnstile>c>e]) = (pi\<bullet>M)[(pi\<bullet>d)\<turnstile>c>(pi\<bullet>e)]"
   117   shows "pi\<bullet>(M[d\<turnstile>c>e]) = (pi\<bullet>M)[(pi\<bullet>d)\<turnstile>c>(pi\<bullet>e)]"
   126 apply(nominal_induct M avoiding: d e rule: trm.strong_induct)
   118   by (nominal_induct M avoiding: d e rule: trm.strong_induct) (auto simp: fresh_bij eq_bij)
   127 apply(auto simp add: fresh_bij eq_bij)
       
   128 done
       
   129 
   119 
   130 lemma crename_coname_eqvt[eqvt]:
   120 lemma crename_coname_eqvt[eqvt]:
   131   fixes pi::"coname prm"
   121   fixes pi::"coname prm"
   132   shows "pi\<bullet>(M[d\<turnstile>c>e]) = (pi\<bullet>M)[(pi\<bullet>d)\<turnstile>c>(pi\<bullet>e)]"
   122   shows "pi\<bullet>(M[d\<turnstile>c>e]) = (pi\<bullet>M)[(pi\<bullet>d)\<turnstile>c>(pi\<bullet>e)]"
   133 apply(nominal_induct M avoiding: d e rule: trm.strong_induct)
   123   by (nominal_induct M avoiding: d e rule: trm.strong_induct)(auto simp: fresh_bij eq_bij)
   134 apply(auto simp add: fresh_bij eq_bij)
       
   135 done
       
   136 
   124 
   137 lemma nrename_name_eqvt[eqvt]:
   125 lemma nrename_name_eqvt[eqvt]:
   138   fixes pi::"name prm"
   126   fixes pi::"name prm"
   139   shows "pi\<bullet>(M[x\<turnstile>n>y]) = (pi\<bullet>M)[(pi\<bullet>x)\<turnstile>n>(pi\<bullet>y)]"
   127   shows "pi\<bullet>(M[x\<turnstile>n>y]) = (pi\<bullet>M)[(pi\<bullet>x)\<turnstile>n>(pi\<bullet>y)]"
   140 apply(nominal_induct M avoiding: x y rule: trm.strong_induct)
   128   by(nominal_induct M avoiding: x y rule: trm.strong_induct) (auto simp: fresh_bij eq_bij)
   141 apply(auto simp add: fresh_bij eq_bij)
       
   142 done
       
   143 
   129 
   144 lemma nrename_coname_eqvt[eqvt]:
   130 lemma nrename_coname_eqvt[eqvt]:
   145   fixes pi::"coname prm"
   131   fixes pi::"coname prm"
   146   shows "pi\<bullet>(M[x\<turnstile>n>y]) = (pi\<bullet>M)[(pi\<bullet>x)\<turnstile>n>(pi\<bullet>y)]"
   132   shows "pi\<bullet>(M[x\<turnstile>n>y]) = (pi\<bullet>M)[(pi\<bullet>x)\<turnstile>n>(pi\<bullet>y)]"
   147 apply(nominal_induct M avoiding: x y rule: trm.strong_induct)
   133   by(nominal_induct M avoiding: x y rule: trm.strong_induct)(auto simp: fresh_bij eq_bij)
   148 apply(auto simp add: fresh_bij eq_bij)
       
   149 done
       
   150 
   134 
   151 lemmas rename_eqvts = crename_name_eqvt crename_coname_eqvt
   135 lemmas rename_eqvts = crename_name_eqvt crename_coname_eqvt
   152                       nrename_name_eqvt nrename_coname_eqvt
   136                       nrename_name_eqvt nrename_coname_eqvt
   153 lemma nrename_fresh:
   137 lemma nrename_fresh:
   154   assumes a: "x\<sharp>M"
   138   assumes a: "x\<sharp>M"
   155   shows "M[x\<turnstile>n>y] = M"
   139   shows "M[x\<turnstile>n>y] = M"
   156 using a
   140 using a
   157 by (nominal_induct M avoiding: x y rule: trm.strong_induct)
   141 by (nominal_induct M avoiding: x y rule: trm.strong_induct)
   158    (auto simp add: trm.inject fresh_atm abs_fresh fin_supp abs_supp)
   142    (auto simp: trm.inject fresh_atm abs_fresh fin_supp abs_supp)
   159 
   143 
   160 lemma crename_fresh:
   144 lemma crename_fresh:
   161   assumes a: "a\<sharp>M"
   145   assumes a: "a\<sharp>M"
   162   shows "M[a\<turnstile>c>b] = M"
   146   shows "M[a\<turnstile>c>b] = M"
   163 using a
   147 using a
   164 by (nominal_induct M avoiding: a b rule: trm.strong_induct)
   148 by (nominal_induct M avoiding: a b rule: trm.strong_induct)
   165    (auto simp add: trm.inject fresh_atm abs_fresh)
   149    (auto simp: trm.inject fresh_atm abs_fresh)
   166 
   150 
   167 lemma nrename_nfresh:
   151 lemma nrename_nfresh:
   168   fixes x::"name"
   152   fixes x::"name"
   169   shows "x\<sharp>y\<Longrightarrow>x\<sharp>M[x\<turnstile>n>y]"
   153   shows "x\<sharp>y\<Longrightarrow>x\<sharp>M[x\<turnstile>n>y]"
   170 by (nominal_induct M avoiding: x y rule: trm.strong_induct)
   154 by (nominal_induct M avoiding: x y rule: trm.strong_induct)
   171    (auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
   155    (auto simp: fresh_atm abs_fresh abs_supp fin_supp)
   172 
   156 
   173  lemma crename_nfresh:
   157  lemma crename_nfresh:
   174   fixes x::"name"
   158   fixes x::"name"
   175   shows "x\<sharp>M\<Longrightarrow>x\<sharp>M[a\<turnstile>c>b]"
   159   shows "x\<sharp>M\<Longrightarrow>x\<sharp>M[a\<turnstile>c>b]"
   176 by (nominal_induct M avoiding: a b rule: trm.strong_induct)
   160 by (nominal_induct M avoiding: a b rule: trm.strong_induct)
   177    (auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
   161    (auto simp: fresh_atm abs_fresh abs_supp fin_supp)
   178 
   162 
   179 lemma crename_cfresh:
   163 lemma crename_cfresh:
   180   fixes a::"coname"
   164   fixes a::"coname"
   181   shows "a\<sharp>b\<Longrightarrow>a\<sharp>M[a\<turnstile>c>b]"
   165   shows "a\<sharp>b\<Longrightarrow>a\<sharp>M[a\<turnstile>c>b]"
   182 by (nominal_induct M avoiding: a b rule: trm.strong_induct)
   166 by (nominal_induct M avoiding: a b rule: trm.strong_induct)
   183    (auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
   167    (auto simp: fresh_atm abs_fresh abs_supp fin_supp)
   184 
   168 
   185 lemma nrename_cfresh:
   169 lemma nrename_cfresh:
   186   fixes c::"coname"
   170   fixes c::"coname"
   187   shows "c\<sharp>M\<Longrightarrow>c\<sharp>M[x\<turnstile>n>y]"
   171   shows "c\<sharp>M\<Longrightarrow>c\<sharp>M[x\<turnstile>n>y]"
   188 by (nominal_induct M avoiding: x y rule: trm.strong_induct)
   172 by (nominal_induct M avoiding: x y rule: trm.strong_induct)
   189    (auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
   173    (auto simp: fresh_atm abs_fresh abs_supp fin_supp)
   190 
   174 
   191 lemma nrename_nfresh':
   175 lemma nrename_nfresh':
   192   fixes x::"name"
   176   fixes x::"name"
   193   shows "x\<sharp>(M,z,y)\<Longrightarrow>x\<sharp>M[z\<turnstile>n>y]"
   177   shows "x\<sharp>(M,z,y)\<Longrightarrow>x\<sharp>M[z\<turnstile>n>y]"
   194 by (nominal_induct M avoiding: x z y rule: trm.strong_induct)
   178 by (nominal_induct M avoiding: x z y rule: trm.strong_induct)
   195    (auto simp add: fresh_prod fresh_atm abs_fresh abs_supp fin_supp)
   179    (auto simp: fresh_prod fresh_atm abs_fresh abs_supp fin_supp)
   196 
   180 
   197 lemma crename_cfresh':
   181 lemma crename_cfresh':
   198   fixes a::"coname"
   182   fixes a::"coname"
   199   shows "a\<sharp>(M,b,c)\<Longrightarrow>a\<sharp>M[b\<turnstile>c>c]"
   183   shows "a\<sharp>(M,b,c)\<Longrightarrow>a\<sharp>M[b\<turnstile>c>c]"
   200 by (nominal_induct M avoiding: a b c rule: trm.strong_induct)
   184 by (nominal_induct M avoiding: a b c rule: trm.strong_induct)
   201    (auto simp add: fresh_prod fresh_atm abs_fresh abs_supp fin_supp)
   185    (auto simp: fresh_prod fresh_atm abs_fresh abs_supp fin_supp)
   202 
   186 
   203 lemma nrename_rename:
   187 lemma nrename_rename:
   204   assumes a: "x'\<sharp>M"
   188   assumes a: "x'\<sharp>M"
   205   shows "([(x',x)]\<bullet>M)[x'\<turnstile>n>y]= M[x\<turnstile>n>y]"
   189   shows "([(x',x)]\<bullet>M)[x'\<turnstile>n>y]= M[x\<turnstile>n>y]"
   206 using a
   190 using a
   207 apply(nominal_induct M avoiding: x x' y rule: trm.strong_induct)
   191 apply(nominal_induct M avoiding: x x' y rule: trm.strong_induct)
   208 apply(auto simp add: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp)
   192 apply(auto simp: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp)
   209 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)
   193 apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)
   210 done
   194 done
   211 
   195 
   212 lemma crename_rename:
   196 lemma crename_rename:
   213   assumes a: "a'\<sharp>M"
   197   assumes a: "a'\<sharp>M"
   214   shows "([(a',a)]\<bullet>M)[a'\<turnstile>c>b]= M[a\<turnstile>c>b]"
   198   shows "([(a',a)]\<bullet>M)[a'\<turnstile>c>b]= M[a\<turnstile>c>b]"
   215 using a
   199 using a
   216 apply(nominal_induct M avoiding: a a' b rule: trm.strong_induct)
   200 apply(nominal_induct M avoiding: a a' b rule: trm.strong_induct)
   217 apply(auto simp add: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp)
   201 apply(auto simp: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp)
   218 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)
   202 apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)
   219 done
   203 done
   220 
   204 
   221 lemmas rename_fresh = nrename_fresh crename_fresh 
   205 lemmas rename_fresh = nrename_fresh crename_fresh 
   222                       nrename_nfresh crename_nfresh crename_cfresh nrename_cfresh
   206                       nrename_nfresh crename_nfresh crename_cfresh nrename_cfresh
   223                       nrename_nfresh' crename_cfresh'
   207                       nrename_nfresh' crename_cfresh'
   228   shows "(Cut <a>.M (x).N)[u\<turnstile>n>v] = Cut <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v])"
   212   shows "(Cut <a>.M (x).N)[u\<turnstile>n>v] = Cut <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v])"
   229 proof -
   213 proof -
   230   obtain x'::"name"   where fs1: "x'\<sharp>(M,N,a,x,u,v)" by (rule exists_fresh(1), rule fin_supp, blast)
   214   obtain x'::"name"   where fs1: "x'\<sharp>(M,N,a,x,u,v)" by (rule exists_fresh(1), rule fin_supp, blast)
   231   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,x,u,v)" by (rule exists_fresh(2), rule fin_supp, blast)
   215   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,x,u,v)" by (rule exists_fresh(2), rule fin_supp, blast)
   232   have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))"
   216   have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))"
   233     using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
   217     using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
   234   have "(Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))[u\<turnstile>n>v] = 
   218   have "(Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))[u\<turnstile>n>v] = 
   235                         Cut <a'>.(([(a',a)]\<bullet>M)[u\<turnstile>n>v]) (x').(([(x',x)]\<bullet>N)[u\<turnstile>n>v])"
   219                         Cut <a'>.(([(a',a)]\<bullet>M)[u\<turnstile>n>v]) (x').(([(x',x)]\<bullet>N)[u\<turnstile>n>v])"
   236     using fs1 fs2
   220     using fs1 fs2
   237     apply -
   221     by (intro nrename.simps; simp add: fresh_left calc_atm)
   238     apply(rule nrename.simps)
       
   239     apply(simp add: fresh_left calc_atm)
       
   240     apply(simp add: fresh_left calc_atm)
       
   241     done
       
   242   also have "\<dots> = Cut <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v])" using fs1 fs2 a
   222   also have "\<dots> = Cut <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v])" using fs1 fs2 a
   243     apply -
   223     by(simp add: trm.inject alpha fresh_prod rename_eqvts calc_atm rename_fresh fresh_atm)
   244     apply(simp add: trm.inject alpha fresh_atm fresh_prod rename_eqvts)
       
   245     apply(simp add: calc_atm)
       
   246     apply(simp add: rename_fresh fresh_atm)
       
   247     done
       
   248   finally show "(Cut <a>.M (x).N)[u\<turnstile>n>v] = Cut <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v])" using eq1
   224   finally show "(Cut <a>.M (x).N)[u\<turnstile>n>v] = Cut <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v])" using eq1
   249     by simp
   225     by simp
   250 qed
   226 qed
   251 
   227 
   252 lemma better_crename_Cut:
   228 lemma better_crename_Cut:
   254   shows "(Cut <a>.M (x).N)[b\<turnstile>c>c] = Cut <a>.(M[b\<turnstile>c>c]) (x).(N[b\<turnstile>c>c])"
   230   shows "(Cut <a>.M (x).N)[b\<turnstile>c>c] = Cut <a>.(M[b\<turnstile>c>c]) (x).(N[b\<turnstile>c>c])"
   255 proof -
   231 proof -
   256   obtain x'::"name"   where fs1: "x'\<sharp>(M,N,a,x,b,c)" by (rule exists_fresh(1), rule fin_supp, blast)
   232   obtain x'::"name"   where fs1: "x'\<sharp>(M,N,a,x,b,c)" by (rule exists_fresh(1), rule fin_supp, blast)
   257   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,x,b,c)" by (rule exists_fresh(2), rule fin_supp, blast)
   233   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,x,b,c)" by (rule exists_fresh(2), rule fin_supp, blast)
   258   have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))"
   234   have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))"
   259     using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
   235     using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
   260   have "(Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))[b\<turnstile>c>c] = 
   236   have "(Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))[b\<turnstile>c>c] = 
   261                         Cut <a'>.(([(a',a)]\<bullet>M)[b\<turnstile>c>c]) (x').(([(x',x)]\<bullet>N)[b\<turnstile>c>c])"
   237                         Cut <a'>.(([(a',a)]\<bullet>M)[b\<turnstile>c>c]) (x').(([(x',x)]\<bullet>N)[b\<turnstile>c>c])"
   262     using fs1 fs2
   238     using fs1 fs2
   263     apply -
   239     by (intro crename.simps; simp add: fresh_left calc_atm)
   264     apply(rule crename.simps)
       
   265     apply(simp add: fresh_left calc_atm)
       
   266     apply(simp add: fresh_left calc_atm)
       
   267     done
       
   268   also have "\<dots> = Cut <a>.(M[b\<turnstile>c>c]) (x).(N[b\<turnstile>c>c])" using fs1 fs2 a
   240   also have "\<dots> = Cut <a>.(M[b\<turnstile>c>c]) (x).(N[b\<turnstile>c>c])" using fs1 fs2 a
   269     apply -
   241     by(simp add: trm.inject alpha calc_atm rename_fresh fresh_atm fresh_prod rename_eqvts)
   270     apply(simp add: trm.inject alpha fresh_atm fresh_prod rename_eqvts)
       
   271     apply(simp add: calc_atm)
       
   272     apply(simp add: rename_fresh fresh_atm)
       
   273     done
       
   274   finally show "(Cut <a>.M (x).N)[b\<turnstile>c>c] = Cut <a>.(M[b\<turnstile>c>c]) (x).(N[b\<turnstile>c>c])" using eq1
   242   finally show "(Cut <a>.M (x).N)[b\<turnstile>c>c] = Cut <a>.(M[b\<turnstile>c>c]) (x).(N[b\<turnstile>c>c])" using eq1
   275     by simp
   243     by simp
   276 qed
   244 qed
   277 
   245 
   278 lemma crename_id:
   246 lemma crename_id:
   315   fixes c::"coname"
   283   fixes c::"coname"
   316   and   pi::"coname prm"
   284   and   pi::"coname prm"
   317   and   M::"trm"
   285   and   M::"trm"
   318   assumes a: "c\<sharp>pi" "c\<sharp>M"
   286   assumes a: "c\<sharp>pi" "c\<sharp>M"
   319   shows "c\<sharp>(pi\<bullet>M)"
   287   shows "c\<sharp>(pi\<bullet>M)"
   320 using a
   288   by (simp add: assms fresh_perm_app)
   321 apply -
       
   322 apply(simp add: fresh_left)
       
   323 apply(simp add: at_prm_fresh[OF at_coname_inst] fresh_list_rev)
       
   324 done
       
   325 
   289 
   326 lemma fresh_perm_name:
   290 lemma fresh_perm_name:
   327   fixes x::"name"
   291   fixes x::"name"
   328   and   pi::"name prm"
   292   and   pi::"name prm"
   329   and   M::"trm"
   293   and   M::"trm"
   330   assumes a: "x\<sharp>pi" "x\<sharp>M"
   294   assumes a: "x\<sharp>pi" "x\<sharp>M"
   331   shows "x\<sharp>(pi\<bullet>M)"
   295   shows "x\<sharp>(pi\<bullet>M)"
   332 using a
   296   by (simp add: assms fresh_perm_app)
   333 apply -
       
   334 apply(simp add: fresh_left)
       
   335 apply(simp add: at_prm_fresh[OF at_name_inst] fresh_list_rev)
       
   336 done
       
   337 
   297 
   338 lemma fresh_fun_simp_NotL:
   298 lemma fresh_fun_simp_NotL:
   339   assumes a: "x'\<sharp>P" "x'\<sharp>M"
   299   assumes a: "x'\<sharp>P" "x'\<sharp>M"
   340   shows "fresh_fun (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x') = Cut <c>.P (x').NotL <a>.M x'"
   300   shows "fresh_fun (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x') = Cut <c>.P (x').NotL <a>.M x'"
   341 using a
   301 proof (rule fresh_fun_app)
   342 apply -
   302   show "pt (TYPE(trm)::trm itself) (TYPE(name)::name itself)"
   343 apply(rule fresh_fun_app)
   303     by(rule pt_name_inst)
   344 apply(rule pt_name_inst)
   304   show "at (TYPE(name)::name itself)"
   345 apply(rule at_name_inst)
   305     by(rule at_name_inst)
   346 apply(finite_guess)
   306   show "finite (supp (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x')::name set)"
   347 apply(subgoal_tac "\<exists>n::name. n\<sharp>(c,P,a,M)")
   307     using a by(finite_guess)
   348 apply(erule exE)
   308   obtain n::name where n: "n\<sharp>(c,P,a,M)"
   349 apply(rule_tac x="n" in exI)
   309     by (metis assms fresh_atm(3) fresh_prod)
   350 apply(simp add: fresh_prod abs_fresh)
   310   with assms
   351 apply(fresh_guess)
   311   show "\<exists>b. b \<sharp> (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x', Cut <c>.P (b).NotL <a>.M b)"
   352 apply(rule exists_fresh')
   312     apply(intro exI [where x="n"])
   353 apply(simp add: fin_supp)
   313     apply(simp add: fresh_prod abs_fresh)
   354 apply(fresh_guess)
   314     apply(fresh_guess)
   355 done
   315     done
       
   316   show "x' \<sharp> (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x')"
       
   317     using assms by(fresh_guess)
       
   318 qed
   356 
   319 
   357 lemma fresh_fun_NotL[eqvt_force]:
   320 lemma fresh_fun_NotL[eqvt_force]:
   358   fixes pi1::"name prm"
   321   fixes pi1::"name prm"
   359   and   pi2::"coname prm"
   322   and   pi2::"coname prm"
   360   shows "pi1\<bullet>fresh_fun (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x')=
   323   shows "pi1\<bullet>fresh_fun (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x')=
   361              fresh_fun (pi1\<bullet>(\<lambda>x'. Cut <c>.P (x').NotL <a>.M x'))"
   324              fresh_fun (pi1\<bullet>(\<lambda>x'. Cut <c>.P (x').NotL <a>.M x'))"
   362   and   "pi2\<bullet>fresh_fun (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x')=
   325   and   "pi2\<bullet>fresh_fun (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x')=
   363              fresh_fun (pi2\<bullet>(\<lambda>x'. Cut <c>.P (x').NotL <a>.M x'))"
   326              fresh_fun (pi2\<bullet>(\<lambda>x'. Cut <c>.P (x').NotL <a>.M x'))"
   364 apply -
   327    apply(perm_simp)
   365 apply(perm_simp)
   328    apply(generate_fresh "name")
   366 apply(generate_fresh "name")
   329    apply(auto simp: fresh_prod fresh_fun_simp_NotL)
   367 apply(auto simp add: fresh_prod)
   330    apply(rule sym)
   368 apply(simp add: fresh_fun_simp_NotL)
   331    apply(rule trans)
   369 apply(rule sym)
   332     apply(rule fresh_fun_simp_NotL)
   370 apply(rule trans)
   333      apply(blast intro: fresh_perm_name)
   371 apply(rule fresh_fun_simp_NotL)
   334     apply(metis fresh_perm_name)
   372 apply(rule fresh_perm_name)
   335    apply(simp add: at_prm_fresh[OF at_name_inst] swap_simps)
   373 apply(assumption)
   336 
   374 apply(assumption)
   337   apply(perm_simp)
   375 apply(rule fresh_perm_name)
   338   apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,pi2\<bullet>P,pi2\<bullet>M,pi2)")
   376 apply(assumption)
   339    apply (metis fresh_fun_simp_NotL fresh_prodD swap_simps(8) trm.perm(14) trm.perm(16))
   377 apply(assumption)
   340   by (meson exists_fresh(1) fs_name1)
   378 apply(simp add: at_prm_fresh[OF at_name_inst] swap_simps)
       
   379 apply(perm_simp)
       
   380 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,pi2\<bullet>P,pi2\<bullet>M,pi2)")
       
   381 apply(simp add: fresh_prod)
       
   382 apply(auto)
       
   383 apply(simp add: fresh_fun_simp_NotL calc_atm)
       
   384 apply(rule exists_fresh')
       
   385 apply(simp add: fin_supp)
       
   386 done
       
   387 
   341 
   388 lemma fresh_fun_simp_AndL1:
   342 lemma fresh_fun_simp_AndL1:
   389   assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>x"
   343   assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>x"
   390   shows "fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z') = Cut <c>.P (z').AndL1 (x).M z'"
   344   shows "fresh_fun (\<lambda>z'. Cut <c>.P(z').AndL1 (x).M z') = Cut <c>.P (z').AndL1 (x).M z'"
   391 using a
   345 proof (rule fresh_fun_app [OF pt_name_inst at_name_inst])
   392 apply -
   346   obtain n::name where "n\<sharp>(c,P,x,M)"
   393 apply(rule fresh_fun_app)
   347     by (meson exists_fresh(1) fs_name1)
   394 apply(rule pt_name_inst)
   348   then show "\<exists>a. a \<sharp> (\<lambda>z'. Cut <c>.P(z').AndL1 x. M z', Cut <c>.P(a).AndL1 x. M a)"
   395 apply(rule at_name_inst)
   349     apply(intro exI [where x="n"])
   396 apply(finite_guess)
   350     apply(simp add: fresh_prod abs_fresh)
   397 apply(subgoal_tac "\<exists>n::name. n\<sharp>(c,P,x,M)")
   351     apply(fresh_guess)
   398 apply(erule exE)
   352     done
   399 apply(rule_tac x="n" in exI)
   353 next
   400 apply(simp add: fresh_prod abs_fresh)
   354   show "z' \<sharp> (\<lambda>z'. Cut <c>.P(z').AndL1 x. M z')"
   401 apply(fresh_guess)
   355     using a by(fresh_guess)
   402 apply(rule exists_fresh')
   356 qed finite_guess
   403 apply(simp add: fin_supp)
       
   404 apply(fresh_guess)
       
   405 done
       
   406 
   357 
   407 lemma fresh_fun_AndL1[eqvt_force]:
   358 lemma fresh_fun_AndL1[eqvt_force]:
   408   fixes pi1::"name prm"
   359   fixes pi1::"name prm"
   409   and   pi2::"coname prm"
   360   and   pi2::"coname prm"
   410   shows "pi1\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z')=
   361   shows "pi1\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z')=
   411              fresh_fun (pi1\<bullet>(\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z'))"
   362              fresh_fun (pi1\<bullet>(\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z'))"
   412   and   "pi2\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z')=
   363   and   "pi2\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z')=
   413              fresh_fun (pi2\<bullet>(\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z'))"
   364              fresh_fun (pi2\<bullet>(\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z'))"
   414 apply -
       
   415 apply(perm_simp)
   365 apply(perm_simp)
   416 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,x,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>x,pi1)")
   366 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,x,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>x,pi1)")
   417 apply(simp add: fresh_prod)
   367 apply(force simp add: fresh_prod fresh_fun_simp_AndL1 at_prm_fresh[OF at_name_inst] swap_simps)
   418 apply(auto)
   368   apply (meson exists_fresh(1) fs_name1)
   419 apply(simp add: fresh_fun_simp_AndL1 at_prm_fresh[OF at_name_inst] swap_simps)
       
   420 apply(rule exists_fresh')
       
   421 apply(simp add: fin_supp)
       
   422 apply(perm_simp)
   369 apply(perm_simp)
   423 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,x,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>x,pi2)")
   370 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,x,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>x,pi2)")
   424 apply(simp add: fresh_prod)
   371 apply(force simp add: fresh_prod fresh_fun_simp_AndL1 calc_atm)
   425 apply(auto)
   372   by (meson exists_fresh'(1) fs_name1)
   426 apply(simp add: fresh_fun_simp_AndL1 calc_atm)
       
   427 apply(rule exists_fresh')
       
   428 apply(simp add: fin_supp)
       
   429 done
       
   430 
   373 
   431 lemma fresh_fun_simp_AndL2:
   374 lemma fresh_fun_simp_AndL2:
   432   assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>x"
   375   assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>x"
   433   shows "fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z') = Cut <c>.P (z').AndL2 (x).M z'"
   376   shows "fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z') = Cut <c>.P (z').AndL2 (x).M z'"
   434 using a
   377 proof (rule fresh_fun_app [OF pt_name_inst at_name_inst])
   435 apply -
   378   obtain n::name where "n\<sharp>(c,P,x,M)"
   436 apply(rule fresh_fun_app)
   379     by (meson exists_fresh(1) fs_name1)
   437 apply(rule pt_name_inst)
   380   then show "\<exists>a. a \<sharp> (\<lambda>z'. Cut <c>.P(z').AndL2 x. M z', Cut <c>.P(a).AndL2 x. M a)"
   438 apply(rule at_name_inst)
   381     apply(intro exI [where x="n"])
   439 apply(finite_guess)
   382     apply(simp add: fresh_prod abs_fresh)
   440 apply(subgoal_tac "\<exists>n::name. n\<sharp>(c,P,x,M)")
   383     apply(fresh_guess)
   441 apply(erule exE)
   384     done
   442 apply(rule_tac x="n" in exI)
   385 next
   443 apply(simp add: fresh_prod abs_fresh)
   386   show "z' \<sharp> (\<lambda>z'. Cut <c>.P(z').AndL2 x. M z')"
   444 apply(fresh_guess)
   387     using a by(fresh_guess)           
   445 apply(rule exists_fresh')
   388 qed finite_guess
   446 apply(simp add: fin_supp)
       
   447 apply(fresh_guess)
       
   448 done
       
   449 
   389 
   450 lemma fresh_fun_AndL2[eqvt_force]:
   390 lemma fresh_fun_AndL2[eqvt_force]:
   451   fixes pi1::"name prm"
   391   fixes pi1::"name prm"
   452   and   pi2::"coname prm"
   392   and   pi2::"coname prm"
   453   shows "pi1\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z')=
   393   shows "pi1\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z')=
   454              fresh_fun (pi1\<bullet>(\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z'))"
   394              fresh_fun (pi1\<bullet>(\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z'))"
   455   and   "pi2\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z')=
   395   and   "pi2\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z')=
   456              fresh_fun (pi2\<bullet>(\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z'))"
   396              fresh_fun (pi2\<bullet>(\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z'))"
   457 apply -
   397    apply(perm_simp)
   458 apply(perm_simp)
   398    apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,x,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>x,pi1)")
   459 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,x,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>x,pi1)")
   399     apply(force simp add: fresh_prod fresh_fun_simp_AndL2 at_prm_fresh[OF at_name_inst] swap_simps)
   460 apply(simp add: fresh_prod)
   400    apply (meson exists_fresh(1) fs_name1)
   461 apply(auto)
   401   apply(perm_simp)
   462 apply(simp add: fresh_fun_simp_AndL2 at_prm_fresh[OF at_name_inst] swap_simps)
   402   apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,x,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>x,pi2)")
   463 apply(rule exists_fresh')
   403    apply(force simp add: fresh_prod fresh_fun_simp_AndL2 calc_atm)
   464 apply(simp add: fin_supp)
   404   by (meson exists_fresh(1) fs_name1)
   465 apply(perm_simp)
       
   466 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,x,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>x,pi2)")
       
   467 apply(simp add: fresh_prod)
       
   468 apply(auto)
       
   469 apply(simp add: fresh_fun_simp_AndL2 calc_atm)
       
   470 apply(rule exists_fresh')
       
   471 apply(simp add: fin_supp)
       
   472 done
       
   473 
   405 
   474 lemma fresh_fun_simp_OrL:
   406 lemma fresh_fun_simp_OrL:
   475   assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>N" "z'\<sharp>u" "z'\<sharp>x"
   407   assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>N" "z'\<sharp>u" "z'\<sharp>x"
   476   shows "fresh_fun (\<lambda>z'. Cut <c>.P (z').OrL (x).M (u).N z') = Cut <c>.P (z').OrL (x).M (u).N z'"
   408   shows "fresh_fun (\<lambda>z'. Cut <c>.P(z').OrL(x).M(u).N z') = Cut <c>.P (z').OrL (x).M (u).N z'"
   477 using a
   409 proof (rule fresh_fun_app [OF pt_name_inst at_name_inst])
   478 apply -
   410   obtain n::name where "n\<sharp>(c,P,x,M,u,N)"
   479 apply(rule fresh_fun_app)
   411     by (meson exists_fresh(1) fs_name1)
   480 apply(rule pt_name_inst)
   412   then show "\<exists>a. a \<sharp> (\<lambda>z'. Cut <c>.P(z').OrL(x).M(u).N(z'), Cut <c>.P(a).OrL(x).M(u).N(a))"
   481 apply(rule at_name_inst)
   413     apply(intro exI [where x="n"])
   482 apply(finite_guess)
   414     apply(simp add: fresh_prod abs_fresh)
   483 apply(subgoal_tac "\<exists>n::name. n\<sharp>(c,P,x,M,u,N)")
   415     apply(fresh_guess)
   484 apply(erule exE)
   416     done
   485 apply(rule_tac x="n" in exI)
   417 next
   486 apply(simp add: fresh_prod abs_fresh)
   418   show "z' \<sharp> (\<lambda>z'. Cut <c>.P(z').OrL(x).M(u).N(z'))"
   487 apply(fresh_guess)
   419     using a by(fresh_guess) 
   488 apply(rule exists_fresh')
   420 qed finite_guess
   489 apply(simp add: fin_supp)
       
   490 apply(fresh_guess)
       
   491 done
       
   492 
   421 
   493 lemma fresh_fun_OrL[eqvt_force]:
   422 lemma fresh_fun_OrL[eqvt_force]:
   494   fixes pi1::"name prm"
   423   fixes pi1::"name prm"
   495   and   pi2::"coname prm"
   424   and   pi2::"coname prm"
   496   shows "pi1\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').OrL (x).M (u).N z')=
   425   shows "pi1\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P(z').OrL (x).M(u).N z')=
   497              fresh_fun (pi1\<bullet>(\<lambda>z'. Cut <c>.P (z').OrL (x).M (u).N z'))"
   426              fresh_fun (pi1\<bullet>(\<lambda>z'. Cut <c>.P (z').OrL(x).M (u).N z'))"
   498   and   "pi2\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').OrL (x).M (u).N z')=
   427   and   "pi2\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P(z').OrL (x).M(u).N z')=
   499              fresh_fun (pi2\<bullet>(\<lambda>z'. Cut <c>.P (z').OrL (x).M (u).N z'))"
   428              fresh_fun (pi2\<bullet>(\<lambda>z'. Cut <c>.P(z').OrL(x).M(u).N z'))"
   500 apply -
   429    apply(perm_simp)
   501 apply(perm_simp)
   430    apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,N,x,u,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>N,pi1\<bullet>x,pi1\<bullet>u,pi1)")
   502 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,N,x,u,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>N,pi1\<bullet>x,pi1\<bullet>u,pi1)")
   431     apply(force simp add: fresh_prod fresh_fun_simp_OrL at_prm_fresh[OF at_name_inst] swap_simps)
   503 apply(simp add: fresh_prod)
   432    apply (meson exists_fresh(1) fs_name1)
   504 apply(auto)
   433   apply(perm_simp)
   505 apply(simp add: fresh_fun_simp_OrL at_prm_fresh[OF at_name_inst] swap_simps)
   434   apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,N,x,u,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>N,pi2\<bullet>x,pi2\<bullet>u,pi2)")
   506 apply(rule exists_fresh')
   435    apply(force simp add: fresh_prod fresh_fun_simp_OrL calc_atm)
   507 apply(simp add: fin_supp)
   436   by (meson exists_fresh(1) fs_name1)
   508 apply(perm_simp)
       
   509 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,N,x,u,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>N,pi2\<bullet>x,pi2\<bullet>u,pi2)")
       
   510 apply(simp add: fresh_prod)
       
   511 apply(auto)
       
   512 apply(simp add: fresh_fun_simp_OrL calc_atm)
       
   513 apply(rule exists_fresh')
       
   514 apply(simp add: fin_supp)
       
   515 done
       
   516 
   437 
   517 lemma fresh_fun_simp_ImpL:
   438 lemma fresh_fun_simp_ImpL:
   518   assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>N" "z'\<sharp>x"
   439   assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>N" "z'\<sharp>x"
   519   shows "fresh_fun (\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z') = Cut <c>.P (z').ImpL <a>.M (x).N z'"
   440   shows "fresh_fun (\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z') = Cut <c>.P (z').ImpL <a>.M (x).N z'"
   520 using a
   441 proof (rule fresh_fun_app [OF pt_name_inst at_name_inst])
   521 apply -
   442   obtain n::name where "n\<sharp>(c,P,x,M,N)"
   522 apply(rule fresh_fun_app)
   443     by (meson exists_fresh(1) fs_name1)
   523 apply(rule pt_name_inst)
   444   then show "\<exists>aa. aa \<sharp> (\<lambda>z'. Cut <c>.P(z').ImpL <a>.M(x).N z', Cut <c>.P(aa).ImpL <a>.M(x).N aa)"
   524 apply(rule at_name_inst)
   445     apply(intro exI [where x="n"])
   525 apply(finite_guess)
   446     apply(simp add: fresh_prod abs_fresh)
   526 apply(subgoal_tac "\<exists>n::name. n\<sharp>(c,P,x,M,N)")
   447     apply(fresh_guess)
   527 apply(erule exE)
   448     done
   528 apply(rule_tac x="n" in exI)
   449 next
   529 apply(simp add: fresh_prod abs_fresh)
   450   show "z' \<sharp> (\<lambda>z'. Cut <c>.P(z').ImpL <a>.M(x).N z')"
   530 apply(fresh_guess)
   451     using a by(fresh_guess) 
   531 apply(rule exists_fresh')
   452 qed finite_guess
   532 apply(simp add: fin_supp)
       
   533 apply(fresh_guess)
       
   534 done
       
   535 
   453 
   536 lemma fresh_fun_ImpL[eqvt_force]:
   454 lemma fresh_fun_ImpL[eqvt_force]:
   537   fixes pi1::"name prm"
   455   fixes pi1::"name prm"
   538   and   pi2::"coname prm"
   456   and   pi2::"coname prm"
   539   shows "pi1\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z')=
   457   shows "pi1\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z')=
   540              fresh_fun (pi1\<bullet>(\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z'))"
   458              fresh_fun (pi1\<bullet>(\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z'))"
   541   and   "pi2\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z')=
   459   and   "pi2\<bullet>fresh_fun (\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z')=
   542              fresh_fun (pi2\<bullet>(\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z'))"
   460              fresh_fun (pi2\<bullet>(\<lambda>z'. Cut <c>.P (z').ImpL <a>.M (x).N z'))"
   543 apply -
   461    apply(perm_simp)
   544 apply(perm_simp)
   462    apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,N,x,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>N,pi1\<bullet>x,pi1)")
   545 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,N,x,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>N,pi1\<bullet>x,pi1)")
   463     apply(force simp add: fresh_prod fresh_fun_simp_ImpL at_prm_fresh[OF at_name_inst] swap_simps)
   546 apply(simp add: fresh_prod)
   464    apply (meson exists_fresh(1) fs_name1)
   547 apply(auto)
   465   apply(perm_simp)
   548 apply(simp add: fresh_fun_simp_ImpL at_prm_fresh[OF at_name_inst] swap_simps)
   466   apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,N,x,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>N,pi2\<bullet>x,pi2)")
   549 apply(rule exists_fresh')
   467    apply(force simp add: fresh_prod fresh_fun_simp_ImpL calc_atm)
   550 apply(simp add: fin_supp)
   468   by (meson exists_fresh(1) fs_name1)
   551 apply(perm_simp)
       
   552 apply(subgoal_tac "\<exists>n::name. n\<sharp>(P,M,N,x,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>N,pi2\<bullet>x,pi2)")
       
   553 apply(simp add: fresh_prod)
       
   554 apply(auto)
       
   555 apply(simp add: fresh_fun_simp_ImpL calc_atm)
       
   556 apply(rule exists_fresh')
       
   557 apply(simp add: fin_supp)
       
   558 done
       
   559 
   469 
   560 lemma fresh_fun_simp_NotR:
   470 lemma fresh_fun_simp_NotR:
   561   assumes a: "a'\<sharp>P" "a'\<sharp>M"
   471   assumes a: "a'\<sharp>P" "a'\<sharp>M"
   562   shows "fresh_fun (\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P) = Cut <a'>.(NotR (y).M a') (x).P"
   472   shows "fresh_fun (\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P) = Cut <a'>.(NotR (y).M a') (x).P"
   563 using a
   473 proof (rule fresh_fun_app [OF pt_coname_inst at_coname_inst])
   564 apply -
   474   obtain n::coname where "n\<sharp>(x,P,y,M)"
   565 apply(rule fresh_fun_app)
   475     by (metis assms(1) assms(2) fresh_atm(4) fresh_prod)
   566 apply(rule pt_coname_inst)
   476   then show "\<exists>a. a \<sharp> (\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P, Cut <a>.NotR(y).M(a) (x).P)"
   567 apply(rule at_coname_inst)
   477     apply(intro exI [where x="n"])
   568 apply(finite_guess)
   478     apply(simp add: fresh_prod abs_fresh)
   569 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(x,P,y,M)")
   479     apply(fresh_guess)
   570 apply(erule exE)
   480     done
   571 apply(rule_tac x="n" in exI)
   481 qed (use a in \<open>fresh_guess|finite_guess\<close>)+
   572 apply(simp add: fresh_prod abs_fresh)
       
   573 apply(fresh_guess)
       
   574 apply(rule exists_fresh')
       
   575 apply(simp add: fin_supp)
       
   576 apply(fresh_guess)
       
   577 done
       
   578 
   482 
   579 lemma fresh_fun_NotR[eqvt_force]:
   483 lemma fresh_fun_NotR[eqvt_force]:
   580   fixes pi1::"name prm"
   484   fixes pi1::"name prm"
   581   and   pi2::"coname prm"
   485   and   pi2::"coname prm"
   582   shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P)=
   486   shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P)=
   583              fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P))"
   487              fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P))"
   584   and   "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P)=
   488   and   "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P)=
   585              fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P))"
   489              fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(NotR (y).M a') (x).P))"
   586 apply -
   490    apply(perm_simp)
   587 apply(perm_simp)
   491    apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,pi1\<bullet>P,pi1\<bullet>M,pi1)")
   588 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,pi1\<bullet>P,pi1\<bullet>M,pi1)")
   492     apply(force simp add: fresh_prod fresh_fun_simp_NotR calc_atm)
   589 apply(simp add: fresh_prod)
   493    apply (meson exists_fresh(2) fs_coname1)
   590 apply(auto)
   494   apply(perm_simp)
   591 apply(simp add: fresh_fun_simp_NotR calc_atm)
   495   apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,pi2\<bullet>P,pi2\<bullet>M,pi2)")
   592 apply(rule exists_fresh')
   496    apply(force simp: fresh_prod fresh_fun_simp_NotR at_prm_fresh[OF at_coname_inst] swap_simps)
   593 apply(simp add: fin_supp)
   497   by (meson exists_fresh(2) fs_coname1)
   594 apply(perm_simp)
       
   595 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,pi2\<bullet>P,pi2\<bullet>M,pi2)")
       
   596 apply(simp add: fresh_prod)
       
   597 apply(auto)
       
   598 apply(simp add: fresh_fun_simp_NotR at_prm_fresh[OF at_coname_inst] swap_simps)
       
   599 apply(rule exists_fresh')
       
   600 apply(simp add: fin_supp)
       
   601 done
       
   602 
   498 
   603 lemma fresh_fun_simp_AndR:
   499 lemma fresh_fun_simp_AndR:
   604   assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>N" "a'\<sharp>b" "a'\<sharp>c"
   500   assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>N" "a'\<sharp>b" "a'\<sharp>c"
   605   shows "fresh_fun (\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P) = Cut <a'>.(AndR <b>.M <c>.N a') (x).P"
   501   shows "fresh_fun (\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P) = Cut <a'>.(AndR <b>.M <c>.N a') (x).P"
   606 using a
   502 proof (rule fresh_fun_app [OF pt_coname_inst at_coname_inst])
   607 apply -
   503   obtain n::coname where "n\<sharp>(x,P,b,M,c,N)"
   608 apply(rule fresh_fun_app)
   504     by (meson exists_fresh(2) fs_coname1)
   609 apply(rule pt_coname_inst)
   505   then show "\<exists>a. a \<sharp> (\<lambda>a'. Cut <a'>.AndR <b>.M <c>.N(a') (x).P, Cut <a>.AndR <b>.M <c>.N(a) (x).P)"
   610 apply(rule at_coname_inst)
   506     apply(intro exI [where x="n"])
   611 apply(finite_guess)
   507     apply(simp add: fresh_prod abs_fresh)
   612 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(x,P,b,M,c,N)")
   508     apply(fresh_guess)
   613 apply(erule exE)
   509     done
   614 apply(rule_tac x="n" in exI)
   510 qed (use a in \<open>fresh_guess|finite_guess\<close>)+
   615 apply(simp add: fresh_prod abs_fresh)
       
   616 apply(fresh_guess)
       
   617 apply(rule exists_fresh')
       
   618 apply(simp add: fin_supp)
       
   619 apply(fresh_guess)
       
   620 done
       
   621 
   511 
   622 lemma fresh_fun_AndR[eqvt_force]:
   512 lemma fresh_fun_AndR[eqvt_force]:
   623   fixes pi1::"name prm"
   513   fixes pi1::"name prm"
   624   and   pi2::"coname prm"
   514   and   pi2::"coname prm"
   625   shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P)=
   515   shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P)=
   626              fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P))"
   516              fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P))"
   627   and   "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P)=
   517   and   "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P)=
   628              fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P))"
   518              fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P))"
   629 apply -
   519    apply(perm_simp)
   630 apply(perm_simp)
   520    apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,N,b,c,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>N,pi1\<bullet>b,pi1\<bullet>c,pi1)")
   631 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,N,b,c,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>N,pi1\<bullet>b,pi1\<bullet>c,pi1)")
   521     apply(force simp add: fresh_prod fresh_fun_simp_AndR calc_atm)
   632 apply(simp add: fresh_prod)
   522    apply (meson exists_fresh(2) fs_coname1)
   633 apply(auto)
   523   apply(perm_simp)
   634 apply(simp add: fresh_fun_simp_AndR calc_atm)
   524   apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,N,b,c,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>N,pi2\<bullet>b,pi2\<bullet>c,pi2)")
   635 apply(rule exists_fresh')
   525    apply(force simp add: fresh_prod fresh_fun_simp_AndR at_prm_fresh[OF at_coname_inst] swap_simps)
   636 apply(simp add: fin_supp)
   526   by (meson exists_fresh(2) fs_coname1)
   637 apply(perm_simp)
       
   638 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,N,b,c,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>N,pi2\<bullet>b,pi2\<bullet>c,pi2)")
       
   639 apply(simp add: fresh_prod)
       
   640 apply(auto)
       
   641 apply(simp add: fresh_fun_simp_AndR at_prm_fresh[OF at_coname_inst] swap_simps)
       
   642 apply(rule exists_fresh')
       
   643 apply(simp add: fin_supp)
       
   644 done
       
   645 
   527 
   646 lemma fresh_fun_simp_OrR1:
   528 lemma fresh_fun_simp_OrR1:
   647   assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>b" 
   529   assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>b" 
   648   shows "fresh_fun (\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P) = Cut <a'>.(OrR1 <b>.M a') (x).P"
   530   shows "fresh_fun (\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P) = Cut <a'>.(OrR1 <b>.M a') (x).P"
   649 using a
   531 proof (rule fresh_fun_app [OF pt_coname_inst at_coname_inst])
   650 apply -
   532   obtain n::coname where "n\<sharp>(x,P,b,M)"
   651 apply(rule fresh_fun_app)
   533     by (meson exists_fresh(2) fs_coname1)
   652 apply(rule pt_coname_inst)
   534   then show "\<exists>a. a \<sharp> (\<lambda>a'. Cut <a'>.OrR1 <b>.M(a') (x).P, Cut <a>.OrR1 <b>.M(a) (x).P)"
   653 apply(rule at_coname_inst)
   535     apply(intro exI [where x="n"])
   654 apply(finite_guess)
   536     apply(simp add: fresh_prod abs_fresh)
   655 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(x,P,b,M)")
   537     apply(fresh_guess)
   656 apply(erule exE)
   538     done
   657 apply(rule_tac x="n" in exI)
   539 qed (use a in \<open>fresh_guess|finite_guess\<close>)+
   658 apply(simp add: fresh_prod abs_fresh)
       
   659 apply(fresh_guess)
       
   660 apply(rule exists_fresh')
       
   661 apply(simp add: fin_supp)
       
   662 apply(fresh_guess)
       
   663 done
       
   664 
   540 
   665 lemma fresh_fun_OrR1[eqvt_force]:
   541 lemma fresh_fun_OrR1[eqvt_force]:
   666   fixes pi1::"name prm"
   542   fixes pi1::"name prm"
   667   and   pi2::"coname prm"
   543   and   pi2::"coname prm"
   668   shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P)=
   544   shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P)=
   669              fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(OrR1 <b>.M  a') (x).P))"
   545              fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(OrR1 <b>.M  a') (x).P))"
   670   and   "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P)=
   546   and   "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P)=
   671              fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P))"
   547              fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(OrR1 <b>.M a') (x).P))"
   672 apply -
   548    apply(perm_simp)
   673 apply(perm_simp)
   549    apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>b,pi1)")
   674 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>b,pi1)")
   550     apply(force simp add: fresh_prod fresh_fun_simp_OrR1 calc_atm)
   675 apply(simp add: fresh_prod)
   551    apply (meson exists_fresh(2) fs_coname1)
   676 apply(auto)
   552   apply(perm_simp)
   677 apply(simp add: fresh_fun_simp_OrR1 calc_atm)
   553   apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>b,pi2)")
   678 apply(rule exists_fresh')
   554    apply(force simp add: fresh_prod fresh_fun_simp_OrR1 at_prm_fresh[OF at_coname_inst] swap_simps)
   679 apply(simp add: fin_supp)
   555   by (meson exists_fresh(2) fs_coname1)
   680 apply(perm_simp)
       
   681 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>b,pi2)")
       
   682 apply(simp add: fresh_prod)
       
   683 apply(auto)
       
   684 apply(simp add: fresh_fun_simp_OrR1 at_prm_fresh[OF at_coname_inst] swap_simps)
       
   685 apply(rule exists_fresh')
       
   686 apply(simp add: fin_supp)
       
   687 done
       
   688 
   556 
   689 lemma fresh_fun_simp_OrR2:
   557 lemma fresh_fun_simp_OrR2:
   690   assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>b" 
   558   assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>b" 
   691   shows "fresh_fun (\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P) = Cut <a'>.(OrR2 <b>.M a') (x).P"
   559   shows "fresh_fun (\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P) = Cut <a'>.(OrR2 <b>.M a') (x).P"
   692 using a
   560 proof (rule fresh_fun_app [OF pt_coname_inst at_coname_inst])
   693 apply -
   561   obtain n::coname where "n\<sharp>(x,P,b,M)"
   694 apply(rule fresh_fun_app)
   562     by (meson exists_fresh(2) fs_coname1)
   695 apply(rule pt_coname_inst)
   563   then show "\<exists>a. a \<sharp> (\<lambda>a'. Cut <a'>.OrR2 <b>.M(a') (x).P, Cut <a>.OrR2 <b>.M(a) (x).P)"
   696 apply(rule at_coname_inst)
   564     apply(intro exI [where x="n"])
   697 apply(finite_guess)
   565     apply(simp add: fresh_prod abs_fresh)
   698 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(x,P,b,M)")
   566     apply(fresh_guess)
   699 apply(erule exE)
   567     done
   700 apply(rule_tac x="n" in exI)
   568 qed (use a in \<open>fresh_guess|finite_guess\<close>)+
   701 apply(simp add: fresh_prod abs_fresh)
       
   702 apply(fresh_guess)
       
   703 apply(rule exists_fresh')
       
   704 apply(simp add: fin_supp)
       
   705 apply(fresh_guess)
       
   706 done
       
   707 
   569 
   708 lemma fresh_fun_OrR2[eqvt_force]:
   570 lemma fresh_fun_OrR2[eqvt_force]:
   709   fixes pi1::"name prm"
   571   fixes pi1::"name prm"
   710   and   pi2::"coname prm"
   572   and   pi2::"coname prm"
   711   shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P)=
   573   shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P)=
   712              fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(OrR2 <b>.M  a') (x).P))"
   574              fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(OrR2 <b>.M  a') (x).P))"
   713   and   "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P)=
   575   and   "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P)=
   714              fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P))"
   576              fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(OrR2 <b>.M a') (x).P))"
   715 apply -
   577    apply(perm_simp)
   716 apply(perm_simp)
   578    apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>b,pi1)")
   717 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>b,pi1)")
   579     apply(force simp add: fresh_prod fresh_fun_simp_OrR2 calc_atm)
   718 apply(simp add: fresh_prod)
   580    apply (meson exists_fresh(2) fs_coname1)
   719 apply(auto)
   581   apply(perm_simp)
   720 apply(simp add: fresh_fun_simp_OrR2 calc_atm)
   582   apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>b,pi2)")
   721 apply(rule exists_fresh')
   583    apply(force simp add: fresh_prod fresh_fun_simp_OrR2 at_prm_fresh[OF at_coname_inst] swap_simps)
   722 apply(simp add: fin_supp)
   584   by (meson exists_fresh(2) fs_coname1)
   723 apply(perm_simp)
       
   724 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>b,pi2)")
       
   725 apply(simp add: fresh_prod)
       
   726 apply(auto)
       
   727 apply(simp add: fresh_fun_simp_OrR2 at_prm_fresh[OF at_coname_inst] swap_simps)
       
   728 apply(rule exists_fresh')
       
   729 apply(simp add: fin_supp)
       
   730 done
       
   731 
   585 
   732 lemma fresh_fun_simp_ImpR:
   586 lemma fresh_fun_simp_ImpR:
   733   assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>b" 
   587   assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>b" 
   734   shows "fresh_fun (\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P) = Cut <a'>.(ImpR (y).<b>.M a') (x).P"
   588   shows "fresh_fun (\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P) = Cut <a'>.(ImpR (y).<b>.M a') (x).P"
   735 using a
   589 proof (rule fresh_fun_app [OF pt_coname_inst at_coname_inst])
   736 apply -
   590   obtain n::coname where "n\<sharp>(x,P,y,b,M)"
   737 apply(rule fresh_fun_app)
   591     by (meson exists_fresh(2) fs_coname1)
   738 apply(rule pt_coname_inst)
   592   then show "\<exists>a. a \<sharp> (\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P, Cut <a>.(ImpR (y).<b>.M a) (x).P)"
   739 apply(rule at_coname_inst)
   593     apply(intro exI [where x="n"])
   740 apply(finite_guess)
   594     apply(simp add: fresh_prod abs_fresh)
   741 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(x,P,y,b,M)")
   595     apply(fresh_guess)
   742 apply(erule exE)
   596     done
   743 apply(rule_tac x="n" in exI)
   597 qed (use a in \<open>fresh_guess|finite_guess\<close>)+
   744 apply(simp add: fresh_prod abs_fresh)
       
   745 apply(fresh_guess)
       
   746 apply(rule exists_fresh')
       
   747 apply(simp add: fin_supp)
       
   748 apply(fresh_guess)
       
   749 done
       
   750 
   598 
   751 lemma fresh_fun_ImpR[eqvt_force]:
   599 lemma fresh_fun_ImpR[eqvt_force]:
   752   fixes pi1::"name prm"
   600   fixes pi1::"name prm"
   753   and   pi2::"coname prm"
   601   and   pi2::"coname prm"
   754   shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P)=
   602   shows "pi1\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P)=
   755              fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M  a') (x).P))"
   603              fresh_fun (pi1\<bullet>(\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M  a') (x).P))"
   756   and   "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P)=
   604   and   "pi2\<bullet>fresh_fun (\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P)=
   757              fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P))"
   605              fresh_fun (pi2\<bullet>(\<lambda>a'. Cut <a'>.(ImpR (y).<b>.M a') (x).P))"
   758 apply -
   606    apply(perm_simp)
   759 apply(perm_simp)
   607    apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>b,pi1)")
   760 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi1\<bullet>P,pi1\<bullet>M,pi1\<bullet>b,pi1)")
   608     apply(force simp add: fresh_prod fresh_fun_simp_ImpR calc_atm)
   761 apply(simp add: fresh_prod)
   609    apply (meson exists_fresh(2) fs_coname1)
   762 apply(auto)
   610   apply(perm_simp)
   763 apply(simp add: fresh_fun_simp_ImpR calc_atm)
   611   apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>b,pi2)")
   764 apply(rule exists_fresh')
   612    apply(force simp add: fresh_prod fresh_fun_simp_ImpR at_prm_fresh[OF at_coname_inst] swap_simps)
   765 apply(simp add: fin_supp)
   613   by (meson exists_fresh(2) fs_coname1)
   766 apply(perm_simp)
       
   767 apply(subgoal_tac "\<exists>n::coname. n\<sharp>(P,M,b,pi2\<bullet>P,pi2\<bullet>M,pi2\<bullet>b,pi2)")
       
   768 apply(simp add: fresh_prod)
       
   769 apply(auto)
       
   770 apply(simp add: fresh_fun_simp_ImpR at_prm_fresh[OF at_coname_inst] swap_simps)
       
   771 apply(rule exists_fresh')
       
   772 apply(simp add: fin_supp)
       
   773 done
       
   774 
   614 
   775 nominal_primrec (freshness_context: "(y::name,c::coname,P::trm)")
   615 nominal_primrec (freshness_context: "(y::name,c::coname,P::trm)")
   776   substn :: "trm \<Rightarrow> name   \<Rightarrow> coname \<Rightarrow> trm \<Rightarrow> trm" ("_{_:=<_>._}" [100,100,100,100] 100) 
   616   substn :: "trm \<Rightarrow> name   \<Rightarrow> coname \<Rightarrow> trm \<Rightarrow> trm" ("_{_:=<_>._}" [100,100,100,100] 100) 
   777 where
   617 where
   778   "(Ax x a){y:=<c>.P} = (if x=y then Cut <c>.P (y).Ax y a else Ax x a)" 
   618   "(Ax x a){y:=<c>.P} = (if x=y then Cut <c>.P (y).Ax y a else Ax x a)" 
   796    else OrL (x).(M{y:=<c>.P}) (u).(N{y:=<c>.P}) z)"
   636    else OrL (x).(M{y:=<c>.P}) (u).(N{y:=<c>.P}) z)"
   797 | "\<lbrakk>a\<sharp>(b,c,P); x\<sharp>(y,P)\<rbrakk> \<Longrightarrow> (ImpR (x).<a>.M b){y:=<c>.P} = ImpR (x).<a>.(M{y:=<c>.P}) b"
   637 | "\<lbrakk>a\<sharp>(b,c,P); x\<sharp>(y,P)\<rbrakk> \<Longrightarrow> (ImpR (x).<a>.M b){y:=<c>.P} = ImpR (x).<a>.(M{y:=<c>.P}) b"
   798 | "\<lbrakk>a\<sharp>(N,c,P);x\<sharp>(y,P,M,z)\<rbrakk> \<Longrightarrow> (ImpL <a>.M (x).N z){y:=<c>.P} = 
   638 | "\<lbrakk>a\<sharp>(N,c,P);x\<sharp>(y,P,M,z)\<rbrakk> \<Longrightarrow> (ImpL <a>.M (x).N z){y:=<c>.P} = 
   799   (if y=z then fresh_fun (\<lambda>z'. Cut <c>.P (z').ImpL <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}) z') 
   639   (if y=z then fresh_fun (\<lambda>z'. Cut <c>.P (z').ImpL <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}) z') 
   800    else ImpL <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}) z)"
   640    else ImpL <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}) z)"
   801 apply(finite_guess)+
   641 apply(finite_guess | simp add: abs_fresh abs_supp fin_supp | fresh_guess | rule strip)+
   802 apply(rule TrueI)+
   642 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1)")
   803 apply(simp add: abs_fresh abs_supp)+
   643 apply(force simp add: fresh_prod fresh_fun_simp_NotL abs_fresh fresh_atm)
   804 apply(rule impI)
   644 apply (meson exists_fresh(1) fs_name1)
   805 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1)", erule exE, simp add: fresh_prod)
   645 
   806 apply(erule conjE)+
   646 apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+
   807 apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm)
   647 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1)")
   808 apply(rule exists_fresh', simp add: fin_supp)
   648 apply(force simp add: fresh_prod fresh_fun_simp_AndL1 abs_fresh fresh_atm)
   809 apply(simp add: abs_fresh abs_supp)+
   649 apply (meson exists_fresh(1) fs_name1)
   810 apply(rule impI)
   650 
   811 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1)", erule exE, simp add: fresh_prod)
   651 apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+
   812 apply(erule conjE)+
   652 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1)")
   813 apply(simp add: fresh_fun_simp_AndL1 abs_fresh fresh_atm)
   653 apply(force simp add: fresh_prod fresh_fun_simp_AndL2 abs_fresh fresh_atm)
   814 apply(rule exists_fresh', simp add: fin_supp)
   654 apply (meson exists_fresh(1) fs_name1)
   815 apply(simp add: abs_fresh abs_supp)+
   655 
   816 apply(rule impI)
   656 apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+
   817 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1)", erule exE, simp add: fresh_prod)
   657 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1,x3,y2)")
   818 apply(erule conjE)+
   658 apply(force simp add: fresh_prod fresh_fun_simp_OrL abs_fresh fresh_atm)
   819 apply(simp add: fresh_fun_simp_AndL2 abs_fresh fresh_atm)
   659 apply (meson exists_fresh(1) fs_name1)
   820 apply(rule exists_fresh', simp add: fin_supp)
   660 
   821 apply(simp add: abs_fresh abs_supp)+
   661 apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+
   822 apply(rule impI)
   662 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1,x3,y2)")
   823 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1,x3,y2)", erule exE, simp add: fresh_prod)
   663 apply(force simp add: fresh_prod fresh_fun_simp_OrL abs_fresh fresh_atm)
   824 apply(erule conjE)+
   664 apply (meson exists_fresh(1) fs_name1)
   825 apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm)
   665 
   826 apply(rule exists_fresh', simp add: fin_supp)
   666 apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+
   827 apply(simp add: abs_fresh abs_supp)+
   667 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x3,P,y1,y2)")
   828 apply(rule impI)
   668 apply(force simp add: fresh_prod fresh_fun_simp_ImpL abs_fresh fresh_atm)
   829 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x1,P,y1,x3,y2)", erule exE, simp add: fresh_prod)
   669 apply (meson exists_fresh(1) fs_name1)
   830 apply(erule conjE)+
   670 
   831 apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm)
   671 apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+
   832 apply(rule exists_fresh', simp add: fin_supp)
   672 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x3,P,y1,y2)")
   833 apply(simp add: abs_fresh abs_supp)+
   673 apply(force simp add: fresh_prod fresh_fun_simp_ImpL abs_fresh fresh_atm)
   834 apply(rule impI)
   674 apply (meson exists_fresh(1) fs_name1)
   835 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x3,P,y1,y2)", erule exE, simp add: fresh_prod)
       
   836 apply(erule conjE)+
       
   837 apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm)
       
   838 apply(rule exists_fresh', simp add: fin_supp)
       
   839 apply(simp add: abs_fresh abs_supp)+
       
   840 apply(rule impI)
       
   841 apply(subgoal_tac "\<exists>x::name. x\<sharp>(x3,P,y1,y2)", erule exE, simp add: fresh_prod)
       
   842 apply(erule conjE)+
       
   843 apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm)
       
   844 apply(rule exists_fresh', simp add: fin_supp)
       
   845 apply(fresh_guess)+
   675 apply(fresh_guess)+
   846 done
   676 done
   847 
   677 
   848 nominal_primrec (freshness_context: "(d::name,z::coname,P::trm)")
   678 nominal_primrec (freshness_context: "(d::name,z::coname,P::trm)")
   849   substc :: "trm \<Rightarrow> coname \<Rightarrow> name   \<Rightarrow> trm \<Rightarrow> trm" ("_{_:=(_)._}" [100,100,100,100] 100)
   679   substc :: "trm \<Rightarrow> coname \<Rightarrow> name   \<Rightarrow> trm \<Rightarrow> trm" ("_{_:=(_)._}" [100,100,100,100] 100)
   868 | "\<lbrakk>a\<sharp>(b,d,P); x\<sharp>(z,P)\<rbrakk> \<Longrightarrow> (ImpR (x).<a>.M b){d:=(z).P} = 
   698 | "\<lbrakk>a\<sharp>(b,d,P); x\<sharp>(z,P)\<rbrakk> \<Longrightarrow> (ImpR (x).<a>.M b){d:=(z).P} = 
   869   (if d=b then fresh_fun (\<lambda>a'. Cut <a'>.ImpR (x).<a>.(M{d:=(z).P}) a' (z).P) 
   699   (if d=b then fresh_fun (\<lambda>a'. Cut <a'>.ImpR (x).<a>.(M{d:=(z).P}) a' (z).P) 
   870    else ImpR (x).<a>.(M{d:=(z).P}) b)"
   700    else ImpR (x).<a>.(M{d:=(z).P}) b)"
   871 | "\<lbrakk>a\<sharp>(N,d,P);x\<sharp>(y,z,P,M)\<rbrakk> \<Longrightarrow> (ImpL <a>.M (x).N y){d:=(z).P} = 
   701 | "\<lbrakk>a\<sharp>(N,d,P);x\<sharp>(y,z,P,M)\<rbrakk> \<Longrightarrow> (ImpL <a>.M (x).N y){d:=(z).P} = 
   872   ImpL <a>.(M{d:=(z).P}) (x).(N{d:=(z).P}) y"
   702   ImpL <a>.(M{d:=(z).P}) (x).(N{d:=(z).P}) y"
   873 apply(finite_guess)+
   703 apply(finite_guess | simp add: abs_fresh abs_supp fs_name1 fs_coname1 | rule strip)+
   874 apply(rule TrueI)+
   704 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1)")
   875 apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1)+
   705 apply(force simp add: fresh_prod fresh_fun_simp_NotR abs_fresh fresh_atm)
   876 apply(rule impI)
   706 apply(meson exists_fresh' fin_supp)
   877 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1)", erule exE, simp add: fresh_prod)
   707 
   878 apply(erule conjE)+
   708 apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1 | rule strip)+
   879 apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm)
   709 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1,x3,y2)")
   880 apply(rule exists_fresh', simp add: fin_supp)
   710 apply(force simp add: fresh_prod fresh_fun_simp_AndR abs_fresh fresh_atm)
   881 apply(simp add: abs_fresh abs_supp)+
   711 apply(meson exists_fresh' fin_supp)
   882 apply(rule impI)
   712 
   883 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1,x3,y2)", erule exE, simp add: fresh_prod)
   713 apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1 | rule strip)+
   884 apply(erule conjE)+
   714 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1,x3,y2)")
   885 apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm)
   715 apply(force simp add: fresh_prod fresh_fun_simp_AndR abs_fresh fresh_atm)
   886 apply(rule exists_fresh', simp add: fin_supp)
   716 apply(meson exists_fresh' fin_supp)
   887 apply(simp add: abs_fresh abs_supp)+
   717 
   888 apply(rule impI)
   718 apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1 | rule strip)+
   889 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1,x3,y2)", erule exE, simp add: fresh_prod)
   719 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1)")
   890 apply(erule conjE)+
   720 apply(force simp add: fresh_prod fresh_fun_simp_OrR1 abs_fresh fresh_atm)
   891 apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm)
   721 apply(meson exists_fresh' fin_supp)
   892 apply(rule exists_fresh', simp add: fin_supp)
   722 
   893 apply(simp add: abs_fresh abs_supp)+
   723 apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1 | rule strip)+
   894 apply(rule impI)
   724 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1)")
   895 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1)", erule exE, simp add: fresh_prod)
   725 apply(force simp add: fresh_prod fresh_fun_simp_OrR2 abs_fresh fresh_atm)
   896 apply(erule conjE)+
   726 apply(meson exists_fresh' fin_supp)
   897 apply(simp add: fresh_fun_simp_OrR1 abs_fresh fresh_atm)
   727 
   898 apply(rule exists_fresh', simp add: fin_supp)
   728 apply(simp add: abs_fresh abs_supp | rule strip)+
   899 apply(simp add: abs_fresh abs_supp)+
   729 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,x2,y1)")
   900 apply(rule impI)
   730 apply(force simp add: fresh_prod fresh_fun_simp_ImpR abs_fresh fresh_atm abs_supp)
   901 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,y1)", erule exE, simp add: fresh_prod)
   731 apply(meson exists_fresh' fin_supp)
   902 apply(erule conjE)+
   732 
   903 apply(simp add: fresh_fun_simp_OrR2 abs_fresh fresh_atm)
   733 apply(simp add: abs_fresh abs_supp | rule strip)+
   904 apply(rule exists_fresh', simp add: fin_supp)
   734 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,x2,y1)")
   905 apply(simp add: abs_fresh abs_supp)+
   735 apply(force simp add: fresh_prod fresh_fun_simp_ImpR abs_fresh fresh_atm)
   906 apply(rule impI)
   736 apply(meson exists_fresh' fin_supp)
   907 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,x2,y1)", erule exE, simp add: fresh_prod)
   737 
   908 apply(erule conjE)+
   738 apply(simp add: abs_fresh | fresh_guess add: abs_fresh)+
   909 apply(simp add: fresh_fun_simp_ImpR abs_fresh fresh_atm abs_supp)
   739 done
   910 apply(rule exists_fresh', simp add: fin_supp)
   740 
   911 apply(simp add: abs_fresh abs_supp)+
       
   912 apply(rule impI)
       
   913 apply(subgoal_tac "\<exists>x::coname. x\<sharp>(x1,P,x2,y1)", erule exE, simp add: fresh_prod)
       
   914 apply(erule conjE)+
       
   915 apply(simp add: fresh_fun_simp_ImpR abs_fresh fresh_atm)
       
   916 apply(rule exists_fresh', simp add: fin_supp)
       
   917 apply(simp add: abs_fresh abs_supp)+
       
   918 apply(fresh_guess add: abs_fresh fresh_prod)+
       
   919 done
       
   920 
   741 
   921 lemma csubst_eqvt[eqvt]:
   742 lemma csubst_eqvt[eqvt]:
   922   fixes pi1::"name prm"
   743   fixes pi1::"name prm"
   923   and   pi2::"coname prm"
   744   and   pi2::"coname prm"
   924   shows "pi1\<bullet>(M{c:=(x).N}) = (pi1\<bullet>M){(pi1\<bullet>c):=(pi1\<bullet>x).(pi1\<bullet>N)}"
   745   shows "pi1\<bullet>(M{c:=(x).N}) = (pi1\<bullet>M){(pi1\<bullet>c):=(pi1\<bullet>x).(pi1\<bullet>N)}"
   925   and   "pi2\<bullet>(M{c:=(x).N}) = (pi2\<bullet>M){(pi2\<bullet>c):=(pi2\<bullet>x).(pi2\<bullet>N)}"
   746   and   "pi2\<bullet>(M{c:=(x).N}) = (pi2\<bullet>M){(pi2\<bullet>c):=(pi2\<bullet>x).(pi2\<bullet>N)}"
   926 apply(nominal_induct M avoiding: c x N rule: trm.strong_induct)
   747 apply(nominal_induct M avoiding: c x N rule: trm.strong_induct)
   927 apply(auto simp add: eq_bij fresh_bij eqvts)
   748 apply(auto simp: eq_bij fresh_bij eqvts)
   928 apply(perm_simp)+
   749 apply(perm_simp)+
   929 done
   750 done
   930 
   751 
   931 lemma nsubst_eqvt[eqvt]:
   752 lemma nsubst_eqvt[eqvt]:
   932   fixes pi1::"name prm"
   753   fixes pi1::"name prm"
   933   and   pi2::"coname prm"
   754   and   pi2::"coname prm"
   934   shows "pi1\<bullet>(M{x:=<c>.N}) = (pi1\<bullet>M){(pi1\<bullet>x):=<(pi1\<bullet>c)>.(pi1\<bullet>N)}"
   755   shows "pi1\<bullet>(M{x:=<c>.N}) = (pi1\<bullet>M){(pi1\<bullet>x):=<(pi1\<bullet>c)>.(pi1\<bullet>N)}"
   935   and   "pi2\<bullet>(M{x:=<c>.N}) = (pi2\<bullet>M){(pi2\<bullet>x):=<(pi2\<bullet>c)>.(pi2\<bullet>N)}"
   756   and   "pi2\<bullet>(M{x:=<c>.N}) = (pi2\<bullet>M){(pi2\<bullet>x):=<(pi2\<bullet>c)>.(pi2\<bullet>N)}"
   936 apply(nominal_induct M avoiding: c x N rule: trm.strong_induct)
   757 apply(nominal_induct M avoiding: c x N rule: trm.strong_induct)
   937 apply(auto simp add: eq_bij fresh_bij eqvts)
   758 apply(auto simp: eq_bij fresh_bij eqvts)
   938 apply(perm_simp)+
   759 apply(perm_simp)+
   939 done
   760 done
   940 
   761 
   941 lemma supp_subst1:
   762 lemma supp_subst1:
   942   shows "supp (M{y:=<c>.P}) \<subseteq> ((supp M) - {y}) \<union> (supp P)"
   763   shows "supp (M{y:=<c>.P}) \<subseteq> ((supp M) - {y}) \<union> (supp P)"
   943 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct)
   764 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct)
   944 apply(auto)
   765 apply(auto)
   945 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
   766 apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp)
   946 apply(blast)+
   767 apply(blast)+
   947 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)")
   768 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)")
   948 apply(erule exE)
   769 apply(erule exE)
   949 apply(simp add: fresh_prod)
   770 apply(simp add: fresh_prod)
   950 apply(erule conjE)+
   771 apply(erule conjE)+
  1069 
   890 
  1070 lemma supp_subst2:
   891 lemma supp_subst2:
  1071   shows "supp (M{y:=<c>.P}) \<subseteq> supp (M) \<union> ((supp P) - {c})"
   892   shows "supp (M{y:=<c>.P}) \<subseteq> supp (M) \<union> ((supp P) - {c})"
  1072 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct)
   893 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct)
  1073 apply(auto)
   894 apply(auto)
  1074 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
   895 apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1075 apply(blast)+
   896 apply(blast)+
  1076 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)")
   897 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)")
  1077 apply(erule exE)
   898 apply(erule exE)
  1078 apply(simp add: fresh_prod)
   899 apply(simp add: fresh_prod)
  1079 apply(erule conjE)+
   900 apply(erule conjE)+
  1182 
  1003 
  1183 lemma supp_subst3:
  1004 lemma supp_subst3:
  1184   shows "supp (M{c:=(x).P}) \<subseteq> ((supp M) - {c}) \<union> (supp P)"
  1005   shows "supp (M{c:=(x).P}) \<subseteq> ((supp M) - {c}) \<union> (supp P)"
  1185 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct)
  1006 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct)
  1186 apply(auto)
  1007 apply(auto)
  1187 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1008 apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1188 apply(blast)+
  1009 apply(blast)+
  1189 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)")
  1010 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)")
  1190 apply(erule exE)
  1011 apply(erule exE)
  1191 apply(simp add: fresh_prod)
  1012 apply(simp add: fresh_prod)
  1192 apply(erule conjE)+
  1013 apply(erule conjE)+
  1310 
  1131 
  1311 lemma supp_subst4:
  1132 lemma supp_subst4:
  1312   shows "supp (M{c:=(x).P}) \<subseteq> (supp M) \<union> ((supp P) - {x})"
  1133   shows "supp (M{c:=(x).P}) \<subseteq> (supp M) \<union> ((supp P) - {x})"
  1313 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct)
  1134 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct)
  1314 apply(auto)
  1135 apply(auto)
  1315 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1136 apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1316 apply(blast)+
  1137 apply(blast)+
  1317 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)")
  1138 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)")
  1318 apply(erule exE)
  1139 apply(erule exE)
  1319 apply(simp add: fresh_prod)
  1140 apply(simp add: fresh_prod)
  1320 apply(erule conjE)+
  1141 apply(erule conjE)+
  1415 
  1236 
  1416 lemma supp_subst5:
  1237 lemma supp_subst5:
  1417   shows "(supp M - {y}) \<subseteq> supp (M{y:=<c>.P})"
  1238   shows "(supp M - {y}) \<subseteq> supp (M{y:=<c>.P})"
  1418 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct)
  1239 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct)
  1419 apply(auto)
  1240 apply(auto)
  1420 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1241 apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1421 apply(blast)+
  1242 apply(blast)+
  1422 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)")
  1243 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)")
  1423 apply(erule exE)
  1244 apply(erule exE)
  1424 apply(simp add: fresh_prod)
  1245 apply(simp add: fresh_prod)
  1425 apply(erule conjE)+
  1246 apply(erule conjE)+
  1482 
  1303 
  1483 lemma supp_subst6:
  1304 lemma supp_subst6:
  1484   shows "(supp M) \<subseteq> ((supp (M{y:=<c>.P}))::coname set)"
  1305   shows "(supp M) \<subseteq> ((supp (M{y:=<c>.P}))::coname set)"
  1485 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct)
  1306 apply(nominal_induct M avoiding: y P c rule: trm.strong_induct)
  1486 apply(auto)
  1307 apply(auto)
  1487 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1308 apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1488 apply(blast)+
  1309 apply(blast)+
  1489 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)")
  1310 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{y:=<c>.P},P)")
  1490 apply(erule exE)
  1311 apply(erule exE)
  1491 apply(simp add: fresh_prod)
  1312 apply(simp add: fresh_prod)
  1492 apply(erule conjE)+
  1313 apply(erule conjE)+
  1549 
  1370 
  1550 lemma supp_subst7:
  1371 lemma supp_subst7:
  1551   shows "(supp M - {c}) \<subseteq>  supp (M{c:=(x).P})"
  1372   shows "(supp M - {c}) \<subseteq>  supp (M{c:=(x).P})"
  1552 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct)
  1373 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct)
  1553 apply(auto)
  1374 apply(auto)
  1554 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1375 apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1555 apply(blast)+
  1376 apply(blast)+
  1556 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)")
  1377 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)")
  1557 apply(erule exE)
  1378 apply(erule exE)
  1558 apply(simp add: fresh_prod)
  1379 apply(simp add: fresh_prod)
  1559 apply(erule conjE)+
  1380 apply(erule conjE)+
  1608 
  1429 
  1609 lemma supp_subst8:
  1430 lemma supp_subst8:
  1610   shows "(supp M) \<subseteq> ((supp (M{c:=(x).P}))::name set)"
  1431   shows "(supp M) \<subseteq> ((supp (M{c:=(x).P}))::name set)"
  1611 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct)
  1432 apply(nominal_induct M avoiding: x P c rule: trm.strong_induct)
  1612 apply(auto)
  1433 apply(auto)
  1613 apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1434 apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp)
  1614 apply(blast)+
  1435 apply(blast)+
  1615 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)")
  1436 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(x).P},P)")
  1616 apply(erule exE)
  1437 apply(erule exE)
  1617 apply(simp add: fresh_prod)
  1438 apply(simp add: fresh_prod)
  1618 apply(erule conjE)+
  1439 apply(erule conjE)+
  1686 
  1507 
  1687 lemma forget:
  1508 lemma forget:
  1688   shows "x\<sharp>M \<Longrightarrow> M{x:=<c>.P} = M"
  1509   shows "x\<sharp>M \<Longrightarrow> M{x:=<c>.P} = M"
  1689   and   "c\<sharp>M \<Longrightarrow> M{c:=(x).P} = M"
  1510   and   "c\<sharp>M \<Longrightarrow> M{c:=(x).P} = M"
  1690 apply(nominal_induct M avoiding: x c P rule: trm.strong_induct)
  1511 apply(nominal_induct M avoiding: x c P rule: trm.strong_induct)
  1691 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
  1512 apply(auto simp: fresh_atm abs_fresh abs_supp fin_supp)
  1692 done
  1513 done
  1693 
  1514 
  1694 lemma substc_rename1:
  1515 lemma substc_rename1:
  1695   assumes a: "c\<sharp>(M,a)"
  1516   assumes a: "c\<sharp>(M,a)"
  1696   shows "M{a:=(x).N} = ([(c,a)]\<bullet>M){c:=(x).N}"
  1517   shows "M{a:=(x).N} = ([(c,a)]\<bullet>M){c:=(x).N}"
  1697 using a
  1518 using a
  1698 proof(nominal_induct M avoiding: c a x N rule: trm.strong_induct)
  1519 proof(nominal_induct M avoiding: c a x N rule: trm.strong_induct)
  1699   case (Ax z d)
  1520   case (Ax z d)
  1700   then show ?case by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha)
  1521   then show ?case by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha)
  1701 next
  1522 next
  1702   case NotL
  1523   case NotL
  1703   then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1524   then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1704 next
  1525 next
  1705   case (NotR y M d)
  1526   case (NotR y M d)
  1706   then show ?case 
  1527   then show ?case 
  1707     by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1528     by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1708 next
  1529 next
  1709   case (AndR c1 M c2 M' c3)
  1530   case (AndR c1 M c2 M' c3)
  1710   then show ?case
  1531   then show ?case
  1711     apply(auto simp add: fresh_prod calc_atm fresh_atm abs_fresh fresh_left)
  1532     apply(auto simp: fresh_prod calc_atm fresh_atm abs_fresh fresh_left)
  1712     apply (metis (erased, opaque_lifting))
  1533     apply (metis (erased, opaque_lifting))
  1713     by metis
  1534     by metis
  1714 next
  1535 next
  1715   case AndL1
  1536   case AndL1
  1716   then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1537   then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1717 next
  1538 next
  1718   case AndL2
  1539   case AndL2
  1719   then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1540   then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1720 next
  1541 next
  1721   case (OrR1 d M e)
  1542   case (OrR1 d M e)
  1722   then show ?case 
  1543   then show ?case 
  1723     by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1544     by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1724 next
  1545 next
  1725   case (OrR2 d M e)
  1546   case (OrR2 d M e)
  1726   then show ?case 
  1547   then show ?case 
  1727     by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1548     by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1728 next
  1549 next
  1729   case (OrL x1 M x2 M' x3)
  1550   case (OrL x1 M x2 M' x3)
  1730   then show ?case
  1551   then show ?case
  1731     by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1552     by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1732 next 
  1553 next 
  1733   case ImpL
  1554   case ImpL
  1734   then show ?case
  1555   then show ?case
  1735     by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1556     by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1736        metis
  1557        metis
  1737 next
  1558 next
  1738   case (ImpR y d M e)
  1559   case (ImpR y d M e)
  1739   then show ?case
  1560   then show ?case
  1740     by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1561     by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1741 next
  1562 next
  1742   case (Cut d M y M')
  1563   case (Cut d M y M')
  1743   then show ?case
  1564   then show ?case
  1744     by(simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1565     by(simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1745       (metis crename.simps(1) crename_id crename_rename)
  1566       (metis crename.simps(1) crename_id crename_rename)
  1750   shows "M{a:=(x).N} = M{a:=(y).([(y,x)]\<bullet>N)}"
  1571   shows "M{a:=(x).N} = M{a:=(y).([(y,x)]\<bullet>N)}"
  1751 using a
  1572 using a
  1752 proof(nominal_induct M avoiding: a x y N rule: trm.strong_induct)
  1573 proof(nominal_induct M avoiding: a x y N rule: trm.strong_induct)
  1753   case (Ax z d)
  1574   case (Ax z d)
  1754   then show ?case 
  1575   then show ?case 
  1755     by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left)
  1576     by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left)
  1756 next
  1577 next
  1757   case NotL
  1578   case NotL
  1758   then show ?case 
  1579   then show ?case 
  1759     by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left)
  1580     by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left)
  1760 next
  1581 next
  1761   case (NotR y M d)
  1582   case (NotR y M d)
  1762   then show ?case
  1583   then show ?case
  1763     apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1584     apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1764     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(N,M{d:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N)")
  1585     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(N,M{d:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N)")
  1765     apply(erule exE, simp add: fresh_prod)
  1586     apply(erule exE, simp add: fresh_prod)
  1766     apply(erule conjE)+
  1587     apply(erule conjE)+
  1767     apply(simp add: fresh_fun_simp_NotR)
  1588     apply(simp add: fresh_fun_simp_NotR)
  1768     apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm)
  1589     apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm)
  1769     apply(rule exists_fresh'(2)[OF fs_coname1])
  1590     apply(rule exists_fresh'(2)[OF fs_coname1])
  1770     done
  1591     done
  1771 next
  1592 next
  1772   case (AndR c1 M c2 M' c3)
  1593   case (AndR c1 M c2 M' c3)
  1773   then show ?case
  1594   then show ?case
  1774     apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1595     apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1775     apply(subgoal_tac 
  1596     apply(subgoal_tac 
  1776        "\<exists>a'::coname. a'\<sharp>(N,M{c3:=(y).([(y,x)]\<bullet>N)},M'{c3:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N,c1,c2,c3)")
  1597        "\<exists>a'::coname. a'\<sharp>(N,M{c3:=(y).([(y,x)]\<bullet>N)},M'{c3:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N,c1,c2,c3)")
  1777     apply(erule exE, simp add: fresh_prod)
  1598     apply(erule exE, simp add: fresh_prod)
  1778     apply(erule conjE)+
  1599     apply(erule conjE)+
  1779     apply(simp add: fresh_fun_simp_AndR)
  1600     apply(simp add: fresh_fun_simp_AndR)
  1780     apply (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh subst_fresh perm_swap fresh_left)
  1601     apply (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh subst_fresh perm_swap fresh_left)
  1781     apply(rule exists_fresh'(2)[OF fs_coname1])
  1602     apply(rule exists_fresh'(2)[OF fs_coname1])
  1782     done
  1603     done
  1783 next
  1604 next
  1784   case AndL1
  1605   case AndL1
  1785   then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1606   then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1786 next
  1607 next
  1787   case AndL2
  1608   case AndL2
  1788   then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1609   then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1789 next
  1610 next
  1790   case (OrR1 d M e)
  1611   case (OrR1 d M e)
  1791   then show ?case 
  1612   then show ?case 
  1792     apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1613     apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1793     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(N,M{e:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N,d,e)")
  1614     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(N,M{e:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N,d,e)")
  1794     apply(erule exE, simp add: fresh_prod)
  1615     apply(erule exE, simp add: fresh_prod)
  1795     apply(erule conjE)+
  1616     apply(erule conjE)+
  1796     apply(simp add: fresh_fun_simp_OrR1)
  1617     apply(simp add: fresh_fun_simp_OrR1)
  1797     apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm)
  1618     apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm)
  1798     apply(rule exists_fresh'(2)[OF fs_coname1])
  1619     apply(rule exists_fresh'(2)[OF fs_coname1])
  1799     done
  1620     done
  1800 next
  1621 next
  1801   case (OrR2 d M e)
  1622   case (OrR2 d M e)
  1802   then show ?case
  1623   then show ?case
  1803     apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1624     apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1804     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(N,M{e:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N,d,e)")
  1625     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(N,M{e:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N,d,e)")
  1805     apply(erule exE, simp add: fresh_prod)
  1626     apply(erule exE, simp add: fresh_prod)
  1806     apply(erule conjE)+
  1627     apply(erule conjE)+
  1807     apply(simp add: fresh_fun_simp_OrR2)
  1628     apply(simp add: fresh_fun_simp_OrR2)
  1808     apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm)
  1629     apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm)
  1809     apply(rule exists_fresh'(2)[OF fs_coname1])
  1630     apply(rule exists_fresh'(2)[OF fs_coname1])
  1810     done
  1631     done
  1811 next
  1632 next
  1812   case (OrL x1 M x2 M' x3)
  1633   case (OrL x1 M x2 M' x3)
  1813   then show ?case
  1634   then show ?case
  1814     by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1635     by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1815 next 
  1636 next 
  1816   case ImpL
  1637   case ImpL
  1817   then show ?case
  1638   then show ?case
  1818     by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1639     by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1819 next
  1640 next
  1820   case (ImpR y d M e)
  1641   case (ImpR y d M e)
  1821   then show ?case
  1642   then show ?case
  1822     apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1643     apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1823     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(N,M{e:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N,d,e)")
  1644     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(N,M{e:=(y).([(y,x)]\<bullet>N)},[(y,x)]\<bullet>N,d,e)")
  1824     apply(erule exE, simp add: fresh_prod)
  1645     apply(erule exE, simp add: fresh_prod)
  1825     apply(erule conjE)+
  1646     apply(erule conjE)+
  1826     apply(simp add: fresh_fun_simp_ImpR)
  1647     apply(simp add: fresh_fun_simp_ImpR)
  1827     apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm)
  1648     apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm)
  1828     apply(rule exists_fresh'(2)[OF fs_coname1])
  1649     apply(rule exists_fresh'(2)[OF fs_coname1])
  1829     done
  1650     done
  1830 next
  1651 next
  1831   case (Cut d M y M')
  1652   case (Cut d M y M')
  1832   then show ?case
  1653   then show ?case
  1833     by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left perm_swap)
  1654     by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left perm_swap)
  1834 qed
  1655 qed
  1835 
  1656 
  1836 lemma substn_rename3:
  1657 lemma substn_rename3:
  1837   assumes a: "y\<sharp>(M,x)"
  1658   assumes a: "y\<sharp>(M,x)"
  1838   shows "M{x:=<a>.N} = ([(y,x)]\<bullet>M){y:=<a>.N}"
  1659   shows "M{x:=<a>.N} = ([(y,x)]\<bullet>M){y:=<a>.N}"
  1839 using a
  1660 using a
  1840 proof(nominal_induct M avoiding: a x y N rule: trm.strong_induct)
  1661 proof(nominal_induct M avoiding: a x y N rule: trm.strong_induct)
  1841   case (Ax z d)
  1662   case (Ax z d)
  1842   then show ?case by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha)
  1663   then show ?case by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha)
  1843 next
  1664 next
  1844   case NotR
  1665   case NotR
  1845   then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1666   then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1846 next
  1667 next
  1847   case (NotL d M z)
  1668   case (NotL d M z)
  1848   then show ?case 
  1669   then show ?case 
  1849     by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1670     by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1850 next
  1671 next
  1851   case (AndR c1 M c2 M' c3)
  1672   case (AndR c1 M c2 M' c3)
  1852   then show ?case
  1673   then show ?case
  1853     by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1674     by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1854 next
  1675 next
  1855   case OrR1
  1676   case OrR1
  1856   then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1677   then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1857 next
  1678 next
  1858   case OrR2
  1679   case OrR2
  1859   then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1680   then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1860 next
  1681 next
  1861   case (AndL1 u M v)
  1682   case (AndL1 u M v)
  1862   then show ?case 
  1683   then show ?case 
  1863     by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1684     by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1864 next
  1685 next
  1865   case (AndL2 u M v)
  1686   case (AndL2 u M v)
  1866   then show ?case 
  1687   then show ?case 
  1867     by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1688     by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod)
  1868 next
  1689 next
  1869   case (OrL x1 M x2 M' x3)
  1690   case (OrL x1 M x2 M' x3)
  1870   then show ?case
  1691   then show ?case
  1871     by(simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1692     by(simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1872       (metis (poly_guards_query))
  1693       (metis (poly_guards_query))
  1873 next 
  1694 next 
  1874   case ImpR
  1695   case ImpR
  1875   then show ?case
  1696   then show ?case
  1876   by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_left abs_supp fin_supp fresh_prod)
  1697   by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_left abs_supp fin_supp fresh_prod)
  1877 next
  1698 next
  1878   case (ImpL d M v M' u)
  1699   case (ImpL d M v M' u)
  1879   then show ?case
  1700   then show ?case
  1880     by(simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1701     by(simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1881        (metis (poly_guards_query))
  1702        (metis (poly_guards_query))
  1882 next
  1703 next
  1883   case (Cut d M y M')
  1704   case (Cut d M y M')
  1884   then show ?case
  1705   then show ?case
  1885     apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1706     apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1886     apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
  1707     apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
  1887     apply(simp add: calc_atm)
  1708     apply(simp add: calc_atm)
  1888     apply metis
  1709     apply metis
  1889     done
  1710     done
  1890 qed
  1711 qed
  1894   shows "M{x:=<a>.N} = M{x:=<c>.([(c,a)]\<bullet>N)}"
  1715   shows "M{x:=<a>.N} = M{x:=<c>.([(c,a)]\<bullet>N)}"
  1895 using a
  1716 using a
  1896 proof(nominal_induct M avoiding: x c a N rule: trm.strong_induct)
  1717 proof(nominal_induct M avoiding: x c a N rule: trm.strong_induct)
  1897   case (Ax z d)
  1718   case (Ax z d)
  1898   then show ?case 
  1719   then show ?case 
  1899     by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left)
  1720     by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left)
  1900 next
  1721 next
  1901   case NotR
  1722   case NotR
  1902   then show ?case 
  1723   then show ?case 
  1903     by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left)
  1724     by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left)
  1904 next
  1725 next
  1905   case (NotL d M y)
  1726   case (NotL d M y)
  1906   then show ?case
  1727   then show ?case
  1907     apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1728     apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1908     apply(subgoal_tac "\<exists>a'::name. a'\<sharp>(N,M{x:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N)")
  1729     apply(subgoal_tac "\<exists>a'::name. a'\<sharp>(N,M{x:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N)")
  1909     apply(erule exE, simp add: fresh_prod)
  1730     apply(erule exE, simp add: fresh_prod)
  1910     apply(erule conjE)+
  1731     apply(erule conjE)+
  1911     apply(simp add: fresh_fun_simp_NotL)
  1732     apply(simp add: fresh_fun_simp_NotL)
  1912     apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm)
  1733     apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm)
  1913     apply(rule exists_fresh'(1)[OF fs_name1])
  1734     apply(rule exists_fresh'(1)[OF fs_name1])
  1914     done
  1735     done
  1915 next
  1736 next
  1916   case (OrL x1 M x2 M' x3)
  1737   case (OrL x1 M x2 M' x3)
  1917   then show ?case
  1738   then show ?case
  1918     apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1739     apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1919     apply(subgoal_tac 
  1740     apply(subgoal_tac 
  1920        "\<exists>a'::name. a'\<sharp>(N,M{x:=<c>.([(c,a)]\<bullet>N)},M'{x:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N,x1,x2,x3)")
  1741        "\<exists>a'::name. a'\<sharp>(N,M{x:=<c>.([(c,a)]\<bullet>N)},M'{x:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N,x1,x2,x3)")
  1921     apply(erule exE, simp add: fresh_prod)
  1742     apply(erule exE, simp add: fresh_prod)
  1922     apply(erule conjE)+
  1743     apply(erule conjE)+
  1923     apply(simp add: fresh_fun_simp_OrL)
  1744     apply(simp add: fresh_fun_simp_OrL)
  1924     apply (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh subst_fresh perm_swap fresh_left)
  1745     apply (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh subst_fresh perm_swap fresh_left)
  1925     apply(rule exists_fresh'(1)[OF fs_name1])
  1746     apply(rule exists_fresh'(1)[OF fs_name1])
  1926     done
  1747     done
  1927 next
  1748 next
  1928   case OrR1
  1749   case OrR1
  1929   then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1750   then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1930 next
  1751 next
  1931   case OrR2
  1752   case OrR2
  1932   then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1753   then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1933 next
  1754 next
  1934   case (AndL1 u M v)
  1755   case (AndL1 u M v)
  1935   then show ?case 
  1756   then show ?case 
  1936     apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1757     apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1937     apply(subgoal_tac "\<exists>a'::name. a'\<sharp>(N,M{x:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N,u,v)")
  1758     apply(subgoal_tac "\<exists>a'::name. a'\<sharp>(N,M{x:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N,u,v)")
  1938     apply(erule exE, simp add: fresh_prod)
  1759     apply(erule exE, simp add: fresh_prod)
  1939     apply(erule conjE)+
  1760     apply(erule conjE)+
  1940     apply(simp add: fresh_fun_simp_AndL1)
  1761     apply(simp add: fresh_fun_simp_AndL1)
  1941     apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm)
  1762     apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm)
  1942     apply(rule exists_fresh'(1)[OF fs_name1])
  1763     apply(rule exists_fresh'(1)[OF fs_name1])
  1943     done
  1764     done
  1944 next
  1765 next
  1945   case (AndL2 u M v)
  1766   case (AndL2 u M v)
  1946   then show ?case 
  1767   then show ?case 
  1947     apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1768     apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1948     apply(subgoal_tac "\<exists>a'::name. a'\<sharp>(N,M{x:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N,u,v)")
  1769     apply(subgoal_tac "\<exists>a'::name. a'\<sharp>(N,M{x:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N,u,v)")
  1949     apply(erule exE, simp add: fresh_prod)
  1770     apply(erule exE, simp add: fresh_prod)
  1950     apply(erule conjE)+
  1771     apply(erule conjE)+
  1951     apply(simp add: fresh_fun_simp_AndL2)
  1772     apply(simp add: fresh_fun_simp_AndL2)
  1952     apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm)
  1773     apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm)
  1953     apply(rule exists_fresh'(1)[OF fs_name1])
  1774     apply(rule exists_fresh'(1)[OF fs_name1])
  1954     done
  1775     done
  1955 next
  1776 next
  1956   case (AndR c1 M c2 M' c3)
  1777   case (AndR c1 M c2 M' c3)
  1957   then show ?case
  1778   then show ?case
  1958     by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1779     by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1959 next 
  1780 next 
  1960   case ImpR
  1781   case ImpR
  1961   then show ?case
  1782   then show ?case
  1962     by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1783     by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1963 next
  1784 next
  1964   case (ImpL d M y M' u)
  1785   case (ImpL d M y M' u)
  1965   then show ?case
  1786   then show ?case
  1966     apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1787     apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left)
  1967     apply(subgoal_tac "\<exists>a'::name. a'\<sharp>(N,M{u:=<c>.([(c,a)]\<bullet>N)},M'{u:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N,y,u)")
  1788     apply(subgoal_tac "\<exists>a'::name. a'\<sharp>(N,M{u:=<c>.([(c,a)]\<bullet>N)},M'{u:=<c>.([(c,a)]\<bullet>N)},[(c,a)]\<bullet>N,y,u)")
  1968     apply(erule exE, simp add: fresh_prod)
  1789     apply(erule exE, simp add: fresh_prod)
  1969     apply(erule conjE)+
  1790     apply(erule conjE)+
  1970     apply(simp add: fresh_fun_simp_ImpL)
  1791     apply(simp add: fresh_fun_simp_ImpL)
  1971     apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm)
  1792     apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm)
  1972     apply(rule exists_fresh'(1)[OF fs_name1])
  1793     apply(rule exists_fresh'(1)[OF fs_name1])
  1973     done
  1794     done
  1974 next
  1795 next
  1975   case (Cut d M y M')
  1796   case (Cut d M y M')
  1976   then show ?case
  1797   then show ?case
  1977     by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left perm_swap)
  1798     by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left perm_swap)
  1978 qed
  1799 qed
  1979 
  1800 
  1980 lemma subst_rename5:
  1801 lemma subst_rename5:
  1981   assumes a: "c'\<sharp>(c,N)" "x'\<sharp>(x,M)"
  1802   assumes a: "c'\<sharp>(c,N)" "x'\<sharp>(x,M)"
  1982   shows "M{x:=<c>.N} = ([(x',x)]\<bullet>M){x':=<c'>.([(c',c)]\<bullet>N)}"
  1803   shows "M{x:=<c>.N} = ([(x',x)]\<bullet>M){x':=<c'>.([(c',c)]\<bullet>N)}"
  2003   (if M=Ax y a then Cut <c>.P (x).(N{y:=<c>.P}) else Cut <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}))"
  1824   (if M=Ax y a then Cut <c>.P (x).(N{y:=<c>.P}) else Cut <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}))"
  2004 proof -   
  1825 proof -   
  2005   obtain x'::"name"   where fs1: "x'\<sharp>(M,N,c,P,x,y)" by (rule exists_fresh(1), rule fin_supp, blast)
  1826   obtain x'::"name"   where fs1: "x'\<sharp>(M,N,c,P,x,y)" by (rule exists_fresh(1), rule fin_supp, blast)
  2006   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,c,P,a)" by (rule exists_fresh(2), rule fin_supp, blast)
  1827   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,c,P,a)" by (rule exists_fresh(2), rule fin_supp, blast)
  2007   have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))"
  1828   have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))"
  2008     using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  1829     using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  2009   have eq2: "(M=Ax y a) = (([(a',a)]\<bullet>M)=Ax y a')"
  1830   have eq2: "(M=Ax y a) = (([(a',a)]\<bullet>M)=Ax y a')"
  2010     apply(auto simp add: calc_atm)
  1831     apply(auto simp: calc_atm)
  2011     apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
  1832     apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst])
  2012     apply(simp add: calc_atm)
  1833     apply(simp add: calc_atm)
  2013     done
  1834     done
  2014   have "(Cut <a>.M (x).N){y:=<c>.P} = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)){y:=<c>.P}" 
  1835   have "(Cut <a>.M (x).N){y:=<c>.P} = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)){y:=<c>.P}" 
  2015     using eq1 by simp
  1836     using eq1 by simp
  2016   also have "\<dots> = (if ([(a',a)]\<bullet>M)=Ax y a' then Cut <c>.P (x').(([(x',x)]\<bullet>N){y:=<c>.P}) 
  1837   also have "\<dots> = (if ([(a',a)]\<bullet>M)=Ax y a' then Cut <c>.P (x').(([(x',x)]\<bullet>N){y:=<c>.P}) 
  2017                               else Cut <a'>.(([(a',a)]\<bullet>M){y:=<c>.P}) (x').(([(x',x)]\<bullet>N){y:=<c>.P}))" 
  1838                               else Cut <a'>.(([(a',a)]\<bullet>M){y:=<c>.P}) (x').(([(x',x)]\<bullet>N){y:=<c>.P}))" 
  2018     using fs1 fs2 by (auto simp add: fresh_prod fresh_left calc_atm fresh_atm)
  1839     using fs1 fs2 by (auto simp: fresh_prod fresh_left calc_atm fresh_atm)
  2019   also have "\<dots> =(if M=Ax y a then Cut <c>.P (x).(N{y:=<c>.P}) else Cut <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}))"
  1840   also have "\<dots> =(if M=Ax y a then Cut <c>.P (x).(N{y:=<c>.P}) else Cut <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}))"
  2020     using fs1 fs2 a
  1841     using fs1 fs2 a
  2021     apply -
  1842     apply -
  2022     apply(simp only: eq2[symmetric])
  1843     apply(simp only: eq2[symmetric])
  2023     apply(auto simp add: trm.inject)
  1844     apply(auto simp: trm.inject)
  2024     apply(simp_all add: alpha fresh_atm fresh_prod subst_fresh)
  1845     apply(simp_all add: alpha fresh_atm fresh_prod subst_fresh)
  2025     apply(simp_all add: eqvts perm_fresh_fresh calc_atm)
  1846     apply(simp_all add: eqvts perm_fresh_fresh calc_atm)
  2026     apply(auto)
  1847     apply(auto)
  2027     apply(rule subst_rename)
  1848     apply(rule subst_rename)
  2028     apply(simp add: fresh_prod fresh_atm)
  1849     apply(simp add: fresh_prod fresh_atm)
  2038   (if N=Ax x c then Cut <a>.(M{c:=(y).P}) (y).P else Cut <a>.(M{c:=(y).P}) (x).(N{c:=(y).P}))" 
  1859   (if N=Ax x c then Cut <a>.(M{c:=(y).P}) (y).P else Cut <a>.(M{c:=(y).P}) (x).(N{c:=(y).P}))" 
  2039 proof -   
  1860 proof -   
  2040   obtain x'::"name"   where fs1: "x'\<sharp>(M,N,c,P,x,y)" by (rule exists_fresh(1), rule fin_supp, blast)
  1861   obtain x'::"name"   where fs1: "x'\<sharp>(M,N,c,P,x,y)" by (rule exists_fresh(1), rule fin_supp, blast)
  2041   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,c,P,a)" by (rule exists_fresh(2), rule fin_supp, blast)
  1862   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,c,P,a)" by (rule exists_fresh(2), rule fin_supp, blast)
  2042   have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))"
  1863   have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N))"
  2043     using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  1864     using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  2044   have eq2: "(N=Ax x c) = (([(x',x)]\<bullet>N)=Ax x' c)"
  1865   have eq2: "(N=Ax x c) = (([(x',x)]\<bullet>N)=Ax x' c)"
  2045     apply(auto simp add: calc_atm)
  1866     apply(auto simp: calc_atm)
  2046     apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
  1867     apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
  2047     apply(simp add: calc_atm)
  1868     apply(simp add: calc_atm)
  2048     done
  1869     done
  2049   have "(Cut <a>.M (x).N){c:=(y).P} = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)){c:=(y).P}" 
  1870   have "(Cut <a>.M (x).N){c:=(y).P} = (Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)){c:=(y).P}" 
  2050     using eq1 by simp
  1871     using eq1 by simp
  2053     using fs1 fs2  by (simp add: fresh_prod fresh_left calc_atm fresh_atm trm.inject)
  1874     using fs1 fs2  by (simp add: fresh_prod fresh_left calc_atm fresh_atm trm.inject)
  2054   also have "\<dots> =(if N=Ax x c then Cut <a>.(M{c:=(y).P}) (y).P else Cut <a>.(M{c:=(y).P}) (x).(N{c:=(y).P}))"
  1875   also have "\<dots> =(if N=Ax x c then Cut <a>.(M{c:=(y).P}) (y).P else Cut <a>.(M{c:=(y).P}) (x).(N{c:=(y).P}))"
  2055     using fs1 fs2 a
  1876     using fs1 fs2 a
  2056     apply -
  1877     apply -
  2057     apply(simp only: eq2[symmetric])
  1878     apply(simp only: eq2[symmetric])
  2058     apply(auto simp add: trm.inject)
  1879     apply(auto simp: trm.inject)
  2059     apply(simp_all add: alpha fresh_atm fresh_prod subst_fresh)
  1880     apply(simp_all add: alpha fresh_atm fresh_prod subst_fresh)
  2060     apply(simp_all add: eqvts perm_fresh_fresh calc_atm)
  1881     apply(simp_all add: eqvts perm_fresh_fresh calc_atm)
  2061     apply(auto)
  1882     apply(auto)
  2062     apply(rule subst_rename)
  1883     apply(rule subst_rename)
  2063     apply(simp add: fresh_prod fresh_atm)
  1884     apply(simp add: fresh_prod fresh_atm)
  2076 apply(subgoal_tac "Cut <a>.M (x).N = Cut <a>.M (ca).([(ca,x)]\<bullet>N)")
  1897 apply(subgoal_tac "Cut <a>.M (x).N = Cut <a>.M (ca).([(ca,x)]\<bullet>N)")
  2077 apply(simp)
  1898 apply(simp)
  2078 apply(subgoal_tac"y\<sharp>([(ca,x)]\<bullet>N)")
  1899 apply(subgoal_tac"y\<sharp>([(ca,x)]\<bullet>N)")
  2079 apply(simp add: forget)
  1900 apply(simp add: forget)
  2080 apply(simp add: trm.inject)
  1901 apply(simp add: trm.inject)
  2081 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1]
  1902 apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1]
  2082 apply(simp add: trm.inject)
  1903 apply(simp add: trm.inject)
  2083 apply(rule sym)
  1904 apply(rule sym)
  2084 apply(simp add: alpha fresh_prod fresh_atm)
  1905 apply(simp add: alpha fresh_prod fresh_atm)
  2085 done
  1906 done
  2086 
  1907 
  2089   shows "(NotR (x).M d){d:=(z).P} = fresh_fun (\<lambda>a'. Cut <a'>.NotR (x).M a' (z).P)"
  1910   shows "(NotR (x).M d){d:=(z).P} = fresh_fun (\<lambda>a'. Cut <a'>.NotR (x).M a' (z).P)"
  2090 using a
  1911 using a
  2091 apply -
  1912 apply -
  2092 apply(generate_fresh "name")
  1913 apply(generate_fresh "name")
  2093 apply(subgoal_tac "NotR (x).M d = NotR (c).([(c,x)]\<bullet>M) d")
  1914 apply(subgoal_tac "NotR (x).M d = NotR (c).([(c,x)]\<bullet>M) d")
  2094 apply(auto simp add: fresh_left calc_atm forget)
  1915 apply(auto simp: fresh_left calc_atm forget)
  2095 apply(generate_fresh "coname")
  1916 apply(generate_fresh "coname")
  2096 apply(rule_tac f="fresh_fun" in arg_cong)
  1917 apply(rule_tac f="fresh_fun" in arg_cong)
  2097 apply(simp add:  fun_eq_iff)
  1918 apply(simp add:  fun_eq_iff)
  2098 apply(rule allI)
  1919 apply(rule allI)
  2099 apply(simp add: trm.inject alpha fresh_prod fresh_atm)
  1920 apply(simp add: trm.inject alpha fresh_prod fresh_atm)
  2105   shows "(NotL <a>.M y){y:=<c>.P} = fresh_fun (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x')"
  1926   shows "(NotL <a>.M y){y:=<c>.P} = fresh_fun (\<lambda>x'. Cut <c>.P (x').NotL <a>.M x')"
  2106 using a
  1927 using a
  2107 apply -
  1928 apply -
  2108 apply(generate_fresh "coname")
  1929 apply(generate_fresh "coname")
  2109 apply(subgoal_tac "NotL <a>.M y = NotL <ca>.([(ca,a)]\<bullet>M) y")
  1930 apply(subgoal_tac "NotL <a>.M y = NotL <ca>.([(ca,a)]\<bullet>M) y")
  2110 apply(auto simp add: fresh_left calc_atm forget)
  1931 apply(auto simp: fresh_left calc_atm forget)
  2111 apply(generate_fresh "name")
  1932 apply(generate_fresh "name")
  2112 apply(rule_tac f="fresh_fun" in arg_cong)
  1933 apply(rule_tac f="fresh_fun" in arg_cong)
  2113 apply(simp add:  fun_eq_iff)
  1934 apply(simp add:  fun_eq_iff)
  2114 apply(rule allI)
  1935 apply(rule allI)
  2115 apply(simp add: trm.inject alpha fresh_prod fresh_atm)
  1936 apply(simp add: trm.inject alpha fresh_prod fresh_atm)
  2121   shows "(AndL1 (x).M y){y:=<c>.P} = fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z')"
  1942   shows "(AndL1 (x).M y){y:=<c>.P} = fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL1 (x).M z')"
  2122 using a
  1943 using a
  2123 apply -
  1944 apply -
  2124 apply(generate_fresh "name")
  1945 apply(generate_fresh "name")
  2125 apply(subgoal_tac "AndL1 (x).M y = AndL1 (ca).([(ca,x)]\<bullet>M) y")
  1946 apply(subgoal_tac "AndL1 (x).M y = AndL1 (ca).([(ca,x)]\<bullet>M) y")
  2126 apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1]
  1947 apply(auto simp: fresh_left calc_atm forget abs_fresh)[1]
  2127 apply(generate_fresh "name")
  1948 apply(generate_fresh "name")
  2128 apply(rule_tac f="fresh_fun" in arg_cong)
  1949 apply(rule_tac f="fresh_fun" in arg_cong)
  2129 apply(simp add:  fun_eq_iff)
  1950 apply(simp add:  fun_eq_iff)
  2130 apply(rule allI)
  1951 apply(rule allI)
  2131 apply(simp add: trm.inject alpha fresh_prod fresh_atm)
  1952 apply(simp add: trm.inject alpha fresh_prod fresh_atm)
  2146   shows "(AndL2 (x).M y){y:=<c>.P} = fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z')"
  1967   shows "(AndL2 (x).M y){y:=<c>.P} = fresh_fun (\<lambda>z'. Cut <c>.P (z').AndL2 (x).M z')"
  2147 using a
  1968 using a
  2148 apply -
  1969 apply -
  2149 apply(generate_fresh "name")
  1970 apply(generate_fresh "name")
  2150 apply(subgoal_tac "AndL2 (x).M y = AndL2 (ca).([(ca,x)]\<bullet>M) y")
  1971 apply(subgoal_tac "AndL2 (x).M y = AndL2 (ca).([(ca,x)]\<bullet>M) y")
  2151 apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1]
  1972 apply(auto simp: fresh_left calc_atm forget abs_fresh)[1]
  2152 apply(generate_fresh "name")
  1973 apply(generate_fresh "name")
  2153 apply(rule_tac f="fresh_fun" in arg_cong)
  1974 apply(rule_tac f="fresh_fun" in arg_cong)
  2154 apply(simp add:  fun_eq_iff)
  1975 apply(simp add:  fun_eq_iff)
  2155 apply(rule allI)
  1976 apply(rule allI)
  2156 apply(simp add: trm.inject alpha fresh_prod fresh_atm)
  1977 apply(simp add: trm.inject alpha fresh_prod fresh_atm)
  2172 using a
  1993 using a
  2173 apply -
  1994 apply -
  2174 apply(generate_fresh "coname")
  1995 apply(generate_fresh "coname")
  2175 apply(generate_fresh "coname")
  1996 apply(generate_fresh "coname")
  2176 apply(subgoal_tac "AndR <a>.M <b>.N c = AndR <ca>.([(ca,a)]\<bullet>M) <caa>.([(caa,b)]\<bullet>N) c")
  1997 apply(subgoal_tac "AndR <a>.M <b>.N c = AndR <ca>.([(ca,a)]\<bullet>M) <caa>.([(caa,b)]\<bullet>N) c")
  2177 apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1]
  1998 apply(auto simp: fresh_left calc_atm forget abs_fresh)[1]
  2178 apply(rule trans)
  1999 apply(rule trans)
  2179 apply(rule substc.simps)
  2000 apply(rule substc.simps)
  2180 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1]
  2001 apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1]
  2181 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1]
  2002 apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1]
  2182 apply(auto simp add: fresh_prod fresh_atm)[1]
  2003 apply(auto simp: fresh_prod fresh_atm)[1]
  2183 apply(simp)
  2004 apply(simp)
  2184 apply(rule_tac f="fresh_fun" in arg_cong)
  2005 apply(rule_tac f="fresh_fun" in arg_cong)
  2185 apply(simp add:  fun_eq_iff)
  2006 apply(simp add:  fun_eq_iff)
  2186 apply(rule allI)
  2007 apply(rule allI)
  2187 apply(simp add: trm.inject alpha fresh_prod fresh_atm)
  2008 apply(simp add: trm.inject alpha fresh_prod fresh_atm)
  2188 apply(rule conjI)
  2009 apply(rule conjI)
  2189 apply(rule forget)
  2010 apply(rule forget)
  2190 apply(auto simp add: fresh_left calc_atm abs_fresh)[1]
  2011 apply(auto simp: fresh_left calc_atm abs_fresh)[1]
  2191 apply(rule forget)
  2012 apply(rule forget)
  2192 apply(auto simp add: fresh_left calc_atm abs_fresh)[1]
  2013 apply(auto simp: fresh_left calc_atm abs_fresh)[1]
  2193 apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm)
  2014 apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm)
  2194 apply(auto)
  2015 apply(auto)
  2195 done
  2016 done
  2196 
  2017 
  2197 lemma better_OrL_substn:
  2018 lemma better_OrL_substn:
  2200 using a
  2021 using a
  2201 apply -
  2022 apply -
  2202 apply(generate_fresh "name")
  2023 apply(generate_fresh "name")
  2203 apply(generate_fresh "name")
  2024 apply(generate_fresh "name")
  2204 apply(subgoal_tac "OrL (y).M (z).N x = OrL (ca).([(ca,y)]\<bullet>M) (caa).([(caa,z)]\<bullet>N) x")
  2025 apply(subgoal_tac "OrL (y).M (z).N x = OrL (ca).([(ca,y)]\<bullet>M) (caa).([(caa,z)]\<bullet>N) x")
  2205 apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1]
  2026 apply(auto simp: fresh_left calc_atm forget abs_fresh)[1]
  2206 apply(rule trans)
  2027 apply(rule trans)
  2207 apply(rule substn.simps)
  2028 apply(rule substn.simps)
  2208 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1]
  2029 apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1]
  2209 apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1]
  2030 apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1]
  2210 apply(auto simp add: fresh_prod fresh_atm)[1]
  2031 apply(auto simp: fresh_prod fresh_atm)[1]
  2211 apply(simp)
  2032 apply(simp)
  2212 apply(rule_tac f="fresh_fun" in arg_cong)
  2033 apply(rule_tac f="fresh_fun" in arg_cong)
  2213 apply(simp add:  fun_eq_iff)
  2034 apply(simp add:  fun_eq_iff)
  2214 apply(rule allI)
  2035 apply(rule allI)
  2215 apply(simp add: trm.inject alpha fresh_prod fresh_atm)
  2036 apply(simp add: trm.inject alpha fresh_prod fresh_atm)
  2216 apply(rule conjI)
  2037 apply(rule conjI)
  2217 apply(rule forget)
  2038 apply(rule forget)
  2218 apply(auto simp add: fresh_left calc_atm abs_fresh)[1]
  2039 apply(auto simp: fresh_left calc_atm abs_fresh)[1]
  2219 apply(rule forget)
  2040 apply(rule forget)
  2220 apply(auto simp add: fresh_left calc_atm abs_fresh)[1]
  2041 apply(auto simp: fresh_left calc_atm abs_fresh)[1]
  2221 apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm)
  2042 apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm)
  2222 apply(auto)
  2043 apply(auto)
  2223 done
  2044 done
  2224 
  2045 
  2225 lemma better_OrR1_substc:
  2046 lemma better_OrR1_substc:
  2227   shows "(OrR1 <a>.M d){d:=(z).P} = fresh_fun (\<lambda>a'. Cut <a'>.OrR1 <a>.M a' (z).P)"
  2048   shows "(OrR1 <a>.M d){d:=(z).P} = fresh_fun (\<lambda>a'. Cut <a'>.OrR1 <a>.M a' (z).P)"
  2228 using a
  2049 using a
  2229 apply -
  2050 apply -
  2230 apply(generate_fresh "coname")
  2051 apply(generate_fresh "coname")
  2231 apply(subgoal_tac "OrR1 <a>.M d = OrR1 <c>.([(c,a)]\<bullet>M) d")
  2052 apply(subgoal_tac "OrR1 <a>.M d = OrR1 <c>.([(c,a)]\<bullet>M) d")
  2232 apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1]
  2053 apply(auto simp: fresh_left calc_atm forget abs_fresh)[1]
  2233 apply(rule_tac f="fresh_fun" in arg_cong)
  2054 apply(rule_tac f="fresh_fun" in arg_cong)
  2234 apply(simp add:  fun_eq_iff)
  2055 apply(simp add:  fun_eq_iff)
  2235 apply(rule allI)
  2056 apply(rule allI)
  2236 apply(simp add: trm.inject alpha fresh_prod fresh_atm)
  2057 apply(simp add: trm.inject alpha fresh_prod fresh_atm)
  2237 apply(rule forget)
  2058 apply(rule forget)
  2251   shows "(OrR2 <a>.M d){d:=(z).P} = fresh_fun (\<lambda>a'. Cut <a'>.OrR2 <a>.M a' (z).P)"
  2072   shows "(OrR2 <a>.M d){d:=(z).P} = fresh_fun (\<lambda>a'. Cut <a'>.OrR2 <a>.M a' (z).P)"
  2252 using a
  2073 using a
  2253 apply -
  2074 apply -
  2254 apply(generate_fresh "coname")
  2075 apply(generate_fresh "coname")
  2255 apply(subgoal_tac "OrR2 <a>.M d = OrR2 <c>.([(c,a)]\<bullet>M) d")
  2076 apply(subgoal_tac "OrR2 <a>.M d = OrR2 <c>.([(c,a)]\<bullet>M) d")
  2256 apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1]
  2077 apply(auto simp: fresh_left calc_atm forget abs_fresh)[1]
  2257 apply(rule_tac f="fresh_fun" in arg_cong)
  2078 apply(rule_tac f="fresh_fun" in arg_cong)
  2258 apply(simp add:  fun_eq_iff)
  2079 apply(simp add:  fun_eq_iff)
  2259 apply(rule allI)
  2080 apply(rule allI)
  2260 apply(simp add: trm.inject alpha fresh_prod fresh_atm)
  2081 apply(simp add: trm.inject alpha fresh_prod fresh_atm)
  2261 apply(rule forget)
  2082 apply(rule forget)
  2276 using a
  2097 using a
  2277 apply -
  2098 apply -
  2278 apply(generate_fresh "coname")
  2099 apply(generate_fresh "coname")
  2279 apply(generate_fresh "name")
  2100 apply(generate_fresh "name")
  2280 apply(subgoal_tac "ImpR (x).<a>.M d = ImpR (ca).<c>.([(c,a)]\<bullet>[(ca,x)]\<bullet>M) d")
  2101 apply(subgoal_tac "ImpR (x).<a>.M d = ImpR (ca).<c>.([(c,a)]\<bullet>[(ca,x)]\<bullet>M) d")
  2281 apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1]
  2102 apply(auto simp: fresh_left calc_atm forget abs_fresh)[1]
  2282 apply(rule_tac f="fresh_fun" in arg_cong)
  2103 apply(rule_tac f="fresh_fun" in arg_cong)
  2283 apply(simp add:  fun_eq_iff)
  2104 apply(simp add:  fun_eq_iff)
  2284 apply(rule allI)
  2105 apply(rule allI)
  2285 apply(simp add: trm.inject alpha fresh_prod fresh_atm abs_perm abs_fresh fresh_left calc_atm)
  2106 apply(simp add: trm.inject alpha fresh_prod fresh_atm abs_perm abs_fresh fresh_left calc_atm)
  2286 apply(rule forget)
  2107 apply(rule forget)
  2301 using a
  2122 using a
  2302 apply -
  2123 apply -
  2303 apply(generate_fresh "coname")
  2124 apply(generate_fresh "coname")
  2304 apply(generate_fresh "name")
  2125 apply(generate_fresh "name")
  2305 apply(subgoal_tac "ImpL <a>.M (x).N y = ImpL <ca>.([(ca,a)]\<bullet>M) (caa).([(caa,x)]\<bullet>N) y")
  2126 apply(subgoal_tac "ImpL <a>.M (x).N y = ImpL <ca>.([(ca,a)]\<bullet>M) (caa).([(caa,x)]\<bullet>N) y")
  2306 apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1]
  2127 apply(auto simp: fresh_left calc_atm forget abs_fresh)[1]
  2307 apply(rule_tac f="fresh_fun" in arg_cong)
  2128 apply(rule_tac f="fresh_fun" in arg_cong)
  2308 apply(simp add:  fun_eq_iff)
  2129 apply(simp add:  fun_eq_iff)
  2309 apply(rule allI)
  2130 apply(rule allI)
  2310 apply(simp add: trm.inject alpha fresh_prod fresh_atm abs_perm abs_fresh fresh_left calc_atm)
  2131 apply(simp add: trm.inject alpha fresh_prod fresh_atm abs_perm abs_fresh fresh_left calc_atm)
  2311 apply(rule forget)
  2132 apply(rule forget)
  2355 lemma substn_crename_comm:
  2176 lemma substn_crename_comm:
  2356   assumes a: "c\<noteq>a" "c\<noteq>b"
  2177   assumes a: "c\<noteq>a" "c\<noteq>b"
  2357   shows "M{x:=<c>.P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{x:=<c>.(P[a\<turnstile>c>b])}"
  2178   shows "M{x:=<c>.P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{x:=<c>.(P[a\<turnstile>c>b])}"
  2358 using a
  2179 using a
  2359 apply(nominal_induct M avoiding: x c P a b rule: trm.strong_induct)
  2180 apply(nominal_induct M avoiding: x c P a b rule: trm.strong_induct)
  2360 apply(auto simp add: subst_fresh rename_fresh trm.inject)
  2181 apply(auto simp: subst_fresh rename_fresh trm.inject)
  2361 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,x,c)")
  2182 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,x,c)")
  2362 apply(erule exE)
  2183 apply(erule exE)
  2363 apply(subgoal_tac "Cut <c>.P (x).Ax x a = Cut <c>.P (x').Ax x' a")
  2184 apply(subgoal_tac "Cut <c>.P (x).Ax x a = Cut <c>.P (x').Ax x' a")
  2364 apply(simp)
  2185 apply(simp)
  2365 apply(rule trans)
  2186 apply(rule trans)
  2379 apply(simp add: crename_id)
  2200 apply(simp add: crename_id)
  2380 apply(rule trans)
  2201 apply(rule trans)
  2381 apply(rule better_crename_Cut)
  2202 apply(rule better_crename_Cut)
  2382 apply(simp add: fresh_atm fresh_prod)
  2203 apply(simp add: fresh_atm fresh_prod)
  2383 apply(simp add: rename_fresh fresh_atm)
  2204 apply(simp add: rename_fresh fresh_atm)
  2384 apply(auto simp add: fresh_atm)[1]
  2205 apply(auto simp: fresh_atm)[1]
  2385 apply(rule trans)
  2206 apply(rule trans)
  2386 apply(rule better_crename_Cut)
  2207 apply(rule better_crename_Cut)
  2387 apply(simp add: fresh_atm)
  2208 apply(simp add: fresh_atm)
  2388 apply(auto simp add: fresh_atm)[1]
  2209 apply(auto simp: fresh_atm)[1]
  2389 apply(drule crename_ax)
  2210 apply(drule crename_ax)
  2390 apply(simp add: fresh_atm)
  2211 apply(simp add: fresh_atm)
  2391 apply(simp add: fresh_atm)
  2212 apply(simp add: fresh_atm)
  2392 apply(simp)
  2213 apply(simp)
  2393 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{x:=<c>.P},P,P[a\<turnstile>c>b],x,trm[a\<turnstile>c>b]{x:=<c>.P[a\<turnstile>c>b]})")
  2214 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{x:=<c>.P},P,P[a\<turnstile>c>b],x,trm[a\<turnstile>c>b]{x:=<c>.P[a\<turnstile>c>b]})")
  2447 lemma substc_crename_comm:
  2268 lemma substc_crename_comm:
  2448   assumes a: "c\<noteq>a" "c\<noteq>b"
  2269   assumes a: "c\<noteq>a" "c\<noteq>b"
  2449   shows "M{c:=(x).P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{c:=(x).(P[a\<turnstile>c>b])}"
  2270   shows "M{c:=(x).P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{c:=(x).(P[a\<turnstile>c>b])}"
  2450 using a
  2271 using a
  2451 apply(nominal_induct M avoiding: x c P a b rule: trm.strong_induct)
  2272 apply(nominal_induct M avoiding: x c P a b rule: trm.strong_induct)
  2452 apply(auto simp add: subst_fresh rename_fresh trm.inject)
  2273 apply(auto simp: subst_fresh rename_fresh trm.inject)
  2453 apply(rule trans)
  2274 apply(rule trans)
  2454 apply(rule better_crename_Cut)
  2275 apply(rule better_crename_Cut)
  2455 apply(simp add: fresh_atm fresh_prod)
  2276 apply(simp add: fresh_atm fresh_prod)
  2456 apply(simp add: rename_fresh fresh_atm)
  2277 apply(simp add: rename_fresh fresh_atm)
  2457 apply(rule trans)
  2278 apply(rule trans)
  2521 lemma substn_nrename_comm:
  2342 lemma substn_nrename_comm:
  2522   assumes a: "x\<noteq>y" "x\<noteq>z"
  2343   assumes a: "x\<noteq>y" "x\<noteq>z"
  2523   shows "M{x:=<c>.P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{x:=<c>.(P[y\<turnstile>n>z])}"
  2344   shows "M{x:=<c>.P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{x:=<c>.(P[y\<turnstile>n>z])}"
  2524 using a
  2345 using a
  2525 apply(nominal_induct M avoiding: x c P y z rule: trm.strong_induct)
  2346 apply(nominal_induct M avoiding: x c P y z rule: trm.strong_induct)
  2526 apply(auto simp add: subst_fresh rename_fresh trm.inject)
  2347 apply(auto simp: subst_fresh rename_fresh trm.inject)
  2527 apply(rule trans)
  2348 apply(rule trans)
  2528 apply(rule better_nrename_Cut)
  2349 apply(rule better_nrename_Cut)
  2529 apply(simp add: fresh_prod fresh_atm)
  2350 apply(simp add: fresh_prod fresh_atm)
  2530 apply(simp add: trm.inject)
  2351 apply(simp add: trm.inject)
  2531 apply(rule trans)
  2352 apply(rule trans)
  2593 lemma substc_nrename_comm:
  2414 lemma substc_nrename_comm:
  2594   assumes a: "x\<noteq>y" "x\<noteq>z"
  2415   assumes a: "x\<noteq>y" "x\<noteq>z"
  2595   shows "M{c:=(x).P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{c:=(x).(P[y\<turnstile>n>z])}"
  2416   shows "M{c:=(x).P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{c:=(x).(P[y\<turnstile>n>z])}"
  2596 using a
  2417 using a
  2597 apply(nominal_induct M avoiding: x c P y z rule: trm.strong_induct)
  2418 apply(nominal_induct M avoiding: x c P y z rule: trm.strong_induct)
  2598 apply(auto simp add: subst_fresh rename_fresh trm.inject)
  2419 apply(auto simp: subst_fresh rename_fresh trm.inject)
  2599 apply(rule trans)
  2420 apply(rule trans)
  2600 apply(rule better_nrename_Cut)
  2421 apply(rule better_nrename_Cut)
  2601 apply(simp add: fresh_atm fresh_prod)
  2422 apply(simp add: fresh_atm fresh_prod)
  2602 apply(simp add: rename_fresh fresh_atm)
  2423 apply(simp add: rename_fresh fresh_atm)
  2603 apply(rule trans)
  2424 apply(rule trans)
  2863   and   x::"name"
  2684   and   x::"name"
  2864   and   \<Gamma>::"ctxtn"
  2685   and   \<Gamma>::"ctxtn"
  2865   and   \<Delta>::"ctxtc"
  2686   and   \<Delta>::"ctxtc"
  2866   shows "a\<sharp>\<Gamma>" and "x\<sharp>\<Delta>"
  2687   shows "a\<sharp>\<Gamma>" and "x\<sharp>\<Delta>"
  2867 proof -
  2688 proof -
  2868   show "a\<sharp>\<Gamma>" by (induct \<Gamma>) (auto simp add: fresh_list_nil fresh_list_cons fresh_prod fresh_atm fresh_ty)
  2689   show "a\<sharp>\<Gamma>" by (induct \<Gamma>) (auto simp: fresh_list_nil fresh_list_cons fresh_prod fresh_atm fresh_ty)
  2869 next
  2690 next
  2870   show "x\<sharp>\<Delta>" by (induct \<Delta>) (auto simp add: fresh_list_nil fresh_list_cons fresh_prod fresh_atm fresh_ty)
  2691   show "x\<sharp>\<Delta>" by (induct \<Delta>) (auto simp: fresh_list_nil fresh_list_cons fresh_prod fresh_atm fresh_ty)
  2871 qed
  2692 qed
  2872 
  2693 
  2873 text \<open>cut-reductions\<close>
  2694 text \<open>cut-reductions\<close>
  2874 
  2695 
  2875 declare abs_perm[eqvt]
  2696 declare abs_perm[eqvt]
  2889 lemma fin_Ax_elim:
  2710 lemma fin_Ax_elim:
  2890   assumes a: "fin (Ax x a) y"
  2711   assumes a: "fin (Ax x a) y"
  2891   shows "x=y"
  2712   shows "x=y"
  2892 using a
  2713 using a
  2893 apply(erule_tac fin.cases)
  2714 apply(erule_tac fin.cases)
  2894 apply(auto simp add: trm.inject)
  2715 apply(auto simp: trm.inject)
  2895 done
  2716 done
  2896 
  2717 
  2897 lemma fin_NotL_elim:
  2718 lemma fin_NotL_elim:
  2898   assumes a: "fin (NotL <a>.M x) y"
  2719   assumes a: "fin (NotL <a>.M x) y"
  2899   shows "x=y \<and> x\<sharp>M"
  2720   shows "x=y \<and> x\<sharp>M"
  2900 using a
  2721 using a
  2901 apply(erule_tac fin.cases)
  2722 apply(erule_tac fin.cases)
  2902 apply(auto simp add: trm.inject)
  2723 apply(auto simp: trm.inject)
  2903 apply(subgoal_tac "y\<sharp>[aa].Ma")
  2724 apply(subgoal_tac "y\<sharp>[aa].Ma")
  2904 apply(drule sym)
  2725 apply(drule sym)
  2905 apply(simp_all add: abs_fresh)
  2726 apply(simp_all add: abs_fresh)
  2906 done
  2727 done
  2907 
  2728 
  2908 lemma fin_AndL1_elim:
  2729 lemma fin_AndL1_elim:
  2909   assumes a: "fin (AndL1 (x).M y) z"
  2730   assumes a: "fin (AndL1 (x).M y) z"
  2910   shows "z=y \<and> z\<sharp>[x].M"
  2731   shows "z=y \<and> z\<sharp>[x].M"
  2911 using a
  2732 using a
  2912 apply(erule_tac fin.cases)
  2733 apply(erule_tac fin.cases)
  2913 apply(auto simp add: trm.inject)
  2734 apply(auto simp: trm.inject)
  2914 done
  2735 done
  2915 
  2736 
  2916 lemma fin_AndL2_elim:
  2737 lemma fin_AndL2_elim:
  2917   assumes a: "fin (AndL2 (x).M y) z"
  2738   assumes a: "fin (AndL2 (x).M y) z"
  2918   shows "z=y \<and> z\<sharp>[x].M"
  2739   shows "z=y \<and> z\<sharp>[x].M"
  2919 using a
  2740 using a
  2920 apply(erule_tac fin.cases)
  2741 apply(erule_tac fin.cases)
  2921 apply(auto simp add: trm.inject)
  2742 apply(auto simp: trm.inject)
  2922 done
  2743 done
  2923 
  2744 
  2924 lemma fin_OrL_elim:
  2745 lemma fin_OrL_elim:
  2925   assumes a: "fin (OrL (x).M (y).N u) z"
  2746   assumes a: "fin (OrL (x).M (y).N u) z"
  2926   shows "z=u \<and> z\<sharp>[x].M \<and> z\<sharp>[y].N"
  2747   shows "z=u \<and> z\<sharp>[x].M \<and> z\<sharp>[y].N"
  2927 using a
  2748 using a
  2928 apply(erule_tac fin.cases)
  2749 apply(erule_tac fin.cases)
  2929 apply(auto simp add: trm.inject)
  2750 apply(auto simp: trm.inject)
  2930 done
  2751 done
  2931 
  2752 
  2932 lemma fin_ImpL_elim:
  2753 lemma fin_ImpL_elim:
  2933   assumes a: "fin (ImpL <a>.M (x).N z) y"
  2754   assumes a: "fin (ImpL <a>.M (x).N z) y"
  2934   shows "z=y \<and> z\<sharp>M \<and> z\<sharp>[x].N"
  2755   shows "z=y \<and> z\<sharp>M \<and> z\<sharp>[x].N"
  2935 using a
  2756 using a
  2936 apply(erule_tac fin.cases)
  2757 apply(erule_tac fin.cases)
  2937 apply(auto simp add: trm.inject)
  2758 apply(auto simp: trm.inject)
  2938 apply(subgoal_tac "y\<sharp>[aa].Ma")
  2759 apply(subgoal_tac "y\<sharp>[aa].Ma")
  2939 apply(drule sym)
  2760 apply(drule sym)
  2940 apply(simp_all add: abs_fresh)
  2761 apply(simp_all add: abs_fresh)
  2941 apply (metis abs_fresh(5))
  2762 apply (metis abs_fresh(5))
  2942 done
  2763 done
  2955                    fin_ImpL_elim fin_rest_elims
  2776                    fin_ImpL_elim fin_rest_elims
  2956 
  2777 
  2957 lemma fin_rename:
  2778 lemma fin_rename:
  2958   shows "fin M x \<Longrightarrow> fin ([(x',x)]\<bullet>M) x'"
  2779   shows "fin M x \<Longrightarrow> fin ([(x',x)]\<bullet>M) x'"
  2959 by (induct rule: fin.induct)
  2780 by (induct rule: fin.induct)
  2960    (auto simp add: calc_atm simp add: fresh_left abs_fresh)
  2781    (auto simp: calc_atm simp add: fresh_left abs_fresh)
  2961 
  2782 
  2962 lemma not_fin_subst1:
  2783 lemma not_fin_subst1:
  2963   assumes a: "\<not>(fin M x)" 
  2784   assumes a: "\<not>(fin M x)" 
  2964   shows "\<not>(fin (M{c:=(y).P}) x)"
  2785   shows "\<not>(fin (M{c:=(y).P}) x)"
  2965 using a [[simproc del: defined_all]]
  2786 using a [[simproc del: defined_all]]
  2993 apply(simp add: fresh_fun_simp_AndR)
  2814 apply(simp add: fresh_fun_simp_AndR)
  2994 apply(erule fin.cases, simp_all add: trm.inject)
  2815 apply(erule fin.cases, simp_all add: trm.inject)
  2995 apply(rule exists_fresh'(2)[OF fs_coname1])
  2816 apply(rule exists_fresh'(2)[OF fs_coname1])
  2996 apply(erule fin.cases, simp_all add: trm.inject)
  2817 apply(erule fin.cases, simp_all add: trm.inject)
  2997 apply(drule fin_AndL1_elim)
  2818 apply(drule fin_AndL1_elim)
  2998 apply(auto simp add: abs_fresh)[1]
  2819 apply(auto simp: abs_fresh)[1]
  2999 apply(drule freshn_after_substc)
  2820 apply(drule freshn_after_substc)
  3000 apply(subgoal_tac "name2\<sharp>[name1]. trm")
  2821 apply(subgoal_tac "name2\<sharp>[name1]. trm")
  3001 apply(simp add: fin.intros)
  2822 apply(simp add: fin.intros)
  3002 apply(simp add: abs_fresh)
  2823 apply(simp add: abs_fresh)
  3003 apply(drule fin_AndL2_elim)
  2824 apply(drule fin_AndL2_elim)
  3004 apply(auto simp add: abs_fresh)[1]
  2825 apply(auto simp: abs_fresh)[1]
  3005 apply(drule freshn_after_substc)
  2826 apply(drule freshn_after_substc)
  3006 apply(subgoal_tac "name2\<sharp>[name1].trm")
  2827 apply(subgoal_tac "name2\<sharp>[name1].trm")
  3007 apply(simp add: fin.intros)
  2828 apply(simp add: fin.intros)
  3008 apply(simp add: abs_fresh)
  2829 apply(simp add: abs_fresh)
  3009 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(trm{coname2:=(y).P},coname1,P,x)")
  2830 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(trm{coname2:=(y).P},coname1,P,x)")
  3021 apply(simp add: fresh_fun_simp_OrR2)
  2842 apply(simp add: fresh_fun_simp_OrR2)
  3022 apply(erule fin.cases, simp_all add: trm.inject)
  2843 apply(erule fin.cases, simp_all add: trm.inject)
  3023 apply(rule exists_fresh'(2)[OF fs_coname1])
  2844 apply(rule exists_fresh'(2)[OF fs_coname1])
  3024 apply(erule fin.cases, simp_all add: trm.inject)
  2845 apply(erule fin.cases, simp_all add: trm.inject)
  3025 apply(drule fin_OrL_elim)
  2846 apply(drule fin_OrL_elim)
  3026 apply(auto simp add: abs_fresh)[1]
  2847 apply(auto simp: abs_fresh)[1]
  3027 apply(drule freshn_after_substc)+
  2848 apply(drule freshn_after_substc)+
  3028 apply(subgoal_tac "name3\<sharp>[name1].trm1 \<and> name3\<sharp>[name2].trm2")
  2849 apply(subgoal_tac "name3\<sharp>[name1].trm1 \<and> name3\<sharp>[name2].trm2")
  3029 apply(simp add: fin.intros)
  2850 apply(simp add: fin.intros)
  3030 apply(simp add: abs_fresh)
  2851 apply(simp add: abs_fresh)
  3031 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(trm{coname2:=(y).P},coname1,P,x)")
  2852 apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(trm{coname2:=(y).P},coname1,P,x)")
  3035 apply(simp add: fresh_fun_simp_ImpR)
  2856 apply(simp add: fresh_fun_simp_ImpR)
  3036 apply(erule fin.cases, simp_all add: trm.inject)
  2857 apply(erule fin.cases, simp_all add: trm.inject)
  3037 apply(rule exists_fresh'(2)[OF fs_coname1])
  2858 apply(rule exists_fresh'(2)[OF fs_coname1])
  3038 apply(erule fin.cases, simp_all add: trm.inject)
  2859 apply(erule fin.cases, simp_all add: trm.inject)
  3039 apply(drule fin_ImpL_elim)
  2860 apply(drule fin_ImpL_elim)
  3040 apply(auto simp add: abs_fresh)[1]
  2861 apply(auto simp: abs_fresh)[1]
  3041 apply(drule freshn_after_substc)+
  2862 apply(drule freshn_after_substc)+
  3042 apply(subgoal_tac "x\<sharp>[name1].trm2")
  2863 apply(subgoal_tac "x\<sharp>[name1].trm2")
  3043 apply(simp add: fin.intros)
  2864 apply(simp add: fin.intros)
  3044 apply(simp add: abs_fresh)
  2865 apply(simp add: abs_fresh)
  3045 done
  2866 done
  3073 apply(erule conjE)+
  2894 apply(erule conjE)+
  3074 apply(simp add: fresh_fun_simp_AndL1)
  2895 apply(simp add: fresh_fun_simp_AndL1)
  3075 apply(erule fin.cases, simp_all add: trm.inject)
  2896 apply(erule fin.cases, simp_all add: trm.inject)
  3076 apply(rule exists_fresh'(1)[OF fs_name1])
  2897 apply(rule exists_fresh'(1)[OF fs_name1])
  3077 apply(drule fin_AndL1_elim)
  2898 apply(drule fin_AndL1_elim)
  3078 apply(auto simp add: abs_fresh)[1]
  2899 apply(auto simp: abs_fresh)[1]
  3079 apply(drule freshn_after_substn)
  2900 apply(drule freshn_after_substn)
  3080 apply(simp)
  2901 apply(simp)
  3081 apply(subgoal_tac "name2\<sharp>[name1]. trm")
  2902 apply(subgoal_tac "name2\<sharp>[name1]. trm")
  3082 apply(simp add: fin.intros)
  2903 apply(simp add: fin.intros)
  3083 apply(simp add: abs_fresh)
  2904 apply(simp add: abs_fresh)
  3087 apply(erule conjE)+
  2908 apply(erule conjE)+
  3088 apply(simp add: fresh_fun_simp_AndL2)
  2909 apply(simp add: fresh_fun_simp_AndL2)
  3089 apply(erule fin.cases, simp_all add: trm.inject)
  2910 apply(erule fin.cases, simp_all add: trm.inject)
  3090 apply(rule exists_fresh'(1)[OF fs_name1])
  2911 apply(rule exists_fresh'(1)[OF fs_name1])
  3091 apply(drule fin_AndL2_elim)
  2912 apply(drule fin_AndL2_elim)
  3092 apply(auto simp add: abs_fresh)[1]
  2913 apply(auto simp: abs_fresh)[1]
  3093 apply(drule freshn_after_substn)
  2914 apply(drule freshn_after_substn)
  3094 apply(simp)
  2915 apply(simp)
  3095 apply(subgoal_tac "name2\<sharp>[name1].trm")
  2916 apply(subgoal_tac "name2\<sharp>[name1].trm")
  3096 apply(simp add: fin.intros)
  2917 apply(simp add: fin.intros)
  3097 apply(simp add: abs_fresh)
  2918 apply(simp add: abs_fresh)
  3103 apply(erule conjE)+
  2924 apply(erule conjE)+
  3104 apply(simp add: fresh_fun_simp_OrL)
  2925 apply(simp add: fresh_fun_simp_OrL)
  3105 apply(erule fin.cases, simp_all add: trm.inject)
  2926 apply(erule fin.cases, simp_all add: trm.inject)
  3106 apply(rule exists_fresh'(1)[OF fs_name1])
  2927 apply(rule exists_fresh'(1)[OF fs_name1])
  3107 apply(drule fin_OrL_elim)
  2928 apply(drule fin_OrL_elim)
  3108 apply(auto simp add: abs_fresh)[1]
  2929 apply(auto simp: abs_fresh)[1]
  3109 apply(drule freshn_after_substn)
  2930 apply(drule freshn_after_substn)
  3110 apply(simp)
  2931 apply(simp)
  3111 apply(drule freshn_after_substn)
  2932 apply(drule freshn_after_substn)
  3112 apply(simp)
  2933 apply(simp)
  3113 apply(subgoal_tac "name3\<sharp>[name1].trm1 \<and> name3\<sharp>[name2].trm2")
  2934 apply(subgoal_tac "name3\<sharp>[name1].trm1 \<and> name3\<sharp>[name2].trm2")
  3120 apply(erule conjE)+
  2941 apply(erule conjE)+
  3121 apply(simp add: fresh_fun_simp_ImpL)
  2942 apply(simp add: fresh_fun_simp_ImpL)
  3122 apply(erule fin.cases, simp_all add: trm.inject)
  2943 apply(erule fin.cases, simp_all add: trm.inject)
  3123 apply(rule exists_fresh'(1)[OF fs_name1])
  2944 apply(rule exists_fresh'(1)[OF fs_name1])
  3124 apply(drule fin_ImpL_elim)
  2945 apply(drule fin_ImpL_elim)
  3125 apply(auto simp add: abs_fresh)[1]
  2946 apply(auto simp: abs_fresh)[1]
  3126 apply(drule freshn_after_substn)
  2947 apply(drule freshn_after_substn)
  3127 apply(simp)
  2948 apply(simp)
  3128 apply(drule freshn_after_substn)
  2949 apply(drule freshn_after_substn)
  3129 apply(simp)
  2950 apply(simp)
  3130 apply(subgoal_tac "x\<sharp>[name1].trm2")
  2951 apply(subgoal_tac "x\<sharp>[name1].trm2")
  3313 lemma fic_Ax_elim:
  3134 lemma fic_Ax_elim:
  3314   assumes a: "fic (Ax x a) b"
  3135   assumes a: "fic (Ax x a) b"
  3315   shows "a=b"
  3136   shows "a=b"
  3316 using a
  3137 using a
  3317 apply(erule_tac fic.cases)
  3138 apply(erule_tac fic.cases)
  3318 apply(auto simp add: trm.inject)
  3139 apply(auto simp: trm.inject)
  3319 done
  3140 done
  3320 
  3141 
  3321 lemma fic_NotR_elim:
  3142 lemma fic_NotR_elim:
  3322   assumes a: "fic (NotR (x).M a) b"
  3143   assumes a: "fic (NotR (x).M a) b"
  3323   shows "a=b \<and> b\<sharp>M"
  3144   shows "a=b \<and> b\<sharp>M"
  3324 using a
  3145 using a
  3325 apply(erule_tac fic.cases)
  3146 apply(erule_tac fic.cases)
  3326 apply(auto simp add: trm.inject)
  3147 apply(auto simp: trm.inject)
  3327 apply(subgoal_tac "b\<sharp>[xa].Ma")
  3148 apply(subgoal_tac "b\<sharp>[xa].Ma")
  3328 apply(drule sym)
  3149 apply(drule sym)
  3329 apply(simp_all add: abs_fresh)
  3150 apply(simp_all add: abs_fresh)
  3330 done
  3151 done
  3331 
  3152 
  3332 lemma fic_OrR1_elim:
  3153 lemma fic_OrR1_elim:
  3333   assumes a: "fic (OrR1 <a>.M b) c"
  3154   assumes a: "fic (OrR1 <a>.M b) c"
  3334   shows "b=c \<and> c\<sharp>[a].M"
  3155   shows "b=c \<and> c\<sharp>[a].M"
  3335 using a
  3156 using a
  3336 apply(erule_tac fic.cases)
  3157 apply(erule_tac fic.cases)
  3337 apply(auto simp add: trm.inject)
  3158 apply(auto simp: trm.inject)
  3338 done
  3159 done
  3339 
  3160 
  3340 lemma fic_OrR2_elim:
  3161 lemma fic_OrR2_elim:
  3341   assumes a: "fic (OrR2 <a>.M b) c"
  3162   assumes a: "fic (OrR2 <a>.M b) c"
  3342   shows "b=c \<and> c\<sharp>[a].M"
  3163   shows "b=c \<and> c\<sharp>[a].M"
  3343 using a
  3164 using a
  3344 apply(erule_tac fic.cases)
  3165 apply(erule_tac fic.cases)
  3345 apply(auto simp add: trm.inject)
  3166 apply(auto simp: trm.inject)
  3346 done
  3167 done
  3347 
  3168 
  3348 lemma fic_AndR_elim:
  3169 lemma fic_AndR_elim:
  3349   assumes a: "fic (AndR <a>.M <b>.N c) d"
  3170   assumes a: "fic (AndR <a>.M <b>.N c) d"
  3350   shows "c=d \<and> d\<sharp>[a].M \<and> d\<sharp>[b].N"
  3171   shows "c=d \<and> d\<sharp>[a].M \<and> d\<sharp>[b].N"
  3351 using a
  3172 using a
  3352 apply(erule_tac fic.cases)
  3173 apply(erule_tac fic.cases)
  3353 apply(auto simp add: trm.inject)
  3174 apply(auto simp: trm.inject)
  3354 done
  3175 done
  3355 
  3176 
  3356 lemma fic_ImpR_elim:
  3177 lemma fic_ImpR_elim:
  3357   assumes a: "fic (ImpR (x).<a>.M b) c"
  3178   assumes a: "fic (ImpR (x).<a>.M b) c"
  3358   shows "b=c \<and> b\<sharp>[a].M"
  3179   shows "b=c \<and> b\<sharp>[a].M"
  3359 using a
  3180 using a
  3360 apply(erule_tac fic.cases)
  3181 apply(erule_tac fic.cases)
  3361 apply(auto simp add: trm.inject)
  3182 apply(auto simp: trm.inject)
  3362 apply(subgoal_tac "c\<sharp>[xa].[aa].Ma")
  3183 apply(subgoal_tac "c\<sharp>[xa].[aa].Ma")
  3363 apply(drule sym)
  3184 apply(drule sym)
  3364 apply(simp_all add: abs_fresh)
  3185 apply(simp_all add: abs_fresh)
  3365 done
  3186 done
  3366 
  3187 
  3377                    fic_ImpR_elim fic_rest_elims
  3198                    fic_ImpR_elim fic_rest_elims
  3378 
  3199 
  3379 lemma fic_rename:
  3200 lemma fic_rename:
  3380   shows "fic M a \<Longrightarrow> fic ([(a',a)]\<bullet>M) a'"
  3201   shows "fic M a \<Longrightarrow> fic ([(a',a)]\<bullet>M) a'"
  3381 by (induct rule: fic.induct)
  3202 by (induct rule: fic.induct)
  3382    (auto simp add: calc_atm simp add: fresh_left abs_fresh)
  3203    (auto simp: calc_atm simp add: fresh_left abs_fresh)
  3383 
  3204 
  3384 lemma not_fic_subst1:
  3205 lemma not_fic_subst1:
  3385   assumes a: "\<not>(fic M a)" 
  3206   assumes a: "\<not>(fic M a)" 
  3386   shows "\<not>(fic (M{y:=<c>.P}) a)"
  3207   shows "\<not>(fic (M{y:=<c>.P}) a)"
  3387 using a
  3208 using a
  3732   and   a::"coname"
  3553   and   a::"coname"
  3733   shows "M \<longrightarrow>\<^sub>l M' \<Longrightarrow> x\<sharp>M \<Longrightarrow> x\<sharp>M'"
  3554   shows "M \<longrightarrow>\<^sub>l M' \<Longrightarrow> x\<sharp>M \<Longrightarrow> x\<sharp>M'"
  3734   and   "M \<longrightarrow>\<^sub>l M' \<Longrightarrow> a\<sharp>M \<Longrightarrow> a\<sharp>M'"
  3555   and   "M \<longrightarrow>\<^sub>l M' \<Longrightarrow> a\<sharp>M \<Longrightarrow> a\<sharp>M'"
  3735 apply -
  3556 apply -
  3736 apply(induct rule: l_redu.induct)
  3557 apply(induct rule: l_redu.induct)
  3737 apply(auto simp add: abs_fresh rename_fresh)
  3558 apply(auto simp: abs_fresh rename_fresh)
  3738 apply(case_tac "xa=x")
  3559 apply(case_tac "xa=x")
  3739 apply(simp add: rename_fresh)
  3560 apply(simp add: rename_fresh)
  3740 apply(simp add: rename_fresh fresh_atm)
  3561 apply(simp add: rename_fresh fresh_atm)
  3741 apply(simp add: fresh_prod abs_fresh abs_supp fin_supp)+
  3562 apply(simp add: fresh_prod abs_fresh abs_supp fin_supp)+
  3742 apply(induct rule: l_redu.induct)
  3563 apply(induct rule: l_redu.induct)
  3743 apply(auto simp add: abs_fresh rename_fresh)
  3564 apply(auto simp: abs_fresh rename_fresh)
  3744 apply(case_tac "aa=a")
  3565 apply(case_tac "aa=a")
  3745 apply(simp add: rename_fresh)
  3566 apply(simp add: rename_fresh)
  3746 apply(simp add: rename_fresh fresh_atm)
  3567 apply(simp add: rename_fresh fresh_atm)
  3747 apply(simp add: fresh_prod abs_fresh abs_supp fin_supp)+
  3568 apply(simp add: fresh_prod abs_fresh abs_supp fin_supp)+
  3748 done
  3569 done
  3752 proof -
  3573 proof -
  3753   assume fin: "fic M a"
  3574   assume fin: "fic M a"
  3754   obtain x'::"name" where fs1: "x'\<sharp>(M,x)" by (rule exists_fresh(1), rule fin_supp, blast)
  3575   obtain x'::"name" where fs1: "x'\<sharp>(M,x)" by (rule exists_fresh(1), rule fin_supp, blast)
  3755   obtain a'::"coname" where fs2: "a'\<sharp>(a,M,b)" by (rule exists_fresh(2), rule fin_supp, blast)
  3576   obtain a'::"coname" where fs2: "a'\<sharp>(a,M,b)" by (rule exists_fresh(2), rule fin_supp, blast)
  3756   have "Cut <a>.M (x).(Ax x b) =  Cut <a'>.([(a',a)]\<bullet>M) (x').(Ax x' b)"
  3577   have "Cut <a>.M (x).(Ax x b) =  Cut <a'>.([(a',a)]\<bullet>M) (x').(Ax x' b)"
  3757     using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  3578     using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  3758   also have "\<dots> \<longrightarrow>\<^sub>l ([(a',a)]\<bullet>M)[a'\<turnstile>c>b]" using fs1 fs2 fin
  3579   also have "\<dots> \<longrightarrow>\<^sub>l ([(a',a)]\<bullet>M)[a'\<turnstile>c>b]" using fs1 fs2 fin
  3759     by (auto intro: l_redu.intros simp add: fresh_left calc_atm fic_rename)
  3580     by (auto intro: l_redu.intros simp add: fresh_left calc_atm fic_rename)
  3760   also have "\<dots> = M[a\<turnstile>c>b]" using fs1 fs2 by (simp add: crename_rename)
  3581   also have "\<dots> = M[a\<turnstile>c>b]" using fs1 fs2 by (simp add: crename_rename)
  3761   finally show ?thesis by simp
  3582   finally show ?thesis by simp
  3762 qed
  3583 qed
  3766 proof -
  3587 proof -
  3767   assume fin: "fin M x"
  3588   assume fin: "fin M x"
  3768   obtain x'::"name" where fs1: "x'\<sharp>(y,M,x)" by (rule exists_fresh(1), rule fin_supp, blast)
  3589   obtain x'::"name" where fs1: "x'\<sharp>(y,M,x)" by (rule exists_fresh(1), rule fin_supp, blast)
  3769   obtain a'::"coname" where fs2: "a'\<sharp>(a,M)" by (rule exists_fresh(2), rule fin_supp, blast)
  3590   obtain a'::"coname" where fs2: "a'\<sharp>(a,M)" by (rule exists_fresh(2), rule fin_supp, blast)
  3770   have "Cut <a>.(Ax y a) (x).M = Cut <a'>.(Ax y a') (x').([(x',x)]\<bullet>M)"
  3591   have "Cut <a>.(Ax y a) (x).M = Cut <a'>.(Ax y a') (x').([(x',x)]\<bullet>M)"
  3771     using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  3592     using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  3772   also have "\<dots> \<longrightarrow>\<^sub>l ([(x',x)]\<bullet>M)[x'\<turnstile>n>y]" using fs1 fs2 fin
  3593   also have "\<dots> \<longrightarrow>\<^sub>l ([(x',x)]\<bullet>M)[x'\<turnstile>n>y]" using fs1 fs2 fin
  3773     by (auto intro: l_redu.intros simp add: fresh_left calc_atm fin_rename)
  3594     by (auto intro: l_redu.intros simp add: fresh_left calc_atm fin_rename)
  3774   also have "\<dots> = M[x\<turnstile>n>y]" using fs1 fs2 by (simp add: nrename_rename)
  3595   also have "\<dots> = M[x\<turnstile>n>y]" using fs1 fs2 by (simp add: nrename_rename)
  3775   finally show ?thesis by simp
  3596   finally show ?thesis by simp
  3776 qed
  3597 qed
  3784   obtain a'::"coname" where f3: "a'\<sharp>(a,M,N,b)" by (rule exists_fresh(2), rule fin_supp, blast)
  3605   obtain a'::"coname" where f3: "a'\<sharp>(a,M,N,b)" by (rule exists_fresh(2), rule fin_supp, blast)
  3785   obtain b'::"coname" where f4: "b'\<sharp>(a,M,N,b,a')" by (rule exists_fresh(2), rule fin_supp, blast)
  3606   obtain b'::"coname" where f4: "b'\<sharp>(a,M,N,b,a')" by (rule exists_fresh(2), rule fin_supp, blast)
  3786   have "Cut <a>.(NotR (x).M a) (y).(NotL <b>.N y) 
  3607   have "Cut <a>.(NotR (x).M a) (y).(NotL <b>.N y) 
  3787                       = Cut <a'>.(NotR (x).([(a',a)]\<bullet>M) a') (y').(NotL <b>.([(y',y)]\<bullet>N) y')"
  3608                       = Cut <a'>.(NotR (x).([(a',a)]\<bullet>M) a') (y').(NotL <b>.([(y',y)]\<bullet>N) y')"
  3788     using f1 f2 f3 f4 
  3609     using f1 f2 f3 f4 
  3789     by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm abs_fresh)
  3610     by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm abs_fresh)
  3790   also have "\<dots> = Cut <a'>.(NotR (x).M a') (y').(NotL <b>.N y')"
  3611   also have "\<dots> = Cut <a'>.(NotR (x).M a') (y').(NotL <b>.N y')"
  3791     using f1 f2 f3 f4 fs by (perm_simp)
  3612     using f1 f2 f3 f4 fs by (perm_simp)
  3792   also have "\<dots> = Cut <a'>.(NotR (x').([(x',x)]\<bullet>M) a') (y').(NotL <b'>.([(b',b)]\<bullet>N) y')"
  3613   also have "\<dots> = Cut <a'>.(NotR (x').([(x',x)]\<bullet>M) a') (y').(NotL <b'>.([(b',b)]\<bullet>N) y')"
  3793     using f1 f2 f3 f4 
  3614     using f1 f2 f3 f4 
  3794     by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  3615     by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  3795   also have "\<dots> \<longrightarrow>\<^sub>l Cut <b'>.([(b',b)]\<bullet>N) (x').([(x',x)]\<bullet>M)"
  3616   also have "\<dots> \<longrightarrow>\<^sub>l Cut <b'>.([(b',b)]\<bullet>N) (x').([(x',x)]\<bullet>M)"
  3796     using f1 f2 f3 f4 fs
  3617     using f1 f2 f3 f4 fs
  3797     by (auto intro:  l_redu.intros simp add: fresh_prod fresh_left calc_atm fresh_atm)
  3618     by (auto intro:  l_redu.intros simp add: fresh_prod fresh_left calc_atm fresh_atm)
  3798   also have "\<dots> = Cut <b>.N (x).M"
  3619   also have "\<dots> = Cut <b>.N (x).M"
  3799     using f1 f2 f3 f4 by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  3620     using f1 f2 f3 f4 by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  3800   finally show ?thesis by simp
  3621   finally show ?thesis by simp
  3801 qed 
  3622 qed 
  3802 
  3623 
  3803 lemma better_LAnd1_intro[intro]:
  3624 lemma better_LAnd1_intro[intro]:
  3804   shows "\<lbrakk>a\<sharp>([b1].M1,[b2].M2); y\<sharp>[x].N\<rbrakk> 
  3625   shows "\<lbrakk>a\<sharp>([b1].M1,[b2].M2); y\<sharp>[x].N\<rbrakk> 
  3813   have "Cut <a>.(AndR <b1>.M1 <b2>.M2 a) (y).(AndL1 (x).N y)
  3634   have "Cut <a>.(AndR <b1>.M1 <b2>.M2 a) (y).(AndL1 (x).N y)
  3814                       = Cut <a'>.(AndR <b1>.M1 <b2>.M2 a') (y').(AndL1 (x).N y')"
  3635                       = Cut <a'>.(AndR <b1>.M1 <b2>.M2 a') (y').(AndL1 (x).N y')"
  3815     using f1 f2 f3 f4 fs
  3636     using f1 f2 f3 f4 fs
  3816     apply(rule_tac sym)
  3637     apply(rule_tac sym)
  3817     apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh)
  3638     apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh)
  3818     apply(auto simp add: perm_fresh_fresh)
  3639     apply(auto simp: perm_fresh_fresh)
  3819     done
  3640     done
  3820   also have "\<dots> = Cut <a'>.(AndR <b1'>.([(b1',b1)]\<bullet>M1) <b2'>.([(b2',b2)]\<bullet>M2) a') 
  3641   also have "\<dots> = Cut <a'>.(AndR <b1'>.([(b1',b1)]\<bullet>M1) <b2'>.([(b2',b2)]\<bullet>M2) a') 
  3821                                                                (y').(AndL1 (x').([(x',x)]\<bullet>N) y')"
  3642                                                                (y').(AndL1 (x').([(x',x)]\<bullet>N) y')"
  3822     using f1 f2 f3 f4 f5 fs 
  3643     using f1 f2 f3 f4 f5 fs 
  3823     apply(rule_tac sym)
  3644     apply(rule_tac sym)
  3825     done
  3646     done
  3826   also have "\<dots> \<longrightarrow>\<^sub>l Cut <b1'>.([(b1',b1)]\<bullet>M1) (x').([(x',x)]\<bullet>N)"
  3647   also have "\<dots> \<longrightarrow>\<^sub>l Cut <b1'>.([(b1',b1)]\<bullet>M1) (x').([(x',x)]\<bullet>N)"
  3827     using f1 f2 f3 f4 f5 fs
  3648     using f1 f2 f3 f4 f5 fs
  3828     apply -
  3649     apply -
  3829     apply(rule l_redu.intros)
  3650     apply(rule l_redu.intros)
  3830     apply(auto simp add: abs_fresh fresh_prod fresh_left calc_atm fresh_atm)
  3651     apply(auto simp: abs_fresh fresh_prod fresh_left calc_atm fresh_atm)
  3831     done
  3652     done
  3832   also have "\<dots> = Cut <b1>.M1 (x).N"
  3653   also have "\<dots> = Cut <b1>.M1 (x).N"
  3833     using f1 f2 f3 f4 f5 fs by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  3654     using f1 f2 f3 f4 f5 fs by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  3834   finally show ?thesis by simp
  3655   finally show ?thesis by simp
  3835 qed 
  3656 qed 
  3836 
  3657 
  3837 lemma better_LAnd2_intro[intro]:
  3658 lemma better_LAnd2_intro[intro]:
  3838   shows "\<lbrakk>a\<sharp>([b1].M1,[b2].M2); y\<sharp>[x].N\<rbrakk> 
  3659   shows "\<lbrakk>a\<sharp>([b1].M1,[b2].M2); y\<sharp>[x].N\<rbrakk> 
  3847   have "Cut <a>.(AndR <b1>.M1 <b2>.M2 a) (y).(AndL2 (x).N y)
  3668   have "Cut <a>.(AndR <b1>.M1 <b2>.M2 a) (y).(AndL2 (x).N y)
  3848                       = Cut <a'>.(AndR <b1>.M1 <b2>.M2 a') (y').(AndL2 (x).N y')"
  3669                       = Cut <a'>.(AndR <b1>.M1 <b2>.M2 a') (y').(AndL2 (x).N y')"
  3849     using f1 f2 f3 f4 fs
  3670     using f1 f2 f3 f4 fs
  3850     apply(rule_tac sym)
  3671     apply(rule_tac sym)
  3851     apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh)
  3672     apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh)
  3852     apply(auto simp add: perm_fresh_fresh)
  3673     apply(auto simp: perm_fresh_fresh)
  3853     done
  3674     done
  3854   also have "\<dots> = Cut <a'>.(AndR <b1'>.([(b1',b1)]\<bullet>M1) <b2'>.([(b2',b2)]\<bullet>M2) a') 
  3675   also have "\<dots> = Cut <a'>.(AndR <b1'>.([(b1',b1)]\<bullet>M1) <b2'>.([(b2',b2)]\<bullet>M2) a') 
  3855                                                                (y').(AndL2 (x').([(x',x)]\<bullet>N) y')"
  3676                                                                (y').(AndL2 (x').([(x',x)]\<bullet>N) y')"
  3856     using f1 f2 f3 f4 f5 fs 
  3677     using f1 f2 f3 f4 f5 fs 
  3857     apply(rule_tac sym)
  3678     apply(rule_tac sym)
  3859     done
  3680     done
  3860   also have "\<dots> \<longrightarrow>\<^sub>l Cut <b2'>.([(b2',b2)]\<bullet>M2) (x').([(x',x)]\<bullet>N)"
  3681   also have "\<dots> \<longrightarrow>\<^sub>l Cut <b2'>.([(b2',b2)]\<bullet>M2) (x').([(x',x)]\<bullet>N)"
  3861     using f1 f2 f3 f4 f5 fs
  3682     using f1 f2 f3 f4 f5 fs
  3862     apply -
  3683     apply -
  3863     apply(rule l_redu.intros)
  3684     apply(rule l_redu.intros)
  3864     apply(auto simp add: abs_fresh fresh_prod fresh_left calc_atm fresh_atm)
  3685     apply(auto simp: abs_fresh fresh_prod fresh_left calc_atm fresh_atm)
  3865     done
  3686     done
  3866   also have "\<dots> = Cut <b2>.M2 (x).N"
  3687   also have "\<dots> = Cut <b2>.M2 (x).N"
  3867     using f1 f2 f3 f4 f5 fs by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  3688     using f1 f2 f3 f4 f5 fs by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  3868   finally show ?thesis by simp
  3689   finally show ?thesis by simp
  3869 qed
  3690 qed
  3870 
  3691 
  3871 lemma better_LOr1_intro[intro]:
  3692 lemma better_LOr1_intro[intro]:
  3872   shows "\<lbrakk>y\<sharp>([x1].N1,[x2].N2); b\<sharp>[a].M\<rbrakk> 
  3693   shows "\<lbrakk>y\<sharp>([x1].N1,[x2].N2); b\<sharp>[a].M\<rbrakk> 
  3881   have "Cut <b>.(OrR1 <a>.M b) (y).(OrL (x1).N1 (x2).N2 y)
  3702   have "Cut <b>.(OrR1 <a>.M b) (y).(OrL (x1).N1 (x2).N2 y)
  3882                       = Cut <b'>.(OrR1 <a>.M b') (y').(OrL (x1).N1 (x2).N2 y')"
  3703                       = Cut <b'>.(OrR1 <a>.M b') (y').(OrL (x1).N1 (x2).N2 y')"
  3883     using f1 f2 f3 f4 f5 fs
  3704     using f1 f2 f3 f4 f5 fs
  3884     apply(rule_tac sym)
  3705     apply(rule_tac sym)
  3885     apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh)
  3706     apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh)
  3886     apply(auto simp add: perm_fresh_fresh)
  3707     apply(auto simp: perm_fresh_fresh)
  3887     done
  3708     done
  3888   also have "\<dots> = Cut <b'>.(OrR1 <a'>.([(a',a)]\<bullet>M) b') 
  3709   also have "\<dots> = Cut <b'>.(OrR1 <a'>.([(a',a)]\<bullet>M) b') 
  3889               (y').(OrL (x1').([(x1',x1)]\<bullet>N1) (x2').([(x2',x2)]\<bullet>N2) y')"   
  3710               (y').(OrL (x1').([(x1',x1)]\<bullet>N1) (x2').([(x2',x2)]\<bullet>N2) y')"   
  3890     using f1 f2 f3 f4 f5 fs 
  3711     using f1 f2 f3 f4 f5 fs 
  3891     apply(rule_tac sym)
  3712     apply(rule_tac sym)
  3893     done
  3714     done
  3894   also have "\<dots> \<longrightarrow>\<^sub>l Cut <a'>.([(a',a)]\<bullet>M) (x1').([(x1',x1)]\<bullet>N1)"
  3715   also have "\<dots> \<longrightarrow>\<^sub>l Cut <a'>.([(a',a)]\<bullet>M) (x1').([(x1',x1)]\<bullet>N1)"
  3895     using f1 f2 f3 f4 f5 fs
  3716     using f1 f2 f3 f4 f5 fs
  3896     apply -
  3717     apply -
  3897     apply(rule l_redu.intros)
  3718     apply(rule l_redu.intros)
  3898     apply(auto simp add: abs_fresh fresh_prod fresh_left calc_atm fresh_atm)
  3719     apply(auto simp: abs_fresh fresh_prod fresh_left calc_atm fresh_atm)
  3899     done
  3720     done
  3900   also have "\<dots> = Cut <a>.M (x1).N1"
  3721   also have "\<dots> = Cut <a>.M (x1).N1"
  3901     using f1 f2 f3 f4 f5 fs by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  3722     using f1 f2 f3 f4 f5 fs by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  3902   finally show ?thesis by simp
  3723   finally show ?thesis by simp
  3903 qed
  3724 qed
  3904 
  3725 
  3905 lemma better_LOr2_intro[intro]:
  3726 lemma better_LOr2_intro[intro]:
  3906   shows "\<lbrakk>y\<sharp>([x1].N1,[x2].N2); b\<sharp>[a].M\<rbrakk> 
  3727   shows "\<lbrakk>y\<sharp>([x1].N1,[x2].N2); b\<sharp>[a].M\<rbrakk> 
  3915   have "Cut <b>.(OrR2 <a>.M b) (y).(OrL (x1).N1 (x2).N2 y)
  3736   have "Cut <b>.(OrR2 <a>.M b) (y).(OrL (x1).N1 (x2).N2 y)
  3916                       = Cut <b'>.(OrR2 <a>.M b') (y').(OrL (x1).N1 (x2).N2 y')"
  3737                       = Cut <b'>.(OrR2 <a>.M b') (y').(OrL (x1).N1 (x2).N2 y')"
  3917     using f1 f2 f3 f4 f5 fs
  3738     using f1 f2 f3 f4 f5 fs
  3918     apply(rule_tac sym)
  3739     apply(rule_tac sym)
  3919     apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh)
  3740     apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh)
  3920     apply(auto simp add: perm_fresh_fresh)
  3741     apply(auto simp: perm_fresh_fresh)
  3921     done
  3742     done
  3922   also have "\<dots> = Cut <b'>.(OrR2 <a'>.([(a',a)]\<bullet>M) b') 
  3743   also have "\<dots> = Cut <b'>.(OrR2 <a'>.([(a',a)]\<bullet>M) b') 
  3923               (y').(OrL (x1').([(x1',x1)]\<bullet>N1) (x2').([(x2',x2)]\<bullet>N2) y')"   
  3744               (y').(OrL (x1').([(x1',x1)]\<bullet>N1) (x2').([(x2',x2)]\<bullet>N2) y')"   
  3924     using f1 f2 f3 f4 f5 fs 
  3745     using f1 f2 f3 f4 f5 fs 
  3925     apply(rule_tac sym)
  3746     apply(rule_tac sym)
  3927     done
  3748     done
  3928   also have "\<dots> \<longrightarrow>\<^sub>l Cut <a'>.([(a',a)]\<bullet>M) (x2').([(x2',x2)]\<bullet>N2)"
  3749   also have "\<dots> \<longrightarrow>\<^sub>l Cut <a'>.([(a',a)]\<bullet>M) (x2').([(x2',x2)]\<bullet>N2)"
  3929     using f1 f2 f3 f4 f5 fs
  3750     using f1 f2 f3 f4 f5 fs
  3930     apply -
  3751     apply -
  3931     apply(rule l_redu.intros)
  3752     apply(rule l_redu.intros)
  3932     apply(auto simp add: abs_fresh fresh_prod fresh_left calc_atm fresh_atm)
  3753     apply(auto simp: abs_fresh fresh_prod fresh_left calc_atm fresh_atm)
  3933     done
  3754     done
  3934   also have "\<dots> = Cut <a>.M (x2).N2"
  3755   also have "\<dots> = Cut <a>.M (x2).N2"
  3935     using f1 f2 f3 f4 f5 fs by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  3756     using f1 f2 f3 f4 f5 fs by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  3936   finally show ?thesis by simp
  3757   finally show ?thesis by simp
  3937 qed 
  3758 qed 
  3938 
  3759 
  3939 lemma better_LImp_intro[intro]:
  3760 lemma better_LImp_intro[intro]:
  3940   shows "\<lbrakk>z\<sharp>(N,[y].P); b\<sharp>[a].M; a\<sharp>N\<rbrakk> 
  3761   shows "\<lbrakk>z\<sharp>(N,[y].P); b\<sharp>[a].M; a\<sharp>N\<rbrakk> 
  3950   have " Cut <b>.(ImpR (x).<a>.M b) (z).(ImpL <c>.N (y).P z)
  3771   have " Cut <b>.(ImpR (x).<a>.M b) (z).(ImpL <c>.N (y).P z)
  3951                       =  Cut <b'>.(ImpR (x).<a>.M b') (z').(ImpL <c>.N (y).P z')"
  3772                       =  Cut <b'>.(ImpR (x).<a>.M b') (z').(ImpL <c>.N (y).P z')"
  3952     using f1 f2 f3 f4 f5 fs
  3773     using f1 f2 f3 f4 f5 fs
  3953     apply(rule_tac sym)
  3774     apply(rule_tac sym)
  3954     apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh)
  3775     apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh)
  3955     apply(auto simp add: perm_fresh_fresh)
  3776     apply(auto simp: perm_fresh_fresh)
  3956     done
  3777     done
  3957   also have "\<dots> = Cut <b'>.(ImpR (x').<a'>.([(a',a)]\<bullet>([(x',x)]\<bullet>M)) b') 
  3778   also have "\<dots> = Cut <b'>.(ImpR (x').<a'>.([(a',a)]\<bullet>([(x',x)]\<bullet>M)) b') 
  3958                            (z').(ImpL <c'>.([(c',c)]\<bullet>N) (y').([(y',y)]\<bullet>P) z')"
  3779                            (z').(ImpL <c'>.([(c',c)]\<bullet>N) (y').([(y',y)]\<bullet>P) z')"
  3959     using f1 f2 f3 f4 f5 f6 fs 
  3780     using f1 f2 f3 f4 f5 f6 fs 
  3960     apply(rule_tac sym)
  3781     apply(rule_tac sym)
  3971     done
  3792     done
  3972   also have "\<dots> \<longrightarrow>\<^sub>l Cut <a'>.(Cut <c'>.([(c',c)]\<bullet>N) (x').([(a',a)]\<bullet>[(x',x)]\<bullet>M)) (y').([(y',y)]\<bullet>P)"
  3793   also have "\<dots> \<longrightarrow>\<^sub>l Cut <a'>.(Cut <c'>.([(c',c)]\<bullet>N) (x').([(a',a)]\<bullet>[(x',x)]\<bullet>M)) (y').([(y',y)]\<bullet>P)"
  3973     using f1 f2 f3 f4 f5 f6 fs
  3794     using f1 f2 f3 f4 f5 f6 fs
  3974     apply -
  3795     apply -
  3975     apply(rule l_redu.intros)
  3796     apply(rule l_redu.intros)
  3976     apply(auto simp add: abs_fresh fresh_prod fresh_left calc_atm fresh_atm)
  3797     apply(auto simp: abs_fresh fresh_prod fresh_left calc_atm fresh_atm)
  3977     done
  3798     done
  3978   also have "\<dots> = Cut <a>.(Cut <c>.N (x).M) (y).P"
  3799   also have "\<dots> = Cut <a>.(Cut <c>.N (x).M) (y).P"
  3979     using f1 f2 f3 f4 f5 f6 fs 
  3800     using f1 f2 f3 f4 f5 f6 fs 
  3980     apply(simp add: trm.inject)
  3801     apply(simp add: trm.inject)
  3981     apply(rule conjI)
  3802     apply(rule conjI)
  3984     apply(simp add: trm.inject)
  3805     apply(simp add: trm.inject)
  3985     apply(rule conjI)
  3806     apply(rule conjI)
  3986     apply(simp add: fresh_prod fresh_atm)
  3807     apply(simp add: fresh_prod fresh_atm)
  3987     apply(rule conjI)
  3808     apply(rule conjI)
  3988     apply(perm_simp add: calc_atm)
  3809     apply(perm_simp add: calc_atm)
  3989     apply(auto simp add: fresh_prod fresh_atm)[1]
  3810     apply(auto simp: fresh_prod fresh_atm)[1]
  3990     apply(perm_simp add: alpha)
  3811     apply(perm_simp add: alpha)
  3991     apply(perm_simp add: alpha)
  3812     apply(perm_simp add: alpha)
  3992     apply(perm_simp add: alpha)
  3813     apply(perm_simp add: alpha)
  3993     apply(rule conjI)
  3814     apply(rule conjI)
  3994     apply(perm_simp add: calc_atm)
  3815     apply(perm_simp add: calc_atm)
  4005   fixes M::"trm"
  3826   fixes M::"trm"
  4006   and   a::"coname"
  3827   and   a::"coname"
  4007   assumes a: "[a].M = [b].N" "c\<sharp>(a,b,M,N)"
  3828   assumes a: "[a].M = [b].N" "c\<sharp>(a,b,M,N)"
  4008   shows "M = [(a,c)]\<bullet>[(b,c)]\<bullet>N"
  3829   shows "M = [(a,c)]\<bullet>[(b,c)]\<bullet>N"
  4009 using a
  3830 using a
  4010 apply(auto simp add: alpha_fresh fresh_prod fresh_atm)
  3831 apply(auto simp: alpha_fresh fresh_prod fresh_atm)
  4011 apply(drule sym)
  3832 apply(drule sym)
  4012 apply(perm_simp)
  3833 apply(perm_simp)
  4013 done 
  3834 done 
  4014 
  3835 
  4015 lemma alpha_name:
  3836 lemma alpha_name:
  4016   fixes M::"trm"
  3837   fixes M::"trm"
  4017   and   x::"name"
  3838   and   x::"name"
  4018   assumes a: "[x].M = [y].N" "z\<sharp>(x,y,M,N)"
  3839   assumes a: "[x].M = [y].N" "z\<sharp>(x,y,M,N)"
  4019   shows "M = [(x,z)]\<bullet>[(y,z)]\<bullet>N"
  3840   shows "M = [(x,z)]\<bullet>[(y,z)]\<bullet>N"
  4020 using a
  3841 using a
  4021 apply(auto simp add: alpha_fresh fresh_prod fresh_atm)
  3842 apply(auto simp: alpha_fresh fresh_prod fresh_atm)
  4022 apply(drule sym)
  3843 apply(drule sym)
  4023 apply(perm_simp)
  3844 apply(perm_simp)
  4024 done 
  3845 done 
  4025 
  3846 
  4026 lemma alpha_name_coname:
  3847 lemma alpha_name_coname:
  4028   and   x::"name"
  3849   and   x::"name"
  4029   and   a::"coname"
  3850   and   a::"coname"
  4030   assumes a: "[x].[b].M = [y].[c].N" "z\<sharp>(x,y,M,N)" "a\<sharp>(b,c,M,N)"
  3851   assumes a: "[x].[b].M = [y].[c].N" "z\<sharp>(x,y,M,N)" "a\<sharp>(b,c,M,N)"
  4031   shows "M = [(x,z)]\<bullet>[(b,a)]\<bullet>[(c,a)]\<bullet>[(y,z)]\<bullet>N"
  3852   shows "M = [(x,z)]\<bullet>[(b,a)]\<bullet>[(c,a)]\<bullet>[(y,z)]\<bullet>N"
  4032 using a
  3853 using a
  4033 apply(auto simp add: alpha_fresh fresh_prod fresh_atm 
  3854 apply(auto simp: alpha_fresh fresh_prod fresh_atm 
  4034                      abs_supp fin_supp abs_fresh abs_perm fresh_left calc_atm)
  3855                      abs_supp fin_supp abs_fresh abs_perm fresh_left calc_atm)
  4035 apply(drule sym)
  3856 apply(drule sym)
  4036 apply(simp)
  3857 apply(simp)
  4037 apply(perm_simp)
  3858 apply(perm_simp)
  4038 done 
  3859 done 
  4097 apply(simp add: fresh_prod fresh_atm abs_fresh)
  3918 apply(simp add: fresh_prod fresh_atm abs_fresh)
  4098 apply(simp add: calc_atm)
  3919 apply(simp add: calc_atm)
  4099 apply(rule exI)+
  3920 apply(rule exI)+
  4100 apply(rule conjI)
  3921 apply(rule conjI)
  4101 apply(rule refl)
  3922 apply(rule refl)
  4102 apply(auto simp add: calc_atm abs_fresh fresh_left)[1]
  3923 apply(auto simp: calc_atm abs_fresh fresh_left)[1]
  4103 apply(case_tac "y=x")
  3924 apply(case_tac "y=x")
  4104 apply(perm_simp)
  3925 apply(perm_simp)
  4105 apply(perm_simp)
  3926 apply(perm_simp)
  4106 apply(case_tac "aa=a")
  3927 apply(case_tac "aa=a")
  4107 apply(perm_simp)
  3928 apply(perm_simp)
  4134 apply(rule exI)+
  3955 apply(rule exI)+
  4135 apply(rule conjI)
  3956 apply(rule conjI)
  4136 apply(rule_tac s="x" and t="[(x,ca)]\<bullet>[(y,ca)]\<bullet>y" in subst)
  3957 apply(rule_tac s="x" and t="[(x,ca)]\<bullet>[(y,ca)]\<bullet>y" in subst)
  4137 apply(simp add: calc_atm)
  3958 apply(simp add: calc_atm)
  4138 apply(rule refl)
  3959 apply(rule refl)
  4139 apply(auto simp add: fresh_left calc_atm abs_fresh split: if_splits)[1]
  3960 apply(auto simp: fresh_left calc_atm abs_fresh split: if_splits)[1]
  4140 apply(generate_fresh "name")
  3961 apply(generate_fresh "name")
  4141 apply(simp add: abs_fresh fresh_prod fresh_atm)
  3962 apply(simp add: abs_fresh fresh_prod fresh_atm)
  4142 apply(auto)[1]
  3963 apply(auto)[1]
  4143 apply(drule_tac z="cb" in  alpha_name)
  3964 apply(drule_tac z="cb" in  alpha_name)
  4144 apply(simp add: fresh_prod fresh_atm abs_fresh)
  3965 apply(simp add: fresh_prod fresh_atm abs_fresh)
  4146 apply(rule exI)+
  3967 apply(rule exI)+
  4147 apply(rule conjI)
  3968 apply(rule conjI)
  4148 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst)
  3969 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst)
  4149 apply(simp add: calc_atm)
  3970 apply(simp add: calc_atm)
  4150 apply(rule refl)
  3971 apply(rule refl)
  4151 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  3972 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4152 apply(perm_simp)+
  3973 apply(perm_simp)+
  4153 apply(generate_fresh "name")
  3974 apply(generate_fresh "name")
  4154 apply(simp add: abs_fresh fresh_prod fresh_atm)
  3975 apply(simp add: abs_fresh fresh_prod fresh_atm)
  4155 apply(auto)[1]
  3976 apply(auto)[1]
  4156 apply(drule_tac z="cb" in  alpha_name)
  3977 apply(drule_tac z="cb" in  alpha_name)
  4159 apply(rule exI)+
  3980 apply(rule exI)+
  4160 apply(rule conjI)
  3981 apply(rule conjI)
  4161 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst)
  3982 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst)
  4162 apply(simp add: calc_atm)
  3983 apply(simp add: calc_atm)
  4163 apply(rule refl)
  3984 apply(rule refl)
  4164 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  3985 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4165 apply(perm_simp)+
  3986 apply(perm_simp)+
  4166 apply(generate_fresh "name")
  3987 apply(generate_fresh "name")
  4167 apply(simp add: abs_fresh fresh_prod fresh_atm)
  3988 apply(simp add: abs_fresh fresh_prod fresh_atm)
  4168 apply(auto)[1]
  3989 apply(auto)[1]
  4169 apply(drule_tac z="cb" in  alpha_name)
  3990 apply(drule_tac z="cb" in  alpha_name)
  4172 apply(rule exI)+
  3993 apply(rule exI)+
  4173 apply(rule conjI)
  3994 apply(rule conjI)
  4174 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst)
  3995 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst)
  4175 apply(simp add: calc_atm)
  3996 apply(simp add: calc_atm)
  4176 apply(rule refl)
  3997 apply(rule refl)
  4177 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  3998 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4178 apply(perm_simp)+
  3999 apply(perm_simp)+
  4179 (* and2 case *)
  4000 (* and2 case *)
  4180 apply(rule disjI2)
  4001 apply(rule disjI2)
  4181 apply(rule disjI2)
  4002 apply(rule disjI2)
  4182 apply(rule disjI2)
  4003 apply(rule disjI2)
  4204 apply(rule exI)+
  4025 apply(rule exI)+
  4205 apply(rule conjI)
  4026 apply(rule conjI)
  4206 apply(rule_tac s="x" and t="[(x,ca)]\<bullet>[(y,ca)]\<bullet>y" in subst)
  4027 apply(rule_tac s="x" and t="[(x,ca)]\<bullet>[(y,ca)]\<bullet>y" in subst)
  4207 apply(simp add: calc_atm)
  4028 apply(simp add: calc_atm)
  4208 apply(rule refl)
  4029 apply(rule refl)
  4209 apply(auto simp add: fresh_left calc_atm abs_fresh split: if_splits)[1]
  4030 apply(auto simp: fresh_left calc_atm abs_fresh split: if_splits)[1]
  4210 apply(generate_fresh "name")
  4031 apply(generate_fresh "name")
  4211 apply(simp add: abs_fresh fresh_prod fresh_atm)
  4032 apply(simp add: abs_fresh fresh_prod fresh_atm)
  4212 apply(auto)[1]
  4033 apply(auto)[1]
  4213 apply(drule_tac z="cb" in  alpha_name)
  4034 apply(drule_tac z="cb" in  alpha_name)
  4214 apply(simp add: fresh_prod fresh_atm abs_fresh)
  4035 apply(simp add: fresh_prod fresh_atm abs_fresh)
  4216 apply(rule exI)+
  4037 apply(rule exI)+
  4217 apply(rule conjI)
  4038 apply(rule conjI)
  4218 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst)
  4039 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst)
  4219 apply(simp add: calc_atm)
  4040 apply(simp add: calc_atm)
  4220 apply(rule refl)
  4041 apply(rule refl)
  4221 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4042 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4222 apply(perm_simp)+
  4043 apply(perm_simp)+
  4223 apply(generate_fresh "name")
  4044 apply(generate_fresh "name")
  4224 apply(simp add: abs_fresh fresh_prod fresh_atm)
  4045 apply(simp add: abs_fresh fresh_prod fresh_atm)
  4225 apply(auto)[1]
  4046 apply(auto)[1]
  4226 apply(drule_tac z="cb" in  alpha_name)
  4047 apply(drule_tac z="cb" in  alpha_name)
  4229 apply(rule exI)+
  4050 apply(rule exI)+
  4230 apply(rule conjI)
  4051 apply(rule conjI)
  4231 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst)
  4052 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst)
  4232 apply(simp add: calc_atm)
  4053 apply(simp add: calc_atm)
  4233 apply(rule refl)
  4054 apply(rule refl)
  4234 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4055 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4235 apply(perm_simp)+
  4056 apply(perm_simp)+
  4236 apply(generate_fresh "name")
  4057 apply(generate_fresh "name")
  4237 apply(simp add: abs_fresh fresh_prod fresh_atm)
  4058 apply(simp add: abs_fresh fresh_prod fresh_atm)
  4238 apply(auto)[1]
  4059 apply(auto)[1]
  4239 apply(drule_tac z="cb" in  alpha_name)
  4060 apply(drule_tac z="cb" in  alpha_name)
  4242 apply(rule exI)+
  4063 apply(rule exI)+
  4243 apply(rule conjI)
  4064 apply(rule conjI)
  4244 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst)
  4065 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst)
  4245 apply(simp add: calc_atm)
  4066 apply(simp add: calc_atm)
  4246 apply(rule refl)
  4067 apply(rule refl)
  4247 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4068 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4248 apply(perm_simp)+
  4069 apply(perm_simp)+
  4249 (* or1 case *)
  4070 (* or1 case *)
  4250 apply(rule disjI2)
  4071 apply(rule disjI2)
  4251 apply(rule disjI2)
  4072 apply(rule disjI2)
  4252 apply(rule disjI2)
  4073 apply(rule disjI2)
  4276 apply(rule conjI)
  4097 apply(rule conjI)
  4277 apply(rule exI)+
  4098 apply(rule exI)+
  4278 apply(rule_tac s="x" and t="[(x,ca)]\<bullet>[(y,ca)]\<bullet>y" in subst)
  4099 apply(rule_tac s="x" and t="[(x,ca)]\<bullet>[(y,ca)]\<bullet>y" in subst)
  4279 apply(simp add: calc_atm)
  4100 apply(simp add: calc_atm)
  4280 apply(rule refl)
  4101 apply(rule refl)
  4281 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4102 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4282 apply(perm_simp)+
  4103 apply(perm_simp)+
  4283 apply(generate_fresh "name")
  4104 apply(generate_fresh "name")
  4284 apply(simp add: abs_fresh fresh_prod fresh_atm)
  4105 apply(simp add: abs_fresh fresh_prod fresh_atm)
  4285 apply(auto)[1]
  4106 apply(auto)[1]
  4286 apply(drule_tac z="cb" in  alpha_name)
  4107 apply(drule_tac z="cb" in  alpha_name)
  4290 apply(rule conjI)
  4111 apply(rule conjI)
  4291 apply(rule exI)+
  4112 apply(rule exI)+
  4292 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst)
  4113 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst)
  4293 apply(simp add: calc_atm)
  4114 apply(simp add: calc_atm)
  4294 apply(rule refl)
  4115 apply(rule refl)
  4295 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4116 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4296 apply(perm_simp)+
  4117 apply(perm_simp)+
  4297 (* or2 case *)
  4118 (* or2 case *)
  4298 apply(rule disjI2)
  4119 apply(rule disjI2)
  4299 apply(rule disjI2)
  4120 apply(rule disjI2)
  4300 apply(rule disjI2)
  4121 apply(rule disjI2)
  4324 apply(rule exI)+
  4145 apply(rule exI)+
  4325 apply(rule conjI)
  4146 apply(rule conjI)
  4326 apply(rule_tac s="x" and t="[(x,ca)]\<bullet>[(y,ca)]\<bullet>y" in subst)
  4147 apply(rule_tac s="x" and t="[(x,ca)]\<bullet>[(y,ca)]\<bullet>y" in subst)
  4327 apply(simp add: calc_atm)
  4148 apply(simp add: calc_atm)
  4328 apply(rule refl)
  4149 apply(rule refl)
  4329 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4150 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4330 apply(perm_simp)+
  4151 apply(perm_simp)+
  4331 apply(generate_fresh "name")
  4152 apply(generate_fresh "name")
  4332 apply(simp add: abs_fresh fresh_prod fresh_atm)
  4153 apply(simp add: abs_fresh fresh_prod fresh_atm)
  4333 apply(auto)[1]
  4154 apply(auto)[1]
  4334 apply(drule_tac z="cb" in  alpha_name)
  4155 apply(drule_tac z="cb" in  alpha_name)
  4337 apply(rule exI)+
  4158 apply(rule exI)+
  4338 apply(rule conjI)
  4159 apply(rule conjI)
  4339 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst)
  4160 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(y,cb)]\<bullet>y" in subst)
  4340 apply(simp add: calc_atm)
  4161 apply(simp add: calc_atm)
  4341 apply(rule refl)
  4162 apply(rule refl)
  4342 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4163 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4343 apply(perm_simp)+
  4164 apply(perm_simp)+
  4344 (* imp-case *)
  4165 (* imp-case *)
  4345 apply(rule disjI2)
  4166 apply(rule disjI2)
  4346 apply(rule disjI2)
  4167 apply(rule disjI2)
  4347 apply(rule disjI2)
  4168 apply(rule disjI2)
  4371 apply(rule exI)+
  4192 apply(rule exI)+
  4372 apply(rule conjI)
  4193 apply(rule conjI)
  4373 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(z,cb)]\<bullet>z" in subst)
  4194 apply(rule_tac s="x" and t="[(x,cb)]\<bullet>[(z,cb)]\<bullet>z" in subst)
  4374 apply(simp add: calc_atm)
  4195 apply(simp add: calc_atm)
  4375 apply(rule refl)
  4196 apply(rule refl)
  4376 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4197 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4377 apply(perm_simp)+
  4198 apply(perm_simp)+
  4378 apply(generate_fresh "name")
  4199 apply(generate_fresh "name")
  4379 apply(simp add: abs_fresh fresh_prod fresh_atm)
  4200 apply(simp add: abs_fresh fresh_prod fresh_atm)
  4380 apply(auto)[1]
  4201 apply(auto)[1]
  4381 apply(drule_tac z="cc" in  alpha_name)
  4202 apply(drule_tac z="cc" in  alpha_name)
  4384 apply(rule exI)+
  4205 apply(rule exI)+
  4385 apply(rule conjI)
  4206 apply(rule conjI)
  4386 apply(rule_tac s="x" and t="[(x,cc)]\<bullet>[(z,cc)]\<bullet>z" in subst)
  4207 apply(rule_tac s="x" and t="[(x,cc)]\<bullet>[(z,cc)]\<bullet>z" in subst)
  4387 apply(simp add: calc_atm)
  4208 apply(simp add: calc_atm)
  4388 apply(rule refl)
  4209 apply(rule refl)
  4389 apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4210 apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1]
  4390 apply(perm_simp)+
  4211 apply(perm_simp)+
  4391 done
  4212 done
  4392 
  4213 
  4393 inductive
  4214 inductive
  4394   c_redu :: "trm \<Rightarrow> trm \<Rightarrow> bool" ("_ \<longrightarrow>\<^sub>c _" [100,100] 100)
  4215   c_redu :: "trm \<Rightarrow> trm \<Rightarrow> bool" ("_ \<longrightarrow>\<^sub>c _" [100,100] 100)
  4406 proof -
  4227 proof -
  4407   assume not_fic: "\<not>fic M a"
  4228   assume not_fic: "\<not>fic M a"
  4408   obtain x'::"name" where fs1: "x'\<sharp>(N,M,x)" by (rule exists_fresh(1), rule fin_supp, blast)
  4229   obtain x'::"name" where fs1: "x'\<sharp>(N,M,x)" by (rule exists_fresh(1), rule fin_supp, blast)
  4409   obtain a'::"coname" where fs2: "a'\<sharp>(a,M,N)" by (rule exists_fresh(2), rule fin_supp, blast)
  4230   obtain a'::"coname" where fs2: "a'\<sharp>(a,M,N)" by (rule exists_fresh(2), rule fin_supp, blast)
  4410   have "Cut <a>.M (x).N =  Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)"
  4231   have "Cut <a>.M (x).N =  Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)"
  4411     using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4232     using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4412   also have "\<dots> \<longrightarrow>\<^sub>c ([(a',a)]\<bullet>M){a':=(x').([(x',x)]\<bullet>N)}" using fs1 fs2 not_fic
  4233   also have "\<dots> \<longrightarrow>\<^sub>c ([(a',a)]\<bullet>M){a':=(x').([(x',x)]\<bullet>N)}" using fs1 fs2 not_fic
  4413     apply -
  4234     apply -
  4414     apply(rule left)
  4235     apply(rule left)
  4415     apply(clarify)
  4236     apply(clarify)
  4416     apply(drule_tac a'="a" in fic_rename)
  4237     apply(drule_tac a'="a" in fic_rename)
  4427 proof -
  4248 proof -
  4428   assume not_fin: "\<not>fin N x"
  4249   assume not_fin: "\<not>fin N x"
  4429   obtain x'::"name" where fs1: "x'\<sharp>(N,M,x)" by (rule exists_fresh(1), rule fin_supp, blast)
  4250   obtain x'::"name" where fs1: "x'\<sharp>(N,M,x)" by (rule exists_fresh(1), rule fin_supp, blast)
  4430   obtain a'::"coname" where fs2: "a'\<sharp>(a,M,N)" by (rule exists_fresh(2), rule fin_supp, blast)
  4251   obtain a'::"coname" where fs2: "a'\<sharp>(a,M,N)" by (rule exists_fresh(2), rule fin_supp, blast)
  4431   have "Cut <a>.M (x).N =  Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)"
  4252   have "Cut <a>.M (x).N =  Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)"
  4432     using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4253     using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4433   also have "\<dots> \<longrightarrow>\<^sub>c ([(x',x)]\<bullet>N){x':=<a'>.([(a',a)]\<bullet>M)}" using fs1 fs2 not_fin
  4254   also have "\<dots> \<longrightarrow>\<^sub>c ([(x',x)]\<bullet>N){x':=<a'>.([(a',a)]\<bullet>M)}" using fs1 fs2 not_fin
  4434     apply -
  4255     apply -
  4435     apply(rule right)
  4256     apply(rule right)
  4436     apply(clarify)
  4257     apply(clarify)
  4437     apply(drule_tac x'="x" in fin_rename)
  4258     apply(drule_tac x'="x" in fin_rename)
  4448   and   c::"coname"
  4269   and   c::"coname"
  4449   shows "M \<longrightarrow>\<^sub>c M' \<Longrightarrow> x\<sharp>M \<Longrightarrow> x\<sharp>M'"
  4270   shows "M \<longrightarrow>\<^sub>c M' \<Longrightarrow> x\<sharp>M \<Longrightarrow> x\<sharp>M'"
  4450   and   "M \<longrightarrow>\<^sub>c M' \<Longrightarrow> c\<sharp>M \<Longrightarrow> c\<sharp>M'"
  4271   and   "M \<longrightarrow>\<^sub>c M' \<Longrightarrow> c\<sharp>M \<Longrightarrow> c\<sharp>M'"
  4451 apply -
  4272 apply -
  4452 apply(induct rule: c_redu.induct)
  4273 apply(induct rule: c_redu.induct)
  4453 apply(auto simp add: abs_fresh rename_fresh subst_fresh)
  4274 apply(auto simp: abs_fresh rename_fresh subst_fresh)
  4454 apply(induct rule: c_redu.induct)
  4275 apply(induct rule: c_redu.induct)
  4455 apply(auto simp add: abs_fresh rename_fresh subst_fresh)
  4276 apply(auto simp: abs_fresh rename_fresh subst_fresh)
  4456 done
  4277 done
  4457 
  4278 
  4458 inductive
  4279 inductive
  4459   a_redu :: "trm \<Rightarrow> trm \<Rightarrow> bool" ("_ \<longrightarrow>\<^sub>a _" [100,100] 100)
  4280   a_redu :: "trm \<Rightarrow> trm \<Rightarrow> bool" ("_ \<longrightarrow>\<^sub>a _" [100,100] 100)
  4460 where
  4281 where
  4483   and   "M \<longrightarrow>\<^sub>a M' \<Longrightarrow> c\<sharp>M \<Longrightarrow> c\<sharp>M'"
  4304   and   "M \<longrightarrow>\<^sub>a M' \<Longrightarrow> c\<sharp>M \<Longrightarrow> c\<sharp>M'"
  4484 apply -
  4305 apply -
  4485 apply(induct rule: a_redu.induct)
  4306 apply(induct rule: a_redu.induct)
  4486 apply(simp add: fresh_l_redu)
  4307 apply(simp add: fresh_l_redu)
  4487 apply(simp add: fresh_c_redu)
  4308 apply(simp add: fresh_c_redu)
  4488 apply(auto simp add: abs_fresh abs_supp fin_supp)
  4309 apply(auto simp: abs_fresh abs_supp fin_supp)
  4489 apply(induct rule: a_redu.induct)
  4310 apply(induct rule: a_redu.induct)
  4490 apply(simp add: fresh_l_redu)
  4311 apply(simp add: fresh_l_redu)
  4491 apply(simp add: fresh_c_redu)
  4312 apply(simp add: fresh_c_redu)
  4492 apply(auto simp add: abs_fresh abs_supp fin_supp)
  4313 apply(auto simp: abs_fresh abs_supp fin_supp)
  4493 done
  4314 done
  4494 
  4315 
  4495 equivariance a_redu
  4316 equivariance a_redu
  4496 
  4317 
  4497 nominal_inductive a_redu
  4318 nominal_inductive a_redu
  4502 proof -
  4323 proof -
  4503   assume red: "M\<longrightarrow>\<^sub>a M'"
  4324   assume red: "M\<longrightarrow>\<^sub>a M'"
  4504   obtain x'::"name"   where fs1: "x'\<sharp>(M,N,x)" by (rule exists_fresh(1), rule fin_supp, blast)
  4325   obtain x'::"name"   where fs1: "x'\<sharp>(M,N,x)" by (rule exists_fresh(1), rule fin_supp, blast)
  4505   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast)
  4326   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast)
  4506   have "Cut <a>.M (x).N =  Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)"
  4327   have "Cut <a>.M (x).N =  Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)"
  4507     using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4328     using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4508   also have "\<dots> \<longrightarrow>\<^sub>a  Cut <a'>.([(a',a)]\<bullet>M') (x').([(x',x)]\<bullet>N)" using fs1 fs2 red
  4329   also have "\<dots> \<longrightarrow>\<^sub>a  Cut <a'>.([(a',a)]\<bullet>M') (x').([(x',x)]\<bullet>N)" using fs1 fs2 red
  4509     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt)
  4330     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt)
  4510   also have "\<dots> = Cut <a>.M' (x).N" 
  4331   also have "\<dots> = Cut <a>.M' (x).N" 
  4511     using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4332     using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4512   finally show ?thesis by simp
  4333   finally show ?thesis by simp
  4513 qed
  4334 qed
  4514 
  4335 
  4515 lemma better_CutR_intro[intro]:
  4336 lemma better_CutR_intro[intro]:
  4516   shows "N\<longrightarrow>\<^sub>a N' \<Longrightarrow> Cut <a>.M (x).N \<longrightarrow>\<^sub>a Cut <a>.M (x).N'"
  4337   shows "N\<longrightarrow>\<^sub>a N' \<Longrightarrow> Cut <a>.M (x).N \<longrightarrow>\<^sub>a Cut <a>.M (x).N'"
  4517 proof -
  4338 proof -
  4518   assume red: "N\<longrightarrow>\<^sub>a N'"
  4339   assume red: "N\<longrightarrow>\<^sub>a N'"
  4519   obtain x'::"name"   where fs1: "x'\<sharp>(M,N,x)" by (rule exists_fresh(1), rule fin_supp, blast)
  4340   obtain x'::"name"   where fs1: "x'\<sharp>(M,N,x)" by (rule exists_fresh(1), rule fin_supp, blast)
  4520   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast)
  4341   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast)
  4521   have "Cut <a>.M (x).N =  Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)"
  4342   have "Cut <a>.M (x).N =  Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N)"
  4522     using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4343     using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4523   also have "\<dots> \<longrightarrow>\<^sub>a  Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N')" using fs1 fs2 red
  4344   also have "\<dots> \<longrightarrow>\<^sub>a  Cut <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N')" using fs1 fs2 red
  4524     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt)
  4345     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt)
  4525   also have "\<dots> = Cut <a>.M (x).N'" 
  4346   also have "\<dots> = Cut <a>.M (x).N'" 
  4526     using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4347     using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4527   finally show ?thesis by simp
  4348   finally show ?thesis by simp
  4528 qed
  4349 qed
  4529     
  4350     
  4530 lemma better_AndRL_intro[intro]:
  4351 lemma better_AndRL_intro[intro]:
  4531   shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> AndR <a>.M <b>.N c \<longrightarrow>\<^sub>a AndR <a>.M' <b>.N c"
  4352   shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> AndR <a>.M <b>.N c \<longrightarrow>\<^sub>a AndR <a>.M' <b>.N c"
  4532 proof -
  4353 proof -
  4533   assume red: "M\<longrightarrow>\<^sub>a M'"
  4354   assume red: "M\<longrightarrow>\<^sub>a M'"
  4534   obtain b'::"coname" where fs1: "b'\<sharp>(M,N,a,b,c)" by (rule exists_fresh(2), rule fin_supp, blast)
  4355   obtain b'::"coname" where fs1: "b'\<sharp>(M,N,a,b,c)" by (rule exists_fresh(2), rule fin_supp, blast)
  4535   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,b,c,b')" by (rule exists_fresh(2), rule fin_supp, blast)
  4356   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,b,c,b')" by (rule exists_fresh(2), rule fin_supp, blast)
  4536   have "AndR <a>.M <b>.N c =  AndR <a'>.([(a',a)]\<bullet>M) <b'>.([(b',b)]\<bullet>N) c"
  4357   have "AndR <a>.M <b>.N c =  AndR <a'>.([(a',a)]\<bullet>M) <b'>.([(b',b)]\<bullet>N) c"
  4537     using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4358     using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4538   also have "\<dots> \<longrightarrow>\<^sub>a  AndR <a'>.([(a',a)]\<bullet>M') <b'>.([(b',b)]\<bullet>N) c" using fs1 fs2 red
  4359   also have "\<dots> \<longrightarrow>\<^sub>a  AndR <a'>.([(a',a)]\<bullet>M') <b'>.([(b',b)]\<bullet>N) c" using fs1 fs2 red
  4539     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4360     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4540   also have "\<dots> = AndR <a>.M' <b>.N c" 
  4361   also have "\<dots> = AndR <a>.M' <b>.N c" 
  4541     using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4362     using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4542   finally show ?thesis by simp
  4363   finally show ?thesis by simp
  4543 qed
  4364 qed
  4544 
  4365 
  4545 lemma better_AndRR_intro[intro]:
  4366 lemma better_AndRR_intro[intro]:
  4546   shows "N\<longrightarrow>\<^sub>a N' \<Longrightarrow> AndR <a>.M <b>.N c \<longrightarrow>\<^sub>a AndR <a>.M <b>.N' c"
  4367   shows "N\<longrightarrow>\<^sub>a N' \<Longrightarrow> AndR <a>.M <b>.N c \<longrightarrow>\<^sub>a AndR <a>.M <b>.N' c"
  4547 proof -
  4368 proof -
  4548   assume red: "N\<longrightarrow>\<^sub>a N'"
  4369   assume red: "N\<longrightarrow>\<^sub>a N'"
  4549   obtain b'::"coname" where fs1: "b'\<sharp>(M,N,a,b,c)" by (rule exists_fresh(2), rule fin_supp, blast)
  4370   obtain b'::"coname" where fs1: "b'\<sharp>(M,N,a,b,c)" by (rule exists_fresh(2), rule fin_supp, blast)
  4550   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,b,c,b')" by (rule exists_fresh(2), rule fin_supp, blast)
  4371   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,b,c,b')" by (rule exists_fresh(2), rule fin_supp, blast)
  4551   have "AndR <a>.M <b>.N c =  AndR <a'>.([(a',a)]\<bullet>M) <b'>.([(b',b)]\<bullet>N) c"
  4372   have "AndR <a>.M <b>.N c =  AndR <a'>.([(a',a)]\<bullet>M) <b'>.([(b',b)]\<bullet>N) c"
  4552     using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4373     using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4553   also have "\<dots> \<longrightarrow>\<^sub>a  AndR <a'>.([(a',a)]\<bullet>M) <b'>.([(b',b)]\<bullet>N') c" using fs1 fs2 red
  4374   also have "\<dots> \<longrightarrow>\<^sub>a  AndR <a'>.([(a',a)]\<bullet>M) <b'>.([(b',b)]\<bullet>N') c" using fs1 fs2 red
  4554     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4375     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4555   also have "\<dots> = AndR <a>.M <b>.N' c" 
  4376   also have "\<dots> = AndR <a>.M <b>.N' c" 
  4556     using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4377     using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4557   finally show ?thesis by simp
  4378   finally show ?thesis by simp
  4558 qed
  4379 qed
  4559 
  4380 
  4560 lemma better_AndL1_intro[intro]:
  4381 lemma better_AndL1_intro[intro]:
  4561   shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> AndL1 (x).M y \<longrightarrow>\<^sub>a AndL1 (x).M' y"
  4382   shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> AndL1 (x).M y \<longrightarrow>\<^sub>a AndL1 (x).M' y"
  4562 proof -
  4383 proof -
  4563   assume red: "M\<longrightarrow>\<^sub>a M'"
  4384   assume red: "M\<longrightarrow>\<^sub>a M'"
  4564   obtain x'::"name" where fs1: "x'\<sharp>(M,y,x)" by (rule exists_fresh(1), rule fin_supp, blast)
  4385   obtain x'::"name" where fs1: "x'\<sharp>(M,y,x)" by (rule exists_fresh(1), rule fin_supp, blast)
  4565   have "AndL1 (x).M y = AndL1 (x').([(x',x)]\<bullet>M) y"
  4386   have "AndL1 (x).M y = AndL1 (x').([(x',x)]\<bullet>M) y"
  4566     using fs1 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4387     using fs1 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4567   also have "\<dots> \<longrightarrow>\<^sub>a AndL1 (x').([(x',x)]\<bullet>M') y" using fs1 red
  4388   also have "\<dots> \<longrightarrow>\<^sub>a AndL1 (x').([(x',x)]\<bullet>M') y" using fs1 red
  4568     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4389     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4569   also have "\<dots> = AndL1 (x).M' y" 
  4390   also have "\<dots> = AndL1 (x).M' y" 
  4570     using fs1 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4391     using fs1 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4571   finally show ?thesis by simp
  4392   finally show ?thesis by simp
  4572 qed
  4393 qed
  4573 
  4394 
  4574 lemma better_AndL2_intro[intro]:
  4395 lemma better_AndL2_intro[intro]:
  4575   shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> AndL2 (x).M y \<longrightarrow>\<^sub>a AndL2 (x).M' y"
  4396   shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> AndL2 (x).M y \<longrightarrow>\<^sub>a AndL2 (x).M' y"
  4576 proof -
  4397 proof -
  4577   assume red: "M\<longrightarrow>\<^sub>a M'"
  4398   assume red: "M\<longrightarrow>\<^sub>a M'"
  4578   obtain x'::"name" where fs1: "x'\<sharp>(M,y,x)" by (rule exists_fresh(1), rule fin_supp, blast)
  4399   obtain x'::"name" where fs1: "x'\<sharp>(M,y,x)" by (rule exists_fresh(1), rule fin_supp, blast)
  4579   have "AndL2 (x).M y = AndL2 (x').([(x',x)]\<bullet>M) y"
  4400   have "AndL2 (x).M y = AndL2 (x').([(x',x)]\<bullet>M) y"
  4580     using fs1 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4401     using fs1 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4581   also have "\<dots> \<longrightarrow>\<^sub>a AndL2 (x').([(x',x)]\<bullet>M') y" using fs1 red
  4402   also have "\<dots> \<longrightarrow>\<^sub>a AndL2 (x').([(x',x)]\<bullet>M') y" using fs1 red
  4582     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4403     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4583   also have "\<dots> = AndL2 (x).M' y" 
  4404   also have "\<dots> = AndL2 (x).M' y" 
  4584     using fs1 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4405     using fs1 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4585   finally show ?thesis by simp
  4406   finally show ?thesis by simp
  4586 qed
  4407 qed
  4587 
  4408 
  4588 lemma better_OrLL_intro[intro]:
  4409 lemma better_OrLL_intro[intro]:
  4589   shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> OrL (x).M (y).N z \<longrightarrow>\<^sub>a OrL (x).M' (y).N z"
  4410   shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> OrL (x).M (y).N z \<longrightarrow>\<^sub>a OrL (x).M' (y).N z"
  4590 proof -
  4411 proof -
  4591   assume red: "M\<longrightarrow>\<^sub>a M'"
  4412   assume red: "M\<longrightarrow>\<^sub>a M'"
  4592   obtain x'::"name" where fs1: "x'\<sharp>(M,N,x,y,z)" by (rule exists_fresh(1), rule fin_supp, blast)
  4413   obtain x'::"name" where fs1: "x'\<sharp>(M,N,x,y,z)" by (rule exists_fresh(1), rule fin_supp, blast)
  4593   obtain y'::"name" where fs2: "y'\<sharp>(M,N,x,y,z,x')" by (rule exists_fresh(1), rule fin_supp, blast)
  4414   obtain y'::"name" where fs2: "y'\<sharp>(M,N,x,y,z,x')" by (rule exists_fresh(1), rule fin_supp, blast)
  4594   have "OrL (x).M (y).N z =  OrL (x').([(x',x)]\<bullet>M) (y').([(y',y)]\<bullet>N) z"
  4415   have "OrL (x).M (y).N z =  OrL (x').([(x',x)]\<bullet>M) (y').([(y',y)]\<bullet>N) z"
  4595     using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4416     using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4596   also have "\<dots> \<longrightarrow>\<^sub>a OrL (x').([(x',x)]\<bullet>M') (y').([(y',y)]\<bullet>N) z" using fs1 fs2 red
  4417   also have "\<dots> \<longrightarrow>\<^sub>a OrL (x').([(x',x)]\<bullet>M') (y').([(y',y)]\<bullet>N) z" using fs1 fs2 red
  4597     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4418     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4598   also have "\<dots> = OrL (x).M' (y).N z" 
  4419   also have "\<dots> = OrL (x).M' (y).N z" 
  4599     using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4420     using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4600   finally show ?thesis by simp
  4421   finally show ?thesis by simp
  4601 qed
  4422 qed
  4602 
  4423 
  4603 lemma better_OrLR_intro[intro]:
  4424 lemma better_OrLR_intro[intro]:
  4604   shows "N\<longrightarrow>\<^sub>a N' \<Longrightarrow> OrL (x).M (y).N z \<longrightarrow>\<^sub>a OrL (x).M (y).N' z"
  4425   shows "N\<longrightarrow>\<^sub>a N' \<Longrightarrow> OrL (x).M (y).N z \<longrightarrow>\<^sub>a OrL (x).M (y).N' z"
  4605 proof -
  4426 proof -
  4606   assume red: "N\<longrightarrow>\<^sub>a N'"
  4427   assume red: "N\<longrightarrow>\<^sub>a N'"
  4607   obtain x'::"name" where fs1: "x'\<sharp>(M,N,x,y,z)" by (rule exists_fresh(1), rule fin_supp, blast)
  4428   obtain x'::"name" where fs1: "x'\<sharp>(M,N,x,y,z)" by (rule exists_fresh(1), rule fin_supp, blast)
  4608   obtain y'::"name" where fs2: "y'\<sharp>(M,N,x,y,z,x')" by (rule exists_fresh(1), rule fin_supp, blast)
  4429   obtain y'::"name" where fs2: "y'\<sharp>(M,N,x,y,z,x')" by (rule exists_fresh(1), rule fin_supp, blast)
  4609   have "OrL (x).M (y).N z =  OrL (x').([(x',x)]\<bullet>M) (y').([(y',y)]\<bullet>N) z"
  4430   have "OrL (x).M (y).N z =  OrL (x').([(x',x)]\<bullet>M) (y').([(y',y)]\<bullet>N) z"
  4610     using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4431     using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4611   also have "\<dots> \<longrightarrow>\<^sub>a OrL (x').([(x',x)]\<bullet>M) (y').([(y',y)]\<bullet>N') z" using fs1 fs2 red
  4432   also have "\<dots> \<longrightarrow>\<^sub>a OrL (x').([(x',x)]\<bullet>M) (y').([(y',y)]\<bullet>N') z" using fs1 fs2 red
  4612     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4433     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4613   also have "\<dots> = OrL (x).M (y).N' z" 
  4434   also have "\<dots> = OrL (x).M (y).N' z" 
  4614     using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4435     using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4615   finally show ?thesis by simp
  4436   finally show ?thesis by simp
  4616 qed
  4437 qed
  4617 
  4438 
  4618 lemma better_OrR1_intro[intro]:
  4439 lemma better_OrR1_intro[intro]:
  4619   shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> OrR1 <a>.M b \<longrightarrow>\<^sub>a OrR1 <a>.M' b"
  4440   shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> OrR1 <a>.M b \<longrightarrow>\<^sub>a OrR1 <a>.M' b"
  4620 proof -
  4441 proof -
  4621   assume red: "M\<longrightarrow>\<^sub>a M'"
  4442   assume red: "M\<longrightarrow>\<^sub>a M'"
  4622   obtain a'::"coname" where fs1: "a'\<sharp>(M,b,a)" by (rule exists_fresh(2), rule fin_supp, blast)
  4443   obtain a'::"coname" where fs1: "a'\<sharp>(M,b,a)" by (rule exists_fresh(2), rule fin_supp, blast)
  4623   have "OrR1 <a>.M b = OrR1 <a'>.([(a',a)]\<bullet>M) b"
  4444   have "OrR1 <a>.M b = OrR1 <a'>.([(a',a)]\<bullet>M) b"
  4624     using fs1 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4445     using fs1 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4625   also have "\<dots> \<longrightarrow>\<^sub>a OrR1 <a'>.([(a',a)]\<bullet>M') b" using fs1 red
  4446   also have "\<dots> \<longrightarrow>\<^sub>a OrR1 <a'>.([(a',a)]\<bullet>M') b" using fs1 red
  4626     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4447     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4627   also have "\<dots> = OrR1 <a>.M' b" 
  4448   also have "\<dots> = OrR1 <a>.M' b" 
  4628     using fs1 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4449     using fs1 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4629   finally show ?thesis by simp
  4450   finally show ?thesis by simp
  4630 qed
  4451 qed
  4631 
  4452 
  4632 lemma better_OrR2_intro[intro]:
  4453 lemma better_OrR2_intro[intro]:
  4633   shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> OrR2 <a>.M b \<longrightarrow>\<^sub>a OrR2 <a>.M' b"
  4454   shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> OrR2 <a>.M b \<longrightarrow>\<^sub>a OrR2 <a>.M' b"
  4634 proof -
  4455 proof -
  4635   assume red: "M\<longrightarrow>\<^sub>a M'"
  4456   assume red: "M\<longrightarrow>\<^sub>a M'"
  4636   obtain a'::"coname" where fs1: "a'\<sharp>(M,b,a)" by (rule exists_fresh(2), rule fin_supp, blast)
  4457   obtain a'::"coname" where fs1: "a'\<sharp>(M,b,a)" by (rule exists_fresh(2), rule fin_supp, blast)
  4637   have "OrR2 <a>.M b = OrR2 <a'>.([(a',a)]\<bullet>M) b"
  4458   have "OrR2 <a>.M b = OrR2 <a'>.([(a',a)]\<bullet>M) b"
  4638     using fs1 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4459     using fs1 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4639   also have "\<dots> \<longrightarrow>\<^sub>a OrR2 <a'>.([(a',a)]\<bullet>M') b" using fs1 red
  4460   also have "\<dots> \<longrightarrow>\<^sub>a OrR2 <a'>.([(a',a)]\<bullet>M') b" using fs1 red
  4640     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4461     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4641   also have "\<dots> = OrR2 <a>.M' b" 
  4462   also have "\<dots> = OrR2 <a>.M' b" 
  4642     using fs1 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4463     using fs1 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4643   finally show ?thesis by simp
  4464   finally show ?thesis by simp
  4644 qed
  4465 qed
  4645 
  4466 
  4646 lemma better_ImpLL_intro[intro]:
  4467 lemma better_ImpLL_intro[intro]:
  4647   shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> ImpL <a>.M (x).N y \<longrightarrow>\<^sub>a ImpL <a>.M' (x).N y"
  4468   shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> ImpL <a>.M (x).N y \<longrightarrow>\<^sub>a ImpL <a>.M' (x).N y"
  4648 proof -
  4469 proof -
  4649   assume red: "M\<longrightarrow>\<^sub>a M'"
  4470   assume red: "M\<longrightarrow>\<^sub>a M'"
  4650   obtain x'::"name"   where fs1: "x'\<sharp>(M,N,x,y)" by (rule exists_fresh(1), rule fin_supp, blast)
  4471   obtain x'::"name"   where fs1: "x'\<sharp>(M,N,x,y)" by (rule exists_fresh(1), rule fin_supp, blast)
  4651   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast)
  4472   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast)
  4652   have "ImpL <a>.M (x).N y =  ImpL <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N) y"
  4473   have "ImpL <a>.M (x).N y =  ImpL <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N) y"
  4653     using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4474     using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4654   also have "\<dots> \<longrightarrow>\<^sub>a  ImpL <a'>.([(a',a)]\<bullet>M') (x').([(x',x)]\<bullet>N) y" using fs1 fs2 red
  4475   also have "\<dots> \<longrightarrow>\<^sub>a  ImpL <a'>.([(a',a)]\<bullet>M') (x').([(x',x)]\<bullet>N) y" using fs1 fs2 red
  4655     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4476     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4656   also have "\<dots> = ImpL <a>.M' (x).N y" 
  4477   also have "\<dots> = ImpL <a>.M' (x).N y" 
  4657     using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4478     using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4658   finally show ?thesis by simp
  4479   finally show ?thesis by simp
  4659 qed
  4480 qed
  4660 
  4481 
  4661 lemma better_ImpLR_intro[intro]:
  4482 lemma better_ImpLR_intro[intro]:
  4662   shows "N\<longrightarrow>\<^sub>a N' \<Longrightarrow> ImpL <a>.M (x).N y \<longrightarrow>\<^sub>a ImpL <a>.M (x).N' y"
  4483   shows "N\<longrightarrow>\<^sub>a N' \<Longrightarrow> ImpL <a>.M (x).N y \<longrightarrow>\<^sub>a ImpL <a>.M (x).N' y"
  4663 proof -
  4484 proof -
  4664   assume red: "N\<longrightarrow>\<^sub>a N'"
  4485   assume red: "N\<longrightarrow>\<^sub>a N'"
  4665   obtain x'::"name"   where fs1: "x'\<sharp>(M,N,x,y)" by (rule exists_fresh(1), rule fin_supp, blast)
  4486   obtain x'::"name"   where fs1: "x'\<sharp>(M,N,x,y)" by (rule exists_fresh(1), rule fin_supp, blast)
  4666   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast)
  4487   obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast)
  4667   have "ImpL <a>.M (x).N y =  ImpL <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N) y"
  4488   have "ImpL <a>.M (x).N y =  ImpL <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N) y"
  4668     using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4489     using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4669   also have "\<dots> \<longrightarrow>\<^sub>a  ImpL <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N') y" using fs1 fs2 red
  4490   also have "\<dots> \<longrightarrow>\<^sub>a  ImpL <a'>.([(a',a)]\<bullet>M) (x').([(x',x)]\<bullet>N') y" using fs1 fs2 red
  4670     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4491     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4671   also have "\<dots> = ImpL <a>.M (x).N' y" 
  4492   also have "\<dots> = ImpL <a>.M (x).N' y" 
  4672     using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4493     using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4673   finally show ?thesis by simp
  4494   finally show ?thesis by simp
  4674 qed
  4495 qed
  4675 
  4496 
  4676 lemma better_ImpR_intro[intro]:
  4497 lemma better_ImpR_intro[intro]:
  4677   shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> ImpR (x).<a>.M b \<longrightarrow>\<^sub>a ImpR (x).<a>.M' b"
  4498   shows "M\<longrightarrow>\<^sub>a M' \<Longrightarrow> ImpR (x).<a>.M b \<longrightarrow>\<^sub>a ImpR (x).<a>.M' b"
  4678 proof -
  4499 proof -
  4679   assume red: "M\<longrightarrow>\<^sub>a M'"
  4500   assume red: "M\<longrightarrow>\<^sub>a M'"
  4680   obtain a'::"coname" where fs2: "a'\<sharp>(M,a,b)" by (rule exists_fresh(2), rule fin_supp, blast)
  4501   obtain a'::"coname" where fs2: "a'\<sharp>(M,a,b)" by (rule exists_fresh(2), rule fin_supp, blast)
  4681   have "ImpR (x).<a>.M b = ImpR (x).<a'>.([(a',a)]\<bullet>M) b"
  4502   have "ImpR (x).<a>.M b = ImpR (x).<a'>.([(a',a)]\<bullet>M) b"
  4682     using fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4503     using fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm)
  4683   also have "\<dots> \<longrightarrow>\<^sub>a ImpR (x).<a'>.([(a',a)]\<bullet>M') b" using fs2 red
  4504   also have "\<dots> \<longrightarrow>\<^sub>a ImpR (x).<a'>.([(a',a)]\<bullet>M') b" using fs2 red
  4684     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4505     by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod)
  4685   also have "\<dots> = ImpR (x).<a>.M' b" 
  4506   also have "\<dots> = ImpR (x).<a>.M' b" 
  4686     using fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4507     using fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu)
  4687   finally show ?thesis by simp
  4508   finally show ?thesis by simp
  4688 qed
  4509 qed
  4689 
  4510 
  4690 text \<open>axioms do not reduce\<close>
  4511 text \<open>axioms do not reduce\<close>
  4691 
  4512 
  4698 by (erule_tac c_redu.cases) (simp_all add: trm.inject)
  4519 by (erule_tac c_redu.cases) (simp_all add: trm.inject)
  4699 
  4520 
  4700 lemma ax_do_not_a_reduce:
  4521 lemma ax_do_not_a_reduce:
  4701   shows "Ax x a \<longrightarrow>\<^sub>a M \<Longrightarrow> False"
  4522   shows "Ax x a \<longrightarrow>\<^sub>a M \<Longrightarrow> False"
  4702 apply(erule_tac a_redu.cases) 
  4523 apply(erule_tac a_redu.cases) 
  4703 apply(auto simp add: trm.inject)
  4524 apply(auto simp: trm.inject)
  4704 apply(drule ax_do_not_l_reduce)
  4525 apply(drule ax_do_not_l_reduce)
  4705 apply(simp)
  4526 apply(simp)
  4706 apply(drule ax_do_not_c_reduce)
  4527 apply(drule ax_do_not_c_reduce)
  4707 apply(simp)
  4528 apply(simp)
  4708 done
  4529 done
  4717 apply(auto)
  4538 apply(auto)
  4718 apply(rotate_tac 2)
  4539 apply(rotate_tac 2)
  4719 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4540 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4720 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4541 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4721 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4542 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4722 apply(auto simp add: alpha a_redu.eqvt)
  4543 apply(auto simp: alpha a_redu.eqvt)
  4723 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  4544 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  4724 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4545 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4725 apply(simp add: perm_swap)
  4546 apply(simp add: perm_swap)
  4726 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4547 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4727 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4548 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4728 apply(simp add: perm_swap)
  4549 apply(simp add: perm_swap)
  4729 done
  4550 done
  4730 
  4551 
  4731 lemma a_redu_NotR_elim:
  4552 lemma a_redu_NotR_elim:
  4732   assumes a: "NotR (x).M a \<longrightarrow>\<^sub>a R"
  4553   assumes a: "NotR (x).M a \<longrightarrow>\<^sub>a R"
  4738 apply(auto)
  4559 apply(auto)
  4739 apply(rotate_tac 2)
  4560 apply(rotate_tac 2)
  4740 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4561 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4741 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4562 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4742 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4563 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4743 apply(auto simp add: alpha a_redu.eqvt)
  4564 apply(auto simp: alpha a_redu.eqvt)
  4744 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI)
  4565 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI)
  4745 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4566 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4746 apply(simp add: perm_swap)
  4567 apply(simp add: perm_swap)
  4747 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  4568 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  4748 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4569 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4749 apply(simp add: perm_swap)
  4570 apply(simp add: perm_swap)
  4750 done
  4571 done
  4751 
  4572 
  4752 lemma a_redu_AndR_elim:
  4573 lemma a_redu_AndR_elim:
  4753   assumes a: "AndR <a>.M <b>.N c\<longrightarrow>\<^sub>a R"
  4574   assumes a: "AndR <a>.M <b>.N c\<longrightarrow>\<^sub>a R"
  4759 apply(rotate_tac 6)
  4580 apply(rotate_tac 6)
  4760 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4581 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4761 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4582 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4762 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4583 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4763 apply(rule disjI1)
  4584 apply(rule disjI1)
  4764 apply(auto simp add: alpha a_redu.eqvt)[1]
  4585 apply(auto simp: alpha a_redu.eqvt)[1]
  4765 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) 
  4586 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) 
  4766 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4587 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4767 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  4588 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  4768 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4589 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4769 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  4590 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  4770 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4591 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4771 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  4592 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  4772 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4593 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4773 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4594 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4774 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4595 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4775 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4596 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4776 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4597 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4777 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4598 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4778 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4599 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4779 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4600 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4780 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4601 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4781 apply(rule disjI2)
  4602 apply(rule disjI2)
  4782 apply(auto simp add: alpha a_redu.eqvt)[1]
  4603 apply(auto simp: alpha a_redu.eqvt)[1]
  4783 apply(rule_tac x="([(b,ba)]\<bullet>N')" in exI) 
  4604 apply(rule_tac x="([(b,ba)]\<bullet>N')" in exI) 
  4784 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4605 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4785 apply(rule_tac x="([(b,baa)]\<bullet>N')" in exI)
  4606 apply(rule_tac x="([(b,baa)]\<bullet>N')" in exI)
  4786 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4607 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4787 apply(rule_tac x="([(b,ba)]\<bullet>N')" in exI)
  4608 apply(rule_tac x="([(b,ba)]\<bullet>N')" in exI)
  4788 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4609 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4789 apply(rule_tac x="([(b,baa)]\<bullet>N')" in exI)
  4610 apply(rule_tac x="([(b,baa)]\<bullet>N')" in exI)
  4790 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4611 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4791 apply(rule_tac x="([(b,ba)]\<bullet>N')" in exI)
  4612 apply(rule_tac x="([(b,ba)]\<bullet>N')" in exI)
  4792 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4613 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4793 apply(rule_tac x="([(b,baa)]\<bullet>N')" in exI)
  4614 apply(rule_tac x="([(b,baa)]\<bullet>N')" in exI)
  4794 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4615 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4795 apply(rule_tac x="([(b,ba)]\<bullet>N')" in exI)
  4616 apply(rule_tac x="([(b,ba)]\<bullet>N')" in exI)
  4796 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4617 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4797 apply(rule_tac x="([(b,baa)]\<bullet>N')" in exI)
  4618 apply(rule_tac x="([(b,baa)]\<bullet>N')" in exI)
  4798 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4619 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4799 apply(rotate_tac 6)
  4620 apply(rotate_tac 6)
  4800 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4621 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4801 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4622 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4802 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4623 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4803 apply(rule disjI1)
  4624 apply(rule disjI1)
  4804 apply(auto simp add: alpha a_redu.eqvt)[1]
  4625 apply(auto simp: alpha a_redu.eqvt)[1]
  4805 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) 
  4626 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) 
  4806 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4627 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4807 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI)
  4628 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI)
  4808 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4629 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4809 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI)
  4630 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI)
  4810 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4631 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4811 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI)
  4632 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI)
  4812 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4633 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4813 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI)
  4634 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI)
  4814 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4635 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4815 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI)
  4636 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI)
  4816 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4637 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4817 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI)
  4638 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI)
  4818 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4639 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4819 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI)
  4640 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI)
  4820 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4641 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4821 apply(rule disjI2)
  4642 apply(rule disjI2)
  4822 apply(auto simp add: alpha a_redu.eqvt)[1]
  4643 apply(auto simp: alpha a_redu.eqvt)[1]
  4823 apply(rule_tac x="([(b,ba)]\<bullet>N'a)" in exI) 
  4644 apply(rule_tac x="([(b,ba)]\<bullet>N'a)" in exI) 
  4824 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4645 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4825 apply(rule_tac x="([(b,ba)]\<bullet>N'a)" in exI)
  4646 apply(rule_tac x="([(b,ba)]\<bullet>N'a)" in exI)
  4826 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4647 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4827 apply(rule_tac x="([(b,ba)]\<bullet>N'a)" in exI)
  4648 apply(rule_tac x="([(b,ba)]\<bullet>N'a)" in exI)
  4828 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4649 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4829 apply(rule_tac x="([(b,ba)]\<bullet>N'a)" in exI)
  4650 apply(rule_tac x="([(b,ba)]\<bullet>N'a)" in exI)
  4830 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4651 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4831 apply(rule_tac x="([(b,baa)]\<bullet>N'a)" in exI)
  4652 apply(rule_tac x="([(b,baa)]\<bullet>N'a)" in exI)
  4832 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4653 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4833 apply(rule_tac x="([(b,baa)]\<bullet>N'a)" in exI)
  4654 apply(rule_tac x="([(b,baa)]\<bullet>N'a)" in exI)
  4834 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4655 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4835 apply(rule_tac x="([(b,baa)]\<bullet>N'a)" in exI)
  4656 apply(rule_tac x="([(b,baa)]\<bullet>N'a)" in exI)
  4836 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4657 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4837 apply(rule_tac x="([(b,baa)]\<bullet>N'a)" in exI)
  4658 apply(rule_tac x="([(b,baa)]\<bullet>N'a)" in exI)
  4838 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4659 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4839 done
  4660 done
  4840 
  4661 
  4841 lemma a_redu_AndL1_elim:
  4662 lemma a_redu_AndL1_elim:
  4842   assumes a: "AndL1 (x).M y \<longrightarrow>\<^sub>a R"
  4663   assumes a: "AndL1 (x).M y \<longrightarrow>\<^sub>a R"
  4843   shows "\<exists>M'. R = AndL1 (x).M' y \<and> M\<longrightarrow>\<^sub>aM'"
  4664   shows "\<exists>M'. R = AndL1 (x).M' y \<and> M\<longrightarrow>\<^sub>aM'"
  4848 apply(auto)
  4669 apply(auto)
  4849 apply(rotate_tac 3)
  4670 apply(rotate_tac 3)
  4850 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4671 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4851 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4672 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4852 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4673 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4853 apply(auto simp add: alpha a_redu.eqvt)
  4674 apply(auto simp: alpha a_redu.eqvt)
  4854 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI)
  4675 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI)
  4855 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4676 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4856 apply(simp add: perm_swap)
  4677 apply(simp add: perm_swap)
  4857 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  4678 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  4858 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4679 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4859 apply(simp add: perm_swap)
  4680 apply(simp add: perm_swap)
  4860 done
  4681 done
  4861 
  4682 
  4862 lemma a_redu_AndL2_elim:
  4683 lemma a_redu_AndL2_elim:
  4863   assumes a: "AndL2 (x).M y \<longrightarrow>\<^sub>a R"
  4684   assumes a: "AndL2 (x).M y \<longrightarrow>\<^sub>a R"
  4869 apply(auto)
  4690 apply(auto)
  4870 apply(rotate_tac 3)
  4691 apply(rotate_tac 3)
  4871 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4692 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4872 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4693 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4873 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4694 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4874 apply(auto simp add: alpha a_redu.eqvt)
  4695 apply(auto simp: alpha a_redu.eqvt)
  4875 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI)
  4696 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI)
  4876 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4697 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4877 apply(simp add: perm_swap)
  4698 apply(simp add: perm_swap)
  4878 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  4699 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  4879 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4700 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4880 apply(simp add: perm_swap)
  4701 apply(simp add: perm_swap)
  4881 done
  4702 done
  4882 
  4703 
  4883 lemma a_redu_OrL_elim:
  4704 lemma a_redu_OrL_elim:
  4884   assumes a: "OrL (x).M (y).N z\<longrightarrow>\<^sub>a R"
  4705   assumes a: "OrL (x).M (y).N z\<longrightarrow>\<^sub>a R"
  4890 apply(rotate_tac 6)
  4711 apply(rotate_tac 6)
  4891 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4712 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4892 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4713 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4893 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4714 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4894 apply(rule disjI1)
  4715 apply(rule disjI1)
  4895 apply(auto simp add: alpha a_redu.eqvt)[1]
  4716 apply(auto simp: alpha a_redu.eqvt)[1]
  4896 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) 
  4717 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI) 
  4897 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4718 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4898 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI)
  4719 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI)
  4899 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4720 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4900 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI)
  4721 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI)
  4901 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4722 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4902 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI)
  4723 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI)
  4903 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4724 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4904 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  4725 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  4905 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4726 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4906 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  4727 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  4907 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4728 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4908 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  4729 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  4909 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4730 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4910 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  4731 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  4911 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4732 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4912 apply(rule disjI2)
  4733 apply(rule disjI2)
  4913 apply(auto simp add: alpha a_redu.eqvt)[1]
  4734 apply(auto simp: alpha a_redu.eqvt)[1]
  4914 apply(rule_tac x="([(y,ya)]\<bullet>N')" in exI) 
  4735 apply(rule_tac x="([(y,ya)]\<bullet>N')" in exI) 
  4915 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4736 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4916 apply(rule_tac x="([(y,yaa)]\<bullet>N')" in exI)
  4737 apply(rule_tac x="([(y,yaa)]\<bullet>N')" in exI)
  4917 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4738 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4918 apply(rule_tac x="([(y,ya)]\<bullet>N')" in exI)
  4739 apply(rule_tac x="([(y,ya)]\<bullet>N')" in exI)
  4919 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4740 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4920 apply(rule_tac x="([(y,yaa)]\<bullet>N')" in exI)
  4741 apply(rule_tac x="([(y,yaa)]\<bullet>N')" in exI)
  4921 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4742 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4922 apply(rule_tac x="([(y,ya)]\<bullet>N')" in exI)
  4743 apply(rule_tac x="([(y,ya)]\<bullet>N')" in exI)
  4923 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4744 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4924 apply(rule_tac x="([(y,yaa)]\<bullet>N')" in exI)
  4745 apply(rule_tac x="([(y,yaa)]\<bullet>N')" in exI)
  4925 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4746 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4926 apply(rule_tac x="([(y,ya)]\<bullet>N')" in exI)
  4747 apply(rule_tac x="([(y,ya)]\<bullet>N')" in exI)
  4927 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4748 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4928 apply(rule_tac x="([(y,yaa)]\<bullet>N')" in exI)
  4749 apply(rule_tac x="([(y,yaa)]\<bullet>N')" in exI)
  4929 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4750 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4930 apply(rotate_tac 6)
  4751 apply(rotate_tac 6)
  4931 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4752 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4932 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4753 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4933 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4754 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4934 apply(rule disjI1)
  4755 apply(rule disjI1)
  4935 apply(auto simp add: alpha a_redu.eqvt)[1]
  4756 apply(auto simp: alpha a_redu.eqvt)[1]
  4936 apply(rule_tac x="([(x,xa)]\<bullet>M')" in exI) 
  4757 apply(rule_tac x="([(x,xa)]\<bullet>M')" in exI) 
  4937 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4758 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4938 apply(rule_tac x="([(x,xa)]\<bullet>M')" in exI)
  4759 apply(rule_tac x="([(x,xa)]\<bullet>M')" in exI)
  4939 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4760 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4940 apply(rule_tac x="([(x,xa)]\<bullet>M')" in exI)
  4761 apply(rule_tac x="([(x,xa)]\<bullet>M')" in exI)
  4941 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4762 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4942 apply(rule_tac x="([(x,xa)]\<bullet>M')" in exI)
  4763 apply(rule_tac x="([(x,xa)]\<bullet>M')" in exI)
  4943 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4764 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4944 apply(rule_tac x="([(x,xaa)]\<bullet>M')" in exI)
  4765 apply(rule_tac x="([(x,xaa)]\<bullet>M')" in exI)
  4945 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4766 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4946 apply(rule_tac x="([(x,xaa)]\<bullet>M')" in exI)
  4767 apply(rule_tac x="([(x,xaa)]\<bullet>M')" in exI)
  4947 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4768 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4948 apply(rule_tac x="([(x,xaa)]\<bullet>M')" in exI)
  4769 apply(rule_tac x="([(x,xaa)]\<bullet>M')" in exI)
  4949 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4770 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4950 apply(rule_tac x="([(x,xaa)]\<bullet>M')" in exI)
  4771 apply(rule_tac x="([(x,xaa)]\<bullet>M')" in exI)
  4951 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4772 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4952 apply(rule disjI2)
  4773 apply(rule disjI2)
  4953 apply(auto simp add: alpha a_redu.eqvt)[1]
  4774 apply(auto simp: alpha a_redu.eqvt)[1]
  4954 apply(rule_tac x="([(y,ya)]\<bullet>N'a)" in exI) 
  4775 apply(rule_tac x="([(y,ya)]\<bullet>N'a)" in exI) 
  4955 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4776 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4956 apply(rule_tac x="([(y,ya)]\<bullet>N'a)" in exI)
  4777 apply(rule_tac x="([(y,ya)]\<bullet>N'a)" in exI)
  4957 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4778 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4958 apply(rule_tac x="([(y,ya)]\<bullet>N'a)" in exI)
  4779 apply(rule_tac x="([(y,ya)]\<bullet>N'a)" in exI)
  4959 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4780 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4960 apply(rule_tac x="([(y,ya)]\<bullet>N'a)" in exI)
  4781 apply(rule_tac x="([(y,ya)]\<bullet>N'a)" in exI)
  4961 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4782 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4962 apply(rule_tac x="([(y,yaa)]\<bullet>N'a)" in exI)
  4783 apply(rule_tac x="([(y,yaa)]\<bullet>N'a)" in exI)
  4963 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4784 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4964 apply(rule_tac x="([(y,yaa)]\<bullet>N'a)" in exI)
  4785 apply(rule_tac x="([(y,yaa)]\<bullet>N'a)" in exI)
  4965 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4786 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4966 apply(rule_tac x="([(y,yaa)]\<bullet>N'a)" in exI)
  4787 apply(rule_tac x="([(y,yaa)]\<bullet>N'a)" in exI)
  4967 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4788 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4968 apply(rule_tac x="([(y,yaa)]\<bullet>N'a)" in exI)
  4789 apply(rule_tac x="([(y,yaa)]\<bullet>N'a)" in exI)
  4969 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4790 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4970 done
  4791 done
  4971 
  4792 
  4972 lemma a_redu_OrR1_elim:
  4793 lemma a_redu_OrR1_elim:
  4973   assumes a: "OrR1 <a>.M b \<longrightarrow>\<^sub>a R"
  4794   assumes a: "OrR1 <a>.M b \<longrightarrow>\<^sub>a R"
  4974   shows "\<exists>M'. R = OrR1 <a>.M' b \<and> M\<longrightarrow>\<^sub>aM'"
  4795   shows "\<exists>M'. R = OrR1 <a>.M' b \<and> M\<longrightarrow>\<^sub>aM'"
  4979 apply(auto)
  4800 apply(auto)
  4980 apply(rotate_tac 3)
  4801 apply(rotate_tac 3)
  4981 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4802 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4982 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4803 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4983 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4804 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4984 apply(auto simp add: alpha a_redu.eqvt)
  4805 apply(auto simp: alpha a_redu.eqvt)
  4985 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  4806 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  4986 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4807 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4987 apply(simp add: perm_swap)
  4808 apply(simp add: perm_swap)
  4988 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4809 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4989 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4810 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4990 apply(simp add: perm_swap)
  4811 apply(simp add: perm_swap)
  4991 done
  4812 done
  4992 
  4813 
  4993 lemma a_redu_OrR2_elim:
  4814 lemma a_redu_OrR2_elim:
  4994   assumes a: "OrR2 <a>.M b \<longrightarrow>\<^sub>a R"
  4815   assumes a: "OrR2 <a>.M b \<longrightarrow>\<^sub>a R"
  5000 apply(auto)
  4821 apply(auto)
  5001 apply(rotate_tac 3)
  4822 apply(rotate_tac 3)
  5002 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4823 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  5003 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4824 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  5004 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4825 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  5005 apply(auto simp add: alpha a_redu.eqvt)
  4826 apply(auto simp: alpha a_redu.eqvt)
  5006 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  4827 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  5007 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4828 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  5008 apply(simp add: perm_swap)
  4829 apply(simp add: perm_swap)
  5009 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4830 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  5010 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  4831 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)
  5011 apply(simp add: perm_swap)
  4832 apply(simp add: perm_swap)
  5012 done
  4833 done
  5013 
  4834 
  5014 lemma a_redu_ImpL_elim:
  4835 lemma a_redu_ImpL_elim:
  5015   assumes a: "ImpL <a>.M (y).N z\<longrightarrow>\<^sub>a R"
  4836   assumes a: "ImpL <a>.M (y).N z\<longrightarrow>\<^sub>a R"
  5021 apply(rotate_tac 5)
  4842 apply(rotate_tac 5)
  5022 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4843 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  5023 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4844 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  5024 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4845 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  5025 apply(rule disjI1)
  4846 apply(rule disjI1)
  5026 apply(auto simp add: alpha a_redu.eqvt)[1]
  4847 apply(auto simp: alpha a_redu.eqvt)[1]
  5027 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) 
  4848 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI) 
  5028 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4849 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5029 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  4850 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  5030 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4851 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5031 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  4852 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  5032 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4853 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5033 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  4854 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  5034 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4855 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5035 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4856 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  5036 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4857 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5037 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4858 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  5038 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4859 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5039 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4860 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  5040 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4861 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5041 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4862 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  5042 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4863 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5043 apply(rule disjI2)
  4864 apply(rule disjI2)
  5044 apply(auto simp add: alpha a_redu.eqvt)[1]
  4865 apply(auto simp: alpha a_redu.eqvt)[1]
  5045 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) 
  4866 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI) 
  5046 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4867 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5047 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI)
  4868 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI)
  5048 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4869 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5049 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI)
  4870 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI)
  5050 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4871 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5051 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI)
  4872 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI)
  5052 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4873 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5053 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI)
  4874 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI)
  5054 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4875 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5055 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI)
  4876 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI)
  5056 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4877 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5057 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI)
  4878 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI)
  5058 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4879 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5059 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI)
  4880 apply(rule_tac x="([(y,xa)]\<bullet>N')" in exI)
  5060 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4881 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5061 apply(rotate_tac 5)
  4882 apply(rotate_tac 5)
  5062 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4883 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  5063 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4884 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  5064 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4885 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  5065 apply(rule disjI1)
  4886 apply(rule disjI1)
  5066 apply(auto simp add: alpha a_redu.eqvt)[1]
  4887 apply(auto simp: alpha a_redu.eqvt)[1]
  5067 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) 
  4888 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI) 
  5068 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4889 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5069 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI)
  4890 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI)
  5070 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4891 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5071 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI)
  4892 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI)
  5072 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4893 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5073 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI)
  4894 apply(rule_tac x="([(a,aa)]\<bullet>M')" in exI)
  5074 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4895 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5075 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI)
  4896 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI)
  5076 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4897 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5077 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI)
  4898 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI)
  5078 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4899 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5079 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI)
  4900 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI)
  5080 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4901 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5081 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI)
  4902 apply(rule_tac x="([(a,aaa)]\<bullet>M')" in exI)
  5082 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4903 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5083 apply(rule disjI2)
  4904 apply(rule disjI2)
  5084 apply(auto simp add: alpha a_redu.eqvt)[1]
  4905 apply(auto simp: alpha a_redu.eqvt)[1]
  5085 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) 
  4906 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI) 
  5086 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4907 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5087 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI)
  4908 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI)
  5088 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4909 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5089 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI)
  4910 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI)
  5090 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4911 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5091 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI)
  4912 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI)
  5092 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4913 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5093 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI)
  4914 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI)
  5094 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4915 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5095 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI)
  4916 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI)
  5096 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4917 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5097 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI)
  4918 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI)
  5098 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4919 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5099 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI)
  4920 apply(rule_tac x="([(y,xa)]\<bullet>N'a)" in exI)
  5100 apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  4921 apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1]
  5101 done
  4922 done
  5102 
  4923 
  5103 lemma a_redu_ImpR_elim:
  4924 lemma a_redu_ImpR_elim:
  5104   assumes a: "ImpR (x).<a>.M b \<longrightarrow>\<^sub>a R"
  4925   assumes a: "ImpR (x).<a>.M b \<longrightarrow>\<^sub>a R"
  5105   shows "\<exists>M'. R = ImpR (x).<a>.M' b \<and> M\<longrightarrow>\<^sub>aM'"
  4926   shows "\<exists>M'. R = ImpR (x).<a>.M' b \<and> M\<longrightarrow>\<^sub>aM'"
  5110 apply(auto)
  4931 apply(auto)
  5111 apply(rotate_tac 3)
  4932 apply(rotate_tac 3)
  5112 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  4933 apply(erule_tac a_redu.cases, simp_all add: trm.inject)
  5113 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  4934 apply(erule_tac l_redu.cases, simp_all add: trm.inject)
  5114 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  4935 apply(erule_tac c_redu.cases, simp_all add: trm.inject)
  5115 apply(auto simp add: alpha a_redu.eqvt abs_perm abs_fresh)
  4936 apply(auto simp: alpha a_redu.eqvt abs_perm abs_fresh)
  5116 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  4937 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  5117 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  4938 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  5118 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4939 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  5119 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  4940 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  5120 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  4941 apply(rule_tac x="([(a,aa)]\<bullet>M'a)" in exI)
  5121 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  4942 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  5122 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  4943 apply(rule_tac x="([(a,aaa)]\<bullet>M'a)" in exI)
  5123 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  4944 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  5124 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI)
  4945 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI)
  5125 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  4946 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  5126 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI)
  4947 apply(rule_tac x="([(x,xa)]\<bullet>M'a)" in exI)
  5127 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  4948 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  5128 apply(rule_tac x="([(a,aa)]\<bullet>[(x,xa)]\<bullet>M'a)" in exI)
  4949 apply(rule_tac x="([(a,aa)]\<bullet>[(x,xa)]\<bullet>M'a)" in exI)
  5129 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  4950 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  5130 apply(rule sym)
  4951 apply(rule sym)
  5131 apply(rule trans)
  4952 apply(rule trans)
  5132 apply(rule perm_compose)
  4953 apply(rule perm_compose)
  5133 apply(simp add: calc_atm perm_swap)
  4954 apply(simp add: calc_atm perm_swap)
  5134 apply(rule_tac x="([(a,aaa)]\<bullet>[(x,xa)]\<bullet>M'a)" in exI)
  4955 apply(rule_tac x="([(a,aaa)]\<bullet>[(x,xa)]\<bullet>M'a)" in exI)
  5135 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  4956 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  5136 apply(rule sym)
  4957 apply(rule sym)
  5137 apply(rule trans)
  4958 apply(rule trans)
  5138 apply(rule perm_compose)
  4959 apply(rule perm_compose)
  5139 apply(simp add: calc_atm perm_swap)
  4960 apply(simp add: calc_atm perm_swap)
  5140 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  4961 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  5141 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  4962 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  5142 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  4963 apply(rule_tac x="([(x,xaa)]\<bullet>M'a)" in exI)
  5143 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  4964 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  5144 apply(rule_tac x="([(a,aa)]\<bullet>[(x,xaa)]\<bullet>M'a)" in exI)
  4965 apply(rule_tac x="([(a,aa)]\<bullet>[(x,xaa)]\<bullet>M'a)" in exI)
  5145 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  4966 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  5146 apply(rule sym)
  4967 apply(rule sym)
  5147 apply(rule trans)
  4968 apply(rule trans)
  5148 apply(rule perm_compose)
  4969 apply(rule perm_compose)
  5149 apply(simp add: calc_atm perm_swap)
  4970 apply(simp add: calc_atm perm_swap)
  5150 apply(rule_tac x="([(a,aaa)]\<bullet>[(x,xaa)]\<bullet>M'a)" in exI)
  4971 apply(rule_tac x="([(a,aaa)]\<bullet>[(x,xaa)]\<bullet>M'a)" in exI)
  5151 apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  4972 apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap)
  5152 apply(rule sym)
  4973 apply(rule sym)
  5153 apply(rule trans)
  4974 apply(rule trans)
  5154 apply(rule perm_compose)
  4975 apply(rule perm_compose)
  5155 apply(simp add: calc_atm perm_swap)
  4976 apply(simp add: calc_atm perm_swap)
  5156 done
  4977 done
  5299   shows "(\<exists>M' N'. R = AndR <a>.M' <b>.N' c \<and> M \<longrightarrow>\<^sub>a* M' \<and> N \<longrightarrow>\<^sub>a* N')"
  5120   shows "(\<exists>M' N'. R = AndR <a>.M' <b>.N' c \<and> M \<longrightarrow>\<^sub>a* M' \<and> N \<longrightarrow>\<^sub>a* N')"
  5300 using a
  5121 using a
  5301 apply(induct set: rtranclp)
  5122 apply(induct set: rtranclp)
  5302 apply(auto)
  5123 apply(auto)
  5303 apply(drule a_redu_AndR_elim)
  5124 apply(drule a_redu_AndR_elim)
  5304 apply(auto simp add: alpha trm.inject)
  5125 apply(auto simp: alpha trm.inject)
  5305 done
  5126 done
  5306 
  5127 
  5307 lemma a_star_redu_AndL1_elim:
  5128 lemma a_star_redu_AndL1_elim:
  5308   assumes a: "AndL1 (x).M y \<longrightarrow>\<^sub>a* R"
  5129   assumes a: "AndL1 (x).M y \<longrightarrow>\<^sub>a* R"
  5309   shows "\<exists>M'. R = AndL1 (x).M' y \<and> M \<longrightarrow>\<^sub>a* M'"
  5130   shows "\<exists>M'. R = AndL1 (x).M' y \<and> M \<longrightarrow>\<^sub>a* M'"
  5310 using a
  5131 using a
  5311 apply(induct set: rtranclp)
  5132 apply(induct set: rtranclp)
  5312 apply(auto)
  5133 apply(auto)
  5313 apply(drule a_redu_AndL1_elim)
  5134 apply(drule a_redu_AndL1_elim)
  5314 apply(auto simp add: alpha trm.inject)
  5135 apply(auto simp: alpha trm.inject)
  5315 done
  5136 done
  5316 
  5137 
  5317 lemma a_star_redu_AndL2_elim:
  5138 lemma a_star_redu_AndL2_elim:
  5318   assumes a: "AndL2 (x).M y \<longrightarrow>\<^sub>a* R"
  5139   assumes a: "AndL2 (x).M y \<longrightarrow>\<^sub>a* R"
  5319   shows "\<exists>M'. R = AndL2 (x).M' y \<and> M \<longrightarrow>\<^sub>a* M'"
  5140   shows "\<exists>M'. R = AndL2 (x).M' y \<and> M \<longrightarrow>\<^sub>a* M'"
  5320 using a
  5141 using a
  5321 apply(induct set: rtranclp)
  5142 apply(induct set: rtranclp)
  5322 apply(auto)
  5143 apply(auto)
  5323 apply(drule a_redu_AndL2_elim)
  5144 apply(drule a_redu_AndL2_elim)
  5324 apply(auto simp add: alpha trm.inject)
  5145 apply(auto simp: alpha trm.inject)
  5325 done
  5146 done
  5326 
  5147 
  5327 lemma a_star_redu_OrL_elim:
  5148 lemma a_star_redu_OrL_elim:
  5328   assumes a: "OrL (x).M (y).N z \<longrightarrow>\<^sub>a* R"
  5149   assumes a: "OrL (x).M (y).N z \<longrightarrow>\<^sub>a* R"
  5329   shows "(\<exists>M' N'. R = OrL (x).M' (y).N' z \<and> M \<longrightarrow>\<^sub>a* M' \<and> N \<longrightarrow>\<^sub>a* N')"
  5150   shows "(\<exists>M' N'. R = OrL (x).M' (y).N' z \<and> M \<longrightarrow>\<^sub>a* M' \<and> N \<longrightarrow>\<^sub>a* N')"
  5330 using a
  5151 using a
  5331 apply(induct set: rtranclp)
  5152 apply(induct set: rtranclp)
  5332 apply(auto)
  5153 apply(auto)
  5333 apply(drule a_redu_OrL_elim)
  5154 apply(drule a_redu_OrL_elim)
  5334 apply(auto simp add: alpha trm.inject)
  5155 apply(auto simp: alpha trm.inject)
  5335 done
  5156 done
  5336 
  5157 
  5337 lemma a_star_redu_OrR1_elim:
  5158 lemma a_star_redu_OrR1_elim:
  5338   assumes a: "OrR1 <a>.M y \<longrightarrow>\<^sub>a* R"
  5159   assumes a: "OrR1 <a>.M y \<longrightarrow>\<^sub>a* R"
  5339   shows "\<exists>M'. R = OrR1 <a>.M' y \<and> M \<longrightarrow>\<^sub>a* M'"
  5160   shows "\<exists>M'. R = OrR1 <a>.M' y \<and> M \<longrightarrow>\<^sub>a* M'"
  5340 using a
  5161 using a
  5341 apply(induct set: rtranclp)
  5162 apply(induct set: rtranclp)
  5342 apply(auto)
  5163 apply(auto)
  5343 apply(drule a_redu_OrR1_elim)
  5164 apply(drule a_redu_OrR1_elim)
  5344 apply(auto simp add: alpha trm.inject)
  5165 apply(auto simp: alpha trm.inject)
  5345 done
  5166 done
  5346 
  5167 
  5347 lemma a_star_redu_OrR2_elim:
  5168 lemma a_star_redu_OrR2_elim:
  5348   assumes a: "OrR2 <a>.M y \<longrightarrow>\<^sub>a* R"
  5169   assumes a: "OrR2 <a>.M y \<longrightarrow>\<^sub>a* R"
  5349   shows "\<exists>M'. R = OrR2 <a>.M' y \<and> M \<longrightarrow>\<^sub>a* M'"
  5170   shows "\<exists>M'. R = OrR2 <a>.M' y \<and> M \<longrightarrow>\<^sub>a* M'"
  5350 using a
  5171 using a
  5351 apply(induct set: rtranclp)
  5172 apply(induct set: rtranclp)
  5352 apply(auto)
  5173 apply(auto)
  5353 apply(drule a_redu_OrR2_elim)
  5174 apply(drule a_redu_OrR2_elim)
  5354 apply(auto simp add: alpha trm.inject)
  5175 apply(auto simp: alpha trm.inject)
  5355 done
  5176 done
  5356 
  5177 
  5357 lemma a_star_redu_ImpR_elim:
  5178 lemma a_star_redu_ImpR_elim:
  5358   assumes a: "ImpR (x).<a>.M y \<longrightarrow>\<^sub>a* R"
  5179   assumes a: "ImpR (x).<a>.M y \<longrightarrow>\<^sub>a* R"
  5359   shows "\<exists>M'. R = ImpR (x).<a>.M' y \<and> M \<longrightarrow>\<^sub>a* M'"
  5180   shows "\<exists>M'. R = ImpR (x).<a>.M' y \<and> M \<longrightarrow>\<^sub>a* M'"
  5360 using a
  5181 using a
  5361 apply(induct set: rtranclp)
  5182 apply(induct set: rtranclp)
  5362 apply(auto)
  5183 apply(auto)
  5363 apply(drule a_redu_ImpR_elim)
  5184 apply(drule a_redu_ImpR_elim)
  5364 apply(auto simp add: alpha trm.inject)
  5185 apply(auto simp: alpha trm.inject)
  5365 done
  5186 done
  5366 
  5187 
  5367 lemma a_star_redu_ImpL_elim:
  5188 lemma a_star_redu_ImpL_elim:
  5368   assumes a: "ImpL <a>.M (y).N z \<longrightarrow>\<^sub>a* R"
  5189   assumes a: "ImpL <a>.M (y).N z \<longrightarrow>\<^sub>a* R"
  5369   shows "(\<exists>M' N'. R = ImpL <a>.M' (y).N' z \<and> M \<longrightarrow>\<^sub>a* M' \<and> N \<longrightarrow>\<^sub>a* N')"
  5190   shows "(\<exists>M' N'. R = ImpL <a>.M' (y).N' z \<and> M \<longrightarrow>\<^sub>a* M' \<and> N \<longrightarrow>\<^sub>a* N')"
  5370 using a
  5191 using a
  5371 apply(induct set: rtranclp)
  5192 apply(induct set: rtranclp)
  5372 apply(auto)
  5193 apply(auto)
  5373 apply(drule a_redu_ImpL_elim)
  5194 apply(drule a_redu_ImpL_elim)
  5374 apply(auto simp add: alpha trm.inject)
  5195 apply(auto simp: alpha trm.inject)
  5375 done
  5196 done
  5376 
  5197 
  5377 text \<open>Substitution\<close>
  5198 text \<open>Substitution\<close>
  5378 
  5199 
  5379 lemma subst_not_fin1:
  5200 lemma subst_not_fin1:
  5699   assumes  a: "fin M x"
  5520   assumes  a: "fin M x"
  5700   and      b: "M \<longrightarrow>\<^sub>a* M'"
  5521   and      b: "M \<longrightarrow>\<^sub>a* M'"
  5701   shows "fin M' x"
  5522   shows "fin M' x"
  5702 using b a
  5523 using b a
  5703 apply(induct set: rtranclp)
  5524 apply(induct set: rtranclp)
  5704 apply(auto simp add: fin_a_reduce)
  5525 apply(auto simp: fin_a_reduce)
  5705 done
  5526 done
  5706 
  5527 
  5707 lemma fic_l_reduce:
  5528 lemma fic_l_reduce:
  5708   assumes  a: "fic M x"
  5529   assumes  a: "fic M x"
  5709   and      b: "M \<longrightarrow>\<^sub>l M'"
  5530   and      b: "M \<longrightarrow>\<^sub>l M'"
  5765   assumes  a: "fic M x"
  5586   assumes  a: "fic M x"
  5766   and      b: "M \<longrightarrow>\<^sub>a* M'"
  5587   and      b: "M \<longrightarrow>\<^sub>a* M'"
  5767   shows "fic M' x"
  5588   shows "fic M' x"
  5768 using b a
  5589 using b a
  5769 apply(induct set: rtranclp)
  5590 apply(induct set: rtranclp)
  5770 apply(auto simp add: fic_a_reduce)
  5591 apply(auto simp: fic_a_reduce)
  5771 done
  5592 done
  5772 
  5593 
  5773 text \<open>substitution properties\<close>
  5594 text \<open>substitution properties\<close>
  5774 
  5595 
  5775 lemma subst_with_ax1:
  5596 lemma subst_with_ax1:
  5880       apply(rule better_LAxL_intro)
  5701       apply(rule better_LAxL_intro)
  5881       apply(rule fin.intros)
  5702       apply(rule fin.intros)
  5882       apply(simp add: abs_fresh)
  5703       apply(simp add: abs_fresh)
  5883       done
  5704       done
  5884     also have "\<dots> = AndL1 (u).(M{x:=<a>.Ax y a}) y" using fs new
  5705     also have "\<dots> = AndL1 (u).(M{x:=<a>.Ax y a}) y" using fs new
  5885       by (auto simp add: fresh_prod fresh_atm nrename_fresh)
  5706       by (auto simp: fresh_prod fresh_atm nrename_fresh)
  5886     also have "\<dots> \<longrightarrow>\<^sub>a* AndL1 (u).(M[x\<turnstile>n>y]) y" using ih by (auto intro: a_star_congs)
  5707     also have "\<dots> \<longrightarrow>\<^sub>a* AndL1 (u).(M[x\<turnstile>n>y]) y" using ih by (auto intro: a_star_congs)
  5887     also have "\<dots> = (AndL1 (u).M v)[x\<turnstile>n>y]" using eq fs by simp
  5708     also have "\<dots> = (AndL1 (u).M v)[x\<turnstile>n>y]" using eq fs by simp
  5888     finally show "(AndL1 (u).M v){x:=<a>.Ax y a} \<longrightarrow>\<^sub>a* (AndL1 (u).M v)[x\<turnstile>n>y]" by simp
  5709     finally show "(AndL1 (u).M v){x:=<a>.Ax y a} \<longrightarrow>\<^sub>a* (AndL1 (u).M v)[x\<turnstile>n>y]" by simp
  5889   next
  5710   next
  5890     case False
  5711     case False
  5914       apply(rule better_LAxL_intro)
  5735       apply(rule better_LAxL_intro)
  5915       apply(rule fin.intros)
  5736       apply(rule fin.intros)
  5916       apply(simp add: abs_fresh)
  5737       apply(simp add: abs_fresh)
  5917       done
  5738       done
  5918     also have "\<dots> = AndL2 (u).(M{x:=<a>.Ax y a}) y" using fs new
  5739     also have "\<dots> = AndL2 (u).(M{x:=<a>.Ax y a}) y" using fs new
  5919       by (auto simp add: fresh_prod fresh_atm nrename_fresh)
  5740       by (auto simp: fresh_prod fresh_atm nrename_fresh)
  5920     also have "\<dots> \<longrightarrow>\<^sub>a* AndL2 (u).(M[x\<turnstile>n>y]) y" using ih by (auto intro: a_star_congs)
  5741     also have "\<dots> \<longrightarrow>\<^sub>a* AndL2 (u).(M[x\<turnstile>n>y]) y" using ih by (auto intro: a_star_congs)
  5921     also have "\<dots> = (AndL2 (u).M v)[x\<turnstile>n>y]" using eq fs by simp
  5742     also have "\<dots> = (AndL2 (u).M v)[x\<turnstile>n>y]" using eq fs by simp
  5922     finally show "(AndL2 (u).M v){x:=<a>.Ax y a} \<longrightarrow>\<^sub>a* (AndL2 (u).M v)[x\<turnstile>n>y]" by simp
  5743     finally show "(AndL2 (u).M v){x:=<a>.Ax y a} \<longrightarrow>\<^sub>a* (AndL2 (u).M v)[x\<turnstile>n>y]" by simp
  5923   next
  5744   next
  5924     case False
  5745     case False
  5964       apply(rule better_LAxL_intro)
  5785       apply(rule better_LAxL_intro)
  5965       apply(rule fin.intros)
  5786       apply(rule fin.intros)
  5966       apply(simp_all add: abs_fresh)
  5787       apply(simp_all add: abs_fresh)
  5967       done
  5788       done
  5968     also have "\<dots> = OrL (u).(M{x:=<a>.Ax y a}) (v).(N{x:=<a>.Ax y a}) y" using fs new
  5789     also have "\<dots> = OrL (u).(M{x:=<a>.Ax y a}) (v).(N{x:=<a>.Ax y a}) y" using fs new
  5969       by (auto simp add: fresh_prod fresh_atm nrename_fresh subst_fresh)
  5790       by (auto simp: fresh_prod fresh_atm nrename_fresh subst_fresh)
  5970     also have "\<dots> \<longrightarrow>\<^sub>a* OrL (u).(M[x\<turnstile>n>y]) (v).(N[x\<turnstile>n>y]) y" 
  5791     also have "\<dots> \<longrightarrow>\<^sub>a* OrL (u).(M[x\<turnstile>n>y]) (v).(N[x\<turnstile>n>y]) y" 
  5971       using ih1 ih2 by (auto intro: a_star_congs)
  5792       using ih1 ih2 by (auto intro: a_star_congs)
  5972     also have "\<dots> = (OrL (u).M (v).N z)[x\<turnstile>n>y]" using eq fs by simp
  5793     also have "\<dots> = (OrL (u).M (v).N z)[x\<turnstile>n>y]" using eq fs by simp
  5973     finally show "(OrL (u).M (v).N z){x:=<a>.Ax y a} \<longrightarrow>\<^sub>a* (OrL (u).M (v).N z)[x\<turnstile>n>y]" by simp
  5794     finally show "(OrL (u).M (v).N z){x:=<a>.Ax y a} \<longrightarrow>\<^sub>a* (OrL (u).M (v).N z)[x\<turnstile>n>y]" by simp
  5974   next
  5795   next
  6010       apply(rule better_LAxL_intro)
  5831       apply(rule better_LAxL_intro)
  6011       apply(rule fin.intros)
  5832       apply(rule fin.intros)
  6012       apply(simp_all add: abs_fresh)
  5833       apply(simp_all add: abs_fresh)
  6013       done
  5834       done
  6014     also have "\<dots> = ImpL <c>.(M{x:=<a>.Ax y a}) (u).(N{x:=<a>.Ax y a}) y" using fs new
  5835     also have "\<dots> = ImpL <c>.(M{x:=<a>.Ax y a}) (u).(N{x:=<a>.Ax y a}) y" using fs new
  6015       by (auto simp add: fresh_prod subst_fresh fresh_atm trm.inject alpha rename_fresh)
  5836       by (auto simp: fresh_prod subst_fresh fresh_atm trm.inject alpha rename_fresh)
  6016     also have "\<dots> \<longrightarrow>\<^sub>a* ImpL <c>.(M[x\<turnstile>n>y]) (u).(N[x\<turnstile>n>y]) y" 
  5837     also have "\<dots> \<longrightarrow>\<^sub>a* ImpL <c>.(M[x\<turnstile>n>y]) (u).(N[x\<turnstile>n>y]) y" 
  6017       using ih1 ih2 by (auto intro: a_star_congs)
  5838       using ih1 ih2 by (auto intro: a_star_congs)
  6018     also have "\<dots> = (ImpL <c>.M (u).N v)[x\<turnstile>n>y]" using eq fs by simp
  5839     also have "\<dots> = (ImpL <c>.M (u).N v)[x\<turnstile>n>y]" using eq fs by simp
  6019     finally show "(ImpL <c>.M (u).N v){x:=<a>.Ax y a} \<longrightarrow>\<^sub>a* (ImpL <c>.M (u).N v)[x\<turnstile>n>y]" using fs by simp
  5840     finally show "(ImpL <c>.M (u).N v){x:=<a>.Ax y a} \<longrightarrow>\<^sub>a* (ImpL <c>.M (u).N v)[x\<turnstile>n>y]" using fs by simp
  6020   next
  5841   next
  6130       apply(rule better_LAxR_intro)
  5951       apply(rule better_LAxR_intro)
  6131       apply(rule fic.intros)
  5952       apply(rule fic.intros)
  6132       apply(simp_all add: abs_fresh)
  5953       apply(simp_all add: abs_fresh)
  6133       done
  5954       done
  6134     also have "\<dots> = AndR <c>.(M{b:=(x).Ax x a}) <d>.(N{b:=(x).Ax x a}) a" using fs new
  5955     also have "\<dots> = AndR <c>.(M{b:=(x).Ax x a}) <d>.(N{b:=(x).Ax x a}) a" using fs new
  6135       by (auto simp add: fresh_prod fresh_atm subst_fresh crename_fresh)
  5956       by (auto simp: fresh_prod fresh_atm subst_fresh crename_fresh)
  6136     also have "\<dots> \<longrightarrow>\<^sub>a* AndR <c>.(M[b\<turnstile>c>a]) <d>.(N[b\<turnstile>c>a]) a" using ih1 ih2 by (auto intro: a_star_congs)
  5957     also have "\<dots> \<longrightarrow>\<^sub>a* AndR <c>.(M[b\<turnstile>c>a]) <d>.(N[b\<turnstile>c>a]) a" using ih1 ih2 by (auto intro: a_star_congs)
  6137     also have "\<dots> = (AndR <c>.M <d>.N e)[b\<turnstile>c>a]" using eq fs by simp
  5958     also have "\<dots> = (AndR <c>.M <d>.N e)[b\<turnstile>c>a]" using eq fs by simp
  6138     finally show "(AndR <c>.M <d>.N e){b:=(x).Ax x a} \<longrightarrow>\<^sub>a* (AndR <c>.M <d>.N e)[b\<turnstile>c>a]" by simp
  5959     finally show "(AndR <c>.M <d>.N e){b:=(x).Ax x a} \<longrightarrow>\<^sub>a* (AndR <c>.M <d>.N e)[b\<turnstile>c>a]" by simp
  6139   next
  5960   next
  6140     case False
  5961     case False
  6180       apply(rule better_LAxR_intro)
  6001       apply(rule better_LAxR_intro)
  6181       apply(rule fic.intros)
  6002       apply(rule fic.intros)
  6182       apply(simp_all add: abs_fresh)
  6003       apply(simp_all add: abs_fresh)
  6183       done
  6004       done
  6184     also have "\<dots> = OrR1 <c>.M{b:=(x).Ax x a} a" using fs new
  6005     also have "\<dots> = OrR1 <c>.M{b:=(x).Ax x a} a" using fs new
  6185       by (auto simp add: fresh_prod fresh_atm crename_fresh subst_fresh)
  6006       by (auto simp: fresh_prod fresh_atm crename_fresh subst_fresh)
  6186     also have "\<dots> \<longrightarrow>\<^sub>a* OrR1 <c>.(M[b\<turnstile>c>a]) a" using ih by (auto intro: a_star_congs)
  6007     also have "\<dots> \<longrightarrow>\<^sub>a* OrR1 <c>.(M[b\<turnstile>c>a]) a" using ih by (auto intro: a_star_congs)
  6187     also have "\<dots> = (OrR1 <c>.M d)[b\<turnstile>c>a]" using eq fs by simp
  6008     also have "\<dots> = (OrR1 <c>.M d)[b\<turnstile>c>a]" using eq fs by simp
  6188     finally show "(OrR1 <c>.M d){b:=(x).Ax x a} \<longrightarrow>\<^sub>a* (OrR1 <c>.M d)[b\<turnstile>c>a]" by simp
  6009     finally show "(OrR1 <c>.M d){b:=(x).Ax x a} \<longrightarrow>\<^sub>a* (OrR1 <c>.M d)[b\<turnstile>c>a]" by simp
  6189   next
  6010   next
  6190     case False
  6011     case False
  6214       apply(rule better_LAxR_intro)
  6035       apply(rule better_LAxR_intro)
  6215       apply(rule fic.intros)
  6036       apply(rule fic.intros)
  6216       apply(simp_all add: abs_fresh)
  6037       apply(simp_all add: abs_fresh)
  6217       done
  6038       done
  6218     also have "\<dots> = OrR2 <c>.M{b:=(x).Ax x a} a" using fs new
  6039     also have "\<dots> = OrR2 <c>.M{b:=(x).Ax x a} a" using fs new
  6219       by (auto simp add: fresh_prod fresh_atm crename_fresh subst_fresh)
  6040       by (auto simp: fresh_prod fresh_atm crename_fresh subst_fresh)
  6220     also have "\<dots> \<longrightarrow>\<^sub>a* OrR2 <c>.(M[b\<turnstile>c>a]) a" using ih by (auto intro: a_star_congs)
  6041     also have "\<dots> \<longrightarrow>\<^sub>a* OrR2 <c>.(M[b\<turnstile>c>a]) a" using ih by (auto intro: a_star_congs)
  6221     also have "\<dots> = (OrR2 <c>.M d)[b\<turnstile>c>a]" using eq fs by simp
  6042     also have "\<dots> = (OrR2 <c>.M d)[b\<turnstile>c>a]" using eq fs by simp
  6222     finally show "(OrR2 <c>.M d){b:=(x).Ax x a} \<longrightarrow>\<^sub>a* (OrR2 <c>.M d)[b\<turnstile>c>a]" by simp
  6043     finally show "(OrR2 <c>.M d){b:=(x).Ax x a} \<longrightarrow>\<^sub>a* (OrR2 <c>.M d)[b\<turnstile>c>a]" by simp
  6223   next
  6044   next
  6224     case False
  6045     case False
  6257       apply(rule better_LAxR_intro)
  6078       apply(rule better_LAxR_intro)
  6258       apply(rule fic.intros)
  6079       apply(rule fic.intros)
  6259       apply(simp_all add: abs_fresh)
  6080       apply(simp_all add: abs_fresh)
  6260       done
  6081       done
  6261     also have "\<dots> = ImpR z.<c>.M{b:=(x).Ax x a} a" using fs new
  6082     also have "\<dots> = ImpR z.<c>.M{b:=(x).Ax x a} a" using fs new
  6262       by (auto simp add: fresh_prod crename_fresh subst_fresh fresh_atm)
  6083       by (auto simp: fresh_prod crename_fresh subst_fresh fresh_atm)
  6263     also have "\<dots> \<longrightarrow>\<^sub>a* ImpR z.<c>.(M[b\<turnstile>c>a]) a" using ih by (auto intro: a_star_congs)
  6084     also have "\<dots> \<longrightarrow>\<^sub>a* ImpR z.<c>.(M[b\<turnstile>c>a]) a" using ih by (auto intro: a_star_congs)
  6264     also have "\<dots> = (ImpR z.<c>.M b)[b\<turnstile>c>a]" using eq fs by simp
  6085     also have "\<dots> = (ImpR z.<c>.M b)[b\<turnstile>c>a]" using eq fs by simp
  6265     finally show "(ImpR (z).<c>.M d){b:=(x).Ax x a} \<longrightarrow>\<^sub>a* (ImpR (z).<c>.M d)[b\<turnstile>c>a]" using eq by simp
  6086     finally show "(ImpR (z).<c>.M d){b:=(x).Ax x a} \<longrightarrow>\<^sub>a* (ImpR (z).<c>.M d)[b\<turnstile>c>a]" using eq by simp
  6266   next
  6087   next
  6267     case False
  6088     case False
  6286 text \<open>substitution lemmas\<close>
  6107 text \<open>substitution lemmas\<close>
  6287 
  6108 
  6288 lemma not_Ax1:
  6109 lemma not_Ax1:
  6289   shows "\<not>(b\<sharp>M) \<Longrightarrow> M{b:=(y).Q} \<noteq> Ax x a"
  6110   shows "\<not>(b\<sharp>M) \<Longrightarrow> M{b:=(y).Q} \<noteq> Ax x a"
  6290 apply(nominal_induct M avoiding: b y Q x a rule: trm.strong_induct)
  6111 apply(nominal_induct M avoiding: b y Q x a rule: trm.strong_induct)
  6291 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
  6112 apply(auto simp: fresh_atm abs_fresh abs_supp fin_supp)
  6292 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(y).Q},Q)")
  6113 apply(subgoal_tac "\<exists>x'::coname. x'\<sharp>(trm{coname:=(y).Q},Q)")
  6293 apply(erule exE)
  6114 apply(erule exE)
  6294 apply(simp add: fresh_prod)
  6115 apply(simp add: fresh_prod)
  6295 apply(erule conjE)+
  6116 apply(erule conjE)+
  6296 apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm)
  6117 apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm)
  6358 done
  6179 done
  6359 
  6180 
  6360 lemma not_Ax2:
  6181 lemma not_Ax2:
  6361   shows "\<not>(x\<sharp>M) \<Longrightarrow> M{x:=<b>.Q} \<noteq> Ax y a"
  6182   shows "\<not>(x\<sharp>M) \<Longrightarrow> M{x:=<b>.Q} \<noteq> Ax y a"
  6362 apply(nominal_induct M avoiding: b y Q x a rule: trm.strong_induct)
  6183 apply(nominal_induct M avoiding: b y Q x a rule: trm.strong_induct)
  6363 apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp)
  6184 apply(auto simp: fresh_atm abs_fresh abs_supp fin_supp)
  6364 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{x:=<b>.Q},Q)")
  6185 apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(trm{x:=<b>.Q},Q)")
  6365 apply(erule exE)
  6186 apply(erule exE)
  6366 apply(simp add: fresh_prod)
  6187 apply(simp add: fresh_prod)
  6367 apply(erule conjE)+
  6188 apply(erule conjE)+
  6368 apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm)
  6189 apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm)
  6440   shows "N{y:=<c>.P}{x:=<c>.P} = N{x:=<c>.Ax y c}{y:=<c>.P}"
  6261   shows "N{y:=<c>.P}{x:=<c>.P} = N{x:=<c>.Ax y c}{y:=<c>.P}"
  6441 using a
  6262 using a
  6442 proof(nominal_induct N avoiding: x y c P rule: trm.strong_induct)
  6263 proof(nominal_induct N avoiding: x y c P rule: trm.strong_induct)
  6443   case Ax
  6264   case Ax
  6444   then show ?case
  6265   then show ?case
  6445     by (auto simp add: abs_fresh fresh_atm forget trm.inject)
  6266     by (auto simp: abs_fresh fresh_atm forget trm.inject)
  6446 next 
  6267 next 
  6447   case (Cut d M u M' x' y' c P)
  6268   case (Cut d M u M' x' y' c P)
  6448   with assms show ?case
  6269   with assms show ?case
  6449     apply(simp)
  6270     apply(simp)
  6450     apply(auto)
  6271     apply(auto)
  6527     apply(simp add: not_Ax2)
  6348     apply(simp add: not_Ax2)
  6528     done
  6349     done
  6529 next
  6350 next
  6530   case NotR
  6351   case NotR
  6531   then show ?case
  6352   then show ?case
  6532     by (auto simp add: abs_fresh fresh_atm forget)
  6353     by (auto simp: abs_fresh fresh_atm forget)
  6533 next
  6354 next
  6534   case (NotL d M u)
  6355   case (NotL d M u)
  6535   then show ?case
  6356   then show ?case
  6536     apply (auto simp add: abs_fresh fresh_atm forget)
  6357     apply (auto simp: abs_fresh fresh_atm forget)
  6537     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.P},y,x)")
  6358     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.P},y,x)")
  6538     apply(erule exE, simp add: fresh_prod)
  6359     apply(erule exE, simp add: fresh_prod)
  6539     apply(erule conjE)+
  6360     apply(erule conjE)+
  6540     apply(simp add: fresh_fun_simp_NotL)
  6361     apply(simp add: fresh_fun_simp_NotL)
  6541     apply(rule trans)
  6362     apply(rule trans)
  6542     apply(rule better_Cut_substn)
  6363     apply(rule better_Cut_substn)
  6543     apply(simp add: abs_fresh)
  6364     apply(simp add: abs_fresh)
  6544     apply(simp)
  6365     apply(simp)
  6545     apply(simp)
  6366     apply(simp)
  6546     apply(auto simp add: fresh_atm)
  6367     apply(auto simp: fresh_atm)
  6547     apply(simp add: trm.inject alpha forget)
  6368     apply(simp add: trm.inject alpha forget)
  6548     apply(rule exists_fresh'(1)[OF fs_name1])
  6369     apply(rule exists_fresh'(1)[OF fs_name1])
  6549     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<c>.Ax y c},M{x:=<c>.Ax y c}{y:=<c>.P},Ax y c,y,x)")
  6370     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<c>.Ax y c},M{x:=<c>.Ax y c}{y:=<c>.P},Ax y c,y,x)")
  6550     apply(erule exE, simp only: fresh_prod)
  6371     apply(erule exE, simp only: fresh_prod)
  6551     apply(erule conjE)+
  6372     apply(erule conjE)+
  6564     apply(rule exists_fresh'(1)[OF fs_name1])
  6385     apply(rule exists_fresh'(1)[OF fs_name1])
  6565     done
  6386     done
  6566 next
  6387 next
  6567   case (AndR d1 M d2 M' d3)
  6388   case (AndR d1 M d2 M' d3)
  6568   then show ?case
  6389   then show ?case
  6569     by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6390     by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6570 next
  6391 next
  6571   case (AndL1 u M d)
  6392   case (AndL1 u M d)
  6572   then show ?case
  6393   then show ?case
  6573     apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6394     apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6574     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)")
  6395     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)")
  6575     apply(erule exE, simp add: fresh_prod)
  6396     apply(erule exE, simp add: fresh_prod)
  6576     apply(erule conjE)+
  6397     apply(erule conjE)+
  6577     apply(simp add: fresh_fun_simp_AndL1)
  6398     apply(simp add: fresh_fun_simp_AndL1)
  6578     apply(rule trans)
  6399     apply(rule trans)
  6579     apply(rule better_Cut_substn)
  6400     apply(rule better_Cut_substn)
  6580     apply(simp add: abs_fresh)
  6401     apply(simp add: abs_fresh)
  6581     apply(simp)
  6402     apply(simp)
  6582     apply(simp)
  6403     apply(simp)
  6583     apply(auto simp add: fresh_atm)
  6404     apply(auto simp: fresh_atm)
  6584     apply(simp add: trm.inject alpha forget)
  6405     apply(simp add: trm.inject alpha forget)
  6585     apply(rule exists_fresh'(1)[OF fs_name1])
  6406     apply(rule exists_fresh'(1)[OF fs_name1])
  6586     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,Ax y c,M{x:=<c>.Ax y c},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)")
  6407     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,Ax y c,M{x:=<c>.Ax y c},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)")
  6587     apply(erule exE, simp only: fresh_prod)
  6408     apply(erule exE, simp only: fresh_prod)
  6588     apply(erule conjE)+
  6409     apply(erule conjE)+
  6591     apply(rule trans)
  6412     apply(rule trans)
  6592     apply(rule better_Cut_substn)
  6413     apply(rule better_Cut_substn)
  6593     apply(simp add: abs_fresh)
  6414     apply(simp add: abs_fresh)
  6594     apply(simp)
  6415     apply(simp)
  6595     apply(simp)
  6416     apply(simp)
  6596     apply(auto simp add: fresh_atm)
  6417     apply(auto simp: fresh_atm)
  6597     apply(rule exists_fresh'(1)[OF fs_name1])
  6418     apply(rule exists_fresh'(1)[OF fs_name1])
  6598     done
  6419     done
  6599 next
  6420 next
  6600   case (AndL2 u M d)
  6421   case (AndL2 u M d)
  6601   then show ?case
  6422   then show ?case
  6602     apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6423     apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6603     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)")
  6424     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)")
  6604     apply(erule exE, simp add: fresh_prod)
  6425     apply(erule exE, simp add: fresh_prod)
  6605     apply(erule conjE)+
  6426     apply(erule conjE)+
  6606     apply(simp add: fresh_fun_simp_AndL2)
  6427     apply(simp add: fresh_fun_simp_AndL2)
  6607     apply(rule trans)
  6428     apply(rule trans)
  6608     apply(rule better_Cut_substn)
  6429     apply(rule better_Cut_substn)
  6609     apply(simp add: abs_fresh)
  6430     apply(simp add: abs_fresh)
  6610     apply(simp)
  6431     apply(simp)
  6611     apply(simp)
  6432     apply(simp)
  6612     apply(auto simp add: fresh_atm)
  6433     apply(auto simp: fresh_atm)
  6613     apply(simp add: trm.inject alpha forget)
  6434     apply(simp add: trm.inject alpha forget)
  6614     apply(rule exists_fresh'(1)[OF fs_name1])
  6435     apply(rule exists_fresh'(1)[OF fs_name1])
  6615     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,Ax y c,M{x:=<c>.Ax y c},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)")
  6436     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,Ax y c,M{x:=<c>.Ax y c},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)")
  6616     apply(erule exE, simp only: fresh_prod)
  6437     apply(erule exE, simp only: fresh_prod)
  6617     apply(erule conjE)+
  6438     apply(erule conjE)+
  6620     apply(rule trans)
  6441     apply(rule trans)
  6621     apply(rule better_Cut_substn)
  6442     apply(rule better_Cut_substn)
  6622     apply(simp add: abs_fresh)
  6443     apply(simp add: abs_fresh)
  6623     apply(simp)
  6444     apply(simp)
  6624     apply(simp)
  6445     apply(simp)
  6625     apply(auto simp add: fresh_atm)
  6446     apply(auto simp: fresh_atm)
  6626     apply(rule exists_fresh'(1)[OF fs_name1])
  6447     apply(rule exists_fresh'(1)[OF fs_name1])
  6627     done
  6448     done
  6628 next
  6449 next
  6629   case OrR1
  6450   case OrR1
  6630   then show ?case
  6451   then show ?case
  6631     by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6452     by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6632 next
  6453 next
  6633   case OrR2
  6454   case OrR2
  6634   then show ?case
  6455   then show ?case
  6635     by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6456     by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6636 next
  6457 next
  6637   case (OrL x1 M x2 M' x3)
  6458   case (OrL x1 M x2 M' x3)
  6638   then show ?case
  6459   then show ?case
  6639     apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6460     apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6640     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.P},
  6461     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.P},
  6641                                         M'{y:=<c>.P},M'{x:=<c>.Ax y c}{y:=<c>.P},x1,x2,x3,y,x)")
  6462                                         M'{y:=<c>.P},M'{x:=<c>.Ax y c}{y:=<c>.P},x1,x2,x3,y,x)")
  6642     apply(erule exE, simp add: fresh_prod)
  6463     apply(erule exE, simp add: fresh_prod)
  6643     apply(erule conjE)+
  6464     apply(erule conjE)+
  6644     apply(simp add: fresh_fun_simp_OrL)
  6465     apply(simp add: fresh_fun_simp_OrL)
  6645     apply(rule trans)
  6466     apply(rule trans)
  6646     apply(rule better_Cut_substn)
  6467     apply(rule better_Cut_substn)
  6647     apply(simp add: abs_fresh)
  6468     apply(simp add: abs_fresh)
  6648     apply(simp)
  6469     apply(simp)
  6649     apply(simp)
  6470     apply(simp)
  6650     apply(auto simp add: fresh_atm)
  6471     apply(auto simp: fresh_atm)
  6651     apply(simp add: trm.inject alpha forget)
  6472     apply(simp add: trm.inject alpha forget)
  6652     apply(rule trans)
  6473     apply(rule trans)
  6653     apply(rule substn.simps)
  6474     apply(rule substn.simps)
  6654     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6475     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6655     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6476     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6672     apply(rule substn.simps)
  6493     apply(rule substn.simps)
  6673     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6494     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6674     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6495     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6675     apply(force)
  6496     apply(force)
  6676     apply(simp)
  6497     apply(simp)
  6677     apply(auto simp add: fresh_atm)
  6498     apply(auto simp: fresh_atm)
  6678     apply(rule exists_fresh'(1)[OF fs_name1])
  6499     apply(rule exists_fresh'(1)[OF fs_name1])
  6679     done
  6500     done
  6680 next
  6501 next
  6681   case ImpR
  6502   case ImpR
  6682   then show ?case
  6503   then show ?case
  6683     by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6504     by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6684 next
  6505 next
  6685   case (ImpL a M x1 M' x2)
  6506   case (ImpL a M x1 M' x2)
  6686   then show ?case
  6507   then show ?case
  6687     apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6508     apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6688     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x2:=<c>.P},M{x:=<c>.Ax x2 c}{x2:=<c>.P},
  6509     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x2:=<c>.P},M{x:=<c>.Ax x2 c}{x2:=<c>.P},
  6689                                         M'{x2:=<c>.P},M'{x:=<c>.Ax x2 c}{x2:=<c>.P},x1,y,x)")
  6510                                         M'{x2:=<c>.P},M'{x:=<c>.Ax x2 c}{x2:=<c>.P},x1,y,x)")
  6690     apply(erule exE, simp add: fresh_prod)
  6511     apply(erule exE, simp add: fresh_prod)
  6691     apply(erule conjE)+
  6512     apply(erule conjE)+
  6692     apply(simp add: fresh_fun_simp_ImpL)
  6513     apply(simp add: fresh_fun_simp_ImpL)
  6693     apply(rule trans)
  6514     apply(rule trans)
  6694     apply(rule better_Cut_substn)
  6515     apply(rule better_Cut_substn)
  6695     apply(simp add: abs_fresh)
  6516     apply(simp add: abs_fresh)
  6696     apply(simp)
  6517     apply(simp)
  6697     apply(simp)
  6518     apply(simp)
  6698     apply(auto simp add: fresh_atm)
  6519     apply(auto simp: fresh_atm)
  6699     apply(simp add: trm.inject alpha forget)
  6520     apply(simp add: trm.inject alpha forget)
  6700     apply(rule trans)
  6521     apply(rule trans)
  6701     apply(rule substn.simps)
  6522     apply(rule substn.simps)
  6702     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6523     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6703     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6524     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6718     apply(rule trans)
  6539     apply(rule trans)
  6719     apply(rule substn.simps)
  6540     apply(rule substn.simps)
  6720     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6541     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6721     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6542     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6722     apply(simp)
  6543     apply(simp)
  6723     apply(auto simp add: fresh_atm)
  6544     apply(auto simp: fresh_atm)
  6724     apply(rule exists_fresh'(1)[OF fs_name1])
  6545     apply(rule exists_fresh'(1)[OF fs_name1])
  6725     done
  6546     done
  6726 qed 
  6547 qed 
  6727 
  6548 
  6728 lemma interesting_subst1':
  6549 lemma interesting_subst1':
  6748   shows "N{a:=(y).P}{b:=(y).P} = N{b:=(y).Ax y a}{a:=(y).P}"
  6569   shows "N{a:=(y).P}{b:=(y).P} = N{b:=(y).Ax y a}{a:=(y).P}"
  6749 using a
  6570 using a
  6750 proof(nominal_induct N avoiding: a b y P rule: trm.strong_induct)
  6571 proof(nominal_induct N avoiding: a b y P rule: trm.strong_induct)
  6751   case Ax
  6572   case Ax
  6752   then show ?case
  6573   then show ?case
  6753     by (auto simp add: abs_fresh fresh_atm forget trm.inject)
  6574     by (auto simp: abs_fresh fresh_atm forget trm.inject)
  6754 next 
  6575 next 
  6755   case (Cut d M u M' x' y' c P)
  6576   case (Cut d M u M' x' y' c P)
  6756   with assms show ?case
  6577   with assms show ?case
  6757     apply(simp)
  6578     apply(simp)
  6758     apply(auto simp add: trm.inject)
  6579     apply(auto simp: trm.inject)
  6759     apply(rule trans)
  6580     apply(rule trans)
  6760     apply(rule better_Cut_substc)
  6581     apply(rule better_Cut_substc)
  6761     apply(simp)
  6582     apply(simp)
  6762     apply(simp add: abs_fresh)
  6583     apply(simp add: abs_fresh)
  6763     apply(simp add: forget)
  6584     apply(simp add: forget)
  6813     apply(simp add: not_Ax1)
  6634     apply(simp add: not_Ax1)
  6814     done
  6635     done
  6815 next
  6636 next
  6816   case NotL
  6637   case NotL
  6817   then show ?case
  6638   then show ?case
  6818     by (auto simp add: abs_fresh fresh_atm forget)
  6639     by (auto simp: abs_fresh fresh_atm forget)
  6819 next
  6640 next
  6820   case (NotR u M d)
  6641   case (NotR u M d)
  6821   then show ?case
  6642   then show ?case
  6822     apply (auto simp add: abs_fresh fresh_atm forget)
  6643     apply (auto simp: abs_fresh fresh_atm forget)
  6823     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,M{d:=(y).P},M{b:=(y).Ax y d}{d:=(y).P},u,y)")
  6644     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,M{d:=(y).P},M{b:=(y).Ax y d}{d:=(y).P},u,y)")
  6824     apply(erule exE, simp add: fresh_prod)
  6645     apply(erule exE, simp add: fresh_prod)
  6825     apply(erule conjE)+
  6646     apply(erule conjE)+
  6826     apply(simp add: fresh_fun_simp_NotR)
  6647     apply(simp add: fresh_fun_simp_NotR)
  6827     apply(rule trans)
  6648     apply(rule trans)
  6828     apply(rule better_Cut_substc)
  6649     apply(rule better_Cut_substc)
  6829     apply(simp add: abs_fresh)
  6650     apply(simp add: abs_fresh)
  6830     apply(simp add: abs_fresh)
  6651     apply(simp add: abs_fresh)
  6831     apply(simp)
  6652     apply(simp)
  6832     apply(auto simp add: fresh_atm)
  6653     apply(auto simp: fresh_atm)
  6833     apply(simp add: trm.inject alpha forget)
  6654     apply(simp add: trm.inject alpha forget)
  6834     apply(rule exists_fresh'(2)[OF fs_coname1])
  6655     apply(rule exists_fresh'(2)[OF fs_coname1])
  6835     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(P,M{d:=(y).Ax y a},M{d:=(y).Ax y a}{a:=(y).P},Ax y a,y,d)")
  6656     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(P,M{d:=(y).Ax y a},M{d:=(y).Ax y a}{a:=(y).P},Ax y a,y,d)")
  6836     apply(erule exE, simp only: fresh_prod)
  6657     apply(erule exE, simp only: fresh_prod)
  6837     apply(erule conjE)+
  6658     apply(erule conjE)+
  6850     apply(rule exists_fresh'(2)[OF fs_coname1])
  6671     apply(rule exists_fresh'(2)[OF fs_coname1])
  6851     done
  6672     done
  6852 next
  6673 next
  6853   case (AndR d1 M d2 M' d3)
  6674   case (AndR d1 M d2 M' d3)
  6854   then show ?case
  6675   then show ?case
  6855     apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6676     apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6856     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(P,M{d3:=(y).P},M{b:=(y).Ax y d3}{d3:=(y).P},
  6677     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(P,M{d3:=(y).P},M{b:=(y).Ax y d3}{d3:=(y).P},
  6857                                         M'{d3:=(y).P},M'{b:=(y).Ax y d3}{d3:=(y).P},d1,d2,d3,b,y)")
  6678                                         M'{d3:=(y).P},M'{b:=(y).Ax y d3}{d3:=(y).P},d1,d2,d3,b,y)")
  6858     apply(erule exE, simp add: fresh_prod)
  6679     apply(erule exE, simp add: fresh_prod)
  6859     apply(erule conjE)+
  6680     apply(erule conjE)+
  6860     apply(simp add: fresh_fun_simp_AndR)
  6681     apply(simp add: fresh_fun_simp_AndR)
  6861     apply(rule trans)
  6682     apply(rule trans)
  6862     apply(rule better_Cut_substc)
  6683     apply(rule better_Cut_substc)
  6863     apply(simp add: abs_fresh fresh_atm)
  6684     apply(simp add: abs_fresh fresh_atm)
  6864     apply(simp add: abs_fresh fresh_atm)
  6685     apply(simp add: abs_fresh fresh_atm)
  6865     apply(simp)
  6686     apply(simp)
  6866     apply(auto simp add: fresh_atm)
  6687     apply(auto simp: fresh_atm)
  6867     apply(simp add: trm.inject alpha forget)
  6688     apply(simp add: trm.inject alpha forget)
  6868     apply(rule trans)
  6689     apply(rule trans)
  6869     apply(rule substc.simps)
  6690     apply(rule substc.simps)
  6870     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6691     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6871     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6692     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6888     apply(rule substc.simps)
  6709     apply(rule substc.simps)
  6889     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6710     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6890     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6711     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6891     apply(force)
  6712     apply(force)
  6892     apply(simp)
  6713     apply(simp)
  6893     apply(auto simp add: fresh_atm)
  6714     apply(auto simp: fresh_atm)
  6894     apply(rule exists_fresh'(2)[OF fs_coname1])
  6715     apply(rule exists_fresh'(2)[OF fs_coname1])
  6895     done
  6716     done
  6896 next
  6717 next
  6897   case (AndL1 u M d)
  6718   case (AndL1 u M d)
  6898   then show ?case
  6719   then show ?case
  6899     by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6720     by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6900 next
  6721 next
  6901   case (AndL2 u M d)
  6722   case (AndL2 u M d)
  6902   then show ?case
  6723   then show ?case
  6903     by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6724     by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6904 next
  6725 next
  6905   case (OrR1 d M e)
  6726   case (OrR1 d M e)
  6906   then show ?case
  6727   then show ?case
  6907     apply (auto simp add: abs_fresh fresh_atm forget)
  6728     apply (auto simp: abs_fresh fresh_atm forget)
  6908     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,M{e:=(y).P},M{b:=(y).Ax y e}{e:=(y).P},d,e)")
  6729     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,M{e:=(y).P},M{b:=(y).Ax y e}{e:=(y).P},d,e)")
  6909     apply(erule exE, simp add: fresh_prod)
  6730     apply(erule exE, simp add: fresh_prod)
  6910     apply(erule conjE)+
  6731     apply(erule conjE)+
  6911     apply(simp add: fresh_fun_simp_OrR1)
  6732     apply(simp add: fresh_fun_simp_OrR1)
  6912     apply(rule trans)
  6733     apply(rule trans)
  6913     apply(rule better_Cut_substc)
  6734     apply(rule better_Cut_substc)
  6914     apply(simp add: abs_fresh)
  6735     apply(simp add: abs_fresh)
  6915     apply(simp add: abs_fresh)
  6736     apply(simp add: abs_fresh)
  6916     apply(simp)
  6737     apply(simp)
  6917     apply(auto simp add: fresh_atm)
  6738     apply(auto simp: fresh_atm)
  6918     apply(simp add: trm.inject alpha forget)
  6739     apply(simp add: trm.inject alpha forget)
  6919     apply(rule exists_fresh'(2)[OF fs_coname1])
  6740     apply(rule exists_fresh'(2)[OF fs_coname1])
  6920     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,Ax y a,M{e:=(y).Ax y a},M{e:=(y).Ax y a}{a:=(y).P},d,e)")
  6741     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,Ax y a,M{e:=(y).Ax y a},M{e:=(y).Ax y a}{a:=(y).P},d,e)")
  6921     apply(erule exE, simp only: fresh_prod)
  6742     apply(erule exE, simp only: fresh_prod)
  6922     apply(erule conjE)+
  6743     apply(erule conjE)+
  6935     apply(rule exists_fresh'(2)[OF fs_coname1])
  6756     apply(rule exists_fresh'(2)[OF fs_coname1])
  6936     done
  6757     done
  6937 next
  6758 next
  6938   case (OrR2 d M e)
  6759   case (OrR2 d M e)
  6939   then show ?case
  6760   then show ?case
  6940     apply (auto simp add: abs_fresh fresh_atm forget)
  6761     apply (auto simp: abs_fresh fresh_atm forget)
  6941     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,M{e:=(y).P},M{b:=(y).Ax y e}{e:=(y).P},d,e)")
  6762     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,M{e:=(y).P},M{b:=(y).Ax y e}{e:=(y).P},d,e)")
  6942     apply(erule exE, simp add: fresh_prod)
  6763     apply(erule exE, simp add: fresh_prod)
  6943     apply(erule conjE)+
  6764     apply(erule conjE)+
  6944     apply(simp add: fresh_fun_simp_OrR2)
  6765     apply(simp add: fresh_fun_simp_OrR2)
  6945     apply(rule trans)
  6766     apply(rule trans)
  6946     apply(rule better_Cut_substc)
  6767     apply(rule better_Cut_substc)
  6947     apply(simp add: abs_fresh)
  6768     apply(simp add: abs_fresh)
  6948     apply(simp add: abs_fresh)
  6769     apply(simp add: abs_fresh)
  6949     apply(simp)
  6770     apply(simp)
  6950     apply(auto simp add: fresh_atm)
  6771     apply(auto simp: fresh_atm)
  6951     apply(simp add: trm.inject alpha forget)
  6772     apply(simp add: trm.inject alpha forget)
  6952     apply(rule exists_fresh'(2)[OF fs_coname1])
  6773     apply(rule exists_fresh'(2)[OF fs_coname1])
  6953     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,Ax y a,M{e:=(y).Ax y a},M{e:=(y).Ax y a}{a:=(y).P},d,e)")
  6774     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,P,Ax y a,M{e:=(y).Ax y a},M{e:=(y).Ax y a}{a:=(y).P},d,e)")
  6954     apply(erule exE, simp only: fresh_prod)
  6775     apply(erule exE, simp only: fresh_prod)
  6955     apply(erule conjE)+
  6776     apply(erule conjE)+
  6968     apply(rule exists_fresh'(2)[OF fs_coname1])
  6789     apply(rule exists_fresh'(2)[OF fs_coname1])
  6969     done
  6790     done
  6970 next
  6791 next
  6971   case (OrL x1 M x2 M' x3)
  6792   case (OrL x1 M x2 M' x3)
  6972   then show ?case
  6793   then show ?case
  6973     by(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6794     by(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6974 next
  6795 next
  6975   case ImpL
  6796   case ImpL
  6976   then show ?case
  6797   then show ?case
  6977     by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6798     by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6978 next
  6799 next
  6979   case (ImpR u e M d)
  6800   case (ImpR u e M d)
  6980   then show ?case
  6801   then show ?case
  6981     apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6802     apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh)
  6982     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,e,d,P,M{d:=(y).P},M{b:=(y).Ax y d}{d:=(y).P})")
  6803     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(b,e,d,P,M{d:=(y).P},M{b:=(y).Ax y d}{d:=(y).P})")
  6983     apply(erule exE, simp add: fresh_prod)
  6804     apply(erule exE, simp add: fresh_prod)
  6984     apply(erule conjE)+
  6805     apply(erule conjE)+
  6985     apply(simp add: fresh_fun_simp_ImpR)
  6806     apply(simp add: fresh_fun_simp_ImpR)
  6986     apply(rule trans)
  6807     apply(rule trans)
  6987     apply(rule better_Cut_substc)
  6808     apply(rule better_Cut_substc)
  6988     apply(simp add: abs_fresh)
  6809     apply(simp add: abs_fresh)
  6989     apply(simp add: abs_fresh)
  6810     apply(simp add: abs_fresh)
  6990     apply(simp)
  6811     apply(simp)
  6991     apply(auto simp add: fresh_atm)
  6812     apply(auto simp: fresh_atm)
  6992     apply(simp add: trm.inject alpha forget)
  6813     apply(simp add: trm.inject alpha forget)
  6993     apply(rule exists_fresh'(2)[OF fs_coname1])
  6814     apply(rule exists_fresh'(2)[OF fs_coname1])
  6994     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(e,d,P,Ax y a,M{d:=(y).Ax y a},M{d:=(y).Ax y a}{a:=(y).P})")
  6815     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(e,d,P,Ax y a,M{d:=(y).Ax y a},M{d:=(y).Ax y a}{a:=(y).P})")
  6995     apply(erule exE, simp only: fresh_prod)
  6816     apply(erule exE, simp only: fresh_prod)
  6996     apply(erule conjE)+
  6817     apply(erule conjE)+
  7005     apply(rule trans)
  6826     apply(rule trans)
  7006     apply(rule substc.simps)
  6827     apply(rule substc.simps)
  7007     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6828     apply(simp add: abs_fresh subst_fresh fresh_atm)
  7008     apply(simp add: abs_fresh subst_fresh fresh_atm)
  6829     apply(simp add: abs_fresh subst_fresh fresh_atm)
  7009     apply(simp)
  6830     apply(simp)
  7010     apply(auto simp add: fresh_atm)
  6831     apply(auto simp: fresh_atm)
  7011     apply(rule exists_fresh'(2)[OF fs_coname1])
  6832     apply(rule exists_fresh'(2)[OF fs_coname1])
  7012     done
  6833     done
  7013 qed 
  6834 qed 
  7014 
  6835 
  7015 lemma interesting_subst2':
  6836 lemma interesting_subst2':
  7041     have "(Ax x b){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (x).Ax x b){b:=(y).Q}" using fs by simp
  6862     have "(Ax x b){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (x).Ax x b){b:=(y).Q}" using fs by simp
  7042     also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).Q"
  6863     also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).Q"
  7043       using fs by (simp_all add: fresh_prod fresh_atm)
  6864       using fs by (simp_all add: fresh_prod fresh_atm)
  7044     also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" using fs by (simp add: forget)
  6865     also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" using fs by (simp add: forget)
  7045     also have "\<dots> = (Cut <b>.Ax x b (y).Q){x:=<a>.(P{b:=(y).Q})}"
  6866     also have "\<dots> = (Cut <b>.Ax x b (y).Q){x:=<a>.(P{b:=(y).Q})}"
  7046       using fs asm by (auto simp add: fresh_prod fresh_atm subst_fresh)
  6867       using fs asm by (auto simp: fresh_prod fresh_atm subst_fresh)
  7047     also have "\<dots> = (Ax x b){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using fs by simp
  6868     also have "\<dots> = (Ax x b){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using fs by simp
  7048     finally have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" 
  6869     finally have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" 
  7049       using asm by simp
  6870       using asm by simp
  7050   }
  6871   }
  7051   moreover
  6872   moreover
  7053     have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}" using asm by simp
  6874     have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}" using asm by simp
  7054     also have "\<dots> = Cut <b>.Ax z c (y).Q" using fs asm by simp
  6875     also have "\<dots> = Cut <b>.Ax z c (y).Q" using fs asm by simp
  7055     also have "\<dots> = Cut <b>.(Ax z c{x:=<a>.(P{b:=(y).Q})}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" 
  6876     also have "\<dots> = Cut <b>.(Ax z c{x:=<a>.(P{b:=(y).Q})}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" 
  7056       using fs asm by (simp add: forget)
  6877       using fs asm by (simp add: forget)
  7057     also have "\<dots> = (Cut <b>.Ax z c (y).Q){x:=<a>.(P{b:=(y).Q})}" using asm fs
  6878     also have "\<dots> = (Cut <b>.Ax z c (y).Q){x:=<a>.(P{b:=(y).Q})}" using asm fs
  7058       by (auto simp add: trm.inject subst_fresh fresh_prod fresh_atm abs_fresh)
  6879       by (auto simp: trm.inject subst_fresh fresh_prod fresh_atm abs_fresh)
  7059     also have "\<dots> = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using asm fs by simp
  6880     also have "\<dots> = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using asm fs by simp
  7060     finally have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" by simp
  6881     finally have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" by simp
  7061   }
  6882   }
  7062   moreover
  6883   moreover
  7063   { assume asm: "z=x \<and> c\<noteq>b"
  6884   { assume asm: "z=x \<and> c\<noteq>b"
  7064     have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (x).Ax z c){b:=(y).Q}" using fs asm by simp
  6885     have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (x).Ax z c){b:=(y).Q}" using fs asm by simp
  7065     also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (x).Ax z c" using fs asm by (auto simp add: trm.inject abs_fresh)
  6886     also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (x).Ax z c" using fs asm by (auto simp: trm.inject abs_fresh)
  7066     also have "\<dots> = (Ax z c){x:=<a>.(P{b:=(y).Q})}" using fs asm by simp
  6887     also have "\<dots> = (Ax z c){x:=<a>.(P{b:=(y).Q})}" using fs asm by simp
  7067     also have "\<dots> = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using asm by auto
  6888     also have "\<dots> = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using asm by auto
  7068     finally have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" by simp
  6889     finally have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" by simp
  7069   }
  6890   }
  7070   moreover
  6891   moreover
  7076   case (Cut c M z N)
  6897   case (Cut c M z N)
  7077   { assume asm: "M = Ax x c \<and> N = Ax z b"
  6898   { assume asm: "M = Ax x c \<and> N = Ax z b"
  7078     have "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (z).(N{x:=<a>.P})){b:=(y).Q}" 
  6899     have "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (z).(N{x:=<a>.P})){b:=(y).Q}" 
  7079       using Cut asm by simp
  6900       using Cut asm by simp
  7080     also have "\<dots> = (Cut <a>.P (z).N){b:=(y).Q}" using Cut asm by (simp add: fresh_atm)
  6901     also have "\<dots> = (Cut <a>.P (z).N){b:=(y).Q}" using Cut asm by (simp add: fresh_atm)
  7081     also have "\<dots> = (Cut <a>.(P{b:=(y).Q}) (y).Q)" using Cut asm by (auto simp add: fresh_prod fresh_atm)
  6902     also have "\<dots> = (Cut <a>.(P{b:=(y).Q}) (y).Q)" using Cut asm by (auto simp: fresh_prod fresh_atm)
  7082     finally have eq1: "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <a>.(P{b:=(y).Q}) (y).Q)" by simp
  6903     finally have eq1: "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <a>.(P{b:=(y).Q}) (y).Q)" by simp
  7083     have "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = (Cut <c>.M (y).Q){x:=<a>.(P{b:=(y).Q})}"
  6904     have "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = (Cut <c>.M (y).Q){x:=<a>.(P{b:=(y).Q})}"
  7084       using Cut asm by (simp add: fresh_atm)
  6905       using Cut asm by (simp add: fresh_atm)
  7085     also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" using Cut asm
  6906     also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" using Cut asm
  7086       by (auto simp add: fresh_prod fresh_atm subst_fresh)
  6907       by (auto simp: fresh_prod fresh_atm subst_fresh)
  7087     also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).Q" using Cut asm by (simp add: forget)
  6908     also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (y).Q" using Cut asm by (simp add: forget)
  7088     finally have eq2: "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = Cut <a>.(P{b:=(y).Q}) (y).Q"
  6909     finally have eq2: "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = Cut <a>.(P{b:=(y).Q}) (y).Q"
  7089       by simp
  6910       by simp
  7090     have "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" 
  6911     have "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" 
  7091       using eq1 eq2 by simp
  6912       using eq1 eq2 by simp
  7107     have eq1: "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = Cut <c>.(M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}}) (y).Q" 
  6928     have eq1: "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = Cut <c>.(M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}}) (y).Q" 
  7108       by simp
  6929       by simp
  7109     have "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = 
  6930     have "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = 
  7110                (Cut <c>.(M{b:=(y).Q}) (y).Q){x:=<a>.(P{b:=(y).Q})}" using Cut asm by simp
  6931                (Cut <c>.(M{b:=(y).Q}) (y).Q){x:=<a>.(P{b:=(y).Q})}" using Cut asm by simp
  7111     also have "\<dots> = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (y).(Q{x:=<a>.(P{b:=(y).Q})})"
  6932     also have "\<dots> = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (y).(Q{x:=<a>.(P{b:=(y).Q})})"
  7112       using Cut asm neq by (auto simp add: fresh_prod fresh_atm subst_fresh abs_fresh)
  6933       using Cut asm neq by (auto simp: fresh_prod fresh_atm subst_fresh abs_fresh)
  7113     also have "\<dots> = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (y).Q" using Cut asm by (simp add: forget)
  6934     also have "\<dots> = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (y).Q" using Cut asm by (simp add: forget)
  7114     finally have eq2: "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} 
  6935     finally have eq2: "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} 
  7115                                        = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (y).Q" by simp
  6936                                        = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (y).Q" by simp
  7116     have "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" 
  6937     have "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" 
  7117       using eq1 eq2 by simp
  6938       using eq1 eq2 by simp
  7133                     = Cut <a>.(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" by simp
  6954                     = Cut <a>.(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" by simp
  7134     have "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} 
  6955     have "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} 
  7135                     = (Cut <c>.(M{b:=(y).Q}) (z).(N{b:=(y).Q})){x:=<a>.(P{b:=(y).Q})}"
  6956                     = (Cut <c>.(M{b:=(y).Q}) (z).(N{b:=(y).Q})){x:=<a>.(P{b:=(y).Q})}"
  7136       using Cut asm by auto
  6957       using Cut asm by auto
  7137     also have "\<dots> = (Cut <c>.M (z).(N{b:=(y).Q})){x:=<a>.(P{b:=(y).Q})}"
  6958     also have "\<dots> = (Cut <c>.M (z).(N{b:=(y).Q})){x:=<a>.(P{b:=(y).Q})}"
  7138       using Cut asm by (auto simp add: fresh_atm)
  6959       using Cut asm by (auto simp: fresh_atm)
  7139     also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" 
  6960     also have "\<dots> = Cut <a>.(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" 
  7140       using Cut asm by (simp add: fresh_prod fresh_atm subst_fresh)
  6961       using Cut asm by (simp add: fresh_prod fresh_atm subst_fresh)
  7141     finally 
  6962     finally 
  7142     have eq2: "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} 
  6963     have eq2: "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} 
  7143          = Cut <a>.(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" by simp
  6964          = Cut <a>.(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" by simp
  7177   }
  6998   }
  7178   ultimately show ?case by blast
  6999   ultimately show ?case by blast
  7179 next
  7000 next
  7180   case (NotR z M c)
  7001   case (NotR z M c)
  7181   then show ?case
  7002   then show ?case
  7182     apply(auto simp add: fresh_prod fresh_atm subst_fresh)
  7003     apply(auto simp: fresh_prod fresh_atm subst_fresh)
  7183     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(M{c:=(y).Q},M{c:=(y).Q}{x:=<a>.P{c:=(y).Q}},Q,a,P,c,y)")
  7004     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(M{c:=(y).Q},M{c:=(y).Q}{x:=<a>.P{c:=(y).Q}},Q,a,P,c,y)")
  7184     apply(erule exE)
  7005     apply(erule exE)
  7185     apply(simp add: fresh_prod)
  7006     apply(simp add: fresh_prod)
  7186     apply(erule conjE)+
  7007     apply(erule conjE)+
  7187     apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm)
  7008     apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm)
  7195     apply(rule exists_fresh'(2)[OF fs_coname1])
  7016     apply(rule exists_fresh'(2)[OF fs_coname1])
  7196     done
  7017     done
  7197 next
  7018 next
  7198   case (NotL c M z)
  7019   case (NotL c M z)
  7199   then show ?case  
  7020   then show ?case  
  7200     apply(auto simp add: fresh_prod fresh_atm subst_fresh)
  7021     apply(auto simp: fresh_prod fresh_atm subst_fresh)
  7201     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<a>.P},P{b:=(y).Q},M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}},y,Q)")
  7022     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<a>.P},P{b:=(y).Q},M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}},y,Q)")
  7202     apply(erule exE)
  7023     apply(erule exE)
  7203     apply(simp add: fresh_prod)
  7024     apply(simp add: fresh_prod)
  7204     apply(erule conjE)+
  7025     apply(erule conjE)+
  7205     apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm)
  7026     apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm)
  7206     apply(rule exists_fresh'(1)[OF fs_name1])
  7027     apply(rule exists_fresh'(1)[OF fs_name1])
  7207     done
  7028     done
  7208 next
  7029 next
  7209   case (AndR c1 M c2 N c3)
  7030   case (AndR c1 M c2 N c3)
  7210   then show ?case  
  7031   then show ?case  
  7211     apply(auto simp add: fresh_prod fresh_atm subst_fresh)
  7032     apply(auto simp: fresh_prod fresh_atm subst_fresh)
  7212     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(Q,M{c3:=(y).Q},M{c3:=(y).Q}{x:=<a>.P{c3:=(y).Q}},c2,c3,a,
  7033     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(Q,M{c3:=(y).Q},M{c3:=(y).Q}{x:=<a>.P{c3:=(y).Q}},c2,c3,a,
  7213                                      P{c3:=(y).Q},N{c3:=(y).Q},N{c3:=(y).Q}{x:=<a>.P{c3:=(y).Q}},c1)")
  7034                                      P{c3:=(y).Q},N{c3:=(y).Q},N{c3:=(y).Q}{x:=<a>.P{c3:=(y).Q}},c1)")
  7214     apply(erule exE)
  7035     apply(erule exE)
  7215     apply(simp add: fresh_prod)
  7036     apply(simp add: fresh_prod)
  7216     apply(erule conjE)+
  7037     apply(erule conjE)+
  7223     apply(rule exists_fresh'(2)[OF fs_coname1])
  7044     apply(rule exists_fresh'(2)[OF fs_coname1])
  7224     done
  7045     done
  7225 next
  7046 next
  7226   case (AndL1 z1 M z2)
  7047   case (AndL1 z1 M z2)
  7227   then show ?case  
  7048   then show ?case  
  7228     apply(auto simp add: fresh_prod fresh_atm subst_fresh)
  7049     apply(auto simp: fresh_prod fresh_atm subst_fresh)
  7229     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<a>.P},P{b:=(y).Q},z1,y,Q,M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}})")
  7050     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<a>.P},P{b:=(y).Q},z1,y,Q,M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}})")
  7230     apply(erule exE)
  7051     apply(erule exE)
  7231     apply(simp add: fresh_prod)
  7052     apply(simp add: fresh_prod)
  7232     apply(erule conjE)+
  7053     apply(erule conjE)+
  7233     apply(simp add: fresh_fun_simp_AndL1 abs_fresh fresh_atm)
  7054     apply(simp add: fresh_fun_simp_AndL1 abs_fresh fresh_atm)
  7234     apply(rule exists_fresh'(1)[OF fs_name1])
  7055     apply(rule exists_fresh'(1)[OF fs_name1])
  7235     done
  7056     done
  7236 next
  7057 next
  7237   case (AndL2 z1 M z2)
  7058   case (AndL2 z1 M z2)
  7238   then show ?case  
  7059   then show ?case  
  7239     apply(auto simp add: fresh_prod fresh_atm subst_fresh)
  7060     apply(auto simp: fresh_prod fresh_atm subst_fresh)
  7240     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<a>.P},P{b:=(y).Q},z1,y,Q,M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}})")
  7061     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<a>.P},P{b:=(y).Q},z1,y,Q,M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}})")
  7241     apply(erule exE)
  7062     apply(erule exE)
  7242     apply(simp add: fresh_prod)
  7063     apply(simp add: fresh_prod)
  7243     apply(erule conjE)+
  7064     apply(erule conjE)+
  7244     apply(simp add: fresh_fun_simp_AndL2 abs_fresh fresh_atm)
  7065     apply(simp add: fresh_fun_simp_AndL2 abs_fresh fresh_atm)
  7245     apply(rule exists_fresh'(1)[OF fs_name1])
  7066     apply(rule exists_fresh'(1)[OF fs_name1])
  7246     done
  7067     done
  7247 next
  7068 next
  7248   case (OrL z1 M z2 N z3)
  7069   case (OrL z1 M z2 N z3)
  7249   then show ?case  
  7070   then show ?case  
  7250     apply(auto simp add: fresh_prod fresh_atm subst_fresh)
  7071     apply(auto simp: fresh_prod fresh_atm subst_fresh)
  7251     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<a>.P},M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}},z2,z3,a,y,Q,
  7072     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,M{x:=<a>.P},M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}},z2,z3,a,y,Q,
  7252                                      P{b:=(y).Q},N{x:=<a>.P},N{b:=(y).Q}{x:=<a>.P{b:=(y).Q}},z1)")
  7073                                      P{b:=(y).Q},N{x:=<a>.P},N{b:=(y).Q}{x:=<a>.P{b:=(y).Q}},z1)")
  7253     apply(erule exE)
  7074     apply(erule exE)
  7254     apply(simp add: fresh_prod)
  7075     apply(simp add: fresh_prod)
  7255     apply(erule conjE)+
  7076     apply(erule conjE)+
  7261     apply(rule exists_fresh'(1)[OF fs_name1])
  7082     apply(rule exists_fresh'(1)[OF fs_name1])
  7262     done
  7083     done
  7263 next
  7084 next
  7264   case (OrR1 c1 M c2)
  7085   case (OrR1 c1 M c2)
  7265   then show ?case  
  7086   then show ?case  
  7266     apply(auto simp add: fresh_prod fresh_atm subst_fresh)
  7087     apply(auto simp: fresh_prod fresh_atm subst_fresh)
  7267     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(Q,M{c2:=(y).Q},a,P{c2:=(y).Q},c1,
  7088     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(Q,M{c2:=(y).Q},a,P{c2:=(y).Q},c1,
  7268                                                      M{c2:=(y).Q}{x:=<a>.P{c2:=(y).Q}})")
  7089                                                      M{c2:=(y).Q}{x:=<a>.P{c2:=(y).Q}})")
  7269     apply(erule exE)
  7090     apply(erule exE)
  7270     apply(simp add: fresh_prod)
  7091     apply(simp add: fresh_prod)
  7271     apply(erule conjE)+
  7092     apply(erule conjE)+
  7275     apply(rule exists_fresh'(2)[OF fs_coname1])
  7096     apply(rule exists_fresh'(2)[OF fs_coname1])
  7276     done
  7097     done
  7277 next
  7098 next
  7278   case (OrR2 c1 M c2)
  7099   case (OrR2 c1 M c2)
  7279   then show ?case  
  7100   then show ?case  
  7280     apply(auto simp add: fresh_prod fresh_atm subst_fresh)
  7101     apply(auto simp: fresh_prod fresh_atm subst_fresh)
  7281     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(Q,M{c2:=(y).Q},a,P{c2:=(y).Q},c1,
  7102     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(Q,M{c2:=(y).Q},a,P{c2:=(y).Q},c1,
  7282                                                      M{c2:=(y).Q}{x:=<a>.P{c2:=(y).Q}})")
  7103                                                      M{c2:=(y).Q}{x:=<a>.P{c2:=(y).Q}})")
  7283     apply(erule exE)
  7104     apply(erule exE)
  7284     apply(simp add: fresh_prod)
  7105     apply(simp add: fresh_prod)
  7285     apply(erule conjE)+
  7106     apply(erule conjE)+
  7289     apply(rule exists_fresh'(2)[OF fs_coname1])
  7110     apply(rule exists_fresh'(2)[OF fs_coname1])
  7290     done
  7111     done
  7291 next
  7112 next
  7292   case (ImpR z c M d)
  7113   case (ImpR z c M d)
  7293   then show ?case  
  7114   then show ?case  
  7294     apply(auto simp add: fresh_prod fresh_atm subst_fresh)
  7115     apply(auto simp: fresh_prod fresh_atm subst_fresh)
  7295     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(Q,M{d:=(y).Q},a,P{d:=(y).Q},c,
  7116     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(Q,M{d:=(y).Q},a,P{d:=(y).Q},c,
  7296                                                      M{d:=(y).Q}{x:=<a>.P{d:=(y).Q}})")
  7117                                                      M{d:=(y).Q}{x:=<a>.P{d:=(y).Q}})")
  7297     apply(erule exE)
  7118     apply(erule exE)
  7298     apply(simp add: fresh_prod)
  7119     apply(simp add: fresh_prod)
  7299     apply(erule conjE)+
  7120     apply(erule conjE)+
  7302     apply(rule exists_fresh'(2)[OF fs_coname1])
  7123     apply(rule exists_fresh'(2)[OF fs_coname1])
  7303     done
  7124     done
  7304 next
  7125 next
  7305   case (ImpL c M z N u)
  7126   case (ImpL c M z N u)
  7306   then show ?case  
  7127   then show ?case  
  7307     apply(auto simp add: fresh_prod fresh_atm subst_fresh)
  7128     apply(auto simp: fresh_prod fresh_atm subst_fresh)
  7308     apply(subgoal_tac "\<exists>z'::name. z'\<sharp>(P,P{b:=(y).Q},M{u:=<a>.P},N{u:=<a>.P},y,Q,
  7129     apply(subgoal_tac "\<exists>z'::name. z'\<sharp>(P,P{b:=(y).Q},M{u:=<a>.P},N{u:=<a>.P},y,Q,
  7309                         M{b:=(y).Q}{u:=<a>.P{b:=(y).Q}},N{b:=(y).Q}{u:=<a>.P{b:=(y).Q}},z)")
  7130                         M{b:=(y).Q}{u:=<a>.P{b:=(y).Q}},N{b:=(y).Q}{u:=<a>.P{b:=(y).Q}},z)")
  7310     apply(erule exE)
  7131     apply(erule exE)
  7311     apply(simp add: fresh_prod)
  7132     apply(simp add: fresh_prod)
  7312     apply(erule conjE)+
  7133     apply(erule conjE)+
  7324   shows "M{a:=(x).N}{y:=<b>.P} = M{y:=<b>.P}{a:=(x).N{y:=<b>.P}}"
  7145   shows "M{a:=(x).N}{y:=<b>.P} = M{y:=<b>.P}{a:=(x).N{y:=<b>.P}}"
  7325 using a
  7146 using a
  7326 proof(nominal_induct M avoiding: a x N y b P rule: trm.strong_induct)
  7147 proof(nominal_induct M avoiding: a x N y b P rule: trm.strong_induct)
  7327   case (Ax z c)
  7148   case (Ax z c)
  7328   then show ?case
  7149   then show ?case
  7329     by (auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7150     by (auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7330 next
  7151 next
  7331   case (Cut d M' u M'')
  7152   case (Cut d M' u M'')
  7332   then show ?case
  7153   then show ?case
  7333     apply(simp add: fresh_atm fresh_prod trm.inject abs_fresh)
  7154     apply(simp add: fresh_atm fresh_prod trm.inject abs_fresh)
  7334     apply(auto)
  7155     apply(auto)
  7383     apply(simp add: not_Ax2)
  7204     apply(simp add: not_Ax2)
  7384     done
  7205     done
  7385 next
  7206 next
  7386   case (NotR z M' d) 
  7207   case (NotR z M' d) 
  7387   then show ?case
  7208   then show ?case
  7388     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7209     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7389     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(y,P,N,N{y:=<b>.P},M'{d:=(x).N},M'{y:=<b>.P}{d:=(x).N{y:=<b>.P}})")
  7210     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(y,P,N,N{y:=<b>.P},M'{d:=(x).N},M'{y:=<b>.P}{d:=(x).N{y:=<b>.P}})")
  7390     apply(erule exE, simp add: fresh_prod)
  7211     apply(erule exE, simp add: fresh_prod)
  7391     apply(erule conjE)+
  7212     apply(erule conjE)+
  7392     apply(simp add: fresh_fun_simp_NotR)
  7213     apply(simp add: fresh_fun_simp_NotR)
  7393     apply(rule trans)
  7214     apply(rule trans)
  7403     apply(rule exists_fresh'(2)[OF fs_coname1])
  7224     apply(rule exists_fresh'(2)[OF fs_coname1])
  7404     done
  7225     done
  7405 next
  7226 next
  7406   case (NotL d M' z) 
  7227   case (NotL d M' z) 
  7407   then show ?case
  7228   then show ?case
  7408     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7229     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7409     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(z,y,P,N,N{y:=<b>.P},M'{y:=<b>.P},M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}})")
  7230     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(z,y,P,N,N{y:=<b>.P},M'{y:=<b>.P},M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}})")
  7410     apply(erule exE, simp add: fresh_prod)
  7231     apply(erule exE, simp add: fresh_prod)
  7411     apply(erule conjE)+
  7232     apply(erule conjE)+
  7412     apply(simp add: fresh_fun_simp_NotL)
  7233     apply(simp add: fresh_fun_simp_NotL)
  7413     apply(rule sym)
  7234     apply(rule sym)
  7425     apply(rule exists_fresh'(1)[OF fs_name1])
  7246     apply(rule exists_fresh'(1)[OF fs_name1])
  7426     done
  7247     done
  7427 next
  7248 next
  7428   case (AndR d M' e M'' f) 
  7249   case (AndR d M' e M'' f) 
  7429   then show ?case
  7250   then show ?case
  7430     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7251     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7431     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(P,b,d,e,N,N{y:=<b>.P},M'{f:=(x).N},M''{f:=(x).N},
  7252     apply(subgoal_tac "\<exists>a'::coname. a'\<sharp>(P,b,d,e,N,N{y:=<b>.P},M'{f:=(x).N},M''{f:=(x).N},
  7432                   M'{y:=<b>.P}{f:=(x).N{y:=<b>.P}},M''{y:=<b>.P}{f:=(x).N{y:=<b>.P}})")
  7253                   M'{y:=<b>.P}{f:=(x).N{y:=<b>.P}},M''{y:=<b>.P}{f:=(x).N{y:=<b>.P}})")
  7433     apply(erule exE, simp add: fresh_prod)
  7254     apply(erule exE, simp add: fresh_prod)
  7434     apply(erule conjE)+
  7255     apply(erule conjE)+
  7435     apply(simp add: fresh_fun_simp_AndR)
  7256     apply(simp add: fresh_fun_simp_AndR)
  7448     apply(rule exists_fresh'(2)[OF fs_coname1])
  7269     apply(rule exists_fresh'(2)[OF fs_coname1])
  7449     done
  7270     done
  7450 next
  7271 next
  7451   case (AndL1 z M' u) 
  7272   case (AndL1 z M' u) 
  7452   then show ?case
  7273   then show ?case
  7453     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7274     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7454     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,b,z,u,x,N,M'{y:=<b>.P},M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}})")
  7275     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,b,z,u,x,N,M'{y:=<b>.P},M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}})")
  7455     apply(erule exE, simp add: fresh_prod)
  7276     apply(erule exE, simp add: fresh_prod)
  7456     apply(erule conjE)+
  7277     apply(erule conjE)+
  7457     apply(simp add: fresh_fun_simp_AndL1)
  7278     apply(simp add: fresh_fun_simp_AndL1)
  7458     apply(rule sym)
  7279     apply(rule sym)
  7469     apply(rule exists_fresh'(1)[OF fs_name1])
  7290     apply(rule exists_fresh'(1)[OF fs_name1])
  7470     done
  7291     done
  7471 next
  7292 next
  7472   case (AndL2 z M' u) 
  7293   case (AndL2 z M' u) 
  7473   then show ?case
  7294   then show ?case
  7474     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7295     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7475     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,b,z,u,x,N,M'{y:=<b>.P},M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}})")
  7296     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(P,b,z,u,x,N,M'{y:=<b>.P},M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}})")
  7476     apply(erule exE, simp add: fresh_prod)
  7297     apply(erule exE, simp add: fresh_prod)
  7477     apply(erule conjE)+
  7298     apply(erule conjE)+
  7478     apply(simp add: fresh_fun_simp_AndL2)
  7299     apply(simp add: fresh_fun_simp_AndL2)
  7479     apply(rule sym)
  7300     apply(rule sym)
  7490     apply(rule exists_fresh'(1)[OF fs_name1])
  7311     apply(rule exists_fresh'(1)[OF fs_name1])
  7491     done
  7312     done
  7492 next
  7313 next
  7493   case (OrL u M' v M'' w) 
  7314   case (OrL u M' v M'' w) 
  7494   then show ?case
  7315   then show ?case
  7495     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7316     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7496     apply(subgoal_tac "\<exists>z'::name. z'\<sharp>(P,b,u,w,v,N,N{y:=<b>.P},M'{y:=<b>.P},M''{y:=<b>.P},
  7317     apply(subgoal_tac "\<exists>z'::name. z'\<sharp>(P,b,u,w,v,N,N{y:=<b>.P},M'{y:=<b>.P},M''{y:=<b>.P},
  7497                   M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}},M''{y:=<b>.P}{a:=(x).N{y:=<b>.P}})")
  7318                   M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}},M''{y:=<b>.P}{a:=(x).N{y:=<b>.P}})")
  7498     apply(erule exE, simp add: fresh_prod)
  7319     apply(erule exE, simp add: fresh_prod)
  7499     apply(erule conjE)+
  7320     apply(erule conjE)+
  7500     apply(simp add: fresh_fun_simp_OrL)
  7321     apply(simp add: fresh_fun_simp_OrL)
  7514     apply(rule exists_fresh'(1)[OF fs_name1])
  7335     apply(rule exists_fresh'(1)[OF fs_name1])
  7515     done
  7336     done
  7516 next
  7337 next
  7517   case (OrR1 e M' f) 
  7338   case (OrR1 e M' f) 
  7518   then show ?case
  7339   then show ?case
  7519     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7340     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7520     apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(P,b,e,f,x,N,N{y:=<b>.P},
  7341     apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(P,b,e,f,x,N,N{y:=<b>.P},
  7521                                         M'{f:=(x).N},M'{y:=<b>.P}{f:=(x).N{y:=<b>.P}})")
  7342                                         M'{f:=(x).N},M'{y:=<b>.P}{f:=(x).N{y:=<b>.P}})")
  7522     apply(erule exE, simp add: fresh_prod)
  7343     apply(erule exE, simp add: fresh_prod)
  7523     apply(erule conjE)+
  7344     apply(erule conjE)+
  7524     apply(simp add: fresh_fun_simp_OrR1)
  7345     apply(simp add: fresh_fun_simp_OrR1)
  7535     apply(rule exists_fresh'(2)[OF fs_coname1])
  7356     apply(rule exists_fresh'(2)[OF fs_coname1])
  7536     done
  7357     done
  7537 next
  7358 next
  7538   case (OrR2 e M' f) 
  7359   case (OrR2 e M' f) 
  7539   then show ?case
  7360   then show ?case
  7540     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7361     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7541     apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(P,b,e,f,x,N,N{y:=<b>.P},
  7362     apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(P,b,e,f,x,N,N{y:=<b>.P},
  7542                                         M'{f:=(x).N},M'{y:=<b>.P}{f:=(x).N{y:=<b>.P}})")
  7363                                         M'{f:=(x).N},M'{y:=<b>.P}{f:=(x).N{y:=<b>.P}})")
  7543     apply(erule exE, simp add: fresh_prod)
  7364     apply(erule exE, simp add: fresh_prod)
  7544     apply(erule conjE)+
  7365     apply(erule conjE)+
  7545     apply(simp add: fresh_fun_simp_OrR2)
  7366     apply(simp add: fresh_fun_simp_OrR2)
  7556     apply(rule exists_fresh'(2)[OF fs_coname1])
  7377     apply(rule exists_fresh'(2)[OF fs_coname1])
  7557     done
  7378     done
  7558 next
  7379 next
  7559   case (ImpR x e M' f) 
  7380   case (ImpR x e M' f) 
  7560   then show ?case
  7381   then show ?case
  7561     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7382     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7562     apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(P,b,e,f,x,N,N{y:=<b>.P},
  7383     apply(subgoal_tac "\<exists>c'::coname. c'\<sharp>(P,b,e,f,x,N,N{y:=<b>.P},
  7563                                         M'{f:=(x).N},M'{y:=<b>.P}{f:=(x).N{y:=<b>.P}})")
  7384                                         M'{f:=(x).N},M'{y:=<b>.P}{f:=(x).N{y:=<b>.P}})")
  7564     apply(erule exE, simp add: fresh_prod)
  7385     apply(erule exE, simp add: fresh_prod)
  7565     apply(erule conjE)+
  7386     apply(erule conjE)+
  7566     apply(simp add: fresh_fun_simp_ImpR)
  7387     apply(simp add: fresh_fun_simp_ImpR)
  7579     apply(simp add: fresh_atm trm.inject alpha abs_fresh fin_supp abs_supp)
  7400     apply(simp add: fresh_atm trm.inject alpha abs_fresh fin_supp abs_supp)
  7580     done
  7401     done
  7581 next
  7402 next
  7582   case (ImpL e M' v M'' w) 
  7403   case (ImpL e M' v M'' w) 
  7583   then show ?case
  7404   then show ?case
  7584     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7405     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject)
  7585     apply(subgoal_tac "\<exists>z'::name. z'\<sharp>(P,b,e,w,v,N,N{y:=<b>.P},M'{w:=<b>.P},M''{w:=<b>.P},
  7406     apply(subgoal_tac "\<exists>z'::name. z'\<sharp>(P,b,e,w,v,N,N{y:=<b>.P},M'{w:=<b>.P},M''{w:=<b>.P},
  7586                   M'{w:=<b>.P}{a:=(x).N{w:=<b>.P}},M''{w:=<b>.P}{a:=(x).N{w:=<b>.P}})")
  7407                   M'{w:=<b>.P}{a:=(x).N{w:=<b>.P}},M''{w:=<b>.P}{a:=(x).N{w:=<b>.P}})")
  7587     apply(erule exE, simp add: fresh_prod)
  7408     apply(erule exE, simp add: fresh_prod)
  7588     apply(erule conjE)+
  7409     apply(erule conjE)+
  7589     apply(simp add: fresh_fun_simp_ImpL)
  7410     apply(simp add: fresh_fun_simp_ImpL)
  7608   shows "N{x:=<a>.M}{y:=<c>.P} = N{y:=<c>.P}{x:=<a>.(M{y:=<c>.P})}"
  7429   shows "N{x:=<a>.M}{y:=<c>.P} = N{y:=<c>.P}{x:=<a>.(M{y:=<c>.P})}"
  7609 using a
  7430 using a
  7610 proof(nominal_induct N avoiding: x y a c M P rule: trm.strong_induct)
  7431 proof(nominal_induct N avoiding: x y a c M P rule: trm.strong_induct)
  7611   case (Ax z c)
  7432   case (Ax z c)
  7612   then show ?case
  7433   then show ?case
  7613     by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7434     by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7614 next
  7435 next
  7615   case (Cut d M' u M'')
  7436   case (Cut d M' u M'')
  7616   then show ?case
  7437   then show ?case
  7617     apply(simp add: fresh_atm fresh_prod trm.inject abs_fresh)
  7438     apply(simp add: fresh_atm fresh_prod trm.inject abs_fresh)
  7618     apply(auto)
  7439     apply(auto)
  7648     apply(simp add: not_Ax2)
  7469     apply(simp add: not_Ax2)
  7649     done
  7470     done
  7650 next
  7471 next
  7651   case NotR
  7472   case NotR
  7652   then show ?case
  7473   then show ?case
  7653     by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7474     by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7654 next
  7475 next
  7655   case (NotL d M' u)
  7476   case (NotL d M' u)
  7656   then show ?case
  7477   then show ?case
  7657     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7478     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7658     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(y,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})")
  7479     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(y,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})")
  7659     apply(erule exE, simp add: fresh_prod)
  7480     apply(erule exE, simp add: fresh_prod)
  7660     apply(erule conjE)+
  7481     apply(erule conjE)+
  7661     apply(simp add: fresh_fun_simp_NotL)
  7482     apply(simp add: fresh_fun_simp_NotL)
  7662     apply(rule trans)
  7483     apply(rule trans)
  7691     apply(rule exists_fresh'(1)[OF fs_name1])
  7512     apply(rule exists_fresh'(1)[OF fs_name1])
  7692     done
  7513     done
  7693 next
  7514 next
  7694   case AndR
  7515   case AndR
  7695   then show ?case
  7516   then show ?case
  7696     by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7517     by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7697 next
  7518 next
  7698   case (AndL1 u M' v)
  7519   case (AndL1 u M' v)
  7699   then show ?case
  7520   then show ?case
  7700     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7521     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7701     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(u,y,v,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})")
  7522     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(u,y,v,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})")
  7702     apply(erule exE, simp add: fresh_prod)
  7523     apply(erule exE, simp add: fresh_prod)
  7703     apply(erule conjE)+
  7524     apply(erule conjE)+
  7704     apply(simp add: fresh_fun_simp_AndL1)
  7525     apply(simp add: fresh_fun_simp_AndL1)
  7705     apply(rule trans)
  7526     apply(rule trans)
  7734     apply(rule exists_fresh'(1)[OF fs_name1])
  7555     apply(rule exists_fresh'(1)[OF fs_name1])
  7735     done
  7556     done
  7736 next
  7557 next
  7737   case (AndL2 u M' v)
  7558   case (AndL2 u M' v)
  7738   then show ?case
  7559   then show ?case
  7739     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7560     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7740     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(u,y,v,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})")
  7561     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(u,y,v,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})")
  7741     apply(erule exE, simp add: fresh_prod)
  7562     apply(erule exE, simp add: fresh_prod)
  7742     apply(erule conjE)+
  7563     apply(erule conjE)+
  7743     apply(simp add: fresh_fun_simp_AndL2)
  7564     apply(simp add: fresh_fun_simp_AndL2)
  7744     apply(rule trans)
  7565     apply(rule trans)
  7773     apply(rule exists_fresh'(1)[OF fs_name1])
  7594     apply(rule exists_fresh'(1)[OF fs_name1])
  7774     done
  7595     done
  7775 next
  7596 next
  7776   case OrR1
  7597   case OrR1
  7777   then show ?case
  7598   then show ?case
  7778     by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7599     by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7779 next
  7600 next
  7780   case OrR2
  7601   case OrR2
  7781   then show ?case
  7602   then show ?case
  7782     by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7603     by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7783 next
  7604 next
  7784   case (OrL x1 M' x2 M'' x3)
  7605   case (OrL x1 M' x2 M'' x3)
  7785   then show ?case
  7606   then show ?case
  7786     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7607     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7787     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(y,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}},
  7608     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(y,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}},
  7788                                       x1,x2,x3,M''{x:=<a>.M},M''{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})")
  7609                                       x1,x2,x3,M''{x:=<a>.M},M''{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})")
  7789     apply(erule exE, simp add: fresh_prod)
  7610     apply(erule exE, simp add: fresh_prod)
  7790     apply(erule conjE)+
  7611     apply(erule conjE)+
  7791     apply(simp add: fresh_fun_simp_OrL)
  7612     apply(simp add: fresh_fun_simp_OrL)
  7825     apply(rule exists_fresh'(1)[OF fs_name1])
  7646     apply(rule exists_fresh'(1)[OF fs_name1])
  7826     done
  7647     done
  7827 next
  7648 next
  7828   case ImpR
  7649   case ImpR
  7829   then show ?case
  7650   then show ?case
  7830     by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7651     by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7831 next
  7652 next
  7832   case (ImpL d M' x1 M'' x2)
  7653   case (ImpL d M' x1 M'' x2)
  7833   then show ?case
  7654   then show ?case
  7834     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7655     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7835     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(y,P,M,M{y:=<c>.P},M'{x2:=<a>.M},M'{y:=<c>.P}{x2:=<a>.M{y:=<c>.P}},
  7656     apply(subgoal_tac "\<exists>x'::name. x'\<sharp>(y,P,M,M{y:=<c>.P},M'{x2:=<a>.M},M'{y:=<c>.P}{x2:=<a>.M{y:=<c>.P}},
  7836                                       x1,x2,M''{x2:=<a>.M},M''{y:=<c>.P}{x2:=<a>.M{y:=<c>.P}})")
  7657                                       x1,x2,M''{x2:=<a>.M},M''{y:=<c>.P}{x2:=<a>.M{y:=<c>.P}})")
  7837     apply(erule exE, simp add: fresh_prod)
  7658     apply(erule exE, simp add: fresh_prod)
  7838     apply(erule conjE)+
  7659     apply(erule conjE)+
  7839     apply(simp add: fresh_fun_simp_ImpL)
  7660     apply(simp add: fresh_fun_simp_ImpL)
  7877   shows "N{a:=(x).M}{c:=(y).P} = N{c:=(y).P}{a:=(x).(M{c:=(y).P})}"
  7698   shows "N{a:=(x).M}{c:=(y).P} = N{c:=(y).P}{a:=(x).(M{c:=(y).P})}"
  7878 using a
  7699 using a
  7879 proof(nominal_induct N avoiding: x y a c M P rule: trm.strong_induct)
  7700 proof(nominal_induct N avoiding: x y a c M P rule: trm.strong_induct)
  7880   case (Ax z c)
  7701   case (Ax z c)
  7881   then show ?case
  7702   then show ?case
  7882     by (auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7703     by (auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7883 next
  7704 next
  7884   case (Cut d M' u M'')
  7705   case (Cut d M' u M'')
  7885   then show ?case
  7706   then show ?case
  7886     apply(simp add: fresh_atm fresh_prod trm.inject abs_fresh)
  7707     apply(simp add: fresh_atm fresh_prod trm.inject abs_fresh)
  7887     apply(auto)
  7708     apply(auto)
  7917     apply(simp add: not_Ax1)
  7738     apply(simp add: not_Ax1)
  7918     done
  7739     done
  7919 next
  7740 next
  7920   case NotL
  7741   case NotL
  7921   then show ?case
  7742   then show ?case
  7922     by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7743     by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7923 next
  7744 next
  7924   case (NotR u M' d)
  7745   case (NotR u M' d)
  7925   then show ?case
  7746   then show ?case
  7926     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7747     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7927     apply(generate_fresh "coname")
  7748     apply(generate_fresh "coname")
  7928     apply(fresh_fun_simp)
  7749     apply(fresh_fun_simp)
  7929     apply(fresh_fun_simp)
  7750     apply(fresh_fun_simp)
  7930     apply(simp add: abs_fresh subst_fresh)
  7751     apply(simp add: abs_fresh subst_fresh)
  7931     apply(rule trans)
  7752     apply(rule trans)
  7935     apply(simp)
  7756     apply(simp)
  7936     apply(simp add: trm.inject alpha)
  7757     apply(simp add: trm.inject alpha)
  7937     apply(rule trans)
  7758     apply(rule trans)
  7938     apply(rule substc.simps)
  7759     apply(rule substc.simps)
  7939     apply(simp add: fresh_prod fresh_atm)
  7760     apply(simp add: fresh_prod fresh_atm)
  7940     apply(auto simp add: fresh_atm fresh_prod)[1]
  7761     apply(auto simp: fresh_atm fresh_prod)[1]
  7941     apply(generate_fresh "coname")
  7762     apply(generate_fresh "coname")
  7942     apply(fresh_fun_simp)
  7763     apply(fresh_fun_simp)
  7943     apply(fresh_fun_simp)
  7764     apply(fresh_fun_simp)
  7944     apply(rule sym)
  7765     apply(rule sym)
  7945     apply(rule trans)
  7766     apply(rule trans)
  7946     apply(rule better_Cut_substc)
  7767     apply(rule better_Cut_substc)
  7947     apply(simp add: fresh_prod fresh_atm subst_fresh)
  7768     apply(simp add: fresh_prod fresh_atm subst_fresh)
  7948     apply(simp add: abs_fresh subst_fresh)
  7769     apply(simp add: abs_fresh subst_fresh)
  7949     apply(auto simp add: fresh_atm)
  7770     apply(auto simp: fresh_atm)
  7950     apply(simp add: trm.inject alpha forget)
  7771     apply(simp add: trm.inject alpha forget)
  7951     apply(rule trans)
  7772     apply(rule trans)
  7952     apply(rule substc.simps)
  7773     apply(rule substc.simps)
  7953     apply(simp add: fresh_atm subst_fresh)
  7774     apply(simp add: fresh_atm subst_fresh)
  7954     apply(auto simp add: fresh_prod fresh_atm) 
  7775     apply(auto simp: fresh_prod fresh_atm) 
  7955     done
  7776     done
  7956 next
  7777 next
  7957   case AndL1
  7778   case AndL1
  7958   then show ?case
  7779   then show ?case
  7959     by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7780     by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7960 next
  7781 next
  7961   case AndL2
  7782   case AndL2
  7962   then show ?case
  7783   then show ?case
  7963     by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7784     by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7964 next
  7785 next
  7965   case (AndR d M e M' f)
  7786   case (AndR d M e M' f)
  7966   then show ?case
  7787   then show ?case
  7967     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7788     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7968     apply(generate_fresh "coname")
  7789     apply(generate_fresh "coname")
  7969     apply(fresh_fun_simp)
  7790     apply(fresh_fun_simp)
  7970     apply(fresh_fun_simp)
  7791     apply(fresh_fun_simp)
  7971     apply(simp add: abs_fresh subst_fresh)
  7792     apply(simp add: abs_fresh subst_fresh)
  7972     apply(rule trans)
  7793     apply(rule trans)
  7975     apply(simp add: abs_fresh)
  7796     apply(simp add: abs_fresh)
  7976     apply(simp)
  7797     apply(simp)
  7977     apply(simp add: trm.inject alpha)
  7798     apply(simp add: trm.inject alpha)
  7978     apply(rule trans)
  7799     apply(rule trans)
  7979     apply(rule substc.simps)
  7800     apply(rule substc.simps)
  7980     apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1]
  7801     apply(auto simp: fresh_prod fresh_atm subst_fresh)[1]
  7981     apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1]
  7802     apply(auto simp: fresh_prod fresh_atm subst_fresh)[1]
  7982     apply(simp)
  7803     apply(simp)
  7983     apply(auto simp add: fresh_atm fresh_prod)[1]
  7804     apply(auto simp: fresh_atm fresh_prod)[1]
  7984     apply(generate_fresh "coname")
  7805     apply(generate_fresh "coname")
  7985     apply(fresh_fun_simp)
  7806     apply(fresh_fun_simp)
  7986     apply(fresh_fun_simp)
  7807     apply(fresh_fun_simp)
  7987     apply(rule sym)
  7808     apply(rule sym)
  7988     apply(rule trans)
  7809     apply(rule trans)
  7989     apply(rule better_Cut_substc)
  7810     apply(rule better_Cut_substc)
  7990     apply(simp add: subst_fresh fresh_atm fresh_prod)
  7811     apply(simp add: subst_fresh fresh_atm fresh_prod)
  7991     apply(simp add: abs_fresh subst_fresh)
  7812     apply(simp add: abs_fresh subst_fresh)
  7992     apply(auto simp add: fresh_atm)[1]
  7813     apply(auto simp: fresh_atm)[1]
  7993     apply(simp add: trm.inject alpha forget)
  7814     apply(simp add: trm.inject alpha forget)
  7994     apply(rule trans)
  7815     apply(rule trans)
  7995     apply(rule substc.simps)
  7816     apply(rule substc.simps)
  7996     apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1]
  7817     apply(auto simp: fresh_prod fresh_atm subst_fresh)[1]
  7997     apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1]
  7818     apply(auto simp: fresh_prod fresh_atm subst_fresh)[1]
  7998     apply(simp)
  7819     apply(simp)
  7999     apply(auto simp add: fresh_atm fresh_prod)[1]
  7820     apply(auto simp: fresh_atm fresh_prod)[1]
  8000     done
  7821     done
  8001 next
  7822 next
  8002   case OrL
  7823   case OrL
  8003   then show ?case
  7824   then show ?case
  8004     by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7825     by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  8005 next
  7826 next
  8006   case (OrR1 d M' e)
  7827   case (OrR1 d M' e)
  8007   then show ?case
  7828   then show ?case
  8008     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7829     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  8009     apply(generate_fresh "coname")
  7830     apply(generate_fresh "coname")
  8010     apply(fresh_fun_simp)
  7831     apply(fresh_fun_simp)
  8011     apply(fresh_fun_simp)
  7832     apply(fresh_fun_simp)
  8012     apply(simp add: abs_fresh subst_fresh)
  7833     apply(simp add: abs_fresh subst_fresh)
  8013     apply(rule trans)
  7834     apply(rule trans)
  8016     apply(simp add: abs_fresh)
  7837     apply(simp add: abs_fresh)
  8017     apply(simp)
  7838     apply(simp)
  8018     apply(simp add: trm.inject alpha)
  7839     apply(simp add: trm.inject alpha)
  8019     apply(rule trans)
  7840     apply(rule trans)
  8020     apply(rule substc.simps)
  7841     apply(rule substc.simps)
  8021     apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1]
  7842     apply(auto simp: fresh_prod fresh_atm subst_fresh)[1]
  8022     apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1]
  7843     apply(auto simp: fresh_prod fresh_atm subst_fresh)[1]
  8023     apply(generate_fresh "coname")
  7844     apply(generate_fresh "coname")
  8024     apply(fresh_fun_simp)
  7845     apply(fresh_fun_simp)
  8025     apply(fresh_fun_simp)
  7846     apply(fresh_fun_simp)
  8026     apply(rule sym)
  7847     apply(rule sym)
  8027     apply(rule trans)
  7848     apply(rule trans)
  8028     apply(rule better_Cut_substc)
  7849     apply(rule better_Cut_substc)
  8029     apply(simp add: subst_fresh fresh_atm fresh_prod)
  7850     apply(simp add: subst_fresh fresh_atm fresh_prod)
  8030     apply(simp add: abs_fresh subst_fresh)
  7851     apply(simp add: abs_fresh subst_fresh)
  8031     apply(auto simp add: fresh_atm)[1]
  7852     apply(auto simp: fresh_atm)[1]
  8032     apply(simp add: trm.inject alpha forget)
  7853     apply(simp add: trm.inject alpha forget)
  8033     apply(rule trans)
  7854     apply(rule trans)
  8034     apply(rule substc.simps)
  7855     apply(rule substc.simps)
  8035     apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1]
  7856     apply(auto simp: fresh_prod fresh_atm subst_fresh)[1]
  8036     apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1]
  7857     apply(auto simp: fresh_prod fresh_atm subst_fresh)[1]
  8037     done
  7858     done
  8038 next
  7859 next
  8039   case (OrR2 d M' e)
  7860   case (OrR2 d M' e)
  8040   then show ?case
  7861   then show ?case
  8041     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7862     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  8042     apply(generate_fresh "coname")
  7863     apply(generate_fresh "coname")
  8043     apply(fresh_fun_simp)
  7864     apply(fresh_fun_simp)
  8044     apply(fresh_fun_simp)
  7865     apply(fresh_fun_simp)
  8045     apply(simp add: abs_fresh subst_fresh)
  7866     apply(simp add: abs_fresh subst_fresh)
  8046     apply(rule trans)
  7867     apply(rule trans)
  8049     apply(simp add: abs_fresh)
  7870     apply(simp add: abs_fresh)
  8050     apply(simp)
  7871     apply(simp)
  8051     apply(simp add: trm.inject alpha)
  7872     apply(simp add: trm.inject alpha)
  8052     apply(rule trans)
  7873     apply(rule trans)
  8053     apply(rule substc.simps)
  7874     apply(rule substc.simps)
  8054     apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1]
  7875     apply(auto simp: fresh_prod fresh_atm subst_fresh)[1]
  8055     apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1]
  7876     apply(auto simp: fresh_prod fresh_atm subst_fresh)[1]
  8056     apply(generate_fresh "coname")
  7877     apply(generate_fresh "coname")
  8057     apply(fresh_fun_simp)
  7878     apply(fresh_fun_simp)
  8058     apply(fresh_fun_simp)
  7879     apply(fresh_fun_simp)
  8059     apply(rule sym)
  7880     apply(rule sym)
  8060     apply(rule trans)
  7881     apply(rule trans)
  8061     apply(rule better_Cut_substc)
  7882     apply(rule better_Cut_substc)
  8062     apply(simp add: subst_fresh fresh_atm fresh_prod)
  7883     apply(simp add: subst_fresh fresh_atm fresh_prod)
  8063     apply(simp add: abs_fresh subst_fresh)
  7884     apply(simp add: abs_fresh subst_fresh)
  8064     apply(auto simp add: fresh_atm)[1]
  7885     apply(auto simp: fresh_atm)[1]
  8065     apply(simp add: trm.inject alpha forget)
  7886     apply(simp add: trm.inject alpha forget)
  8066     apply(rule trans)
  7887     apply(rule trans)
  8067     apply(rule substc.simps)
  7888     apply(rule substc.simps)
  8068     apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1]
  7889     apply(auto simp: fresh_prod fresh_atm subst_fresh)[1]
  8069     apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1]
  7890     apply(auto simp: fresh_prod fresh_atm subst_fresh)[1]
  8070     done
  7891     done
  8071 next
  7892 next
  8072   case ImpL
  7893   case ImpL
  8073   then show ?case
  7894   then show ?case
  8074     by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7895     by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  8075 next
  7896 next
  8076   case (ImpR u d M' e)
  7897   case (ImpR u d M' e)
  8077   then show ?case
  7898   then show ?case
  8078     apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  7899     apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget)
  8079     apply(generate_fresh "coname")
  7900     apply(generate_fresh "coname")
  8080     apply(fresh_fun_simp)
  7901     apply(fresh_fun_simp)
  8081     apply(fresh_fun_simp)
  7902     apply(fresh_fun_simp)
  8082     apply(simp add: abs_fresh subst_fresh)
  7903     apply(simp add: abs_fresh subst_fresh)
  8083     apply(rule trans)
  7904     apply(rule trans)
  8086     apply(simp add: abs_fresh)
  7907     apply(simp add: abs_fresh)
  8087     apply(simp)
  7908     apply(simp)
  8088     apply(simp add: trm.inject alpha)
  7909     apply(simp add: trm.inject alpha)
  8089     apply(rule trans)
  7910     apply(rule trans)
  8090     apply(rule substc.simps)
  7911     apply(rule substc.simps)
  8091     apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1]
  7912     apply(auto simp: fresh_prod fresh_atm subst_fresh)[1]
  8092     apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1]
  7913     apply(auto simp: fresh_prod fresh_atm subst_fresh)[1]
  8093     apply(auto simp add: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1]
  7914     apply(auto simp: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1]
  8094     apply(generate_fresh "coname")
  7915     apply(generate_fresh "coname")
  8095     apply(fresh_fun_simp)
  7916     apply(fresh_fun_simp)
  8096     apply(fresh_fun_simp)
  7917     apply(fresh_fun_simp)
  8097     apply(rule sym)
  7918     apply(rule sym)
  8098     apply(rule trans)
  7919     apply(rule trans)
  8099     apply(rule better_Cut_substc)
  7920     apply(rule better_Cut_substc)
  8100     apply(simp add: subst_fresh fresh_atm fresh_prod)
  7921     apply(simp add: subst_fresh fresh_atm fresh_prod)
  8101     apply(simp add: abs_fresh subst_fresh)
  7922     apply(simp add: abs_fresh subst_fresh)
  8102     apply(auto simp add: fresh_atm)[1]
  7923     apply(auto simp: fresh_atm)[1]
  8103     apply(simp add: trm.inject alpha forget)
  7924     apply(simp add: trm.inject alpha forget)
  8104     apply(rule trans)
  7925     apply(rule trans)
  8105     apply(rule substc.simps)
  7926     apply(rule substc.simps)
  8106     apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1]
  7927     apply(auto simp: fresh_prod fresh_atm subst_fresh)[1]
  8107     apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1]
  7928     apply(auto simp: fresh_prod fresh_atm subst_fresh)[1]
  8108     apply(auto simp add: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1]
  7929     apply(auto simp: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1]
  8109     apply(auto simp add: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1]
  7930     apply(auto simp: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1]
  8110     done
  7931     done
  8111 qed
  7932 qed
  8112 
  7933 
  8113 end
  7934 end