diff --git a/src/HOL/Nominal/Examples/Class1.thy b/src/HOL/Nominal/Examples/Class1.thy --- a/src/HOL/Nominal/Examples/Class1.thy +++ b/src/HOL/Nominal/Examples/Class1.thy @@ -1,8113 +1,7934 @@ theory Class1 -imports "HOL-Nominal.Nominal" +imports "HOL-Nominal.Nominal" begin section \Term-Calculus from Urban's PhD\ atom_decl name coname text \types\ no_notation not ("NOT") nominal_datatype ty = PR "string" | NOT "ty" | AND "ty" "ty" ("_ AND _" [100,100] 100) | OR "ty" "ty" ("_ OR _" [100,100] 100) | IMP "ty" "ty" ("_ IMP _" [100,100] 100) instantiation ty :: size begin nominal_primrec size_ty where "size (PR s) = (1::nat)" | "size (NOT T) = 1 + size T" | "size (T1 AND T2) = 1 + size T1 + size T2" | "size (T1 OR T2) = 1 + size T1 + size T2" | "size (T1 IMP T2) = 1 + size T1 + size T2" by (rule TrueI)+ instance .. end lemma ty_cases: fixes T::ty shows "(\s. T=PR s) \ (\T'. T=NOT T') \ (\S U. T=S OR U) \ (\S U. T=S AND U) \ (\S U. T=S IMP U)" by (induct T rule:ty.induct) (auto) lemma fresh_ty: fixes a::"coname" and x::"name" and T::"ty" shows "a\T" and "x\T" by (nominal_induct T rule: ty.strong_induct) - (auto simp add: fresh_string) - -text \terms\ + (auto simp: fresh_string) + +text \terms\ nominal_datatype trm = Ax "name" "coname" | Cut "\coname\trm" "\name\trm" ("Cut <_>._ (_)._" [100,100,100,100] 100) | NotR "\name\trm" "coname" ("NotR (_)._ _" [100,100,100] 100) | NotL "\coname\trm" "name" ("NotL <_>._ _" [100,100,100] 100) | AndR "\coname\trm" "\coname\trm" "coname" ("AndR <_>._ <_>._ _" [100,100,100,100,100] 100) | AndL1 "\name\trm" "name" ("AndL1 (_)._ _" [100,100,100] 100) | AndL2 "\name\trm" "name" ("AndL2 (_)._ _" [100,100,100] 100) | OrR1 "\coname\trm" "coname" ("OrR1 <_>._ _" [100,100,100] 100) | OrR2 "\coname\trm" "coname" ("OrR2 <_>._ _" [100,100,100] 100) | OrL "\name\trm" "\name\trm" "name" ("OrL (_)._ (_)._ _" [100,100,100,100,100] 100) | ImpR "\name\(\coname\trm)" "coname" ("ImpR (_).<_>._ _" [100,100,100,100] 100) | ImpL "\coname\trm" "\name\trm" "name" ("ImpL <_>._ (_)._ _" [100,100,100,100,100] 100) text \named terms\ nominal_datatype ntrm = Na "\name\trm" ("((_):_)" [100,100] 100) text \conamed terms\ nominal_datatype ctrm = Co "\coname\trm" ("(<_>:_)" [100,100] 100) text \renaming functions\ nominal_primrec (freshness_context: "(d::coname,e::coname)") crename :: "trm \ coname \ coname \ trm" ("_[_\c>_]" [100,100,100] 100) where "(Ax x a)[d\c>e] = (if a=d then Ax x e else Ax x a)" | "\a\(d,e,N);x\M\ \ (Cut .M (x).N)[d\c>e] = Cut .(M[d\c>e]) (x).(N[d\c>e])" | "(NotR (x).M a)[d\c>e] = (if a=d then NotR (x).(M[d\c>e]) e else NotR (x).(M[d\c>e]) a)" | "a\(d,e) \ (NotL .M x)[d\c>e] = (NotL .(M[d\c>e]) x)" | "\a\(d,e,N,c);b\(d,e,M,c);b\a\ \ (AndR .M .N c)[d\c>e] = (if c=d then AndR .(M[d\c>e]) .(N[d \c>e]) e else AndR .(M[d\c>e]) .(N[d\c>e]) c)" | "x\y \ (AndL1 (x).M y)[d\c>e] = AndL1 (x).(M[d\c>e]) y" | "x\y \ (AndL2 (x).M y)[d\c>e] = AndL2 (x).(M[d\c>e]) y" | "a\(d,e,b) \ (OrR1 .M b)[d\c>e] = (if b=d then OrR1 .(M[d\c>e]) e else OrR1 .(M[d\c>e]) b)" | "a\(d,e,b) \ (OrR2 .M b)[d\c>e] = (if b=d then OrR2 .(M[d\c>e]) e else OrR2 .(M[d\c>e]) b)" | "\x\(N,z);y\(M,z);y\x\ \ (OrL (x).M (y).N z)[d\c>e] = OrL (x).(M[d\c>e]) (y).(N[d\c>e]) z" | "a\(d,e,b) \ (ImpR (x)..M b)[d\c>e] = (if b=d then ImpR (x)..(M[d\c>e]) e else ImpR (x)..(M[d\c>e]) b)" | "\a\(d,e,N);x\(M,y)\ \ (ImpL .M (x).N y)[d\c>e] = ImpL .(M[d\c>e]) (x).(N[d\c>e]) y" -apply(finite_guess)+ -apply(rule TrueI)+ -apply(simp add: abs_fresh abs_supp fin_supp)+ -apply(fresh_guess)+ -done + by(finite_guess | simp add: abs_fresh abs_supp fin_supp | fresh_guess)+ nominal_primrec (freshness_context: "(u::name,v::name)") nrename :: "trm \ name \ name \ trm" ("_[_\n>_]" [100,100,100] 100) where "(Ax x a)[u\n>v] = (if x=u then Ax v a else Ax x a)" | "\a\N;x\(u,v,M)\ \ (Cut .M (x).N)[u\n>v] = Cut .(M[u\n>v]) (x).(N[u\n>v])" | "x\(u,v) \ (NotR (x).M a)[u\n>v] = NotR (x).(M[u\n>v]) a" | "(NotL .M x)[u\n>v] = (if x=u then NotL .(M[u\n>v]) v else NotL .(M[u\n>v]) x)" | "\a\(N,c);b\(M,c);b\a\ \ (AndR .M .N c)[u\n>v] = AndR .(M[u\n>v]) .(N[u\n>v]) c" | "x\(u,v,y) \ (AndL1 (x).M y)[u\n>v] = (if y=u then AndL1 (x).(M[u\n>v]) v else AndL1 (x).(M[u\n>v]) y)" | "x\(u,v,y) \ (AndL2 (x).M y)[u\n>v] = (if y=u then AndL2 (x).(M[u\n>v]) v else AndL2 (x).(M[u\n>v]) y)" | "a\b \ (OrR1 .M b)[u\n>v] = OrR1 .(M[u\n>v]) b" | "a\b \ (OrR2 .M b)[u\n>v] = OrR2 .(M[u\n>v]) b" | "\x\(u,v,N,z);y\(u,v,M,z);y\x\ \ (OrL (x).M (y).N z)[u\n>v] = (if z=u then OrL (x).(M[u\n>v]) (y).(N[u\n>v]) v else OrL (x).(M[u\n>v]) (y).(N[u\n>v]) z)" | "\a\b; x\(u,v)\ \ (ImpR (x)..M b)[u\n>v] = ImpR (x)..(M[u\n>v]) b" | "\a\N;x\(u,v,M,y)\ \ (ImpL .M (x).N y)[u\n>v] = (if y=u then ImpL .(M[u\n>v]) (x).(N[u\n>v]) v else ImpL .(M[u\n>v]) (x).(N[u\n>v]) y)" -apply(finite_guess)+ -apply(rule TrueI)+ -apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1)+ -apply(fresh_guess)+ -done + by(finite_guess | simp add: abs_fresh abs_supp fin_supp | fresh_guess)+ lemmas eq_bij = pt_bij[OF pt_name_inst, OF at_name_inst] pt_bij[OF pt_coname_inst, OF at_coname_inst] lemma crename_name_eqvt[eqvt]: fixes pi::"name prm" shows "pi\(M[d\c>e]) = (pi\M)[(pi\d)\c>(pi\e)]" -apply(nominal_induct M avoiding: d e rule: trm.strong_induct) -apply(auto simp add: fresh_bij eq_bij) -done + by (nominal_induct M avoiding: d e rule: trm.strong_induct) (auto simp: fresh_bij eq_bij) lemma crename_coname_eqvt[eqvt]: fixes pi::"coname prm" shows "pi\(M[d\c>e]) = (pi\M)[(pi\d)\c>(pi\e)]" -apply(nominal_induct M avoiding: d e rule: trm.strong_induct) -apply(auto simp add: fresh_bij eq_bij) -done + by (nominal_induct M avoiding: d e rule: trm.strong_induct)(auto simp: fresh_bij eq_bij) lemma nrename_name_eqvt[eqvt]: fixes pi::"name prm" shows "pi\(M[x\n>y]) = (pi\M)[(pi\x)\n>(pi\y)]" -apply(nominal_induct M avoiding: x y rule: trm.strong_induct) -apply(auto simp add: fresh_bij eq_bij) -done + by(nominal_induct M avoiding: x y rule: trm.strong_induct) (auto simp: fresh_bij eq_bij) lemma nrename_coname_eqvt[eqvt]: fixes pi::"coname prm" shows "pi\(M[x\n>y]) = (pi\M)[(pi\x)\n>(pi\y)]" -apply(nominal_induct M avoiding: x y rule: trm.strong_induct) -apply(auto simp add: fresh_bij eq_bij) -done + by(nominal_induct M avoiding: x y rule: trm.strong_induct)(auto simp: fresh_bij eq_bij) lemmas rename_eqvts = crename_name_eqvt crename_coname_eqvt nrename_name_eqvt nrename_coname_eqvt lemma nrename_fresh: assumes a: "x\M" shows "M[x\n>y] = M" using a by (nominal_induct M avoiding: x y rule: trm.strong_induct) - (auto simp add: trm.inject fresh_atm abs_fresh fin_supp abs_supp) + (auto simp: trm.inject fresh_atm abs_fresh fin_supp abs_supp) lemma crename_fresh: assumes a: "a\M" shows "M[a\c>b] = M" using a by (nominal_induct M avoiding: a b rule: trm.strong_induct) - (auto simp add: trm.inject fresh_atm abs_fresh) + (auto simp: trm.inject fresh_atm abs_fresh) lemma nrename_nfresh: fixes x::"name" shows "x\y\x\M[x\n>y]" by (nominal_induct M avoiding: x y rule: trm.strong_induct) - (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) + (auto simp: fresh_atm abs_fresh abs_supp fin_supp) lemma crename_nfresh: fixes x::"name" shows "x\M\x\M[a\c>b]" by (nominal_induct M avoiding: a b rule: trm.strong_induct) - (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) + (auto simp: fresh_atm abs_fresh abs_supp fin_supp) lemma crename_cfresh: fixes a::"coname" shows "a\b\a\M[a\c>b]" by (nominal_induct M avoiding: a b rule: trm.strong_induct) - (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) + (auto simp: fresh_atm abs_fresh abs_supp fin_supp) lemma nrename_cfresh: fixes c::"coname" shows "c\M\c\M[x\n>y]" by (nominal_induct M avoiding: x y rule: trm.strong_induct) - (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) + (auto simp: fresh_atm abs_fresh abs_supp fin_supp) lemma nrename_nfresh': fixes x::"name" shows "x\(M,z,y)\x\M[z\n>y]" by (nominal_induct M avoiding: x z y rule: trm.strong_induct) - (auto simp add: fresh_prod fresh_atm abs_fresh abs_supp fin_supp) + (auto simp: fresh_prod fresh_atm abs_fresh abs_supp fin_supp) lemma crename_cfresh': fixes a::"coname" shows "a\(M,b,c)\a\M[b\c>c]" by (nominal_induct M avoiding: a b c rule: trm.strong_induct) - (auto simp add: fresh_prod fresh_atm abs_fresh abs_supp fin_supp) + (auto simp: fresh_prod fresh_atm abs_fresh abs_supp fin_supp) lemma nrename_rename: assumes a: "x'\M" shows "([(x',x)]\M)[x'\n>y]= M[x\n>y]" using a apply(nominal_induct M avoiding: x x' y rule: trm.strong_induct) -apply(auto simp add: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp) -apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm) +apply(auto simp: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp) +apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm) done lemma crename_rename: assumes a: "a'\M" shows "([(a',a)]\M)[a'\c>b]= M[a\c>b]" using a apply(nominal_induct M avoiding: a a' b rule: trm.strong_induct) -apply(auto simp add: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp) -apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm) +apply(auto simp: abs_fresh fresh_bij fresh_atm fresh_prod fresh_right calc_atm abs_supp fin_supp) +apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm) done lemmas rename_fresh = nrename_fresh crename_fresh nrename_nfresh crename_nfresh crename_cfresh nrename_cfresh nrename_nfresh' crename_cfresh' nrename_rename crename_rename lemma better_nrename_Cut: assumes a: "x\(u,v)" shows "(Cut .M (x).N)[u\n>v] = Cut .(M[u\n>v]) (x).(N[u\n>v])" proof - obtain x'::"name" where fs1: "x'\(M,N,a,x,u,v)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\(M,N,a,x,u,v)" by (rule exists_fresh(2), rule fin_supp, blast) have eq1: "(Cut .M (x).N) = (Cut .([(a',a)]\M) (x').([(x',x)]\N))" - using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) have "(Cut .([(a',a)]\M) (x').([(x',x)]\N))[u\n>v] = Cut .(([(a',a)]\M)[u\n>v]) (x').(([(x',x)]\N)[u\n>v])" using fs1 fs2 - apply - - apply(rule nrename.simps) - apply(simp add: fresh_left calc_atm) - apply(simp add: fresh_left calc_atm) - done + by (intro nrename.simps; simp add: fresh_left calc_atm) also have "\ = Cut .(M[u\n>v]) (x).(N[u\n>v])" using fs1 fs2 a - apply - - apply(simp add: trm.inject alpha fresh_atm fresh_prod rename_eqvts) - apply(simp add: calc_atm) - apply(simp add: rename_fresh fresh_atm) - done + by(simp add: trm.inject alpha fresh_prod rename_eqvts calc_atm rename_fresh fresh_atm) finally show "(Cut .M (x).N)[u\n>v] = Cut .(M[u\n>v]) (x).(N[u\n>v])" using eq1 by simp qed lemma better_crename_Cut: assumes a: "a\(b,c)" shows "(Cut .M (x).N)[b\c>c] = Cut .(M[b\c>c]) (x).(N[b\c>c])" proof - obtain x'::"name" where fs1: "x'\(M,N,a,x,b,c)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\(M,N,a,x,b,c)" by (rule exists_fresh(2), rule fin_supp, blast) have eq1: "(Cut .M (x).N) = (Cut .([(a',a)]\M) (x').([(x',x)]\N))" - using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) have "(Cut .([(a',a)]\M) (x').([(x',x)]\N))[b\c>c] = Cut .(([(a',a)]\M)[b\c>c]) (x').(([(x',x)]\N)[b\c>c])" using fs1 fs2 - apply - - apply(rule crename.simps) - apply(simp add: fresh_left calc_atm) - apply(simp add: fresh_left calc_atm) - done + by (intro crename.simps; simp add: fresh_left calc_atm) also have "\ = Cut .(M[b\c>c]) (x).(N[b\c>c])" using fs1 fs2 a - apply - - apply(simp add: trm.inject alpha fresh_atm fresh_prod rename_eqvts) - apply(simp add: calc_atm) - apply(simp add: rename_fresh fresh_atm) - done + by(simp add: trm.inject alpha calc_atm rename_fresh fresh_atm fresh_prod rename_eqvts) finally show "(Cut .M (x).N)[b\c>c] = Cut .(M[b\c>c]) (x).(N[b\c>c])" using eq1 by simp qed lemma crename_id: shows "M[a\c>a] = M" by (nominal_induct M avoiding: a rule: trm.strong_induct) (auto) lemma nrename_id: shows "M[x\n>x] = M" by (nominal_induct M avoiding: x rule: trm.strong_induct) (auto) lemma nrename_swap: shows "x\M \ [(x,y)]\M = M[y\n>x]" by (nominal_induct M avoiding: x y rule: trm.strong_induct) (simp_all add: calc_atm fresh_atm trm.inject alpha abs_fresh abs_supp fin_supp) lemma crename_swap: shows "a\M \ [(a,b)]\M = M[b\c>a]" by (nominal_induct M avoiding: a b rule: trm.strong_induct) (simp_all add: calc_atm fresh_atm trm.inject alpha abs_fresh abs_supp fin_supp) lemma crename_ax: assumes a: "M[a\c>b] = Ax x c" "c\a" "c\b" shows "M = Ax x c" using a apply(nominal_induct M avoiding: a b x c rule: trm.strong_induct) apply(simp_all add: trm.inject split: if_splits) done lemma nrename_ax: assumes a: "M[x\n>y] = Ax z a" "z\x" "z\y" shows "M = Ax z a" using a apply(nominal_induct M avoiding: x y z a rule: trm.strong_induct) apply(simp_all add: trm.inject split: if_splits) done text \substitution functions\ lemma fresh_perm_coname: fixes c::"coname" and pi::"coname prm" and M::"trm" assumes a: "c\pi" "c\M" shows "c\(pi\M)" -using a -apply - -apply(simp add: fresh_left) -apply(simp add: at_prm_fresh[OF at_coname_inst] fresh_list_rev) -done + by (simp add: assms fresh_perm_app) lemma fresh_perm_name: fixes x::"name" and pi::"name prm" and M::"trm" assumes a: "x\pi" "x\M" shows "x\(pi\M)" -using a -apply - -apply(simp add: fresh_left) -apply(simp add: at_prm_fresh[OF at_name_inst] fresh_list_rev) -done + by (simp add: assms fresh_perm_app) lemma fresh_fun_simp_NotL: assumes a: "x'\P" "x'\M" shows "fresh_fun (\x'. Cut .P (x').NotL .M x') = Cut .P (x').NotL .M x'" -using a -apply - -apply(rule fresh_fun_app) -apply(rule pt_name_inst) -apply(rule at_name_inst) -apply(finite_guess) -apply(subgoal_tac "\n::name. n\(c,P,a,M)") -apply(erule exE) -apply(rule_tac x="n" in exI) -apply(simp add: fresh_prod abs_fresh) -apply(fresh_guess) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(fresh_guess) -done +proof (rule fresh_fun_app) + show "pt (TYPE(trm)::trm itself) (TYPE(name)::name itself)" + by(rule pt_name_inst) + show "at (TYPE(name)::name itself)" + by(rule at_name_inst) + show "finite (supp (\x'. Cut .P (x').NotL .M x')::name set)" + using a by(finite_guess) + obtain n::name where n: "n\(c,P,a,M)" + by (metis assms fresh_atm(3) fresh_prod) + with assms + show "\b. b \ (\x'. Cut .P (x').NotL .M x', Cut .P (b).NotL .M b)" + apply(intro exI [where x="n"]) + apply(simp add: fresh_prod abs_fresh) + apply(fresh_guess) + done + show "x' \ (\x'. Cut .P (x').NotL .M x')" + using assms by(fresh_guess) +qed lemma fresh_fun_NotL[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1\fresh_fun (\x'. Cut .P (x').NotL .M x')= fresh_fun (pi1\(\x'. Cut .P (x').NotL .M x'))" and "pi2\fresh_fun (\x'. Cut .P (x').NotL .M x')= fresh_fun (pi2\(\x'. Cut .P (x').NotL .M x'))" -apply - -apply(perm_simp) -apply(generate_fresh "name") -apply(auto simp add: fresh_prod) -apply(simp add: fresh_fun_simp_NotL) -apply(rule sym) -apply(rule trans) -apply(rule fresh_fun_simp_NotL) -apply(rule fresh_perm_name) -apply(assumption) -apply(assumption) -apply(rule fresh_perm_name) -apply(assumption) -apply(assumption) -apply(simp add: at_prm_fresh[OF at_name_inst] swap_simps) -apply(perm_simp) -apply(subgoal_tac "\n::name. n\(P,M,pi2\P,pi2\M,pi2)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_NotL calc_atm) -apply(rule exists_fresh') -apply(simp add: fin_supp) -done + apply(perm_simp) + apply(generate_fresh "name") + apply(auto simp: fresh_prod fresh_fun_simp_NotL) + apply(rule sym) + apply(rule trans) + apply(rule fresh_fun_simp_NotL) + apply(blast intro: fresh_perm_name) + apply(metis fresh_perm_name) + apply(simp add: at_prm_fresh[OF at_name_inst] swap_simps) + + apply(perm_simp) + apply(subgoal_tac "\n::name. n\(P,M,pi2\P,pi2\M,pi2)") + apply (metis fresh_fun_simp_NotL fresh_prodD swap_simps(8) trm.perm(14) trm.perm(16)) + by (meson exists_fresh(1) fs_name1) lemma fresh_fun_simp_AndL1: assumes a: "z'\P" "z'\M" "z'\x" - shows "fresh_fun (\z'. Cut .P (z').AndL1 (x).M z') = Cut .P (z').AndL1 (x).M z'" -using a -apply - -apply(rule fresh_fun_app) -apply(rule pt_name_inst) -apply(rule at_name_inst) -apply(finite_guess) -apply(subgoal_tac "\n::name. n\(c,P,x,M)") -apply(erule exE) -apply(rule_tac x="n" in exI) -apply(simp add: fresh_prod abs_fresh) -apply(fresh_guess) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(fresh_guess) -done + shows "fresh_fun (\z'. Cut .P(z').AndL1 (x).M z') = Cut .P (z').AndL1 (x).M z'" +proof (rule fresh_fun_app [OF pt_name_inst at_name_inst]) + obtain n::name where "n\(c,P,x,M)" + by (meson exists_fresh(1) fs_name1) + then show "\a. a \ (\z'. Cut .P(z').AndL1 x. M z', Cut .P(a).AndL1 x. M a)" + apply(intro exI [where x="n"]) + apply(simp add: fresh_prod abs_fresh) + apply(fresh_guess) + done +next + show "z' \ (\z'. Cut .P(z').AndL1 x. M z')" + using a by(fresh_guess) +qed finite_guess lemma fresh_fun_AndL1[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1\fresh_fun (\z'. Cut .P (z').AndL1 (x).M z')= fresh_fun (pi1\(\z'. Cut .P (z').AndL1 (x).M z'))" and "pi2\fresh_fun (\z'. Cut .P (z').AndL1 (x).M z')= fresh_fun (pi2\(\z'. Cut .P (z').AndL1 (x).M z'))" -apply - apply(perm_simp) apply(subgoal_tac "\n::name. n\(P,M,x,pi1\P,pi1\M,pi1\x,pi1)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_AndL1 at_prm_fresh[OF at_name_inst] swap_simps) -apply(rule exists_fresh') -apply(simp add: fin_supp) +apply(force simp add: fresh_prod fresh_fun_simp_AndL1 at_prm_fresh[OF at_name_inst] swap_simps) + apply (meson exists_fresh(1) fs_name1) apply(perm_simp) apply(subgoal_tac "\n::name. n\(P,M,x,pi2\P,pi2\M,pi2\x,pi2)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_AndL1 calc_atm) -apply(rule exists_fresh') -apply(simp add: fin_supp) -done +apply(force simp add: fresh_prod fresh_fun_simp_AndL1 calc_atm) + by (meson exists_fresh'(1) fs_name1) lemma fresh_fun_simp_AndL2: assumes a: "z'\P" "z'\M" "z'\x" shows "fresh_fun (\z'. Cut .P (z').AndL2 (x).M z') = Cut .P (z').AndL2 (x).M z'" -using a -apply - -apply(rule fresh_fun_app) -apply(rule pt_name_inst) -apply(rule at_name_inst) -apply(finite_guess) -apply(subgoal_tac "\n::name. n\(c,P,x,M)") -apply(erule exE) -apply(rule_tac x="n" in exI) -apply(simp add: fresh_prod abs_fresh) -apply(fresh_guess) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(fresh_guess) -done +proof (rule fresh_fun_app [OF pt_name_inst at_name_inst]) + obtain n::name where "n\(c,P,x,M)" + by (meson exists_fresh(1) fs_name1) + then show "\a. a \ (\z'. Cut .P(z').AndL2 x. M z', Cut .P(a).AndL2 x. M a)" + apply(intro exI [where x="n"]) + apply(simp add: fresh_prod abs_fresh) + apply(fresh_guess) + done +next + show "z' \ (\z'. Cut .P(z').AndL2 x. M z')" + using a by(fresh_guess) +qed finite_guess lemma fresh_fun_AndL2[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1\fresh_fun (\z'. Cut .P (z').AndL2 (x).M z')= fresh_fun (pi1\(\z'. Cut .P (z').AndL2 (x).M z'))" and "pi2\fresh_fun (\z'. Cut .P (z').AndL2 (x).M z')= fresh_fun (pi2\(\z'. Cut .P (z').AndL2 (x).M z'))" -apply - -apply(perm_simp) -apply(subgoal_tac "\n::name. n\(P,M,x,pi1\P,pi1\M,pi1\x,pi1)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_AndL2 at_prm_fresh[OF at_name_inst] swap_simps) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(perm_simp) -apply(subgoal_tac "\n::name. n\(P,M,x,pi2\P,pi2\M,pi2\x,pi2)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_AndL2 calc_atm) -apply(rule exists_fresh') -apply(simp add: fin_supp) -done + apply(perm_simp) + apply(subgoal_tac "\n::name. n\(P,M,x,pi1\P,pi1\M,pi1\x,pi1)") + apply(force simp add: fresh_prod fresh_fun_simp_AndL2 at_prm_fresh[OF at_name_inst] swap_simps) + apply (meson exists_fresh(1) fs_name1) + apply(perm_simp) + apply(subgoal_tac "\n::name. n\(P,M,x,pi2\P,pi2\M,pi2\x,pi2)") + apply(force simp add: fresh_prod fresh_fun_simp_AndL2 calc_atm) + by (meson exists_fresh(1) fs_name1) lemma fresh_fun_simp_OrL: assumes a: "z'\P" "z'\M" "z'\N" "z'\u" "z'\x" - shows "fresh_fun (\z'. Cut .P (z').OrL (x).M (u).N z') = Cut .P (z').OrL (x).M (u).N z'" -using a -apply - -apply(rule fresh_fun_app) -apply(rule pt_name_inst) -apply(rule at_name_inst) -apply(finite_guess) -apply(subgoal_tac "\n::name. n\(c,P,x,M,u,N)") -apply(erule exE) -apply(rule_tac x="n" in exI) -apply(simp add: fresh_prod abs_fresh) -apply(fresh_guess) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(fresh_guess) -done + shows "fresh_fun (\z'. Cut .P(z').OrL(x).M(u).N z') = Cut .P (z').OrL (x).M (u).N z'" +proof (rule fresh_fun_app [OF pt_name_inst at_name_inst]) + obtain n::name where "n\(c,P,x,M,u,N)" + by (meson exists_fresh(1) fs_name1) + then show "\a. a \ (\z'. Cut .P(z').OrL(x).M(u).N(z'), Cut .P(a).OrL(x).M(u).N(a))" + apply(intro exI [where x="n"]) + apply(simp add: fresh_prod abs_fresh) + apply(fresh_guess) + done +next + show "z' \ (\z'. Cut .P(z').OrL(x).M(u).N(z'))" + using a by(fresh_guess) +qed finite_guess lemma fresh_fun_OrL[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" - shows "pi1\fresh_fun (\z'. Cut .P (z').OrL (x).M (u).N z')= - fresh_fun (pi1\(\z'. Cut .P (z').OrL (x).M (u).N z'))" - and "pi2\fresh_fun (\z'. Cut .P (z').OrL (x).M (u).N z')= - fresh_fun (pi2\(\z'. Cut .P (z').OrL (x).M (u).N z'))" -apply - -apply(perm_simp) -apply(subgoal_tac "\n::name. n\(P,M,N,x,u,pi1\P,pi1\M,pi1\N,pi1\x,pi1\u,pi1)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_OrL at_prm_fresh[OF at_name_inst] swap_simps) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(perm_simp) -apply(subgoal_tac "\n::name. n\(P,M,N,x,u,pi2\P,pi2\M,pi2\N,pi2\x,pi2\u,pi2)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_OrL calc_atm) -apply(rule exists_fresh') -apply(simp add: fin_supp) -done + shows "pi1\fresh_fun (\z'. Cut .P(z').OrL (x).M(u).N z')= + fresh_fun (pi1\(\z'. Cut .P (z').OrL(x).M (u).N z'))" + and "pi2\fresh_fun (\z'. Cut .P(z').OrL (x).M(u).N z')= + fresh_fun (pi2\(\z'. Cut .P(z').OrL(x).M(u).N z'))" + apply(perm_simp) + apply(subgoal_tac "\n::name. n\(P,M,N,x,u,pi1\P,pi1\M,pi1\N,pi1\x,pi1\u,pi1)") + apply(force simp add: fresh_prod fresh_fun_simp_OrL at_prm_fresh[OF at_name_inst] swap_simps) + apply (meson exists_fresh(1) fs_name1) + apply(perm_simp) + apply(subgoal_tac "\n::name. n\(P,M,N,x,u,pi2\P,pi2\M,pi2\N,pi2\x,pi2\u,pi2)") + apply(force simp add: fresh_prod fresh_fun_simp_OrL calc_atm) + by (meson exists_fresh(1) fs_name1) lemma fresh_fun_simp_ImpL: assumes a: "z'\P" "z'\M" "z'\N" "z'\x" shows "fresh_fun (\z'. Cut .P (z').ImpL .M (x).N z') = Cut .P (z').ImpL .M (x).N z'" -using a -apply - -apply(rule fresh_fun_app) -apply(rule pt_name_inst) -apply(rule at_name_inst) -apply(finite_guess) -apply(subgoal_tac "\n::name. n\(c,P,x,M,N)") -apply(erule exE) -apply(rule_tac x="n" in exI) -apply(simp add: fresh_prod abs_fresh) -apply(fresh_guess) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(fresh_guess) -done +proof (rule fresh_fun_app [OF pt_name_inst at_name_inst]) + obtain n::name where "n\(c,P,x,M,N)" + by (meson exists_fresh(1) fs_name1) + then show "\aa. aa \ (\z'. Cut .P(z').ImpL .M(x).N z', Cut .P(aa).ImpL .M(x).N aa)" + apply(intro exI [where x="n"]) + apply(simp add: fresh_prod abs_fresh) + apply(fresh_guess) + done +next + show "z' \ (\z'. Cut .P(z').ImpL .M(x).N z')" + using a by(fresh_guess) +qed finite_guess lemma fresh_fun_ImpL[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1\fresh_fun (\z'. Cut .P (z').ImpL .M (x).N z')= fresh_fun (pi1\(\z'. Cut .P (z').ImpL .M (x).N z'))" and "pi2\fresh_fun (\z'. Cut .P (z').ImpL .M (x).N z')= fresh_fun (pi2\(\z'. Cut .P (z').ImpL .M (x).N z'))" -apply - -apply(perm_simp) -apply(subgoal_tac "\n::name. n\(P,M,N,x,pi1\P,pi1\M,pi1\N,pi1\x,pi1)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_ImpL at_prm_fresh[OF at_name_inst] swap_simps) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(perm_simp) -apply(subgoal_tac "\n::name. n\(P,M,N,x,pi2\P,pi2\M,pi2\N,pi2\x,pi2)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_ImpL calc_atm) -apply(rule exists_fresh') -apply(simp add: fin_supp) -done + apply(perm_simp) + apply(subgoal_tac "\n::name. n\(P,M,N,x,pi1\P,pi1\M,pi1\N,pi1\x,pi1)") + apply(force simp add: fresh_prod fresh_fun_simp_ImpL at_prm_fresh[OF at_name_inst] swap_simps) + apply (meson exists_fresh(1) fs_name1) + apply(perm_simp) + apply(subgoal_tac "\n::name. n\(P,M,N,x,pi2\P,pi2\M,pi2\N,pi2\x,pi2)") + apply(force simp add: fresh_prod fresh_fun_simp_ImpL calc_atm) + by (meson exists_fresh(1) fs_name1) lemma fresh_fun_simp_NotR: assumes a: "a'\P" "a'\M" shows "fresh_fun (\a'. Cut .(NotR (y).M a') (x).P) = Cut .(NotR (y).M a') (x).P" -using a -apply - -apply(rule fresh_fun_app) -apply(rule pt_coname_inst) -apply(rule at_coname_inst) -apply(finite_guess) -apply(subgoal_tac "\n::coname. n\(x,P,y,M)") -apply(erule exE) -apply(rule_tac x="n" in exI) -apply(simp add: fresh_prod abs_fresh) -apply(fresh_guess) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(fresh_guess) -done +proof (rule fresh_fun_app [OF pt_coname_inst at_coname_inst]) + obtain n::coname where "n\(x,P,y,M)" + by (metis assms(1) assms(2) fresh_atm(4) fresh_prod) + then show "\a. a \ (\a'. Cut .(NotR (y).M a') (x).P, Cut .NotR(y).M(a) (x).P)" + apply(intro exI [where x="n"]) + apply(simp add: fresh_prod abs_fresh) + apply(fresh_guess) + done +qed (use a in \fresh_guess|finite_guess\)+ lemma fresh_fun_NotR[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1\fresh_fun (\a'. Cut .(NotR (y).M a') (x).P)= fresh_fun (pi1\(\a'. Cut .(NotR (y).M a') (x).P))" and "pi2\fresh_fun (\a'. Cut .(NotR (y).M a') (x).P)= fresh_fun (pi2\(\a'. Cut .(NotR (y).M a') (x).P))" -apply - -apply(perm_simp) -apply(subgoal_tac "\n::coname. n\(P,M,pi1\P,pi1\M,pi1)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_NotR calc_atm) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(perm_simp) -apply(subgoal_tac "\n::coname. n\(P,M,pi2\P,pi2\M,pi2)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_NotR at_prm_fresh[OF at_coname_inst] swap_simps) -apply(rule exists_fresh') -apply(simp add: fin_supp) -done + apply(perm_simp) + apply(subgoal_tac "\n::coname. n\(P,M,pi1\P,pi1\M,pi1)") + apply(force simp add: fresh_prod fresh_fun_simp_NotR calc_atm) + apply (meson exists_fresh(2) fs_coname1) + apply(perm_simp) + apply(subgoal_tac "\n::coname. n\(P,M,pi2\P,pi2\M,pi2)") + apply(force simp: fresh_prod fresh_fun_simp_NotR at_prm_fresh[OF at_coname_inst] swap_simps) + by (meson exists_fresh(2) fs_coname1) lemma fresh_fun_simp_AndR: assumes a: "a'\P" "a'\M" "a'\N" "a'\b" "a'\c" shows "fresh_fun (\a'. Cut .(AndR .M .N a') (x).P) = Cut .(AndR .M .N a') (x).P" -using a -apply - -apply(rule fresh_fun_app) -apply(rule pt_coname_inst) -apply(rule at_coname_inst) -apply(finite_guess) -apply(subgoal_tac "\n::coname. n\(x,P,b,M,c,N)") -apply(erule exE) -apply(rule_tac x="n" in exI) -apply(simp add: fresh_prod abs_fresh) -apply(fresh_guess) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(fresh_guess) -done +proof (rule fresh_fun_app [OF pt_coname_inst at_coname_inst]) + obtain n::coname where "n\(x,P,b,M,c,N)" + by (meson exists_fresh(2) fs_coname1) + then show "\a. a \ (\a'. Cut .AndR .M .N(a') (x).P, Cut .AndR .M .N(a) (x).P)" + apply(intro exI [where x="n"]) + apply(simp add: fresh_prod abs_fresh) + apply(fresh_guess) + done +qed (use a in \fresh_guess|finite_guess\)+ lemma fresh_fun_AndR[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1\fresh_fun (\a'. Cut .(AndR .M .N a') (x).P)= fresh_fun (pi1\(\a'. Cut .(AndR .M .N a') (x).P))" and "pi2\fresh_fun (\a'. Cut .(AndR .M .N a') (x).P)= fresh_fun (pi2\(\a'. Cut .(AndR .M .N a') (x).P))" -apply - -apply(perm_simp) -apply(subgoal_tac "\n::coname. n\(P,M,N,b,c,pi1\P,pi1\M,pi1\N,pi1\b,pi1\c,pi1)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_AndR calc_atm) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(perm_simp) -apply(subgoal_tac "\n::coname. n\(P,M,N,b,c,pi2\P,pi2\M,pi2\N,pi2\b,pi2\c,pi2)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_AndR at_prm_fresh[OF at_coname_inst] swap_simps) -apply(rule exists_fresh') -apply(simp add: fin_supp) -done + apply(perm_simp) + apply(subgoal_tac "\n::coname. n\(P,M,N,b,c,pi1\P,pi1\M,pi1\N,pi1\b,pi1\c,pi1)") + apply(force simp add: fresh_prod fresh_fun_simp_AndR calc_atm) + apply (meson exists_fresh(2) fs_coname1) + apply(perm_simp) + apply(subgoal_tac "\n::coname. n\(P,M,N,b,c,pi2\P,pi2\M,pi2\N,pi2\b,pi2\c,pi2)") + apply(force simp add: fresh_prod fresh_fun_simp_AndR at_prm_fresh[OF at_coname_inst] swap_simps) + by (meson exists_fresh(2) fs_coname1) lemma fresh_fun_simp_OrR1: assumes a: "a'\P" "a'\M" "a'\b" shows "fresh_fun (\a'. Cut .(OrR1 .M a') (x).P) = Cut .(OrR1 .M a') (x).P" -using a -apply - -apply(rule fresh_fun_app) -apply(rule pt_coname_inst) -apply(rule at_coname_inst) -apply(finite_guess) -apply(subgoal_tac "\n::coname. n\(x,P,b,M)") -apply(erule exE) -apply(rule_tac x="n" in exI) -apply(simp add: fresh_prod abs_fresh) -apply(fresh_guess) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(fresh_guess) -done +proof (rule fresh_fun_app [OF pt_coname_inst at_coname_inst]) + obtain n::coname where "n\(x,P,b,M)" + by (meson exists_fresh(2) fs_coname1) + then show "\a. a \ (\a'. Cut .OrR1 .M(a') (x).P, Cut .OrR1 .M(a) (x).P)" + apply(intro exI [where x="n"]) + apply(simp add: fresh_prod abs_fresh) + apply(fresh_guess) + done +qed (use a in \fresh_guess|finite_guess\)+ lemma fresh_fun_OrR1[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1\fresh_fun (\a'. Cut .(OrR1 .M a') (x).P)= fresh_fun (pi1\(\a'. Cut .(OrR1 .M a') (x).P))" and "pi2\fresh_fun (\a'. Cut .(OrR1 .M a') (x).P)= fresh_fun (pi2\(\a'. Cut .(OrR1 .M a') (x).P))" -apply - -apply(perm_simp) -apply(subgoal_tac "\n::coname. n\(P,M,b,pi1\P,pi1\M,pi1\b,pi1)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_OrR1 calc_atm) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(perm_simp) -apply(subgoal_tac "\n::coname. n\(P,M,b,pi2\P,pi2\M,pi2\b,pi2)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_OrR1 at_prm_fresh[OF at_coname_inst] swap_simps) -apply(rule exists_fresh') -apply(simp add: fin_supp) -done + apply(perm_simp) + apply(subgoal_tac "\n::coname. n\(P,M,b,pi1\P,pi1\M,pi1\b,pi1)") + apply(force simp add: fresh_prod fresh_fun_simp_OrR1 calc_atm) + apply (meson exists_fresh(2) fs_coname1) + apply(perm_simp) + apply(subgoal_tac "\n::coname. n\(P,M,b,pi2\P,pi2\M,pi2\b,pi2)") + apply(force simp add: fresh_prod fresh_fun_simp_OrR1 at_prm_fresh[OF at_coname_inst] swap_simps) + by (meson exists_fresh(2) fs_coname1) lemma fresh_fun_simp_OrR2: assumes a: "a'\P" "a'\M" "a'\b" shows "fresh_fun (\a'. Cut .(OrR2 .M a') (x).P) = Cut .(OrR2 .M a') (x).P" -using a -apply - -apply(rule fresh_fun_app) -apply(rule pt_coname_inst) -apply(rule at_coname_inst) -apply(finite_guess) -apply(subgoal_tac "\n::coname. n\(x,P,b,M)") -apply(erule exE) -apply(rule_tac x="n" in exI) -apply(simp add: fresh_prod abs_fresh) -apply(fresh_guess) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(fresh_guess) -done +proof (rule fresh_fun_app [OF pt_coname_inst at_coname_inst]) + obtain n::coname where "n\(x,P,b,M)" + by (meson exists_fresh(2) fs_coname1) + then show "\a. a \ (\a'. Cut .OrR2 .M(a') (x).P, Cut .OrR2 .M(a) (x).P)" + apply(intro exI [where x="n"]) + apply(simp add: fresh_prod abs_fresh) + apply(fresh_guess) + done +qed (use a in \fresh_guess|finite_guess\)+ lemma fresh_fun_OrR2[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1\fresh_fun (\a'. Cut .(OrR2 .M a') (x).P)= fresh_fun (pi1\(\a'. Cut .(OrR2 .M a') (x).P))" and "pi2\fresh_fun (\a'. Cut .(OrR2 .M a') (x).P)= fresh_fun (pi2\(\a'. Cut .(OrR2 .M a') (x).P))" -apply - -apply(perm_simp) -apply(subgoal_tac "\n::coname. n\(P,M,b,pi1\P,pi1\M,pi1\b,pi1)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_OrR2 calc_atm) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(perm_simp) -apply(subgoal_tac "\n::coname. n\(P,M,b,pi2\P,pi2\M,pi2\b,pi2)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_OrR2 at_prm_fresh[OF at_coname_inst] swap_simps) -apply(rule exists_fresh') -apply(simp add: fin_supp) -done + apply(perm_simp) + apply(subgoal_tac "\n::coname. n\(P,M,b,pi1\P,pi1\M,pi1\b,pi1)") + apply(force simp add: fresh_prod fresh_fun_simp_OrR2 calc_atm) + apply (meson exists_fresh(2) fs_coname1) + apply(perm_simp) + apply(subgoal_tac "\n::coname. n\(P,M,b,pi2\P,pi2\M,pi2\b,pi2)") + apply(force simp add: fresh_prod fresh_fun_simp_OrR2 at_prm_fresh[OF at_coname_inst] swap_simps) + by (meson exists_fresh(2) fs_coname1) lemma fresh_fun_simp_ImpR: assumes a: "a'\P" "a'\M" "a'\b" shows "fresh_fun (\a'. Cut .(ImpR (y)..M a') (x).P) = Cut .(ImpR (y)..M a') (x).P" -using a -apply - -apply(rule fresh_fun_app) -apply(rule pt_coname_inst) -apply(rule at_coname_inst) -apply(finite_guess) -apply(subgoal_tac "\n::coname. n\(x,P,y,b,M)") -apply(erule exE) -apply(rule_tac x="n" in exI) -apply(simp add: fresh_prod abs_fresh) -apply(fresh_guess) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(fresh_guess) -done +proof (rule fresh_fun_app [OF pt_coname_inst at_coname_inst]) + obtain n::coname where "n\(x,P,y,b,M)" + by (meson exists_fresh(2) fs_coname1) + then show "\a. a \ (\a'. Cut .(ImpR (y)..M a') (x).P, Cut .(ImpR (y)..M a) (x).P)" + apply(intro exI [where x="n"]) + apply(simp add: fresh_prod abs_fresh) + apply(fresh_guess) + done +qed (use a in \fresh_guess|finite_guess\)+ lemma fresh_fun_ImpR[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1\fresh_fun (\a'. Cut .(ImpR (y)..M a') (x).P)= fresh_fun (pi1\(\a'. Cut .(ImpR (y)..M a') (x).P))" and "pi2\fresh_fun (\a'. Cut .(ImpR (y)..M a') (x).P)= fresh_fun (pi2\(\a'. Cut .(ImpR (y)..M a') (x).P))" -apply - -apply(perm_simp) -apply(subgoal_tac "\n::coname. n\(P,M,b,pi1\P,pi1\M,pi1\b,pi1)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_ImpR calc_atm) -apply(rule exists_fresh') -apply(simp add: fin_supp) -apply(perm_simp) -apply(subgoal_tac "\n::coname. n\(P,M,b,pi2\P,pi2\M,pi2\b,pi2)") -apply(simp add: fresh_prod) -apply(auto) -apply(simp add: fresh_fun_simp_ImpR at_prm_fresh[OF at_coname_inst] swap_simps) -apply(rule exists_fresh') -apply(simp add: fin_supp) -done + apply(perm_simp) + apply(subgoal_tac "\n::coname. n\(P,M,b,pi1\P,pi1\M,pi1\b,pi1)") + apply(force simp add: fresh_prod fresh_fun_simp_ImpR calc_atm) + apply (meson exists_fresh(2) fs_coname1) + apply(perm_simp) + apply(subgoal_tac "\n::coname. n\(P,M,b,pi2\P,pi2\M,pi2\b,pi2)") + apply(force simp add: fresh_prod fresh_fun_simp_ImpR at_prm_fresh[OF at_coname_inst] swap_simps) + by (meson exists_fresh(2) fs_coname1) nominal_primrec (freshness_context: "(y::name,c::coname,P::trm)") substn :: "trm \ name \ coname \ trm \ trm" ("_{_:=<_>._}" [100,100,100,100] 100) where "(Ax x a){y:=.P} = (if x=y then Cut .P (y).Ax y a else Ax x a)" | "\a\(c,P,N);x\(y,P,M)\ \ (Cut .M (x).N){y:=.P} = (if M=Ax y a then Cut .P (x).(N{y:=.P}) else Cut .(M{y:=.P}) (x).(N{y:=.P}))" | "x\(y,P) \ (NotR (x).M a){y:=.P} = NotR (x).(M{y:=.P}) a" | "a\(c,P) \ (NotL .M x){y:=.P} = (if x=y then fresh_fun (\x'. Cut .P (x').NotL .(M{y:=.P}) x') else NotL .(M{y:=.P}) x)" | "\a\(c,P,N,d);b\(c,P,M,d);b\a\ \ (AndR .M .N d){y:=.P} = AndR .(M{y:=.P}) .(N{y:=.P}) d" | "x\(y,P,z) \ (AndL1 (x).M z){y:=.P} = (if z=y then fresh_fun (\z'. Cut .P (z').AndL1 (x).(M{y:=.P}) z') else AndL1 (x).(M{y:=.P}) z)" | "x\(y,P,z) \ (AndL2 (x).M z){y:=.P} = (if z=y then fresh_fun (\z'. Cut .P (z').AndL2 (x).(M{y:=.P}) z') else AndL2 (x).(M{y:=.P}) z)" | "a\(c,P,b) \ (OrR1 .M b){y:=.P} = OrR1 .(M{y:=.P}) b" | "a\(c,P,b) \ (OrR2 .M b){y:=.P} = OrR2 .(M{y:=.P}) b" | "\x\(y,N,P,z);u\(y,M,P,z);x\u\ \ (OrL (x).M (u).N z){y:=.P} = (if z=y then fresh_fun (\z'. Cut .P (z').OrL (x).(M{y:=.P}) (u).(N{y:=.P}) z') else OrL (x).(M{y:=.P}) (u).(N{y:=.P}) z)" | "\a\(b,c,P); x\(y,P)\ \ (ImpR (x)..M b){y:=.P} = ImpR (x)..(M{y:=.P}) b" | "\a\(N,c,P);x\(y,P,M,z)\ \ (ImpL .M (x).N z){y:=.P} = (if y=z then fresh_fun (\z'. Cut .P (z').ImpL .(M{y:=.P}) (x).(N{y:=.P}) z') else ImpL .(M{y:=.P}) (x).(N{y:=.P}) z)" -apply(finite_guess)+ -apply(rule TrueI)+ -apply(simp add: abs_fresh abs_supp)+ -apply(rule impI) -apply(subgoal_tac "\x::name. x\(x1,P,y1)", erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm) -apply(rule exists_fresh', simp add: fin_supp) -apply(simp add: abs_fresh abs_supp)+ -apply(rule impI) -apply(subgoal_tac "\x::name. x\(x1,P,y1)", erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_AndL1 abs_fresh fresh_atm) -apply(rule exists_fresh', simp add: fin_supp) -apply(simp add: abs_fresh abs_supp)+ -apply(rule impI) -apply(subgoal_tac "\x::name. x\(x1,P,y1)", erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_AndL2 abs_fresh fresh_atm) -apply(rule exists_fresh', simp add: fin_supp) -apply(simp add: abs_fresh abs_supp)+ -apply(rule impI) -apply(subgoal_tac "\x::name. x\(x1,P,y1,x3,y2)", erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) -apply(rule exists_fresh', simp add: fin_supp) -apply(simp add: abs_fresh abs_supp)+ -apply(rule impI) -apply(subgoal_tac "\x::name. x\(x1,P,y1,x3,y2)", erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) -apply(rule exists_fresh', simp add: fin_supp) -apply(simp add: abs_fresh abs_supp)+ -apply(rule impI) -apply(subgoal_tac "\x::name. x\(x3,P,y1,y2)", erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) -apply(rule exists_fresh', simp add: fin_supp) -apply(simp add: abs_fresh abs_supp)+ -apply(rule impI) -apply(subgoal_tac "\x::name. x\(x3,P,y1,y2)", erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) -apply(rule exists_fresh', simp add: fin_supp) +apply(finite_guess | simp add: abs_fresh abs_supp fin_supp | fresh_guess | rule strip)+ +apply(subgoal_tac "\x::name. x\(x1,P,y1)") +apply(force simp add: fresh_prod fresh_fun_simp_NotL abs_fresh fresh_atm) +apply (meson exists_fresh(1) fs_name1) + +apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+ +apply(subgoal_tac "\x::name. x\(x1,P,y1)") +apply(force simp add: fresh_prod fresh_fun_simp_AndL1 abs_fresh fresh_atm) +apply (meson exists_fresh(1) fs_name1) + +apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+ +apply(subgoal_tac "\x::name. x\(x1,P,y1)") +apply(force simp add: fresh_prod fresh_fun_simp_AndL2 abs_fresh fresh_atm) +apply (meson exists_fresh(1) fs_name1) + +apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+ +apply(subgoal_tac "\x::name. x\(x1,P,y1,x3,y2)") +apply(force simp add: fresh_prod fresh_fun_simp_OrL abs_fresh fresh_atm) +apply (meson exists_fresh(1) fs_name1) + +apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+ +apply(subgoal_tac "\x::name. x\(x1,P,y1,x3,y2)") +apply(force simp add: fresh_prod fresh_fun_simp_OrL abs_fresh fresh_atm) +apply (meson exists_fresh(1) fs_name1) + +apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+ +apply(subgoal_tac "\x::name. x\(x3,P,y1,y2)") +apply(force simp add: fresh_prod fresh_fun_simp_ImpL abs_fresh fresh_atm) +apply (meson exists_fresh(1) fs_name1) + +apply(simp add: abs_fresh abs_supp fin_supp | rule strip)+ +apply(subgoal_tac "\x::name. x\(x3,P,y1,y2)") +apply(force simp add: fresh_prod fresh_fun_simp_ImpL abs_fresh fresh_atm) +apply (meson exists_fresh(1) fs_name1) apply(fresh_guess)+ done nominal_primrec (freshness_context: "(d::name,z::coname,P::trm)") substc :: "trm \ coname \ name \ trm \ trm" ("_{_:=(_)._}" [100,100,100,100] 100) where "(Ax x a){d:=(z).P} = (if d=a then Cut .(Ax x a) (z).P else Ax x a)" | "\a\(d,P,N);x\(z,P,M)\ \ (Cut .M (x).N){d:=(z).P} = (if N=Ax x d then Cut .(M{d:=(z).P}) (z).P else Cut .(M{d:=(z).P}) (x).(N{d:=(z).P}))" | "x\(z,P) \ (NotR (x).M a){d:=(z).P} = (if d=a then fresh_fun (\a'. Cut .NotR (x).(M{d:=(z).P}) a' (z).P) else NotR (x).(M{d:=(z).P}) a)" | "a\(d,P) \ (NotL .M x){d:=(z).P} = NotL .(M{d:=(z).P}) x" | "\a\(P,c,N,d);b\(P,c,M,d);b\a\ \ (AndR .M .N c){d:=(z).P} = (if d=c then fresh_fun (\a'. Cut .(AndR .(M{d:=(z).P}) .(N{d:=(z).P}) a') (z).P) else AndR .(M{d:=(z).P}) .(N{d:=(z).P}) c)" | "x\(y,z,P) \ (AndL1 (x).M y){d:=(z).P} = AndL1 (x).(M{d:=(z).P}) y" | "x\(y,P,z) \ (AndL2 (x).M y){d:=(z).P} = AndL2 (x).(M{d:=(z).P}) y" | "a\(d,P,b) \ (OrR1 .M b){d:=(z).P} = (if d=b then fresh_fun (\a'. Cut .OrR1 .(M{d:=(z).P}) a' (z).P) else OrR1 .(M{d:=(z).P}) b)" | "a\(d,P,b) \ (OrR2 .M b){d:=(z).P} = (if d=b then fresh_fun (\a'. Cut .OrR2 .(M{d:=(z).P}) a' (z).P) else OrR2 .(M{d:=(z).P}) b)" | "\x\(N,z,P,u);y\(M,z,P,u);x\y\ \ (OrL (x).M (y).N u){d:=(z).P} = OrL (x).(M{d:=(z).P}) (y).(N{d:=(z).P}) u" | "\a\(b,d,P); x\(z,P)\ \ (ImpR (x)..M b){d:=(z).P} = (if d=b then fresh_fun (\a'. Cut .ImpR (x)..(M{d:=(z).P}) a' (z).P) else ImpR (x)..(M{d:=(z).P}) b)" | "\a\(N,d,P);x\(y,z,P,M)\ \ (ImpL .M (x).N y){d:=(z).P} = ImpL .(M{d:=(z).P}) (x).(N{d:=(z).P}) y" -apply(finite_guess)+ -apply(rule TrueI)+ -apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1)+ -apply(rule impI) -apply(subgoal_tac "\x::coname. x\(x1,P,y1)", erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm) -apply(rule exists_fresh', simp add: fin_supp) -apply(simp add: abs_fresh abs_supp)+ -apply(rule impI) -apply(subgoal_tac "\x::coname. x\(x1,P,y1,x3,y2)", erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) -apply(rule exists_fresh', simp add: fin_supp) -apply(simp add: abs_fresh abs_supp)+ -apply(rule impI) -apply(subgoal_tac "\x::coname. x\(x1,P,y1,x3,y2)", erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) -apply(rule exists_fresh', simp add: fin_supp) -apply(simp add: abs_fresh abs_supp)+ -apply(rule impI) -apply(subgoal_tac "\x::coname. x\(x1,P,y1)", erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_OrR1 abs_fresh fresh_atm) -apply(rule exists_fresh', simp add: fin_supp) -apply(simp add: abs_fresh abs_supp)+ -apply(rule impI) -apply(subgoal_tac "\x::coname. x\(x1,P,y1)", erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_OrR2 abs_fresh fresh_atm) -apply(rule exists_fresh', simp add: fin_supp) -apply(simp add: abs_fresh abs_supp)+ -apply(rule impI) -apply(subgoal_tac "\x::coname. x\(x1,P,x2,y1)", erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_ImpR abs_fresh fresh_atm abs_supp) -apply(rule exists_fresh', simp add: fin_supp) -apply(simp add: abs_fresh abs_supp)+ -apply(rule impI) -apply(subgoal_tac "\x::coname. x\(x1,P,x2,y1)", erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_ImpR abs_fresh fresh_atm) -apply(rule exists_fresh', simp add: fin_supp) -apply(simp add: abs_fresh abs_supp)+ -apply(fresh_guess add: abs_fresh fresh_prod)+ +apply(finite_guess | simp add: abs_fresh abs_supp fs_name1 fs_coname1 | rule strip)+ +apply(subgoal_tac "\x::coname. x\(x1,P,y1)") +apply(force simp add: fresh_prod fresh_fun_simp_NotR abs_fresh fresh_atm) +apply(meson exists_fresh' fin_supp) + +apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1 | rule strip)+ +apply(subgoal_tac "\x::coname. x\(x1,P,y1,x3,y2)") +apply(force simp add: fresh_prod fresh_fun_simp_AndR abs_fresh fresh_atm) +apply(meson exists_fresh' fin_supp) + +apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1 | rule strip)+ +apply(subgoal_tac "\x::coname. x\(x1,P,y1,x3,y2)") +apply(force simp add: fresh_prod fresh_fun_simp_AndR abs_fresh fresh_atm) +apply(meson exists_fresh' fin_supp) + +apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1 | rule strip)+ +apply(subgoal_tac "\x::coname. x\(x1,P,y1)") +apply(force simp add: fresh_prod fresh_fun_simp_OrR1 abs_fresh fresh_atm) +apply(meson exists_fresh' fin_supp) + +apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1 | rule strip)+ +apply(subgoal_tac "\x::coname. x\(x1,P,y1)") +apply(force simp add: fresh_prod fresh_fun_simp_OrR2 abs_fresh fresh_atm) +apply(meson exists_fresh' fin_supp) + +apply(simp add: abs_fresh abs_supp | rule strip)+ +apply(subgoal_tac "\x::coname. x\(x1,P,x2,y1)") +apply(force simp add: fresh_prod fresh_fun_simp_ImpR abs_fresh fresh_atm abs_supp) +apply(meson exists_fresh' fin_supp) + +apply(simp add: abs_fresh abs_supp | rule strip)+ +apply(subgoal_tac "\x::coname. x\(x1,P,x2,y1)") +apply(force simp add: fresh_prod fresh_fun_simp_ImpR abs_fresh fresh_atm) +apply(meson exists_fresh' fin_supp) + +apply(simp add: abs_fresh | fresh_guess add: abs_fresh)+ done + lemma csubst_eqvt[eqvt]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1\(M{c:=(x).N}) = (pi1\M){(pi1\c):=(pi1\x).(pi1\N)}" and "pi2\(M{c:=(x).N}) = (pi2\M){(pi2\c):=(pi2\x).(pi2\N)}" apply(nominal_induct M avoiding: c x N rule: trm.strong_induct) -apply(auto simp add: eq_bij fresh_bij eqvts) +apply(auto simp: eq_bij fresh_bij eqvts) apply(perm_simp)+ done lemma nsubst_eqvt[eqvt]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1\(M{x:=.N}) = (pi1\M){(pi1\x):=<(pi1\c)>.(pi1\N)}" and "pi2\(M{x:=.N}) = (pi2\M){(pi2\x):=<(pi2\c)>.(pi2\N)}" apply(nominal_induct M avoiding: c x N rule: trm.strong_induct) -apply(auto simp add: eq_bij fresh_bij eqvts) +apply(auto simp: eq_bij fresh_bij eqvts) apply(perm_simp)+ done lemma supp_subst1: shows "supp (M{y:=.P}) \ ((supp M) - {y}) \ (supp P)" apply(nominal_induct M avoiding: y P c rule: trm.strong_induct) apply(auto) -apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) +apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast)+ apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(blast)+ apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{y:=.P},P,name1,trm2{y:=.P},name2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{y:=.P},P,name1,trm2{y:=.P},name2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{y:=.P},P,name1,trm2{y:=.P},name2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{y:=.P},P,name1,trm2{y:=.P},name2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(blast)+ apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.P},P,name1,trm2{name2:=.P})") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.P},P,name1,trm2{name2:=.P})") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.P},P,name1,trm2{name2:=.P})") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(blast)+ done lemma supp_subst2: shows "supp (M{y:=.P}) \ supp (M) \ ((supp P) - {c})" apply(nominal_induct M avoiding: y P c rule: trm.strong_induct) apply(auto) -apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) +apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast)+ apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(blast)+ apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{y:=.P},P,name1,trm2{y:=.P},name2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{y:=.P},P,name1,trm2{y:=.P},name2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(blast)+ apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.P},P,name1,trm2{name2:=.P})") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.P},P,name1,trm2{name2:=.P})") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.P},P,name1,trm2{name2:=.P})") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.P},P,name1,trm2{name2:=.P})") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(blast)+ done lemma supp_subst3: shows "supp (M{c:=(x).P}) \ ((supp M) - {c}) \ (supp P)" apply(nominal_induct M avoiding: x P c rule: trm.strong_induct) apply(auto) -apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) +apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast)+ apply(subgoal_tac "\x'::coname. x'\(trm{coname:=(x).P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname:=(x).P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm1{coname3:=(x).P},P,trm2{coname3:=(x).P},coname1,coname2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm1{coname3:=(x).P},P,trm2{coname3:=(x).P},coname1,coname2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm1{coname3:=(x).P},P,trm2{coname3:=(x).P},coname1,coname2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm1{coname3:=(x).P},P,trm2{coname3:=(x).P},coname1,coname2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(blast)+ apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(blast)+ apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR abs_fresh abs_supp fin_supp fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR abs_fresh abs_supp fin_supp fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR abs_fresh abs_supp fin_supp fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(blast)+ done lemma supp_subst4: shows "supp (M{c:=(x).P}) \ (supp M) \ ((supp P) - {x})" apply(nominal_induct M avoiding: x P c rule: trm.strong_induct) apply(auto) -apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) +apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast)+ apply(subgoal_tac "\x'::coname. x'\(trm{coname:=(x).P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname:=(x).P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname:=(x).P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm1{coname3:=(x).P},P,trm2{coname3:=(x).P},coname1,coname2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm1{coname3:=(x).P},P,trm2{coname3:=(x).P},coname1,coname2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(blast)+ apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(blast)+ apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR abs_fresh abs_supp fin_supp fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR abs_fresh abs_supp fin_supp fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR abs_fresh abs_supp fin_supp fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(blast)+ done lemma supp_subst5: shows "(supp M - {y}) \ supp (M{y:=.P})" apply(nominal_induct M avoiding: y P c rule: trm.strong_induct) apply(auto) -apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) +apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast)+ apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(blast) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{y:=.P},P,name1,trm2{y:=.P},name2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{y:=.P},P,name1,trm2{y:=.P},name2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(blast) apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.P},P,name1,trm2{name2:=.P})") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.P},P,name1,trm2{name2:=.P})") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(blast) done lemma supp_subst6: shows "(supp M) \ ((supp (M{y:=.P}))::coname set)" apply(nominal_induct M avoiding: y P c rule: trm.strong_induct) apply(auto) -apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) +apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast)+ apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(blast) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{y:=.P},P,name1,trm2{y:=.P},name2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{y:=.P},P,name1,trm2{y:=.P},name2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(blast) apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.P},P,name1,trm2{name2:=.P})") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.P},P,name1,trm2{name2:=.P})") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm) apply(blast) apply(rule exists_fresh'(1)[OF fs_name1]) apply(blast) done lemma supp_subst7: shows "(supp M - {c}) \ supp (M{c:=(x).P})" apply(nominal_induct M avoiding: x P c rule: trm.strong_induct) apply(auto) -apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) +apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast)+ apply(subgoal_tac "\x'::coname. x'\(trm{coname:=(x).P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm1{coname3:=(x).P},P,trm2{coname3:=(x).P},coname1,coname2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm1{coname3:=(x).P},P,trm2{coname3:=(x).P},coname1,coname2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(blast)+ apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(blast)+ apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR abs_fresh abs_supp fin_supp fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(blast) done lemma supp_subst8: shows "(supp M) \ ((supp (M{c:=(x).P}))::name set)" apply(nominal_induct M avoiding: x P c rule: trm.strong_induct) apply(auto) -apply(auto simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) +apply(auto simp: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast)+ apply(subgoal_tac "\x'::coname. x'\(trm{coname:=(x).P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm1{coname3:=(x).P},P,trm2{coname3:=(x).P},coname1,coname2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm1{coname3:=(x).P},P,trm2{coname3:=(x).P},coname1,coname2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(blast)+ apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2 abs_fresh fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(blast) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR abs_fresh abs_supp fin_supp fresh_atm) apply(simp add: fresh_def abs_supp trm.supp supp_atm fin_supp) apply(blast) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(blast)+ done lemmas subst_supp = supp_subst1 supp_subst2 supp_subst3 supp_subst4 supp_subst5 supp_subst6 supp_subst7 supp_subst8 lemma subst_fresh: fixes x::"name" and c::"coname" shows "x\P \ x\M{x:=.P}" and "b\P \ b\M{b:=(y).P}" and "x\(M,P) \ x\M{y:=.P}" and "x\M \ x\M{c:=(x).P}" and "x\(M,P) \ x\M{c:=(y).P}" and "b\(M,P) \ b\M{c:=(y).P}" and "b\M \ b\M{y:=.P}" and "b\(M,P) \ b\M{y:=.P}" apply - apply(insert subst_supp) apply(simp_all add: fresh_def supp_prod) apply(blast)+ done lemma forget: shows "x\M \ M{x:=.P} = M" and "c\M \ M{c:=(x).P} = M" apply(nominal_induct M avoiding: x c P rule: trm.strong_induct) -apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp) +apply(auto simp: fresh_atm abs_fresh abs_supp fin_supp) done lemma substc_rename1: assumes a: "c\(M,a)" shows "M{a:=(x).N} = ([(c,a)]\M){c:=(x).N}" using a proof(nominal_induct M avoiding: c a x N rule: trm.strong_induct) case (Ax z d) - then show ?case by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha) + then show ?case by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha) next case NotL - then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) + then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) next case (NotR y M d) then show ?case - by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) + by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) next case (AndR c1 M c2 M' c3) then show ?case - apply(auto simp add: fresh_prod calc_atm fresh_atm abs_fresh fresh_left) + apply(auto simp: fresh_prod calc_atm fresh_atm abs_fresh fresh_left) apply (metis (erased, opaque_lifting)) by metis next case AndL1 - then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) + then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) next case AndL2 - then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) + then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) next case (OrR1 d M e) then show ?case - by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) + by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) next case (OrR2 d M e) then show ?case - by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) + by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) next case (OrL x1 M x2 M' x3) then show ?case - by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) next case ImpL then show ?case - by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) metis next case (ImpR y d M e) then show ?case - by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) next case (Cut d M y M') then show ?case by(simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) (metis crename.simps(1) crename_id crename_rename) qed lemma substc_rename2: assumes a: "y\(N,x)" shows "M{a:=(x).N} = M{a:=(y).([(y,x)]\N)}" using a proof(nominal_induct M avoiding: a x y N rule: trm.strong_induct) case (Ax z d) then show ?case - by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) + by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) next case NotL then show ?case - by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) + by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) next case (NotR y M d) then show ?case - apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) apply(subgoal_tac "\a'::coname. a'\(N,M{d:=(y).([(y,x)]\N)},[(y,x)]\N)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR) apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (AndR c1 M c2 M' c3) then show ?case - apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) apply(subgoal_tac "\a'::coname. a'\(N,M{c3:=(y).([(y,x)]\N)},M'{c3:=(y).([(y,x)]\N)},[(y,x)]\N,c1,c2,c3)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR) - apply (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh subst_fresh perm_swap fresh_left) + apply (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh subst_fresh perm_swap fresh_left) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case AndL1 - then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) next case AndL2 - then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) next case (OrR1 d M e) then show ?case - apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) apply(subgoal_tac "\a'::coname. a'\(N,M{e:=(y).([(y,x)]\N)},[(y,x)]\N,d,e)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1) apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (OrR2 d M e) then show ?case - apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) apply(subgoal_tac "\a'::coname. a'\(N,M{e:=(y).([(y,x)]\N)},[(y,x)]\N,d,e)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2) apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (OrL x1 M x2 M' x3) then show ?case - by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) next case ImpL then show ?case - by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) next case (ImpR y d M e) then show ?case - apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) apply(subgoal_tac "\a'::coname. a'\(N,M{e:=(y).([(y,x)]\N)},[(y,x)]\N,d,e)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR) apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (Cut d M y M') then show ?case - by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left perm_swap) + by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left perm_swap) qed lemma substn_rename3: assumes a: "y\(M,x)" shows "M{x:=.N} = ([(y,x)]\M){y:=.N}" using a proof(nominal_induct M avoiding: a x y N rule: trm.strong_induct) case (Ax z d) - then show ?case by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha) + then show ?case by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha) next case NotR - then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) + then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) next case (NotL d M z) then show ?case - by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) + by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) next case (AndR c1 M c2 M' c3) then show ?case - by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) next case OrR1 - then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) + then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) next case OrR2 - then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) + then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) next case (AndL1 u M v) then show ?case - by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) + by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) next case (AndL2 u M v) then show ?case - by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) + by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) next case (OrL x1 M x2 M' x3) then show ?case by(simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) (metis (poly_guards_query)) next case ImpR then show ?case - by(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_left abs_supp fin_supp fresh_prod) + by(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_left abs_supp fin_supp fresh_prod) next case (ImpL d M v M' u) then show ?case by(simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) (metis (poly_guards_query)) next case (Cut d M y M') then show ?case - apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm) apply metis done qed lemma substn_rename4: assumes a: "c\(N,a)" shows "M{x:=.N} = M{x:=.([(c,a)]\N)}" using a proof(nominal_induct M avoiding: x c a N rule: trm.strong_induct) case (Ax z d) then show ?case - by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) + by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) next case NotR then show ?case - by (auto simp add: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) + by (auto simp: fresh_prod fresh_atm calc_atm trm.inject alpha perm_swap fresh_left) next case (NotL d M y) then show ?case - apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) apply(subgoal_tac "\a'::name. a'\(N,M{x:=.([(c,a)]\N)},[(c,a)]\N)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL) apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done next case (OrL x1 M x2 M' x3) then show ?case - apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) apply(subgoal_tac "\a'::name. a'\(N,M{x:=.([(c,a)]\N)},M'{x:=.([(c,a)]\N)},[(c,a)]\N,x1,x2,x3)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL) - apply (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh subst_fresh perm_swap fresh_left) + apply (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh subst_fresh perm_swap fresh_left) apply(rule exists_fresh'(1)[OF fs_name1]) done next case OrR1 - then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) next case OrR2 - then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + then show ?case by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) next case (AndL1 u M v) then show ?case - apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) apply(subgoal_tac "\a'::name. a'\(N,M{x:=.([(c,a)]\N)},[(c,a)]\N,u,v)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1) apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done next case (AndL2 u M v) then show ?case - apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) apply(subgoal_tac "\a'::name. a'\(N,M{x:=.([(c,a)]\N)},[(c,a)]\N,u,v)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2) apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done next case (AndR c1 M c2 M' c3) then show ?case - by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) next case ImpR then show ?case - by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) next case (ImpL d M y M' u) then show ?case - apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) + apply(auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) apply(subgoal_tac "\a'::name. a'\(N,M{u:=.([(c,a)]\N)},M'{u:=.([(c,a)]\N)},[(c,a)]\N,y,u)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL) apply(simp add: trm.inject alpha perm_swap fresh_left calc_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done next case (Cut d M y M') then show ?case - by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left perm_swap) + by (auto simp: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left perm_swap) qed lemma subst_rename5: assumes a: "c'\(c,N)" "x'\(x,M)" shows "M{x:=.N} = ([(x',x)]\M){x':=.([(c',c)]\N)}" proof - have "M{x:=.N} = ([(x',x)]\M){x':=.N}" using a by (simp add: substn_rename3) also have "\ = ([(x',x)]\M){x':=.([(c',c)]\N)}" using a by (simp add: substn_rename4) finally show ?thesis by simp qed lemma subst_rename6: assumes a: "c'\(c,M)" "x'\(x,N)" shows "M{c:=(x).N} = ([(c',c)]\M){c':=(x').([(x',x)]\N)}" proof - have "M{c:=(x).N} = ([(c',c)]\M){c':=(x).N}" using a by (simp add: substc_rename1) also have "\ = ([(c',c)]\M){c':=(x').([(x',x)]\N)}" using a by (simp add: substc_rename2) finally show ?thesis by simp qed lemmas subst_rename = substc_rename1 substc_rename2 substn_rename3 substn_rename4 subst_rename5 subst_rename6 lemma better_Cut_substn[simp]: assumes a: "a\[c].P" "x\(y,P)" shows "(Cut .M (x).N){y:=.P} = (if M=Ax y a then Cut .P (x).(N{y:=.P}) else Cut .(M{y:=.P}) (x).(N{y:=.P}))" proof - obtain x'::"name" where fs1: "x'\(M,N,c,P,x,y)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\(M,N,c,P,a)" by (rule exists_fresh(2), rule fin_supp, blast) have eq1: "(Cut .M (x).N) = (Cut .([(a',a)]\M) (x').([(x',x)]\N))" - using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) have eq2: "(M=Ax y a) = (([(a',a)]\M)=Ax y a')" - apply(auto simp add: calc_atm) + apply(auto simp: calc_atm) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm) done have "(Cut .M (x).N){y:=.P} = (Cut .([(a',a)]\M) (x').([(x',x)]\N)){y:=.P}" using eq1 by simp also have "\ = (if ([(a',a)]\M)=Ax y a' then Cut .P (x').(([(x',x)]\N){y:=.P}) else Cut .(([(a',a)]\M){y:=.P}) (x').(([(x',x)]\N){y:=.P}))" - using fs1 fs2 by (auto simp add: fresh_prod fresh_left calc_atm fresh_atm) + using fs1 fs2 by (auto simp: fresh_prod fresh_left calc_atm fresh_atm) also have "\ =(if M=Ax y a then Cut .P (x).(N{y:=.P}) else Cut .(M{y:=.P}) (x).(N{y:=.P}))" using fs1 fs2 a apply - apply(simp only: eq2[symmetric]) - apply(auto simp add: trm.inject) + apply(auto simp: trm.inject) apply(simp_all add: alpha fresh_atm fresh_prod subst_fresh) apply(simp_all add: eqvts perm_fresh_fresh calc_atm) apply(auto) apply(rule subst_rename) apply(simp add: fresh_prod fresh_atm) apply(simp add: abs_fresh) apply(simp add: perm_fresh_fresh) done finally show ?thesis by simp qed lemma better_Cut_substc[simp]: assumes a: "a\(c,P)" "x\[y].P" shows "(Cut .M (x).N){c:=(y).P} = (if N=Ax x c then Cut .(M{c:=(y).P}) (y).P else Cut .(M{c:=(y).P}) (x).(N{c:=(y).P}))" proof - obtain x'::"name" where fs1: "x'\(M,N,c,P,x,y)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\(M,N,c,P,a)" by (rule exists_fresh(2), rule fin_supp, blast) have eq1: "(Cut .M (x).N) = (Cut .([(a',a)]\M) (x').([(x',x)]\N))" - using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) have eq2: "(N=Ax x c) = (([(x',x)]\N)=Ax x' c)" - apply(auto simp add: calc_atm) + apply(auto simp: calc_atm) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm) done have "(Cut .M (x).N){c:=(y).P} = (Cut .([(a',a)]\M) (x').([(x',x)]\N)){c:=(y).P}" using eq1 by simp also have "\ = (if ([(x',x)]\N)=Ax x' c then Cut .(([(a',a)]\M){c:=(y).P}) (y).P else Cut .(([(a',a)]\M){c:=(y).P}) (x').(([(x',x)]\N){c:=(y).P}))" using fs1 fs2 by (simp add: fresh_prod fresh_left calc_atm fresh_atm trm.inject) also have "\ =(if N=Ax x c then Cut .(M{c:=(y).P}) (y).P else Cut .(M{c:=(y).P}) (x).(N{c:=(y).P}))" using fs1 fs2 a apply - apply(simp only: eq2[symmetric]) - apply(auto simp add: trm.inject) + apply(auto simp: trm.inject) apply(simp_all add: alpha fresh_atm fresh_prod subst_fresh) apply(simp_all add: eqvts perm_fresh_fresh calc_atm) apply(auto) apply(rule subst_rename) apply(simp add: fresh_prod fresh_atm) apply(simp add: abs_fresh) apply(simp add: perm_fresh_fresh) done finally show ?thesis by simp qed lemma better_Cut_substn': assumes a: "a\[c].P" "y\(N,x)" "M\Ax y a" shows "(Cut .M (x).N){y:=.P} = Cut .(M{y:=.P}) (x).N" using a apply - apply(generate_fresh "name") apply(subgoal_tac "Cut .M (x).N = Cut .M (ca).([(ca,x)]\N)") apply(simp) apply(subgoal_tac"y\([(ca,x)]\N)") apply(simp add: forget) apply(simp add: trm.inject) -apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] +apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1] apply(simp add: trm.inject) apply(rule sym) apply(simp add: alpha fresh_prod fresh_atm) done lemma better_NotR_substc: assumes a: "d\M" shows "(NotR (x).M d){d:=(z).P} = fresh_fun (\a'. Cut .NotR (x).M a' (z).P)" using a apply - apply(generate_fresh "name") apply(subgoal_tac "NotR (x).M d = NotR (c).([(c,x)]\M) d") -apply(auto simp add: fresh_left calc_atm forget) +apply(auto simp: fresh_left calc_atm forget) apply(generate_fresh "coname") apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: fun_eq_iff) apply(rule allI) apply(simp add: trm.inject alpha fresh_prod fresh_atm) apply(perm_simp add: trm.inject alpha fresh_prod fresh_atm fresh_left, auto) done lemma better_NotL_substn: assumes a: "y\M" shows "(NotL .M y){y:=.P} = fresh_fun (\x'. Cut .P (x').NotL .M x')" using a apply - apply(generate_fresh "coname") apply(subgoal_tac "NotL .M y = NotL .([(ca,a)]\M) y") -apply(auto simp add: fresh_left calc_atm forget) +apply(auto simp: fresh_left calc_atm forget) apply(generate_fresh "name") apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: fun_eq_iff) apply(rule allI) apply(simp add: trm.inject alpha fresh_prod fresh_atm) apply(perm_simp add: trm.inject alpha fresh_prod fresh_atm fresh_left, auto) done lemma better_AndL1_substn: assumes a: "y\[x].M" shows "(AndL1 (x).M y){y:=.P} = fresh_fun (\z'. Cut .P (z').AndL1 (x).M z')" using a apply - apply(generate_fresh "name") apply(subgoal_tac "AndL1 (x).M y = AndL1 (ca).([(ca,x)]\M) y") -apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] +apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] apply(generate_fresh "name") apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: fun_eq_iff) apply(rule allI) apply(simp add: trm.inject alpha fresh_prod fresh_atm) apply(rule forget) apply(simp add: fresh_left calc_atm) apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: fun_eq_iff) apply(rule allI) apply(simp add: trm.inject alpha fresh_prod fresh_atm) apply(rule forget) apply(simp add: fresh_left calc_atm) apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) apply(auto) done lemma better_AndL2_substn: assumes a: "y\[x].M" shows "(AndL2 (x).M y){y:=.P} = fresh_fun (\z'. Cut .P (z').AndL2 (x).M z')" using a apply - apply(generate_fresh "name") apply(subgoal_tac "AndL2 (x).M y = AndL2 (ca).([(ca,x)]\M) y") -apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] +apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] apply(generate_fresh "name") apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: fun_eq_iff) apply(rule allI) apply(simp add: trm.inject alpha fresh_prod fresh_atm) apply(rule forget) apply(simp add: fresh_left calc_atm) apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: fun_eq_iff) apply(rule allI) apply(simp add: trm.inject alpha fresh_prod fresh_atm) apply(rule forget) apply(simp add: fresh_left calc_atm) apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) apply(auto) done lemma better_AndR_substc: assumes a: "c\([a].M,[b].N)" shows "(AndR .M .N c){c:=(z).P} = fresh_fun (\a'. Cut .(AndR .M .N a') (z).P)" using a apply - apply(generate_fresh "coname") apply(generate_fresh "coname") apply(subgoal_tac "AndR .M .N c = AndR .([(ca,a)]\M) .([(caa,b)]\N) c") -apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] +apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] apply(rule trans) apply(rule substc.simps) -apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] -apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] -apply(auto simp add: fresh_prod fresh_atm)[1] +apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1] +apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1] +apply(auto simp: fresh_prod fresh_atm)[1] apply(simp) apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: fun_eq_iff) apply(rule allI) apply(simp add: trm.inject alpha fresh_prod fresh_atm) apply(rule conjI) apply(rule forget) -apply(auto simp add: fresh_left calc_atm abs_fresh)[1] +apply(auto simp: fresh_left calc_atm abs_fresh)[1] apply(rule forget) -apply(auto simp add: fresh_left calc_atm abs_fresh)[1] +apply(auto simp: fresh_left calc_atm abs_fresh)[1] apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) apply(auto) done lemma better_OrL_substn: assumes a: "x\([y].M,[z].N)" shows "(OrL (y).M (z).N x){x:=.P} = fresh_fun (\z'. Cut .P (z').OrL (y).M (z).N z')" using a apply - apply(generate_fresh "name") apply(generate_fresh "name") apply(subgoal_tac "OrL (y).M (z).N x = OrL (ca).([(ca,y)]\M) (caa).([(caa,z)]\N) x") -apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] +apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] apply(rule trans) apply(rule substn.simps) -apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] -apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] -apply(auto simp add: fresh_prod fresh_atm)[1] +apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1] +apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1] +apply(auto simp: fresh_prod fresh_atm)[1] apply(simp) apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: fun_eq_iff) apply(rule allI) apply(simp add: trm.inject alpha fresh_prod fresh_atm) apply(rule conjI) apply(rule forget) -apply(auto simp add: fresh_left calc_atm abs_fresh)[1] +apply(auto simp: fresh_left calc_atm abs_fresh)[1] apply(rule forget) -apply(auto simp add: fresh_left calc_atm abs_fresh)[1] +apply(auto simp: fresh_left calc_atm abs_fresh)[1] apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) apply(auto) done lemma better_OrR1_substc: assumes a: "d\[a].M" shows "(OrR1 .M d){d:=(z).P} = fresh_fun (\a'. Cut .OrR1 .M a' (z).P)" using a apply - apply(generate_fresh "coname") apply(subgoal_tac "OrR1 .M d = OrR1 .([(c,a)]\M) d") -apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] +apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: fun_eq_iff) apply(rule allI) apply(simp add: trm.inject alpha fresh_prod fresh_atm) apply(rule forget) apply(simp add: fresh_left calc_atm) apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: fun_eq_iff) apply(rule allI) apply(simp add: trm.inject alpha fresh_prod fresh_atm) apply(rule forget) apply(simp add: fresh_left calc_atm) apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) apply(auto) done lemma better_OrR2_substc: assumes a: "d\[a].M" shows "(OrR2 .M d){d:=(z).P} = fresh_fun (\a'. Cut .OrR2 .M a' (z).P)" using a apply - apply(generate_fresh "coname") apply(subgoal_tac "OrR2 .M d = OrR2 .([(c,a)]\M) d") -apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] +apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: fun_eq_iff) apply(rule allI) apply(simp add: trm.inject alpha fresh_prod fresh_atm) apply(rule forget) apply(simp add: fresh_left calc_atm) apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: fun_eq_iff) apply(rule allI) apply(simp add: trm.inject alpha fresh_prod fresh_atm) apply(rule forget) apply(simp add: fresh_left calc_atm) apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) apply(auto) done lemma better_ImpR_substc: assumes a: "d\[a].M" shows "(ImpR (x)..M d){d:=(z).P} = fresh_fun (\a'. Cut .ImpR (x)..M a' (z).P)" using a apply - apply(generate_fresh "coname") apply(generate_fresh "name") apply(subgoal_tac "ImpR (x)..M d = ImpR (ca)..([(c,a)]\[(ca,x)]\M) d") -apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] +apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: fun_eq_iff) apply(rule allI) apply(simp add: trm.inject alpha fresh_prod fresh_atm abs_perm abs_fresh fresh_left calc_atm) apply(rule forget) apply(simp add: fresh_left calc_atm) apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: fun_eq_iff) apply(rule allI) apply(simp add: trm.inject alpha fresh_prod fresh_atm abs_perm fresh_left calc_atm abs_fresh) apply(rule forget) apply(simp add: fresh_left calc_atm) apply(rule sym) apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm abs_fresh abs_perm) done lemma better_ImpL_substn: assumes a: "y\(M,[x].N)" shows "(ImpL .M (x).N y){y:=.P} = fresh_fun (\z'. Cut .P (z').ImpL .M (x).N z')" using a apply - apply(generate_fresh "coname") apply(generate_fresh "name") apply(subgoal_tac "ImpL .M (x).N y = ImpL .([(ca,a)]\M) (caa).([(caa,x)]\N) y") -apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] +apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: fun_eq_iff) apply(rule allI) apply(simp add: trm.inject alpha fresh_prod fresh_atm abs_perm abs_fresh fresh_left calc_atm) apply(rule forget) apply(simp add: fresh_left calc_atm) apply(auto)[1] apply(rule sym) apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm abs_fresh abs_perm) done lemma freshn_after_substc: fixes x::"name" assumes a: "x\M{c:=(y).P}" shows "x\M" using a supp_subst8 apply(simp add: fresh_def) apply(blast) done lemma freshn_after_substn: fixes x::"name" assumes a: "x\M{y:=.P}" "x\y" shows "x\M" using a using a supp_subst5 apply(simp add: fresh_def) apply(blast) done lemma freshc_after_substc: fixes a::"coname" assumes a: "a\M{c:=(y).P}" "a\c" shows "a\M" using a supp_subst7 apply(simp add: fresh_def) apply(blast) done lemma freshc_after_substn: fixes a::"coname" assumes a: "a\M{y:=.P}" shows "a\M" using a supp_subst6 apply(simp add: fresh_def) apply(blast) done lemma substn_crename_comm: assumes a: "c\a" "c\b" shows "M{x:=.P}[a\c>b] = M[a\c>b]{x:=.(P[a\c>b])}" using a apply(nominal_induct M avoiding: x c P a b rule: trm.strong_induct) -apply(auto simp add: subst_fresh rename_fresh trm.inject) +apply(auto simp: subst_fresh rename_fresh trm.inject) apply(subgoal_tac "\x'::name. x'\(P,x,c)") apply(erule exE) apply(subgoal_tac "Cut .P (x).Ax x a = Cut .P (x').Ax x' a") apply(simp) apply(rule trans) apply(rule crename.simps) apply(simp add: fresh_prod fresh_atm) apply(simp) apply(simp add: trm.inject) apply(simp add: alpha trm.inject calc_atm fresh_atm) apply(simp add: trm.inject) apply(simp add: alpha trm.inject calc_atm fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) apply(rule trans) apply(rule better_crename_Cut) apply(simp add: fresh_atm) apply(simp) apply(simp add: crename_id) apply(rule trans) apply(rule better_crename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) -apply(auto simp add: fresh_atm)[1] +apply(auto simp: fresh_atm)[1] apply(rule trans) apply(rule better_crename_Cut) apply(simp add: fresh_atm) -apply(auto simp add: fresh_atm)[1] +apply(auto simp: fresh_atm)[1] apply(drule crename_ax) apply(simp add: fresh_atm) apply(simp add: fresh_atm) apply(simp) apply(subgoal_tac "\x'::name. x'\(trm{x:=.P},P,P[a\c>b],x,trm[a\c>b]{x:=.P[a\c>b]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL) apply(rule trans) apply(rule better_crename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) apply(subgoal_tac "\x'::name. x'\(trm{x:=.P},P,P[a\c>b],name1,trm[a\c>b]{x:=.P[a\c>b]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1) apply(rule trans) apply(rule better_crename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) apply(subgoal_tac "\x'::name. x'\(trm{x:=.P},P,P[a\c>b],name1,trm[a\c>b]{x:=.P[a\c>b]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2) apply(rule trans) apply(rule better_crename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) apply(subgoal_tac "\x'::name. x'\(trm1{x:=.P},trm2{x:=.P},P,P[a\c>b],name1,name2, trm1[a\c>b]{x:=.P[a\c>b]},trm2[a\c>b]{x:=.P[a\c>b]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL) apply(rule trans) apply(rule better_crename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh subst_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.P},trm2{name2:=.P},P,P[a\c>b],name1, trm1[a\c>b]{name2:=.P[a\c>b]},trm2[a\c>b]{name2:=.P[a\c>b]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL) apply(rule trans) apply(rule better_crename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh subst_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) done lemma substc_crename_comm: assumes a: "c\a" "c\b" shows "M{c:=(x).P}[a\c>b] = M[a\c>b]{c:=(x).(P[a\c>b])}" using a apply(nominal_induct M avoiding: x c P a b rule: trm.strong_induct) -apply(auto simp add: subst_fresh rename_fresh trm.inject) +apply(auto simp: subst_fresh rename_fresh trm.inject) apply(rule trans) apply(rule better_crename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(rule trans) apply(rule better_crename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(drule crename_ax) apply(simp add: fresh_atm) apply(simp add: fresh_atm) apply(simp) apply(subgoal_tac "\c'::coname. c'\(a,b,trm{coname:=(x).P},P,P[a\c>b],x,trm[a\c>b]{coname:=(x).P[a\c>b]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR) apply(rule trans) apply(rule better_crename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) apply(subgoal_tac "\c'::coname. c'\(coname1,coname2,a,b,trm1{coname3:=(x).P},trm2{coname3:=(x).P}, P,P[a\c>b],x,trm1[a\c>b]{coname3:=(x).P[a\c>b]},trm2[a\c>b]{coname3:=(x).P[a\c>b]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR) apply(rule trans) apply(rule better_crename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh subst_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) apply(subgoal_tac "\c'::coname. c'\(coname1,trm{coname2:=(x).P},P,P[a\c>b],a,b, trm[a\c>b]{coname2:=(x).P[a\c>b]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1) apply(rule trans) apply(rule better_crename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) apply(subgoal_tac "\c'::coname. c'\(coname1,trm{coname2:=(x).P},P,P[a\c>b],a,b, trm[a\c>b]{coname2:=(x).P[a\c>b]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2) apply(rule trans) apply(rule better_crename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) apply(subgoal_tac "\c'::coname. c'\(coname1,trm{coname2:=(x).P},P,P[a\c>b],a,b, trm[a\c>b]{coname2:=(x).P[a\c>b]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR) apply(rule trans) apply(rule better_crename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) done lemma substn_nrename_comm: assumes a: "x\y" "x\z" shows "M{x:=.P}[y\n>z] = M[y\n>z]{x:=.(P[y\n>z])}" using a apply(nominal_induct M avoiding: x c P y z rule: trm.strong_induct) -apply(auto simp add: subst_fresh rename_fresh trm.inject) +apply(auto simp: subst_fresh rename_fresh trm.inject) apply(rule trans) apply(rule better_nrename_Cut) apply(simp add: fresh_prod fresh_atm) apply(simp add: trm.inject) apply(rule trans) apply(rule better_nrename_Cut) apply(simp add: fresh_atm) apply(simp) apply(drule nrename_ax) apply(simp add: fresh_atm) apply(simp add: fresh_atm) apply(simp) apply(subgoal_tac "\x'::name. x'\(y,z,trm{x:=.P},P,P[y\n>z],x,trm[y\n>z]{x:=.P[y\n>z]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL) apply(rule trans) apply(rule better_nrename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) apply(subgoal_tac "\x'::name. x'\(trm{x:=.P},P,P[y\n>z],name1,trm[y\n>z]{x:=.P[y\n>z]},y,z)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1) apply(rule trans) apply(rule better_nrename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) apply(subgoal_tac "\x'::name. x'\(y,z,trm{x:=.P},P,P[y\n>z],name1,trm[y\n>z]{x:=.P[y\n>z]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2) apply(rule trans) apply(rule better_nrename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) apply(subgoal_tac "\x'::name. x'\(trm1{x:=.P},trm2{x:=.P},P,P[y\n>z],name1,name2,y,z, trm1[y\n>z]{x:=.P[y\n>z]},trm2[y\n>z]{x:=.P[y\n>z]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL) apply(rule trans) apply(rule better_nrename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh subst_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.P},trm2{name2:=.P},P,P[y\n>z],y,z,name1, trm1[y\n>z]{name2:=.P[y\n>z]},trm2[y\n>z]{name2:=.P[y\n>z]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL) apply(rule trans) apply(rule better_nrename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh subst_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) done lemma substc_nrename_comm: assumes a: "x\y" "x\z" shows "M{c:=(x).P}[y\n>z] = M[y\n>z]{c:=(x).(P[y\n>z])}" using a apply(nominal_induct M avoiding: x c P y z rule: trm.strong_induct) -apply(auto simp add: subst_fresh rename_fresh trm.inject) +apply(auto simp: subst_fresh rename_fresh trm.inject) apply(rule trans) apply(rule better_nrename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(rule trans) apply(rule better_nrename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(rule trans) apply(rule better_nrename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(rule trans) apply(rule better_nrename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(drule nrename_ax) apply(simp add: fresh_atm) apply(simp add: fresh_atm) apply(simp) apply(rule trans) apply(rule better_nrename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(drule nrename_ax) apply(simp add: fresh_atm) apply(simp add: fresh_atm) apply(simp) apply(subgoal_tac "\c'::coname. c'\(y,z,trm{coname:=(x).P},P,P[y\n>z],x,trm[y\n>z]{coname:=(x).P[y\n>z]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR) apply(rule trans) apply(rule better_nrename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) apply(subgoal_tac "\c'::coname. c'\(coname1,coname2,y,z,trm1{coname3:=(x).P},trm2{coname3:=(x).P}, P,P[y\n>z],x,trm1[y\n>z]{coname3:=(x).P[y\n>z]},trm2[y\n>z]{coname3:=(x).P[y\n>z]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR) apply(rule trans) apply(rule better_nrename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh subst_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) apply(subgoal_tac "\c'::coname. c'\(coname1,trm{coname2:=(x).P},P,P[y\n>z],y,z, trm[y\n>z]{coname2:=(x).P[y\n>z]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1) apply(rule trans) apply(rule better_nrename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) apply(subgoal_tac "\c'::coname. c'\(coname1,trm{coname2:=(x).P},P,P[y\n>z],y,z, trm[y\n>z]{coname2:=(x).P[y\n>z]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2) apply(rule trans) apply(rule better_nrename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) apply(subgoal_tac "\c'::coname. c'\(coname1,trm{coname2:=(x).P},P,P[y\n>z],y,z, trm[y\n>z]{coname2:=(x).P[y\n>z]})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR) apply(rule trans) apply(rule better_nrename_Cut) apply(simp add: fresh_atm fresh_prod) apply(simp add: rename_fresh fresh_atm) apply(rule exists_fresh') apply(rule fin_supp) done lemma substn_crename_comm': assumes a: "a\c" "a\P" shows "M{x:=.P}[a\c>b] = M[a\c>b]{x:=.P}" using a proof - assume a1: "a\c" assume a2: "a\P" obtain c'::"coname" where fs2: "c'\(c,P,a,b)" by (rule exists_fresh(2), rule fin_supp, blast) have eq: "M{x:=.P} = M{x:=.([(c',c)]\P)}" using fs2 apply - apply(rule subst_rename) apply(simp) done have eq': "M[a\c>b]{x:=.P} = M[a\c>b]{x:=.([(c',c)]\P)}" using fs2 apply - apply(rule subst_rename) apply(simp) done have eq2: "([(c',c)]\P)[a\c>b] = ([(c',c)]\P)" using fs2 a2 a1 apply - apply(rule rename_fresh) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) done have "M{x:=.P}[a\c>b] = M{x:=.([(c',c)]\P)}[a\c>b]" using eq by simp also have "\ = M[a\c>b]{x:=.(([(c',c)]\P)[a\c>b])}" using fs2 apply - apply(rule substn_crename_comm) apply(simp_all add: fresh_prod fresh_atm) done also have "\ = M[a\c>b]{x:=.(([(c',c)]\P))}" using eq2 by simp also have "\ = M[a\c>b]{x:=.P}" using eq' by simp finally show ?thesis by simp qed lemma substc_crename_comm': assumes a: "c\a" "c\b" "a\P" shows "M{c:=(x).P}[a\c>b] = M[a\c>b]{c:=(x).P}" using a proof - assume a1: "c\a" assume a1': "c\b" assume a2: "a\P" obtain c'::"coname" where fs2: "c'\(c,M,a,b)" by (rule exists_fresh(2), rule fin_supp, blast) have eq: "M{c:=(x).P} = ([(c',c)]\M){c':=(x).P}" using fs2 apply - apply(rule subst_rename) apply(simp) done have eq': "([(c',c)]\(M[a\c>b])){c':=(x).P} = M[a\c>b]{c:=(x).P}" using fs2 apply - apply(rule subst_rename[symmetric]) apply(simp add: rename_fresh) done have eq2: "([(c',c)]\M)[a\c>b] = ([(c',c)]\(M[a\c>b]))" using fs2 a2 a1 a1' apply - apply(simp add: rename_eqvts) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) done have "M{c:=(x).P}[a\c>b] = ([(c',c)]\M){c':=(x).P}[a\c>b]" using eq by simp also have "\ = ([(c',c)]\M)[a\c>b]{c':=(x).P[a\c>b]}" using fs2 apply - apply(rule substc_crename_comm) apply(simp_all add: fresh_prod fresh_atm) done also have "\ = ([(c',c)]\(M[a\c>b])){c':=(x).P[a\c>b]}" using eq2 by simp also have "\ = ([(c',c)]\(M[a\c>b])){c':=(x).P}" using a2 by (simp add: rename_fresh) also have "\ = M[a\c>b]{c:=(x).P}" using eq' by simp finally show ?thesis by simp qed lemma substn_nrename_comm': assumes a: "x\y" "x\z" "y\P" shows "M{x:=.P}[y\n>z] = M[y\n>z]{x:=.P}" using a proof - assume a1: "x\y" assume a1': "x\z" assume a2: "y\P" obtain x'::"name" where fs2: "x'\(x,M,y,z)" by (rule exists_fresh(1), rule fin_supp, blast) have eq: "M{x:=.P} = ([(x',x)]\M){x':=.P}" using fs2 apply - apply(rule subst_rename) apply(simp) done have eq': "([(x',x)]\(M[y\n>z])){x':=.P} = M[y\n>z]{x:=.P}" using fs2 apply - apply(rule subst_rename[symmetric]) apply(simp add: rename_fresh) done have eq2: "([(x',x)]\M)[y\n>z] = ([(x',x)]\(M[y\n>z]))" using fs2 a2 a1 a1' apply - apply(simp add: rename_eqvts) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) done have "M{x:=.P}[y\n>z] = ([(x',x)]\M){x':=.P}[y\n>z]" using eq by simp also have "\ = ([(x',x)]\M)[y\n>z]{x':=.P[y\n>z]}" using fs2 apply - apply(rule substn_nrename_comm) apply(simp_all add: fresh_prod fresh_atm) done also have "\ = ([(x',x)]\(M[y\n>z])){x':=.P[y\n>z]}" using eq2 by simp also have "\ = ([(x',x)]\(M[y\n>z])){x':=.P}" using a2 by (simp add: rename_fresh) also have "\ = M[y\n>z]{x:=.P}" using eq' by simp finally show ?thesis by simp qed lemma substc_nrename_comm': assumes a: "x\y" "y\P" shows "M{c:=(x).P}[y\n>z] = M[y\n>z]{c:=(x).P}" using a proof - assume a1: "x\y" assume a2: "y\P" obtain x'::"name" where fs2: "x'\(x,P,y,z)" by (rule exists_fresh(1), rule fin_supp, blast) have eq: "M{c:=(x).P} = M{c:=(x').([(x',x)]\P)}" using fs2 apply - apply(rule subst_rename) apply(simp) done have eq': "M[y\n>z]{c:=(x).P} = M[y\n>z]{c:=(x').([(x',x)]\P)}" using fs2 apply - apply(rule subst_rename) apply(simp) done have eq2: "([(x',x)]\P)[y\n>z] = ([(x',x)]\P)" using fs2 a2 a1 apply - apply(rule rename_fresh) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) done have "M{c:=(x).P}[y\n>z] = M{c:=(x').([(x',x)]\P)}[y\n>z]" using eq by simp also have "\ = M[y\n>z]{c:=(x').(([(x',x)]\P)[y\n>z])}" using fs2 apply - apply(rule substc_nrename_comm) apply(simp_all add: fresh_prod fresh_atm) done also have "\ = M[y\n>z]{c:=(x').(([(x',x)]\P))}" using eq2 by simp also have "\ = M[y\n>z]{c:=(x).P}" using eq' by simp finally show ?thesis by simp qed lemmas subst_comm = substn_crename_comm substc_crename_comm substn_nrename_comm substc_nrename_comm lemmas subst_comm' = substn_crename_comm' substc_crename_comm' substn_nrename_comm' substc_nrename_comm' text \typing contexts\ type_synonym ctxtn = "(name\ty) list" type_synonym ctxtc = "(coname\ty) list" inductive validc :: "ctxtc \ bool" where vc1[intro]: "validc []" | vc2[intro]: "\a\\; validc \\ \ validc ((a,T)#\)" equivariance validc inductive validn :: "ctxtn \ bool" where vn1[intro]: "validn []" | vn2[intro]: "\x\\; validn \\ \ validn ((x,T)#\)" equivariance validn lemma fresh_ctxt: fixes a::"coname" and x::"name" and \::"ctxtn" and \::"ctxtc" shows "a\\" and "x\\" proof - - show "a\\" by (induct \) (auto simp add: fresh_list_nil fresh_list_cons fresh_prod fresh_atm fresh_ty) -next - show "x\\" by (induct \) (auto simp add: fresh_list_nil fresh_list_cons fresh_prod fresh_atm fresh_ty) + show "a\\" by (induct \) (auto simp: fresh_list_nil fresh_list_cons fresh_prod fresh_atm fresh_ty) +next + show "x\\" by (induct \) (auto simp: fresh_list_nil fresh_list_cons fresh_prod fresh_atm fresh_ty) qed text \cut-reductions\ declare abs_perm[eqvt] inductive fin :: "trm \ name \ bool" where [intro]: "fin (Ax x a) x" | [intro]: "x\M \ fin (NotL .M x) x" | [intro]: "y\[x].M \ fin (AndL1 (x).M y) y" | [intro]: "y\[x].M \ fin (AndL2 (x).M y) y" | [intro]: "\z\[x].M;z\[y].N\ \ fin (OrL (x).M (y).N z) z" | [intro]: "\y\M;y\[x].N\ \ fin (ImpL .M (x).N y) y" equivariance fin lemma fin_Ax_elim: assumes a: "fin (Ax x a) y" shows "x=y" using a apply(erule_tac fin.cases) -apply(auto simp add: trm.inject) +apply(auto simp: trm.inject) done lemma fin_NotL_elim: assumes a: "fin (NotL .M x) y" shows "x=y \ x\M" using a apply(erule_tac fin.cases) -apply(auto simp add: trm.inject) +apply(auto simp: trm.inject) apply(subgoal_tac "y\[aa].Ma") apply(drule sym) apply(simp_all add: abs_fresh) done lemma fin_AndL1_elim: assumes a: "fin (AndL1 (x).M y) z" shows "z=y \ z\[x].M" using a apply(erule_tac fin.cases) -apply(auto simp add: trm.inject) +apply(auto simp: trm.inject) done lemma fin_AndL2_elim: assumes a: "fin (AndL2 (x).M y) z" shows "z=y \ z\[x].M" using a apply(erule_tac fin.cases) -apply(auto simp add: trm.inject) +apply(auto simp: trm.inject) done lemma fin_OrL_elim: assumes a: "fin (OrL (x).M (y).N u) z" shows "z=u \ z\[x].M \ z\[y].N" using a apply(erule_tac fin.cases) -apply(auto simp add: trm.inject) +apply(auto simp: trm.inject) done lemma fin_ImpL_elim: assumes a: "fin (ImpL .M (x).N z) y" shows "z=y \ z\M \ z\[x].N" using a apply(erule_tac fin.cases) -apply(auto simp add: trm.inject) +apply(auto simp: trm.inject) apply(subgoal_tac "y\[aa].Ma") apply(drule sym) apply(simp_all add: abs_fresh) apply (metis abs_fresh(5)) done lemma fin_rest_elims: shows "fin (Cut .M (x).N) y \ False" and "fin (NotR (x).M c) y \ False" and "fin (AndR .M .N c) y \ False" and "fin (OrR1 .M b) y \ False" and "fin (OrR2 .M b) y \ False" and "fin (ImpR (x)..M b) y \ False" by (erule fin.cases, simp_all add: trm.inject)+ lemmas fin_elims = fin_Ax_elim fin_NotL_elim fin_AndL1_elim fin_AndL2_elim fin_OrL_elim fin_ImpL_elim fin_rest_elims lemma fin_rename: shows "fin M x \ fin ([(x',x)]\M) x'" by (induct rule: fin.induct) - (auto simp add: calc_atm simp add: fresh_left abs_fresh) + (auto simp: calc_atm simp add: fresh_left abs_fresh) lemma not_fin_subst1: assumes a: "\(fin M x)" shows "\(fin (M{c:=(y).P}) x)" using a [[simproc del: defined_all]] apply(nominal_induct M avoiding: x c y P rule: trm.strong_induct) apply(auto) apply(drule fin_elims, simp) apply(drule fin_elims, simp) apply(drule fin_elims, simp) apply(subgoal_tac "\a'::coname. a'\(trm{coname:=(y).P},P,x)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR) apply(erule fin.cases, simp_all add: trm.inject) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(drule fin_elims, simp) apply(drule fin_elims) apply(auto)[1] apply(drule freshn_after_substc) apply(simp add: fin.intros) apply(subgoal_tac "\a'::coname. a'\(trm1{coname3:=(y).P},trm2{coname3:=(y).P},P,coname1,coname2,coname3,x)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR) apply(erule fin.cases, simp_all add: trm.inject) apply(subgoal_tac "\a'::coname. a'\(trm1{coname3:=(y).P},trm2{coname3:=(y).P},P,coname1,coname2,coname3,x)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR) apply(erule fin.cases, simp_all add: trm.inject) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(erule fin.cases, simp_all add: trm.inject) apply(drule fin_AndL1_elim) -apply(auto simp add: abs_fresh)[1] +apply(auto simp: abs_fresh)[1] apply(drule freshn_after_substc) apply(subgoal_tac "name2\[name1]. trm") apply(simp add: fin.intros) apply(simp add: abs_fresh) apply(drule fin_AndL2_elim) -apply(auto simp add: abs_fresh)[1] +apply(auto simp: abs_fresh)[1] apply(drule freshn_after_substc) apply(subgoal_tac "name2\[name1].trm") apply(simp add: fin.intros) apply(simp add: abs_fresh) apply(subgoal_tac "\a'::coname. a'\(trm{coname2:=(y).P},coname1,P,x)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1) apply(erule fin.cases, simp_all add: trm.inject) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(erule fin.cases, simp_all add: trm.inject) apply(subgoal_tac "\a'::coname. a'\(trm{coname2:=(y).P},coname1,P,x)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2) apply(erule fin.cases, simp_all add: trm.inject) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(erule fin.cases, simp_all add: trm.inject) apply(drule fin_OrL_elim) -apply(auto simp add: abs_fresh)[1] +apply(auto simp: abs_fresh)[1] apply(drule freshn_after_substc)+ apply(subgoal_tac "name3\[name1].trm1 \ name3\[name2].trm2") apply(simp add: fin.intros) apply(simp add: abs_fresh) apply(subgoal_tac "\a'::coname. a'\(trm{coname2:=(y).P},coname1,P,x)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR) apply(erule fin.cases, simp_all add: trm.inject) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(erule fin.cases, simp_all add: trm.inject) apply(drule fin_ImpL_elim) -apply(auto simp add: abs_fresh)[1] +apply(auto simp: abs_fresh)[1] apply(drule freshn_after_substc)+ apply(subgoal_tac "x\[name1].trm2") apply(simp add: fin.intros) apply(simp add: abs_fresh) done lemma not_fin_subst2: assumes a: "\(fin M x)" shows "\(fin (M{y:=.P}) x)" using a [[simproc del: defined_all]] apply(nominal_induct M avoiding: x c y P rule: trm.strong_induct) apply(auto) apply(erule fin.cases, simp_all add: trm.inject) apply(erule fin.cases, simp_all add: trm.inject) apply(erule fin.cases, simp_all add: trm.inject) apply(erule fin.cases, simp_all add: trm.inject) apply(subgoal_tac "\a'::name. a'\(trm{y:=.P},P,x)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL) apply(erule fin.cases, simp_all add: trm.inject) apply(rule exists_fresh'(1)[OF fs_name1]) apply(drule fin_NotL_elim) apply(auto)[1] apply(drule freshn_after_substn) apply(simp) apply(simp add: fin.intros) apply(erule fin.cases, simp_all add: trm.inject) apply(subgoal_tac "\a'::name. a'\(trm{y:=.P},P,name1,x)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1) apply(erule fin.cases, simp_all add: trm.inject) apply(rule exists_fresh'(1)[OF fs_name1]) apply(drule fin_AndL1_elim) -apply(auto simp add: abs_fresh)[1] +apply(auto simp: abs_fresh)[1] apply(drule freshn_after_substn) apply(simp) apply(subgoal_tac "name2\[name1]. trm") apply(simp add: fin.intros) apply(simp add: abs_fresh) apply(subgoal_tac "\a'::name. a'\(trm{y:=.P},P,name1,x)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2) apply(erule fin.cases, simp_all add: trm.inject) apply(rule exists_fresh'(1)[OF fs_name1]) apply(drule fin_AndL2_elim) -apply(auto simp add: abs_fresh)[1] +apply(auto simp: abs_fresh)[1] apply(drule freshn_after_substn) apply(simp) apply(subgoal_tac "name2\[name1].trm") apply(simp add: fin.intros) apply(simp add: abs_fresh) apply(erule fin.cases, simp_all add: trm.inject) apply(erule fin.cases, simp_all add: trm.inject) apply(subgoal_tac "\a'::name. a'\(trm1{y:=.P},trm2{y:=.P},name1,name2,P,x)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL) apply(erule fin.cases, simp_all add: trm.inject) apply(rule exists_fresh'(1)[OF fs_name1]) apply(drule fin_OrL_elim) -apply(auto simp add: abs_fresh)[1] +apply(auto simp: abs_fresh)[1] apply(drule freshn_after_substn) apply(simp) apply(drule freshn_after_substn) apply(simp) apply(subgoal_tac "name3\[name1].trm1 \ name3\[name2].trm2") apply(simp add: fin.intros) apply(simp add: abs_fresh) apply(erule fin.cases, simp_all add: trm.inject) apply(subgoal_tac "\a'::name. a'\(trm1{name2:=.P},trm2{name2:=.P},name1,P,x)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL) apply(erule fin.cases, simp_all add: trm.inject) apply(rule exists_fresh'(1)[OF fs_name1]) apply(drule fin_ImpL_elim) -apply(auto simp add: abs_fresh)[1] +apply(auto simp: abs_fresh)[1] apply(drule freshn_after_substn) apply(simp) apply(drule freshn_after_substn) apply(simp) apply(subgoal_tac "x\[name1].trm2") apply(simp add: fin.intros) apply(simp add: abs_fresh) done lemma fin_subst1: assumes a: "fin M x" "x\y" "x\P" shows "fin (M{y:=.P}) x" using a apply(nominal_induct M avoiding: x y c P rule: trm.strong_induct) apply(auto dest!: fin_elims simp add: subst_fresh abs_fresh) apply(rule fin.intros, simp add: subst_fresh abs_fresh) apply(rule fin.intros, simp add: subst_fresh abs_fresh) apply(rule fin.intros, simp add: subst_fresh abs_fresh) apply(rule fin.intros, simp add: subst_fresh abs_fresh) apply(rule fin.intros, simp add: subst_fresh abs_fresh, simp add: subst_fresh abs_fresh) apply(rule fin.intros, simp add: subst_fresh abs_fresh, simp add: subst_fresh abs_fresh) apply(rule fin.intros, simp add: subst_fresh abs_fresh, simp add: subst_fresh abs_fresh) apply(rule fin.intros, simp add: subst_fresh abs_fresh, simp add: subst_fresh abs_fresh) apply(rule fin.intros, simp add: subst_fresh abs_fresh, simp add: subst_fresh abs_fresh) done lemma fin_subst2: assumes a: "fin M y" "x\y" "y\P" "M\Ax y c" shows "fin (M{c:=(x).P}) y" using a apply(nominal_induct M avoiding: x y c P rule: trm.strong_induct) apply(drule fin_elims) apply(simp add: trm.inject) apply(rule fin.intros) apply(drule fin_elims, simp) apply(drule fin_elims, simp) apply(drule fin_elims, simp) apply(rule fin.intros) apply(rule subst_fresh) apply(simp) apply(drule fin_elims, simp) apply(drule fin_elims, simp) apply(rule fin.intros) apply(simp add: abs_fresh fresh_atm) apply(rule subst_fresh) apply(auto)[1] apply(drule fin_elims, simp) apply(rule fin.intros) apply(simp add: abs_fresh fresh_atm) apply(rule subst_fresh) apply(auto)[1] apply(drule fin_elims, simp) apply(drule fin_elims, simp) apply(drule fin_elims, simp) apply(rule fin.intros) apply(simp add: abs_fresh fresh_atm) apply(rule subst_fresh) apply(auto)[1] apply(simp add: abs_fresh fresh_atm) apply(rule subst_fresh) apply(auto)[1] apply(drule fin_elims, simp) apply(drule fin_elims, simp) apply(rule fin.intros) apply(simp add: abs_fresh fresh_atm) apply(rule subst_fresh) apply(auto)[1] apply(simp add: abs_fresh fresh_atm) apply(rule subst_fresh) apply(auto)[1] done lemma fin_substn_nrename: assumes a: "fin M x" "x\y" "x\P" shows "M[x\n>y]{y:=.P} = Cut .P (x).(M{y:=.P})" using a [[simproc del: defined_all]] apply(nominal_induct M avoiding: x y c P rule: trm.strong_induct) apply(drule fin_Ax_elim) apply(simp) apply(simp add: trm.inject) apply(simp add: alpha calc_atm fresh_atm) apply(simp) apply(drule fin_rest_elims) apply(simp) apply(drule fin_rest_elims) apply(simp) apply(drule fin_NotL_elim) apply(simp) apply(subgoal_tac "\z::name. z\(trm,y,x,P,trm[x\n>y]{y:=.P})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL) apply(simp add: trm.inject alpha fresh_atm calc_atm abs_fresh) apply(rule conjI) apply(simp add: nsubst_eqvt calc_atm) apply(simp add: perm_fresh_fresh) apply(simp add: nrename_fresh) apply(rule subst_fresh) apply(simp) apply(rule exists_fresh') apply(rule fin_supp) apply(drule fin_rest_elims) apply(simp) apply(drule fin_AndL1_elim) apply(simp) apply(subgoal_tac "\z::name. z\(name2,name1,P,trm[name2\n>y]{y:=.P},y,P,trm)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1) apply(simp add: trm.inject alpha fresh_atm calc_atm abs_fresh) apply(rule conjI) apply(simp add: nsubst_eqvt calc_atm) apply(simp add: perm_fresh_fresh) apply(simp add: nrename_fresh) apply(rule subst_fresh) apply(simp) apply(rule exists_fresh') apply(rule fin_supp) apply(drule fin_AndL2_elim) apply(simp) apply(subgoal_tac "\z::name. z\(name2,name1,P,trm[name2\n>y]{y:=.P},y,P,trm)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2) apply(simp add: trm.inject alpha fresh_atm calc_atm abs_fresh) apply(rule conjI) apply(simp add: nsubst_eqvt calc_atm) apply(simp add: perm_fresh_fresh) apply(simp add: nrename_fresh) apply(rule subst_fresh) apply(simp) apply(rule exists_fresh') apply(rule fin_supp) apply(drule fin_rest_elims) apply(simp) apply(drule fin_rest_elims) apply(simp) apply(drule fin_OrL_elim) apply(simp add: abs_fresh) apply(simp add: subst_fresh rename_fresh) apply(subgoal_tac "\z::name. z\(name3,name2,name1,P,trm1[name3\n>y]{y:=.P},trm2[name3\n>y]{y:=.P},y,P,trm1,trm2)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL) apply(simp add: trm.inject alpha fresh_atm calc_atm abs_fresh) apply(rule conjI) apply(simp add: nsubst_eqvt calc_atm) apply(simp add: perm_fresh_fresh) apply(simp add: nrename_fresh) apply(simp add: nsubst_eqvt calc_atm) apply(simp add: perm_fresh_fresh) apply(simp add: nrename_fresh) apply(rule exists_fresh') apply(rule fin_supp) apply(drule fin_rest_elims) apply(simp) apply(drule fin_ImpL_elim) apply(simp add: abs_fresh) apply(simp add: subst_fresh rename_fresh) apply(subgoal_tac "\z::name. z\(name1,x,P,trm1[x\n>y]{y:=.P},trm2[x\n>y]{y:=.P},y,P,trm1,trm2)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL) apply(simp add: trm.inject alpha fresh_atm calc_atm abs_fresh) apply(rule conjI) apply(simp add: nsubst_eqvt calc_atm) apply(simp add: perm_fresh_fresh) apply(simp add: nrename_fresh) apply(simp add: nsubst_eqvt calc_atm) apply(simp add: perm_fresh_fresh) apply(simp add: nrename_fresh) apply(rule exists_fresh') apply(rule fin_supp) done inductive fic :: "trm \ coname \ bool" where [intro]: "fic (Ax x a) a" | [intro]: "a\M \ fic (NotR (x).M a) a" | [intro]: "\c\[a].M;c\[b].N\ \ fic (AndR .M .N c) c" | [intro]: "b\[a].M \ fic (OrR1 .M b) b" | [intro]: "b\[a].M \ fic (OrR2 .M b) b" | [intro]: "\b\[a].M\ \ fic (ImpR (x)..M b) b" equivariance fic lemma fic_Ax_elim: assumes a: "fic (Ax x a) b" shows "a=b" using a apply(erule_tac fic.cases) -apply(auto simp add: trm.inject) +apply(auto simp: trm.inject) done lemma fic_NotR_elim: assumes a: "fic (NotR (x).M a) b" shows "a=b \ b\M" using a apply(erule_tac fic.cases) -apply(auto simp add: trm.inject) +apply(auto simp: trm.inject) apply(subgoal_tac "b\[xa].Ma") apply(drule sym) apply(simp_all add: abs_fresh) done lemma fic_OrR1_elim: assumes a: "fic (OrR1 .M b) c" shows "b=c \ c\[a].M" using a apply(erule_tac fic.cases) -apply(auto simp add: trm.inject) +apply(auto simp: trm.inject) done lemma fic_OrR2_elim: assumes a: "fic (OrR2 .M b) c" shows "b=c \ c\[a].M" using a apply(erule_tac fic.cases) -apply(auto simp add: trm.inject) +apply(auto simp: trm.inject) done lemma fic_AndR_elim: assumes a: "fic (AndR .M .N c) d" shows "c=d \ d\[a].M \ d\[b].N" using a apply(erule_tac fic.cases) -apply(auto simp add: trm.inject) +apply(auto simp: trm.inject) done lemma fic_ImpR_elim: assumes a: "fic (ImpR (x)..M b) c" shows "b=c \ b\[a].M" using a apply(erule_tac fic.cases) -apply(auto simp add: trm.inject) +apply(auto simp: trm.inject) apply(subgoal_tac "c\[xa].[aa].Ma") apply(drule sym) apply(simp_all add: abs_fresh) done lemma fic_rest_elims: shows "fic (Cut .M (x).N) d \ False" and "fic (NotL .M x) d \ False" and "fic (OrL (x).M (y).N z) d \ False" and "fic (AndL1 (x).M y) d \ False" and "fic (AndL2 (x).M y) d \ False" and "fic (ImpL .M (x).N y) d \ False" by (erule fic.cases, simp_all add: trm.inject)+ lemmas fic_elims = fic_Ax_elim fic_NotR_elim fic_OrR1_elim fic_OrR2_elim fic_AndR_elim fic_ImpR_elim fic_rest_elims lemma fic_rename: shows "fic M a \ fic ([(a',a)]\M) a'" by (induct rule: fic.induct) - (auto simp add: calc_atm simp add: fresh_left abs_fresh) + (auto simp: calc_atm simp add: fresh_left abs_fresh) lemma not_fic_subst1: assumes a: "\(fic M a)" shows "\(fic (M{y:=.P}) a)" using a apply(nominal_induct M avoiding: a c y P rule: trm.strong_induct) apply(auto) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(drule fic_elims) apply(auto)[1] apply(drule freshc_after_substn) apply(simp add: fic.intros) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P,a)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL) apply(drule fic_elims, simp) apply(rule exists_fresh'(1)[OF fs_name1]) apply(drule fic_elims, simp) apply(drule fic_elims) apply(auto)[1] apply(simp add: abs_fresh fresh_atm) apply(drule freshc_after_substn) apply(drule freshc_after_substn) apply(simp add: fic.intros abs_fresh) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P,name1,a)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1) apply(drule fic_elims, simp) apply(rule exists_fresh'(1)[OF fs_name1]) apply(drule fic_elims, simp) apply(subgoal_tac "\x'::name. x'\(trm{y:=.P},P,name1,a)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2) apply(drule fic_elims, simp) apply(rule exists_fresh'(1)[OF fs_name1]) apply(drule fic_elims, simp) apply(drule fic_elims) apply(auto)[1] apply(simp add: abs_fresh fresh_atm) apply(drule freshc_after_substn) apply(simp add: fic.intros abs_fresh) apply(drule fic_elims) apply(auto)[1] apply(simp add: abs_fresh fresh_atm) apply(drule freshc_after_substn) apply(simp add: fic.intros abs_fresh) apply(subgoal_tac "\x'::name. x'\(trm1{y:=.P},trm2{y:=.P},P,name1,name2,a)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL) apply(drule fic_elims, simp) apply(rule exists_fresh'(1)[OF fs_name1]) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(simp add: abs_fresh fresh_atm) apply(drule freshc_after_substn) apply(simp add: fic.intros abs_fresh) apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.P},trm2{name2:=.P},P,name1,name2,a)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL) apply(drule fic_elims, simp) apply(rule exists_fresh'(1)[OF fs_name1]) apply(drule fic_elims, simp) done lemma not_fic_subst2: assumes a: "\(fic M a)" shows "\(fic (M{c:=(y).P}) a)" using a apply(nominal_induct M avoiding: a c y P rule: trm.strong_induct) apply(auto) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(subgoal_tac "\c'::coname. c'\(trm{coname:=(y).P},P,a)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR) apply(drule fic_elims, simp) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(drule fic_elims, simp) apply(drule freshc_after_substc) apply(simp) apply(simp add: fic.intros abs_fresh) apply(drule fic_elims, simp) apply(subgoal_tac "\c'::coname. c'\(trm1{coname3:=(y).P},trm2{coname3:=(y).P},P,coname1,coname2,a)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR) apply(drule fic_elims, simp) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(drule fic_elims, simp) apply(auto)[1] apply(simp add: abs_fresh fresh_atm) apply(drule freshc_after_substc) apply(simp) apply(drule freshc_after_substc) apply(simp) apply(simp add: fic.intros abs_fresh) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(subgoal_tac "\c'::coname. c'\(trm{coname2:=(y).P},P,coname1,a)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1) apply(drule fic_elims, simp) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(drule fic_elims, simp) apply(simp add: abs_fresh fresh_atm) apply(drule freshc_after_substc) apply(simp) apply(simp add: fic.intros abs_fresh) apply(subgoal_tac "\c'::coname. c'\(trm{coname2:=(y).P},P,coname1,a)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2) apply(drule fic_elims, simp) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(drule fic_elims, simp) apply(simp add: abs_fresh fresh_atm) apply(drule freshc_after_substc) apply(simp) apply(simp add: fic.intros abs_fresh) apply(drule fic_elims, simp) apply(subgoal_tac "\c'::coname. c'\(trm{coname2:=(y).P},P,coname1,a)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR) apply(drule fic_elims, simp) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(drule fic_elims, simp) apply(simp add: abs_fresh fresh_atm) apply(drule freshc_after_substc) apply(simp) apply(simp add: fic.intros abs_fresh) apply(drule fic_elims, simp) done lemma fic_subst1: assumes a: "fic M a" "a\b" "a\P" shows "fic (M{b:=(x).P}) a" using a apply(nominal_induct M avoiding: x b a P rule: trm.strong_induct) apply(drule fic_elims) apply(simp add: fic.intros) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(rule fic.intros) apply(rule subst_fresh) apply(simp) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(rule fic.intros) apply(simp add: abs_fresh fresh_atm) apply(rule subst_fresh) apply(auto)[1] apply(simp add: abs_fresh fresh_atm) apply(rule subst_fresh) apply(auto)[1] apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(rule fic.intros) apply(simp add: abs_fresh fresh_atm) apply(rule subst_fresh) apply(auto)[1] apply(drule fic_elims, simp) apply(rule fic.intros) apply(simp add: abs_fresh fresh_atm) apply(rule subst_fresh) apply(auto)[1] apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(rule fic.intros) apply(simp add: abs_fresh fresh_atm) apply(rule subst_fresh) apply(auto)[1] apply(drule fic_elims, simp) done lemma fic_subst2: assumes a: "fic M a" "c\a" "a\P" "M\Ax x a" shows "fic (M{x:=.P}) a" using a apply(nominal_induct M avoiding: x a c P rule: trm.strong_induct) apply(drule fic_elims) apply(simp add: trm.inject) apply(rule fic.intros) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(rule fic.intros) apply(rule subst_fresh) apply(simp) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(rule fic.intros) apply(simp add: abs_fresh fresh_atm) apply(rule subst_fresh) apply(auto)[1] apply(simp add: abs_fresh fresh_atm) apply(rule subst_fresh) apply(auto)[1] apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(rule fic.intros) apply(simp add: abs_fresh fresh_atm) apply(rule subst_fresh) apply(auto)[1] apply(drule fic_elims, simp) apply(rule fic.intros) apply(simp add: abs_fresh fresh_atm) apply(rule subst_fresh) apply(auto)[1] apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(rule fic.intros) apply(simp add: abs_fresh fresh_atm) apply(rule subst_fresh) apply(auto)[1] apply(drule fic_elims, simp) done lemma fic_substc_crename: assumes a: "fic M a" "a\b" "a\P" shows "M[a\c>b]{b:=(y).P} = Cut .(M{b:=(y).P}) (y).P" using a apply(nominal_induct M avoiding: a b y P rule: trm.strong_induct) apply(drule fic_Ax_elim) apply(simp) apply(simp add: trm.inject) apply(simp add: alpha calc_atm fresh_atm trm.inject) apply(simp) apply(drule fic_rest_elims) apply(simp) apply(drule fic_NotR_elim) apply(simp) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp add: trm.inject alpha fresh_atm fresh_prod fresh_atm calc_atm abs_fresh) apply(rule conjI) apply(simp add: csubst_eqvt calc_atm) apply(simp add: perm_fresh_fresh) apply(simp add: crename_fresh) apply(rule subst_fresh) apply(simp) apply(drule fic_rest_elims) apply(simp) apply(drule fic_AndR_elim) apply(simp add: abs_fresh fresh_atm subst_fresh rename_fresh) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp add: trm.inject alpha fresh_atm calc_atm abs_fresh fresh_prod) apply(rule conjI) apply(simp add: csubst_eqvt calc_atm) apply(simp add: perm_fresh_fresh) apply(simp add: csubst_eqvt calc_atm) apply(simp add: perm_fresh_fresh) apply(simp add: subst_fresh) apply(drule fic_rest_elims) apply(simp) apply(drule fic_rest_elims) apply(simp) apply(drule fic_OrR1_elim) apply(simp) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp add: trm.inject alpha fresh_atm calc_atm abs_fresh fresh_prod) apply(simp add: csubst_eqvt calc_atm) apply(simp add: perm_fresh_fresh) apply(simp add: subst_fresh rename_fresh) apply(drule fic_OrR2_elim) apply(simp add: abs_fresh fresh_atm) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp add: trm.inject alpha fresh_atm calc_atm abs_fresh fresh_prod) apply(simp add: csubst_eqvt calc_atm) apply(simp add: perm_fresh_fresh) apply(simp add: subst_fresh rename_fresh) apply(drule fic_rest_elims) apply(simp) apply(drule fic_ImpR_elim) apply(simp add: abs_fresh fresh_atm) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp add: trm.inject alpha fresh_atm calc_atm abs_fresh fresh_prod) apply(simp add: csubst_eqvt calc_atm) apply(simp add: perm_fresh_fresh) apply(simp add: subst_fresh rename_fresh) apply(drule fic_rest_elims) apply(simp) done inductive l_redu :: "trm \ trm \ bool" ("_ \\<^sub>l _" [100,100] 100) where LAxR: "\x\M; a\b; fic M a\ \ Cut .M (x).(Ax x b) \\<^sub>l M[a\c>b]" | LAxL: "\a\M; x\y; fin M x\ \ Cut .(Ax y a) (x).M \\<^sub>l M[x\n>y]" | LNot: "\y\(M,N); x\(N,y); a\(M,N,b); b\M; y\x; b\a\ \ Cut .(NotR (x).M a) (y).(NotL .N y) \\<^sub>l Cut .N (x).M" | LAnd1: "\b\([a1].M1,[a2].M2,N,a1,a2); y\([x].N,M1,M2,x); x\(M1,M2); a1\(M2,N); a2\(M1,N); a1\a2\ \ Cut .(AndR .M1 .M2 b) (y).(AndL1 (x).N y) \\<^sub>l Cut .M1 (x).N" | LAnd2: "\b\([a1].M1,[a2].M2,N,a1,a2); y\([x].N,M1,M2,x); x\(M1,M2); a1\(M2,N); a2\(M1,N); a1\a2\ \ Cut .(AndR .M1 .M2 b) (y).(AndL2 (x).N y) \\<^sub>l Cut .M2 (x).N" | LOr1: "\b\([a].M,N1,N2,a); y\([x1].N1,[x2].N2,M,x1,x2); x1\(M,N2); x2\(M,N1); a\(N1,N2); x1\x2\ \ Cut .(OrR1 .M b) (y).(OrL (x1).N1 (x2).N2 y) \\<^sub>l Cut .M (x1).N1" | LOr2: "\b\([a].M,N1,N2,a); y\([x1].N1,[x2].N2,M,x1,x2); x1\(M,N2); x2\(M,N1); a\(N1,N2); x1\x2\ \ Cut .(OrR2 .M b) (y).(OrL (x1).N1 (x2).N2 y) \\<^sub>l Cut .M (x2).N2" | LImp: "\z\(N,[y].P,[x].M,y,x); b\([a].M,[c].N,P,c,a); x\(N,[y].P,y); c\(P,[a].M,b,a); a\([c].N,P); y\(N,[x].M)\ \ Cut .(ImpR (x)..M b) (z).(ImpL .N (y).P z) \\<^sub>l Cut .(Cut .N (x).M) (y).P" equivariance l_redu lemma l_redu_eqvt': fixes pi1::"name prm" and pi2::"coname prm" shows "(pi1\M) \\<^sub>l (pi1\M') \ M \\<^sub>l M'" and "(pi2\M) \\<^sub>l (pi2\M') \ M \\<^sub>l M'" apply - apply(drule_tac pi="rev pi1" in l_redu.eqvt(1)) apply(perm_simp) apply(drule_tac pi="rev pi2" in l_redu.eqvt(2)) apply(perm_simp) done nominal_inductive l_redu apply(simp_all add: abs_fresh fresh_atm rename_fresh fresh_prod abs_supp fin_supp) apply(force)+ done lemma fresh_l_redu: fixes x::"name" and a::"coname" shows "M \\<^sub>l M' \ x\M \ x\M'" and "M \\<^sub>l M' \ a\M \ a\M'" apply - apply(induct rule: l_redu.induct) -apply(auto simp add: abs_fresh rename_fresh) +apply(auto simp: abs_fresh rename_fresh) apply(case_tac "xa=x") apply(simp add: rename_fresh) apply(simp add: rename_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh abs_supp fin_supp)+ apply(induct rule: l_redu.induct) -apply(auto simp add: abs_fresh rename_fresh) +apply(auto simp: abs_fresh rename_fresh) apply(case_tac "aa=a") apply(simp add: rename_fresh) apply(simp add: rename_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh abs_supp fin_supp)+ done lemma better_LAxR_intro[intro]: shows "fic M a \ Cut .M (x).(Ax x b) \\<^sub>l M[a\c>b]" proof - assume fin: "fic M a" obtain x'::"name" where fs1: "x'\(M,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\(a,M,b)" by (rule exists_fresh(2), rule fin_supp, blast) have "Cut .M (x).(Ax x b) = Cut .([(a',a)]\M) (x').(Ax x' b)" - using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>l ([(a',a)]\M)[a'\c>b]" using fs1 fs2 fin by (auto intro: l_redu.intros simp add: fresh_left calc_atm fic_rename) also have "\ = M[a\c>b]" using fs1 fs2 by (simp add: crename_rename) finally show ?thesis by simp qed lemma better_LAxL_intro[intro]: shows "fin M x \ Cut .(Ax y a) (x).M \\<^sub>l M[x\n>y]" proof - assume fin: "fin M x" obtain x'::"name" where fs1: "x'\(y,M,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\(a,M)" by (rule exists_fresh(2), rule fin_supp, blast) have "Cut .(Ax y a) (x).M = Cut .(Ax y a') (x').([(x',x)]\M)" - using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>l ([(x',x)]\M)[x'\n>y]" using fs1 fs2 fin by (auto intro: l_redu.intros simp add: fresh_left calc_atm fin_rename) also have "\ = M[x\n>y]" using fs1 fs2 by (simp add: nrename_rename) finally show ?thesis by simp qed lemma better_LNot_intro[intro]: shows "\y\N; a\M\ \ Cut .(NotR (x).M a) (y).(NotL .N y) \\<^sub>l Cut .N (x).M" proof - assume fs: "y\N" "a\M" obtain x'::"name" where f1: "x'\(y,N,M,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain y'::"name" where f2: "y'\(y,N,M,x,x')" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where f3: "a'\(a,M,N,b)" by (rule exists_fresh(2), rule fin_supp, blast) obtain b'::"coname" where f4: "b'\(a,M,N,b,a')" by (rule exists_fresh(2), rule fin_supp, blast) have "Cut .(NotR (x).M a) (y).(NotL .N y) = Cut .(NotR (x).([(a',a)]\M) a') (y').(NotL .([(y',y)]\N) y')" using f1 f2 f3 f4 - by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm abs_fresh) + by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm abs_fresh) also have "\ = Cut .(NotR (x).M a') (y').(NotL .N y')" using f1 f2 f3 f4 fs by (perm_simp) also have "\ = Cut .(NotR (x').([(x',x)]\M) a') (y').(NotL .([(b',b)]\N) y')" using f1 f2 f3 f4 - by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>l Cut .([(b',b)]\N) (x').([(x',x)]\M)" using f1 f2 f3 f4 fs by (auto intro: l_redu.intros simp add: fresh_prod fresh_left calc_atm fresh_atm) also have "\ = Cut .N (x).M" - using f1 f2 f3 f4 by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using f1 f2 f3 f4 by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) finally show ?thesis by simp qed lemma better_LAnd1_intro[intro]: shows "\a\([b1].M1,[b2].M2); y\[x].N\ \ Cut .(AndR .M1 .M2 a) (y).(AndL1 (x).N y) \\<^sub>l Cut .M1 (x).N" proof - assume fs: "a\([b1].M1,[b2].M2)" "y\[x].N" obtain x'::"name" where f1: "x'\(y,N,M1,M2,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain y'::"name" where f2: "y'\(y,N,M1,M2,x,x')" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where f3: "a'\(a,M1,M2,N,b1,b2)" by (rule exists_fresh(2), rule fin_supp, blast) obtain b1'::"coname" where f4:"b1'\(a,M1,M2,N,b1,b2,a')" by (rule exists_fresh(2), rule fin_supp, blast) obtain b2'::"coname" where f5:"b2'\(a,M1,M2,N,b1,b2,a',b1')" by (rule exists_fresh(2),rule fin_supp, blast) have "Cut .(AndR .M1 .M2 a) (y).(AndL1 (x).N y) = Cut .(AndR .M1 .M2 a') (y').(AndL1 (x).N y')" using f1 f2 f3 f4 fs apply(rule_tac sym) apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) - apply(auto simp add: perm_fresh_fresh) + apply(auto simp: perm_fresh_fresh) done also have "\ = Cut .(AndR .([(b1',b1)]\M1) .([(b2',b2)]\M2) a') (y').(AndL1 (x').([(x',x)]\N) y')" using f1 f2 f3 f4 f5 fs apply(rule_tac sym) apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) done also have "\ \\<^sub>l Cut .([(b1',b1)]\M1) (x').([(x',x)]\N)" using f1 f2 f3 f4 f5 fs apply - apply(rule l_redu.intros) - apply(auto simp add: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) + apply(auto simp: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) done also have "\ = Cut .M1 (x).N" - using f1 f2 f3 f4 f5 fs by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using f1 f2 f3 f4 f5 fs by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) finally show ?thesis by simp qed lemma better_LAnd2_intro[intro]: shows "\a\([b1].M1,[b2].M2); y\[x].N\ \ Cut .(AndR .M1 .M2 a) (y).(AndL2 (x).N y) \\<^sub>l Cut .M2 (x).N" proof - assume fs: "a\([b1].M1,[b2].M2)" "y\[x].N" obtain x'::"name" where f1: "x'\(y,N,M1,M2,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain y'::"name" where f2: "y'\(y,N,M1,M2,x,x')" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where f3: "a'\(a,M1,M2,N,b1,b2)" by (rule exists_fresh(2), rule fin_supp, blast) obtain b1'::"coname" where f4:"b1'\(a,M1,M2,N,b1,b2,a')" by (rule exists_fresh(2), rule fin_supp, blast) obtain b2'::"coname" where f5:"b2'\(a,M1,M2,N,b1,b2,a',b1')" by (rule exists_fresh(2),rule fin_supp, blast) have "Cut .(AndR .M1 .M2 a) (y).(AndL2 (x).N y) = Cut .(AndR .M1 .M2 a') (y').(AndL2 (x).N y')" using f1 f2 f3 f4 fs apply(rule_tac sym) apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) - apply(auto simp add: perm_fresh_fresh) + apply(auto simp: perm_fresh_fresh) done also have "\ = Cut .(AndR .([(b1',b1)]\M1) .([(b2',b2)]\M2) a') (y').(AndL2 (x').([(x',x)]\N) y')" using f1 f2 f3 f4 f5 fs apply(rule_tac sym) apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) done also have "\ \\<^sub>l Cut .([(b2',b2)]\M2) (x').([(x',x)]\N)" using f1 f2 f3 f4 f5 fs apply - apply(rule l_redu.intros) - apply(auto simp add: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) + apply(auto simp: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) done also have "\ = Cut .M2 (x).N" - using f1 f2 f3 f4 f5 fs by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using f1 f2 f3 f4 f5 fs by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) finally show ?thesis by simp qed lemma better_LOr1_intro[intro]: shows "\y\([x1].N1,[x2].N2); b\[a].M\ \ Cut .(OrR1 .M b) (y).(OrL (x1).N1 (x2).N2 y) \\<^sub>l Cut .M (x1).N1" proof - assume fs: "y\([x1].N1,[x2].N2)" "b\[a].M" obtain y'::"name" where f1: "y'\(y,M,N1,N2,x1,x2)" by (rule exists_fresh(1), rule fin_supp, blast) obtain x1'::"name" where f2: "x1'\(y,M,N1,N2,x1,x2,y')" by (rule exists_fresh(1), rule fin_supp, blast) obtain x2'::"name" where f3: "x2'\(y,M,N1,N2,x1,x2,y',x1')" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where f4: "a'\(a,N1,N2,M,b)" by (rule exists_fresh(2), rule fin_supp, blast) obtain b'::"coname" where f5: "b'\(a,N1,N2,M,b,a')" by (rule exists_fresh(2),rule fin_supp, blast) have "Cut .(OrR1 .M b) (y).(OrL (x1).N1 (x2).N2 y) = Cut .(OrR1 .M b') (y').(OrL (x1).N1 (x2).N2 y')" using f1 f2 f3 f4 f5 fs apply(rule_tac sym) apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) - apply(auto simp add: perm_fresh_fresh) + apply(auto simp: perm_fresh_fresh) done also have "\ = Cut .(OrR1 .([(a',a)]\M) b') (y').(OrL (x1').([(x1',x1)]\N1) (x2').([(x2',x2)]\N2) y')" using f1 f2 f3 f4 f5 fs apply(rule_tac sym) apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) done also have "\ \\<^sub>l Cut .([(a',a)]\M) (x1').([(x1',x1)]\N1)" using f1 f2 f3 f4 f5 fs apply - apply(rule l_redu.intros) - apply(auto simp add: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) + apply(auto simp: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) done also have "\ = Cut .M (x1).N1" - using f1 f2 f3 f4 f5 fs by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using f1 f2 f3 f4 f5 fs by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) finally show ?thesis by simp qed lemma better_LOr2_intro[intro]: shows "\y\([x1].N1,[x2].N2); b\[a].M\ \ Cut .(OrR2 .M b) (y).(OrL (x1).N1 (x2).N2 y) \\<^sub>l Cut .M (x2).N2" proof - assume fs: "y\([x1].N1,[x2].N2)" "b\[a].M" obtain y'::"name" where f1: "y'\(y,M,N1,N2,x1,x2)" by (rule exists_fresh(1), rule fin_supp, blast) obtain x1'::"name" where f2: "x1'\(y,M,N1,N2,x1,x2,y')" by (rule exists_fresh(1), rule fin_supp, blast) obtain x2'::"name" where f3: "x2'\(y,M,N1,N2,x1,x2,y',x1')" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where f4: "a'\(a,N1,N2,M,b)" by (rule exists_fresh(2), rule fin_supp, blast) obtain b'::"coname" where f5: "b'\(a,N1,N2,M,b,a')" by (rule exists_fresh(2),rule fin_supp, blast) have "Cut .(OrR2 .M b) (y).(OrL (x1).N1 (x2).N2 y) = Cut .(OrR2 .M b') (y').(OrL (x1).N1 (x2).N2 y')" using f1 f2 f3 f4 f5 fs apply(rule_tac sym) apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) - apply(auto simp add: perm_fresh_fresh) + apply(auto simp: perm_fresh_fresh) done also have "\ = Cut .(OrR2 .([(a',a)]\M) b') (y').(OrL (x1').([(x1',x1)]\N1) (x2').([(x2',x2)]\N2) y')" using f1 f2 f3 f4 f5 fs apply(rule_tac sym) apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) done also have "\ \\<^sub>l Cut .([(a',a)]\M) (x2').([(x2',x2)]\N2)" using f1 f2 f3 f4 f5 fs apply - apply(rule l_redu.intros) - apply(auto simp add: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) + apply(auto simp: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) done also have "\ = Cut .M (x2).N2" - using f1 f2 f3 f4 f5 fs by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using f1 f2 f3 f4 f5 fs by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) finally show ?thesis by simp qed lemma better_LImp_intro[intro]: shows "\z\(N,[y].P); b\[a].M; a\N\ \ Cut .(ImpR (x)..M b) (z).(ImpL .N (y).P z) \\<^sub>l Cut .(Cut .N (x).M) (y).P" proof - assume fs: "z\(N,[y].P)" "b\[a].M" "a\N" obtain y'::"name" where f1: "y'\(y,M,N,P,z,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain x'::"name" where f2: "x'\(y,M,N,P,z,x,y')" by (rule exists_fresh(1), rule fin_supp, blast) obtain z'::"name" where f3: "z'\(y,M,N,P,z,x,y',x')" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where f4: "a'\(a,N,P,M,b)" by (rule exists_fresh(2), rule fin_supp, blast) obtain b'::"coname" where f5: "b'\(a,N,P,M,b,c,a')" by (rule exists_fresh(2),rule fin_supp, blast) obtain c'::"coname" where f6: "c'\(a,N,P,M,b,c,a',b')" by (rule exists_fresh(2),rule fin_supp, blast) have " Cut .(ImpR (x)..M b) (z).(ImpL .N (y).P z) = Cut .(ImpR (x)..M b') (z').(ImpL .N (y).P z')" using f1 f2 f3 f4 f5 fs apply(rule_tac sym) apply(perm_simp add: trm.inject alpha calc_atm fresh_prod fresh_left fresh_atm abs_fresh) - apply(auto simp add: perm_fresh_fresh) + apply(auto simp: perm_fresh_fresh) done also have "\ = Cut .(ImpR (x')..([(a',a)]\([(x',x)]\M)) b') (z').(ImpL .([(c',c)]\N) (y').([(y',y)]\P) z')" using f1 f2 f3 f4 f5 f6 fs apply(rule_tac sym) apply(simp add: trm.inject) apply(simp add: alpha) apply(rule conjI) apply(simp add: trm.inject) apply(simp add: alpha fresh_prod fresh_atm abs_perm calc_atm fresh_left abs_fresh) apply(simp add: trm.inject) apply(simp add: alpha) apply(rule conjI) apply(simp add: alpha fresh_prod fresh_atm abs_perm calc_atm fresh_left abs_fresh) apply(simp add: alpha fresh_prod fresh_atm abs_perm calc_atm fresh_left abs_fresh) done also have "\ \\<^sub>l Cut .(Cut .([(c',c)]\N) (x').([(a',a)]\[(x',x)]\M)) (y').([(y',y)]\P)" using f1 f2 f3 f4 f5 f6 fs apply - apply(rule l_redu.intros) - apply(auto simp add: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) + apply(auto simp: abs_fresh fresh_prod fresh_left calc_atm fresh_atm) done also have "\ = Cut .(Cut .N (x).M) (y).P" using f1 f2 f3 f4 f5 f6 fs apply(simp add: trm.inject) apply(rule conjI) apply(simp add: alpha) apply(rule disjI2) apply(simp add: trm.inject) apply(rule conjI) apply(simp add: fresh_prod fresh_atm) apply(rule conjI) apply(perm_simp add: calc_atm) - apply(auto simp add: fresh_prod fresh_atm)[1] + apply(auto simp: fresh_prod fresh_atm)[1] apply(perm_simp add: alpha) apply(perm_simp add: alpha) apply(perm_simp add: alpha) apply(rule conjI) apply(perm_simp add: calc_atm) apply(rule_tac pi="[(a',a)]" in pt_bij4[OF pt_coname_inst, OF at_coname_inst]) apply(perm_simp add: abs_perm calc_atm) apply(perm_simp add: alpha fresh_prod fresh_atm) apply(simp add: abs_fresh) apply(perm_simp add: alpha fresh_prod fresh_atm) done finally show ?thesis by simp qed lemma alpha_coname: fixes M::"trm" and a::"coname" assumes a: "[a].M = [b].N" "c\(a,b,M,N)" shows "M = [(a,c)]\[(b,c)]\N" using a -apply(auto simp add: alpha_fresh fresh_prod fresh_atm) +apply(auto simp: alpha_fresh fresh_prod fresh_atm) apply(drule sym) apply(perm_simp) done lemma alpha_name: fixes M::"trm" and x::"name" assumes a: "[x].M = [y].N" "z\(x,y,M,N)" shows "M = [(x,z)]\[(y,z)]\N" using a -apply(auto simp add: alpha_fresh fresh_prod fresh_atm) +apply(auto simp: alpha_fresh fresh_prod fresh_atm) apply(drule sym) apply(perm_simp) done lemma alpha_name_coname: fixes M::"trm" and x::"name" and a::"coname" assumes a: "[x].[b].M = [y].[c].N" "z\(x,y,M,N)" "a\(b,c,M,N)" shows "M = [(x,z)]\[(b,a)]\[(c,a)]\[(y,z)]\N" using a -apply(auto simp add: alpha_fresh fresh_prod fresh_atm +apply(auto simp: alpha_fresh fresh_prod fresh_atm abs_supp fin_supp abs_fresh abs_perm fresh_left calc_atm) apply(drule sym) apply(simp) apply(perm_simp) done lemma Cut_l_redu_elim: assumes a: "Cut .M (x).N \\<^sub>l R" shows "(\b. R = M[a\c>b]) \ (\y. R = N[x\n>y]) \ (\y M' b N'. M = NotR (y).M' a \ N = NotL .N' x \ R = Cut .N' (y).M' \ fic M a \ fin N x) \ (\b M1 c M2 y N'. M = AndR .M1 .M2 a \ N = AndL1 (y).N' x \ R = Cut .M1 (y).N' \ fic M a \ fin N x) \ (\b M1 c M2 y N'. M = AndR .M1 .M2 a \ N = AndL2 (y).N' x \ R = Cut .M2 (y).N' \ fic M a \ fin N x) \ (\b N' z M1 y M2. M = OrR1 .N' a \ N = OrL (z).M1 (y).M2 x \ R = Cut .N' (z).M1 \ fic M a \ fin N x) \ (\b N' z M1 y M2. M = OrR2 .N' a \ N = OrL (z).M1 (y).M2 x \ R = Cut .N' (y).M2 \ fic M a \ fin N x) \ (\z b M' c N1 y N2. M = ImpR (z)..M' a \ N = ImpL .N1 (y).N2 x \ R = Cut .(Cut .N1 (z).M') (y).N2 \ b\(c,N1) \ fic M a \ fin N x)" using a apply(erule_tac l_redu.cases) apply(rule disjI1) (* ax case *) apply(simp add: trm.inject) apply(rule_tac x="b" in exI) apply(erule conjE) apply(simp add: alpha) apply(erule disjE) apply(simp) apply(simp) apply(simp add: rename_fresh) apply(rule disjI2) apply(rule disjI1) (* ax case *) apply(simp add: trm.inject) apply(rule_tac x="y" in exI) apply(erule conjE) apply(thin_tac "[a].M = [aa].Ax y aa") apply(simp add: alpha) apply(erule disjE) apply(simp) apply(simp) apply(simp add: rename_fresh) apply(rule disjI2) apply(rule disjI2) apply(rule disjI1) (* not case *) apply(simp add: trm.inject) apply(erule conjE)+ apply(generate_fresh "coname") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac c="c" in alpha_coname) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp add: calc_atm) apply(rule exI)+ apply(rule conjI) apply(rule refl) apply(generate_fresh "name") apply(simp add: calc_atm abs_fresh fresh_prod fresh_atm fresh_left) apply(auto)[1] apply(drule_tac z="ca" in alpha_name) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp add: calc_atm) apply(rule exI)+ apply(rule conjI) apply(rule refl) -apply(auto simp add: calc_atm abs_fresh fresh_left)[1] +apply(auto simp: calc_atm abs_fresh fresh_left)[1] apply(case_tac "y=x") apply(perm_simp) apply(perm_simp) apply(case_tac "aa=a") apply(perm_simp) apply(perm_simp) (* and1 case *) apply(rule disjI2) apply(rule disjI2) apply(rule disjI2) apply(rule disjI1) apply(simp add: trm.inject) apply(erule conjE)+ apply(generate_fresh "coname") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac c="c" in alpha_coname) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule exI)+ apply(rule_tac s="a" and t="[(a,c)]\[(b,c)]\b" in subst) apply(simp add: calc_atm) apply(rule refl) apply(generate_fresh "name") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac z="ca" in alpha_name) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule_tac s="x" and t="[(x,ca)]\[(y,ca)]\y" in subst) apply(simp add: calc_atm) apply(rule refl) -apply(auto simp add: fresh_left calc_atm abs_fresh split: if_splits)[1] +apply(auto simp: fresh_left calc_atm abs_fresh split: if_splits)[1] apply(generate_fresh "name") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac z="cb" in alpha_name) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule_tac s="x" and t="[(x,cb)]\[(y,cb)]\y" in subst) apply(simp add: calc_atm) apply(rule refl) -apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] +apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] apply(perm_simp)+ apply(generate_fresh "name") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac z="cb" in alpha_name) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule_tac s="x" and t="[(x,cb)]\[(y,cb)]\y" in subst) apply(simp add: calc_atm) apply(rule refl) -apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] +apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] apply(perm_simp)+ apply(generate_fresh "name") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac z="cb" in alpha_name) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule_tac s="x" and t="[(x,cb)]\[(y,cb)]\y" in subst) apply(simp add: calc_atm) apply(rule refl) -apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] +apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] apply(perm_simp)+ (* and2 case *) apply(rule disjI2) apply(rule disjI2) apply(rule disjI2) apply(rule disjI2) apply(rule disjI1) apply(simp add: trm.inject) apply(erule conjE)+ apply(generate_fresh "coname") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac c="c" in alpha_coname) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule_tac s="a" and t="[(a,c)]\[(b,c)]\b" in subst) apply(simp add: calc_atm) apply(rule refl) apply(generate_fresh "name") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac z="ca" in alpha_name) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule_tac s="x" and t="[(x,ca)]\[(y,ca)]\y" in subst) apply(simp add: calc_atm) apply(rule refl) -apply(auto simp add: fresh_left calc_atm abs_fresh split: if_splits)[1] +apply(auto simp: fresh_left calc_atm abs_fresh split: if_splits)[1] apply(generate_fresh "name") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac z="cb" in alpha_name) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule_tac s="x" and t="[(x,cb)]\[(y,cb)]\y" in subst) apply(simp add: calc_atm) apply(rule refl) -apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] +apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] apply(perm_simp)+ apply(generate_fresh "name") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac z="cb" in alpha_name) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule_tac s="x" and t="[(x,cb)]\[(y,cb)]\y" in subst) apply(simp add: calc_atm) apply(rule refl) -apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] +apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] apply(perm_simp)+ apply(generate_fresh "name") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac z="cb" in alpha_name) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule_tac s="x" and t="[(x,cb)]\[(y,cb)]\y" in subst) apply(simp add: calc_atm) apply(rule refl) -apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] +apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] apply(perm_simp)+ (* or1 case *) apply(rule disjI2) apply(rule disjI2) apply(rule disjI2) apply(rule disjI2) apply(rule disjI2) apply(rule disjI1) apply(simp add: trm.inject) apply(erule conjE)+ apply(generate_fresh "coname") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac c="c" in alpha_coname) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule_tac s="a" and t="[(a,c)]\[(b,c)]\b" in subst) apply(simp add: calc_atm) apply(rule refl) apply(generate_fresh "name") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac z="ca" in alpha_name) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule exI)+ apply(rule_tac s="x" and t="[(x,ca)]\[(y,ca)]\y" in subst) apply(simp add: calc_atm) apply(rule refl) -apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] +apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] apply(perm_simp)+ apply(generate_fresh "name") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac z="cb" in alpha_name) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule exI)+ apply(rule_tac s="x" and t="[(x,cb)]\[(y,cb)]\y" in subst) apply(simp add: calc_atm) apply(rule refl) -apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] +apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] apply(perm_simp)+ (* or2 case *) apply(rule disjI2) apply(rule disjI2) apply(rule disjI2) apply(rule disjI2) apply(rule disjI2) apply(rule disjI2) apply(rule disjI1) apply(simp add: trm.inject) apply(erule conjE)+ apply(generate_fresh "coname") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac c="c" in alpha_coname) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule_tac s="a" and t="[(a,c)]\[(b,c)]\b" in subst) apply(simp add: calc_atm) apply(rule refl) apply(generate_fresh "name") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac z="ca" in alpha_name) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule_tac s="x" and t="[(x,ca)]\[(y,ca)]\y" in subst) apply(simp add: calc_atm) apply(rule refl) -apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] +apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] apply(perm_simp)+ apply(generate_fresh "name") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac z="cb" in alpha_name) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule_tac s="x" and t="[(x,cb)]\[(y,cb)]\y" in subst) apply(simp add: calc_atm) apply(rule refl) -apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] +apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] apply(perm_simp)+ (* imp-case *) apply(rule disjI2) apply(rule disjI2) apply(rule disjI2) apply(rule disjI2) apply(rule disjI2) apply(rule disjI2) apply(rule disjI2) apply(simp add: trm.inject) apply(erule conjE)+ apply(generate_fresh "coname") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac c="ca" in alpha_coname) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule_tac s="a" and t="[(a,ca)]\[(b,ca)]\b" in subst) apply(simp add: calc_atm) apply(rule refl) apply(generate_fresh "name") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac z="cb" in alpha_name) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule_tac s="x" and t="[(x,cb)]\[(z,cb)]\z" in subst) apply(simp add: calc_atm) apply(rule refl) -apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] +apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] apply(perm_simp)+ apply(generate_fresh "name") apply(simp add: abs_fresh fresh_prod fresh_atm) apply(auto)[1] apply(drule_tac z="cc" in alpha_name) apply(simp add: fresh_prod fresh_atm abs_fresh) apply(simp) apply(rule exI)+ apply(rule conjI) apply(rule_tac s="x" and t="[(x,cc)]\[(z,cc)]\z" in subst) apply(simp add: calc_atm) apply(rule refl) -apply(auto simp add: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] +apply(auto simp: fresh_left calc_atm abs_fresh alpha perm_fresh_fresh split: if_splits)[1] apply(perm_simp)+ done inductive c_redu :: "trm \ trm \ bool" ("_ \\<^sub>c _" [100,100] 100) where left[intro]: "\\fic M a; a\N; x\M\ \ Cut .M (x).N \\<^sub>c M{a:=(x).N}" | right[intro]: "\\fin N x; a\N; x\M\ \ Cut .M (x).N \\<^sub>c N{x:=.M}" equivariance c_redu nominal_inductive c_redu by (simp_all add: abs_fresh subst_fresh) lemma better_left[intro]: shows "\fic M a \ Cut .M (x).N \\<^sub>c M{a:=(x).N}" proof - assume not_fic: "\fic M a" obtain x'::"name" where fs1: "x'\(N,M,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\(a,M,N)" by (rule exists_fresh(2), rule fin_supp, blast) have "Cut .M (x).N = Cut .([(a',a)]\M) (x').([(x',x)]\N)" - using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>c ([(a',a)]\M){a':=(x').([(x',x)]\N)}" using fs1 fs2 not_fic apply - apply(rule left) apply(clarify) apply(drule_tac a'="a" in fic_rename) apply(simp add: perm_swap) apply(simp add: fresh_left calc_atm)+ done also have "\ = M{a:=(x).N}" using fs1 fs2 by (simp add: subst_rename[symmetric] fresh_atm fresh_prod fresh_left calc_atm) finally show ?thesis by simp qed lemma better_right[intro]: shows "\fin N x \ Cut .M (x).N \\<^sub>c N{x:=.M}" proof - assume not_fin: "\fin N x" obtain x'::"name" where fs1: "x'\(N,M,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\(a,M,N)" by (rule exists_fresh(2), rule fin_supp, blast) have "Cut .M (x).N = Cut .([(a',a)]\M) (x').([(x',x)]\N)" - using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>c ([(x',x)]\N){x':=.([(a',a)]\M)}" using fs1 fs2 not_fin apply - apply(rule right) apply(clarify) apply(drule_tac x'="x" in fin_rename) apply(simp add: perm_swap) apply(simp add: fresh_left calc_atm)+ done also have "\ = N{x:=.M}" using fs1 fs2 by (simp add: subst_rename[symmetric] fresh_atm fresh_prod fresh_left calc_atm) finally show ?thesis by simp qed lemma fresh_c_redu: fixes x::"name" and c::"coname" shows "M \\<^sub>c M' \ x\M \ x\M'" and "M \\<^sub>c M' \ c\M \ c\M'" apply - apply(induct rule: c_redu.induct) -apply(auto simp add: abs_fresh rename_fresh subst_fresh) +apply(auto simp: abs_fresh rename_fresh subst_fresh) apply(induct rule: c_redu.induct) -apply(auto simp add: abs_fresh rename_fresh subst_fresh) +apply(auto simp: abs_fresh rename_fresh subst_fresh) done inductive a_redu :: "trm \ trm \ bool" ("_ \\<^sub>a _" [100,100] 100) where al_redu[intro]: "M\\<^sub>l M' \ M \\<^sub>a M'" | ac_redu[intro]: "M\\<^sub>c M' \ M \\<^sub>a M'" | a_Cut_l: "\a\N; x\M; M\\<^sub>a M'\ \ Cut .M (x).N \\<^sub>a Cut .M' (x).N" | a_Cut_r: "\a\N; x\M; N\\<^sub>a N'\ \ Cut .M (x).N \\<^sub>a Cut .M (x).N'" | a_NotL[intro]: "M\\<^sub>a M' \ NotL .M x \\<^sub>a NotL .M' x" | a_NotR[intro]: "M\\<^sub>a M' \ NotR (x).M a \\<^sub>a NotR (x).M' a" | a_AndR_l: "\a\(N,c); b\(M,c); b\a; M\\<^sub>a M'\ \ AndR .M .N c \\<^sub>a AndR .M' .N c" | a_AndR_r: "\a\(N,c); b\(M,c); b\a; N\\<^sub>a N'\ \ AndR .M .N c \\<^sub>a AndR .M .N' c" | a_AndL1: "\x\y; M\\<^sub>a M'\ \ AndL1 (x).M y \\<^sub>a AndL1 (x).M' y" | a_AndL2: "\x\y; M\\<^sub>a M'\ \ AndL2 (x).M y \\<^sub>a AndL2 (x).M' y" | a_OrL_l: "\x\(N,z); y\(M,z); y\x; M\\<^sub>a M'\ \ OrL (x).M (y).N z \\<^sub>a OrL (x).M' (y).N z" | a_OrL_r: "\x\(N,z); y\(M,z); y\x; N\\<^sub>a N'\ \ OrL (x).M (y).N z \\<^sub>a OrL (x).M (y).N' z" | a_OrR1: "\a\b; M\\<^sub>a M'\ \ OrR1 .M b \\<^sub>a OrR1 .M' b" | a_OrR2: "\a\b; M\\<^sub>a M'\ \ OrR2 .M b \\<^sub>a OrR2 .M' b" | a_ImpL_l: "\a\N; x\(M,y); M\\<^sub>a M'\ \ ImpL .M (x).N y \\<^sub>a ImpL .M' (x).N y" | a_ImpL_r: "\a\N; x\(M,y); N\\<^sub>a N'\ \ ImpL .M (x).N y \\<^sub>a ImpL .M (x).N' y" | a_ImpR: "\a\b; M\\<^sub>a M'\ \ ImpR (x)..M b \\<^sub>a ImpR (x)..M' b" lemma fresh_a_redu: fixes x::"name" and c::"coname" shows "M \\<^sub>a M' \ x\M \ x\M'" and "M \\<^sub>a M' \ c\M \ c\M'" apply - apply(induct rule: a_redu.induct) apply(simp add: fresh_l_redu) apply(simp add: fresh_c_redu) -apply(auto simp add: abs_fresh abs_supp fin_supp) +apply(auto simp: abs_fresh abs_supp fin_supp) apply(induct rule: a_redu.induct) apply(simp add: fresh_l_redu) apply(simp add: fresh_c_redu) -apply(auto simp add: abs_fresh abs_supp fin_supp) +apply(auto simp: abs_fresh abs_supp fin_supp) done equivariance a_redu nominal_inductive a_redu by (simp_all add: abs_fresh fresh_atm fresh_prod abs_supp fin_supp fresh_a_redu) lemma better_CutL_intro[intro]: shows "M\\<^sub>a M' \ Cut .M (x).N \\<^sub>a Cut .M' (x).N" proof - assume red: "M\\<^sub>a M'" obtain x'::"name" where fs1: "x'\(M,N,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast) have "Cut .M (x).N = Cut .([(a',a)]\M) (x').([(x',x)]\N)" - using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>a Cut .([(a',a)]\M') (x').([(x',x)]\N)" using fs1 fs2 red by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt) also have "\ = Cut .M' (x).N" - using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) + using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) finally show ?thesis by simp qed lemma better_CutR_intro[intro]: shows "N\\<^sub>a N' \ Cut .M (x).N \\<^sub>a Cut .M (x).N'" proof - assume red: "N\\<^sub>a N'" obtain x'::"name" where fs1: "x'\(M,N,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast) have "Cut .M (x).N = Cut .([(a',a)]\M) (x').([(x',x)]\N)" - using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>a Cut .([(a',a)]\M) (x').([(x',x)]\N')" using fs1 fs2 red by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt) also have "\ = Cut .M (x).N'" - using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) + using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) finally show ?thesis by simp qed lemma better_AndRL_intro[intro]: shows "M\\<^sub>a M' \ AndR .M .N c \\<^sub>a AndR .M' .N c" proof - assume red: "M\\<^sub>a M'" obtain b'::"coname" where fs1: "b'\(M,N,a,b,c)" by (rule exists_fresh(2), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\(M,N,a,b,c,b')" by (rule exists_fresh(2), rule fin_supp, blast) have "AndR .M .N c = AndR .([(a',a)]\M) .([(b',b)]\N) c" - using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>a AndR .([(a',a)]\M') .([(b',b)]\N) c" using fs1 fs2 red by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) also have "\ = AndR .M' .N c" - using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) + using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) finally show ?thesis by simp qed lemma better_AndRR_intro[intro]: shows "N\\<^sub>a N' \ AndR .M .N c \\<^sub>a AndR .M .N' c" proof - assume red: "N\\<^sub>a N'" obtain b'::"coname" where fs1: "b'\(M,N,a,b,c)" by (rule exists_fresh(2), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\(M,N,a,b,c,b')" by (rule exists_fresh(2), rule fin_supp, blast) have "AndR .M .N c = AndR .([(a',a)]\M) .([(b',b)]\N) c" - using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>a AndR .([(a',a)]\M) .([(b',b)]\N') c" using fs1 fs2 red by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) also have "\ = AndR .M .N' c" - using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) + using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) finally show ?thesis by simp qed lemma better_AndL1_intro[intro]: shows "M\\<^sub>a M' \ AndL1 (x).M y \\<^sub>a AndL1 (x).M' y" proof - assume red: "M\\<^sub>a M'" obtain x'::"name" where fs1: "x'\(M,y,x)" by (rule exists_fresh(1), rule fin_supp, blast) have "AndL1 (x).M y = AndL1 (x').([(x',x)]\M) y" - using fs1 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>a AndL1 (x').([(x',x)]\M') y" using fs1 red by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) also have "\ = AndL1 (x).M' y" - using fs1 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) + using fs1 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) finally show ?thesis by simp qed lemma better_AndL2_intro[intro]: shows "M\\<^sub>a M' \ AndL2 (x).M y \\<^sub>a AndL2 (x).M' y" proof - assume red: "M\\<^sub>a M'" obtain x'::"name" where fs1: "x'\(M,y,x)" by (rule exists_fresh(1), rule fin_supp, blast) have "AndL2 (x).M y = AndL2 (x').([(x',x)]\M) y" - using fs1 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>a AndL2 (x').([(x',x)]\M') y" using fs1 red by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) also have "\ = AndL2 (x).M' y" - using fs1 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) + using fs1 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) finally show ?thesis by simp qed lemma better_OrLL_intro[intro]: shows "M\\<^sub>a M' \ OrL (x).M (y).N z \\<^sub>a OrL (x).M' (y).N z" proof - assume red: "M\\<^sub>a M'" obtain x'::"name" where fs1: "x'\(M,N,x,y,z)" by (rule exists_fresh(1), rule fin_supp, blast) obtain y'::"name" where fs2: "y'\(M,N,x,y,z,x')" by (rule exists_fresh(1), rule fin_supp, blast) have "OrL (x).M (y).N z = OrL (x').([(x',x)]\M) (y').([(y',y)]\N) z" - using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>a OrL (x').([(x',x)]\M') (y').([(y',y)]\N) z" using fs1 fs2 red by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) also have "\ = OrL (x).M' (y).N z" - using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) + using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) finally show ?thesis by simp qed lemma better_OrLR_intro[intro]: shows "N\\<^sub>a N' \ OrL (x).M (y).N z \\<^sub>a OrL (x).M (y).N' z" proof - assume red: "N\\<^sub>a N'" obtain x'::"name" where fs1: "x'\(M,N,x,y,z)" by (rule exists_fresh(1), rule fin_supp, blast) obtain y'::"name" where fs2: "y'\(M,N,x,y,z,x')" by (rule exists_fresh(1), rule fin_supp, blast) have "OrL (x).M (y).N z = OrL (x').([(x',x)]\M) (y').([(y',y)]\N) z" - using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>a OrL (x').([(x',x)]\M) (y').([(y',y)]\N') z" using fs1 fs2 red by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) also have "\ = OrL (x).M (y).N' z" - using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) + using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) finally show ?thesis by simp qed lemma better_OrR1_intro[intro]: shows "M\\<^sub>a M' \ OrR1 .M b \\<^sub>a OrR1 .M' b" proof - assume red: "M\\<^sub>a M'" obtain a'::"coname" where fs1: "a'\(M,b,a)" by (rule exists_fresh(2), rule fin_supp, blast) have "OrR1 .M b = OrR1 .([(a',a)]\M) b" - using fs1 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>a OrR1 .([(a',a)]\M') b" using fs1 red by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) also have "\ = OrR1 .M' b" - using fs1 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) + using fs1 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) finally show ?thesis by simp qed lemma better_OrR2_intro[intro]: shows "M\\<^sub>a M' \ OrR2 .M b \\<^sub>a OrR2 .M' b" proof - assume red: "M\\<^sub>a M'" obtain a'::"coname" where fs1: "a'\(M,b,a)" by (rule exists_fresh(2), rule fin_supp, blast) have "OrR2 .M b = OrR2 .([(a',a)]\M) b" - using fs1 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>a OrR2 .([(a',a)]\M') b" using fs1 red by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) also have "\ = OrR2 .M' b" - using fs1 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) + using fs1 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) finally show ?thesis by simp qed lemma better_ImpLL_intro[intro]: shows "M\\<^sub>a M' \ ImpL .M (x).N y \\<^sub>a ImpL .M' (x).N y" proof - assume red: "M\\<^sub>a M'" obtain x'::"name" where fs1: "x'\(M,N,x,y)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast) have "ImpL .M (x).N y = ImpL .([(a',a)]\M) (x').([(x',x)]\N) y" - using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>a ImpL .([(a',a)]\M') (x').([(x',x)]\N) y" using fs1 fs2 red by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) also have "\ = ImpL .M' (x).N y" - using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) + using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) finally show ?thesis by simp qed lemma better_ImpLR_intro[intro]: shows "N\\<^sub>a N' \ ImpL .M (x).N y \\<^sub>a ImpL .M (x).N' y" proof - assume red: "N\\<^sub>a N'" obtain x'::"name" where fs1: "x'\(M,N,x,y)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast) have "ImpL .M (x).N y = ImpL .([(a',a)]\M) (x').([(x',x)]\N) y" - using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs1 fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>a ImpL .([(a',a)]\M) (x').([(x',x)]\N') y" using fs1 fs2 red by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) also have "\ = ImpL .M (x).N' y" - using fs1 fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) + using fs1 fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) finally show ?thesis by simp qed lemma better_ImpR_intro[intro]: shows "M\\<^sub>a M' \ ImpR (x)..M b \\<^sub>a ImpR (x)..M' b" proof - assume red: "M\\<^sub>a M'" obtain a'::"coname" where fs2: "a'\(M,a,b)" by (rule exists_fresh(2), rule fin_supp, blast) have "ImpR (x)..M b = ImpR (x)..([(a',a)]\M) b" - using fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) + using fs2 by (rule_tac sym, auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "\ \\<^sub>a ImpR (x)..([(a',a)]\M') b" using fs2 red by (auto intro: a_redu.intros simp add: fresh_left calc_atm a_redu.eqvt fresh_atm fresh_prod) also have "\ = ImpR (x)..M' b" - using fs2 red by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) + using fs2 red by (auto simp: trm.inject alpha fresh_atm fresh_prod calc_atm fresh_a_redu) finally show ?thesis by simp qed text \axioms do not reduce\ lemma ax_do_not_l_reduce: shows "Ax x a \\<^sub>l M \ False" by (erule_tac l_redu.cases) (simp_all add: trm.inject) lemma ax_do_not_c_reduce: shows "Ax x a \\<^sub>c M \ False" by (erule_tac c_redu.cases) (simp_all add: trm.inject) lemma ax_do_not_a_reduce: shows "Ax x a \\<^sub>a M \ False" apply(erule_tac a_redu.cases) -apply(auto simp add: trm.inject) +apply(auto simp: trm.inject) apply(drule ax_do_not_l_reduce) apply(simp) apply(drule ax_do_not_c_reduce) apply(simp) done lemma a_redu_NotL_elim: assumes a: "NotL .M x \\<^sub>a R" shows "\M'. R = NotL .M' x \ M\\<^sub>aM'" using a [[simproc del: defined_all]] apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) apply(auto) apply(rotate_tac 2) apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) -apply(auto simp add: alpha a_redu.eqvt) +apply(auto simp: alpha a_redu.eqvt) apply(rule_tac x="([(a,aa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) apply(simp add: perm_swap) apply(rule_tac x="([(a,aaa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) apply(simp add: perm_swap) done lemma a_redu_NotR_elim: assumes a: "NotR (x).M a \\<^sub>a R" shows "\M'. R = NotR (x).M' a \ M\\<^sub>aM'" using a [[simproc del: defined_all]] apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) apply(auto) apply(rotate_tac 2) apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) -apply(auto simp add: alpha a_redu.eqvt) +apply(auto simp: alpha a_redu.eqvt) apply(rule_tac x="([(x,xa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) apply(simp add: perm_swap) apply(rule_tac x="([(x,xaa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) apply(simp add: perm_swap) done lemma a_redu_AndR_elim: assumes a: "AndR .M .N c\\<^sub>a R" shows "(\M'. R = AndR .M' .N c \ M\\<^sub>aM') \ (\N'. R = AndR .M .N' c \ N\\<^sub>aN')" using a [[simproc del: defined_all]] apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) apply(rotate_tac 6) apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) apply(rule disjI1) -apply(auto simp add: alpha a_redu.eqvt)[1] +apply(auto simp: alpha a_redu.eqvt)[1] apply(rule_tac x="([(a,aa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(a,aa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(a,aa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(a,aa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(a,aaa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(a,aaa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(a,aaa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(a,aa)]\M'a)" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(a,aaa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(a,aaa)]\M'a)" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(a,aaa)]\M'a)" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(a,aaa)]\M'a)" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule disjI2) -apply(auto simp add: alpha a_redu.eqvt)[1] +apply(auto simp: alpha a_redu.eqvt)[1] apply(rule_tac x="([(b,ba)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(b,baa)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(b,ba)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(b,baa)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(b,ba)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(b,baa)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(b,ba)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(b,baa)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rotate_tac 6) apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) apply(rule disjI1) -apply(auto simp add: alpha a_redu.eqvt)[1] +apply(auto simp: alpha a_redu.eqvt)[1] apply(rule_tac x="([(a,aa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(a,aa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(a,aa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(a,aa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(a,aaa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(a,aaa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(a,aaa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(a,aa)]\M')" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(a,aaa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(a,aaa)]\M')" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(a,aaa)]\M')" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(a,aaa)]\M')" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule disjI2) -apply(auto simp add: alpha a_redu.eqvt)[1] +apply(auto simp: alpha a_redu.eqvt)[1] apply(rule_tac x="([(b,ba)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(b,ba)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(b,ba)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(b,ba)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(b,ba)]\N'a)" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(b,baa)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(b,baa)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(b,baa)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(b,baa)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] done lemma a_redu_AndL1_elim: assumes a: "AndL1 (x).M y \\<^sub>a R" shows "\M'. R = AndL1 (x).M' y \ M\\<^sub>aM'" using a [[simproc del: defined_all]] apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) apply(auto) apply(rotate_tac 3) apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) -apply(auto simp add: alpha a_redu.eqvt) +apply(auto simp: alpha a_redu.eqvt) apply(rule_tac x="([(x,xa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) apply(simp add: perm_swap) apply(rule_tac x="([(x,xaa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) apply(simp add: perm_swap) done lemma a_redu_AndL2_elim: assumes a: "AndL2 (x).M y \\<^sub>a R" shows "\M'. R = AndL2 (x).M' y \ M\\<^sub>aM'" using a [[simproc del: defined_all]] apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) apply(auto) apply(rotate_tac 3) apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) -apply(auto simp add: alpha a_redu.eqvt) +apply(auto simp: alpha a_redu.eqvt) apply(rule_tac x="([(x,xa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) apply(simp add: perm_swap) apply(rule_tac x="([(x,xaa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) apply(simp add: perm_swap) done lemma a_redu_OrL_elim: assumes a: "OrL (x).M (y).N z\\<^sub>a R" shows "(\M'. R = OrL (x).M' (y).N z \ M\\<^sub>aM') \ (\N'. R = OrL (x).M (y).N' z \ N\\<^sub>aN')" using a [[simproc del: defined_all]] apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) apply(rotate_tac 6) apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) apply(rule disjI1) -apply(auto simp add: alpha a_redu.eqvt)[1] +apply(auto simp: alpha a_redu.eqvt)[1] apply(rule_tac x="([(x,xa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(x,xa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(x,xa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(x,xa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(x,xaa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(x,xaa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(x,xaa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(x,xa)]\M'a)" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(x,xaa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(x,xaa)]\M'a)" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(x,xaa)]\M'a)" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(x,xaa)]\M'a)" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule disjI2) -apply(auto simp add: alpha a_redu.eqvt)[1] +apply(auto simp: alpha a_redu.eqvt)[1] apply(rule_tac x="([(y,ya)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,yaa)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,ya)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,yaa)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,ya)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,yaa)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,ya)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,yaa)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rotate_tac 6) apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) apply(rule disjI1) -apply(auto simp add: alpha a_redu.eqvt)[1] +apply(auto simp: alpha a_redu.eqvt)[1] apply(rule_tac x="([(x,xa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(x,xa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(x,xa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(x,xa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(x,xaa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(x,xaa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(x,xaa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(x,xa)]\M')" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(x,xaa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(x,xaa)]\M')" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(x,xaa)]\M')" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(x,xaa)]\M')" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule disjI2) -apply(auto simp add: alpha a_redu.eqvt)[1] +apply(auto simp: alpha a_redu.eqvt)[1] apply(rule_tac x="([(y,ya)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(y,ya)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,ya)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,ya)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(y,ya)]\N'a)" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,yaa)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,yaa)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,yaa)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,yaa)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] done lemma a_redu_OrR1_elim: assumes a: "OrR1 .M b \\<^sub>a R" shows "\M'. R = OrR1 .M' b \ M\\<^sub>aM'" using a [[simproc del: defined_all]] apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) apply(auto) apply(rotate_tac 3) apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) -apply(auto simp add: alpha a_redu.eqvt) +apply(auto simp: alpha a_redu.eqvt) apply(rule_tac x="([(a,aa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) apply(simp add: perm_swap) apply(rule_tac x="([(a,aaa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) apply(simp add: perm_swap) done lemma a_redu_OrR2_elim: assumes a: "OrR2 .M b \\<^sub>a R" shows "\M'. R = OrR2 .M' b \ M\\<^sub>aM'" using a [[simproc del: defined_all]] apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) apply(auto) apply(rotate_tac 3) apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) -apply(auto simp add: alpha a_redu.eqvt) +apply(auto simp: alpha a_redu.eqvt) apply(rule_tac x="([(a,aa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) apply(simp add: perm_swap) apply(rule_tac x="([(a,aaa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu) apply(simp add: perm_swap) done lemma a_redu_ImpL_elim: assumes a: "ImpL .M (y).N z\\<^sub>a R" shows "(\M'. R = ImpL .M' (y).N z \ M\\<^sub>aM') \ (\N'. R = ImpL .M (y).N' z \ N\\<^sub>aN')" using a [[simproc del: defined_all]] apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) apply(rotate_tac 5) apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) apply(rule disjI1) -apply(auto simp add: alpha a_redu.eqvt)[1] +apply(auto simp: alpha a_redu.eqvt)[1] apply(rule_tac x="([(a,aa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(a,aa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(a,aa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(a,aa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(a,aaa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(a,aaa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(a,aaa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(a,aa)]\M'a)" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(a,aaa)]\M'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(a,aaa)]\M'a)" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(a,aaa)]\M'a)" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(a,aaa)]\M'a)" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule disjI2) -apply(auto simp add: alpha a_redu.eqvt)[1] +apply(auto simp: alpha a_redu.eqvt)[1] apply(rule_tac x="([(y,xa)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(y,xa)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,xa)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(y,xa)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,xa)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,xa)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,xa)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,xa)]\N')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(y,xa)]\N')" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(y,xa)]\N')" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rotate_tac 5) apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) apply(rule disjI1) -apply(auto simp add: alpha a_redu.eqvt)[1] +apply(auto simp: alpha a_redu.eqvt)[1] apply(rule_tac x="([(a,aa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(a,aa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(a,aa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(a,aa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(a,aaa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(a,aaa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(a,aaa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(a,aa)]\M')" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(a,aaa)]\M')" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(a,aaa)]\M')" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(a,aaa)]\M')" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(a,aaa)]\M')" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule disjI2) -apply(auto simp add: alpha a_redu.eqvt)[1] +apply(auto simp: alpha a_redu.eqvt)[1] apply(rule_tac x="([(y,xa)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(y,xa)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,xa)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] -apply(rule_tac x="([(y,xa)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,xa)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,xa)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,xa)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] apply(rule_tac x="([(y,xa)]\N'a)" in exI) -apply(auto simp add: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(y,xa)]\N'a)" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] +apply(rule_tac x="([(y,xa)]\N'a)" in exI) +apply(auto simp: perm_swap fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu)[1] done lemma a_redu_ImpR_elim: assumes a: "ImpR (x)..M b \\<^sub>a R" shows "\M'. R = ImpR (x)..M' b \ M\\<^sub>aM'" using a [[simproc del: defined_all]] apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) apply(auto) apply(rotate_tac 3) apply(erule_tac a_redu.cases, simp_all add: trm.inject) apply(erule_tac l_redu.cases, simp_all add: trm.inject) apply(erule_tac c_redu.cases, simp_all add: trm.inject) -apply(auto simp add: alpha a_redu.eqvt abs_perm abs_fresh) -apply(rule_tac x="([(a,aa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) -apply(rule_tac x="([(a,aaa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) +apply(auto simp: alpha a_redu.eqvt abs_perm abs_fresh) apply(rule_tac x="([(a,aa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) apply(rule_tac x="([(a,aaa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) +apply(rule_tac x="([(a,aa)]\M'a)" in exI) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) +apply(rule_tac x="([(a,aaa)]\M'a)" in exI) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) apply(rule_tac x="([(x,xa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) apply(rule_tac x="([(x,xa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) apply(rule_tac x="([(a,aa)]\[(x,xa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) apply(rule sym) apply(rule trans) apply(rule perm_compose) apply(simp add: calc_atm perm_swap) apply(rule_tac x="([(a,aaa)]\[(x,xa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) apply(rule sym) apply(rule trans) apply(rule perm_compose) apply(simp add: calc_atm perm_swap) apply(rule_tac x="([(x,xaa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) apply(rule_tac x="([(x,xaa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) apply(rule_tac x="([(a,aa)]\[(x,xaa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) apply(rule sym) apply(rule trans) apply(rule perm_compose) apply(simp add: calc_atm perm_swap) apply(rule_tac x="([(a,aaa)]\[(x,xaa)]\M'a)" in exI) -apply(auto simp add: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) +apply(auto simp: fresh_left alpha a_redu.eqvt calc_atm fresh_a_redu perm_swap) apply(rule sym) apply(rule trans) apply(rule perm_compose) apply(simp add: calc_atm perm_swap) done text \Transitive Closure\ abbreviation a_star_redu :: "trm \ trm \ bool" ("_ \\<^sub>a* _" [100,100] 100) where "M \\<^sub>a* M' \ (a_redu)\<^sup>*\<^sup>* M M'" lemma a_starI: assumes a: "M \\<^sub>a M'" shows "M \\<^sub>a* M'" using a by blast lemma a_starE: assumes a: "M \\<^sub>a* M'" shows "M = M' \ (\N. M \\<^sub>a N \ N \\<^sub>a* M')" using a by (induct) (auto) lemma a_star_refl: shows "M \\<^sub>a* M" by blast lemma a_star_trans[trans]: assumes a1: "M1\\<^sub>a* M2" and a2: "M2\\<^sub>a* M3" shows "M1 \\<^sub>a* M3" using a2 a1 by (induct) (auto) text \congruence rules for \\\<^sub>a*\\ lemma ax_do_not_a_star_reduce: shows "Ax x a \\<^sub>a* M \ M = Ax x a" apply(induct set: rtranclp) apply(auto) apply(drule ax_do_not_a_reduce) apply(simp) done lemma a_star_CutL: "M \\<^sub>a* M' \ Cut .M (x).N \\<^sub>a* Cut .M' (x).N" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_CutR: "N \\<^sub>a* N'\ Cut .M (x).N \\<^sub>a* Cut .M (x).N'" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_Cut: "\M \\<^sub>a* M'; N \\<^sub>a* N'\ \ Cut .M (x).N \\<^sub>a* Cut .M' (x).N'" by (blast intro!: a_star_CutL a_star_CutR intro: rtranclp_trans) lemma a_star_NotR: "M \\<^sub>a* M' \ NotR (x).M a \\<^sub>a* NotR (x).M' a" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_NotL: "M \\<^sub>a* M' \ NotL .M x \\<^sub>a* NotL .M' x" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_AndRL: "M \\<^sub>a* M'\ AndR .M .N c \\<^sub>a* AndR .M' .N c" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_AndRR: "N \\<^sub>a* N'\ AndR .M .N c \\<^sub>a* AndR .M .N' c" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_AndR: "\M \\<^sub>a* M'; N \\<^sub>a* N'\ \ AndR .M .N c \\<^sub>a* AndR .M' .N' c" by (blast intro!: a_star_AndRL a_star_AndRR intro: rtranclp_trans) lemma a_star_AndL1: "M \\<^sub>a* M' \ AndL1 (x).M y \\<^sub>a* AndL1 (x).M' y" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_AndL2: "M \\<^sub>a* M' \ AndL2 (x).M y \\<^sub>a* AndL2 (x).M' y" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_OrLL: "M \\<^sub>a* M'\ OrL (x).M (y).N z \\<^sub>a* OrL (x).M' (y).N z" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_OrLR: "N \\<^sub>a* N'\ OrL (x).M (y).N z \\<^sub>a* OrL (x).M (y).N' z" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_OrL: "\M \\<^sub>a* M'; N \\<^sub>a* N'\ \ OrL (x).M (y).N z \\<^sub>a* OrL (x).M' (y).N' z" by (blast intro!: a_star_OrLL a_star_OrLR intro: rtranclp_trans) lemma a_star_OrR1: "M \\<^sub>a* M' \ OrR1 .M b \\<^sub>a* OrR1 .M' b" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_OrR2: "M \\<^sub>a* M' \ OrR2 .M b \\<^sub>a* OrR2 .M' b" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_ImpLL: "M \\<^sub>a* M'\ ImpL .M (y).N z \\<^sub>a* ImpL .M' (y).N z" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_ImpLR: "N \\<^sub>a* N'\ ImpL .M (y).N z \\<^sub>a* ImpL .M (y).N' z" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_ImpL: "\M \\<^sub>a* M'; N \\<^sub>a* N'\ \ ImpL .M (y).N z \\<^sub>a* ImpL .M' (y).N' z" by (blast intro!: a_star_ImpLL a_star_ImpLR intro: rtranclp_trans) lemma a_star_ImpR: "M \\<^sub>a* M' \ ImpR (x)..M b \\<^sub>a* ImpR (x)..M' b" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemmas a_star_congs = a_star_Cut a_star_NotR a_star_NotL a_star_AndR a_star_AndL1 a_star_AndL2 a_star_OrL a_star_OrR1 a_star_OrR2 a_star_ImpL a_star_ImpR lemma a_star_redu_NotL_elim: assumes a: "NotL .M x \\<^sub>a* R" shows "\M'. R = NotL .M' x \ M \\<^sub>a* M'" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_NotL_elim) apply(auto) done lemma a_star_redu_NotR_elim: assumes a: "NotR (x).M a \\<^sub>a* R" shows "\M'. R = NotR (x).M' a \ M \\<^sub>a* M'" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_NotR_elim) apply(auto) done lemma a_star_redu_AndR_elim: assumes a: "AndR .M .N c\\<^sub>a* R" shows "(\M' N'. R = AndR .M' .N' c \ M \\<^sub>a* M' \ N \\<^sub>a* N')" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_AndR_elim) -apply(auto simp add: alpha trm.inject) +apply(auto simp: alpha trm.inject) done lemma a_star_redu_AndL1_elim: assumes a: "AndL1 (x).M y \\<^sub>a* R" shows "\M'. R = AndL1 (x).M' y \ M \\<^sub>a* M'" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_AndL1_elim) -apply(auto simp add: alpha trm.inject) +apply(auto simp: alpha trm.inject) done lemma a_star_redu_AndL2_elim: assumes a: "AndL2 (x).M y \\<^sub>a* R" shows "\M'. R = AndL2 (x).M' y \ M \\<^sub>a* M'" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_AndL2_elim) -apply(auto simp add: alpha trm.inject) +apply(auto simp: alpha trm.inject) done lemma a_star_redu_OrL_elim: assumes a: "OrL (x).M (y).N z \\<^sub>a* R" shows "(\M' N'. R = OrL (x).M' (y).N' z \ M \\<^sub>a* M' \ N \\<^sub>a* N')" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_OrL_elim) -apply(auto simp add: alpha trm.inject) +apply(auto simp: alpha trm.inject) done lemma a_star_redu_OrR1_elim: assumes a: "OrR1 .M y \\<^sub>a* R" shows "\M'. R = OrR1 .M' y \ M \\<^sub>a* M'" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_OrR1_elim) -apply(auto simp add: alpha trm.inject) +apply(auto simp: alpha trm.inject) done lemma a_star_redu_OrR2_elim: assumes a: "OrR2 .M y \\<^sub>a* R" shows "\M'. R = OrR2 .M' y \ M \\<^sub>a* M'" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_OrR2_elim) -apply(auto simp add: alpha trm.inject) +apply(auto simp: alpha trm.inject) done lemma a_star_redu_ImpR_elim: assumes a: "ImpR (x)..M y \\<^sub>a* R" shows "\M'. R = ImpR (x)..M' y \ M \\<^sub>a* M'" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_ImpR_elim) -apply(auto simp add: alpha trm.inject) +apply(auto simp: alpha trm.inject) done lemma a_star_redu_ImpL_elim: assumes a: "ImpL .M (y).N z \\<^sub>a* R" shows "(\M' N'. R = ImpL .M' (y).N' z \ M \\<^sub>a* M' \ N \\<^sub>a* N')" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_ImpL_elim) -apply(auto simp add: alpha trm.inject) +apply(auto simp: alpha trm.inject) done text \Substitution\ lemma subst_not_fin1: shows "\fin(M{x:=.P}) x" apply(nominal_induct M avoiding: x c P rule: trm.strong_induct) apply(auto) apply(drule fin_elims, simp) apply(drule fin_elims, simp) apply(erule fin.cases, simp_all add: trm.inject) apply(erule fin.cases, simp_all add: trm.inject) apply(erule fin.cases, simp_all add: trm.inject) apply(subgoal_tac "\x'::name. x'\(trm{x:=.P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL) apply(erule fin.cases, simp_all add: trm.inject) apply(rule exists_fresh'(1)[OF fs_name1]) apply(erule fin.cases, simp_all add: trm.inject) apply(erule fin.cases, simp_all add: trm.inject) apply(subgoal_tac "\x'::name. x'\(trm{x:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1) apply(erule fin.cases, simp_all add: trm.inject) apply(rule exists_fresh'(1)[OF fs_name1]) apply(erule fin.cases, simp_all add: trm.inject) apply(subgoal_tac "\x'::name. x'\(trm{x:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2) apply(erule fin.cases, simp_all add: trm.inject) apply(rule exists_fresh'(1)[OF fs_name1]) apply(erule fin.cases, simp_all add: trm.inject) apply(erule fin.cases, simp_all add: trm.inject) apply(erule fin.cases, simp_all add: trm.inject) apply(subgoal_tac "\x'::name. x'\(trm1{x:=.P},P,name1,trm2{x:=.P},name2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL) apply(erule fin.cases, simp_all add: trm.inject) apply(rule exists_fresh'(1)[OF fs_name1]) apply(erule fin.cases, simp_all add: trm.inject) apply(erule fin.cases, simp_all add: trm.inject) apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.P},P,name1,trm2{name2:=.P})") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL) apply(erule fin.cases, simp_all add: trm.inject) apply(rule exists_fresh'(1)[OF fs_name1]) apply(erule fin.cases, simp_all add: trm.inject) done lemma subst_not_fin2: assumes a: "\fin M y" shows "\fin(M{c:=(x).P}) y" using a apply(nominal_induct M avoiding: x c P y rule: trm.strong_induct) apply(auto) apply(drule fin_elims, simp) apply(drule fin_elims, simp) apply(drule fin_elims, simp) apply(subgoal_tac "\c'::coname. c'\(trm{coname:=(x).P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR) apply(drule fin_elims, simp) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(drule fin_elims, simp) apply(drule fin_elims, simp) apply(drule freshn_after_substc) apply(simp add: fin.intros) apply(subgoal_tac "\c'::coname. c'\(trm1{coname3:=(x).P},P,coname1,trm2{coname3:=(x).P},coname2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR) apply(drule fin_elims, simp) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(drule fin_elims, simp) apply(drule fin_elims, simp) apply(simp add: abs_fresh fresh_atm) apply(drule freshn_after_substc) apply(simp add: fin.intros abs_fresh) apply(drule fin_elims, simp) apply(simp add: abs_fresh fresh_atm) apply(drule freshn_after_substc) apply(simp add: fin.intros abs_fresh) apply(subgoal_tac "\c'::coname. c'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1) apply(drule fin_elims, simp) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(drule fin_elims, simp) apply(subgoal_tac "\c'::coname. c'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2) apply(drule fin_elims, simp) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(drule fin_elims, simp) apply(drule fin_elims, simp) apply(auto)[1] apply(simp add: abs_fresh fresh_atm) apply(drule freshn_after_substc) apply(drule freshn_after_substc) apply(simp add: fin.intros abs_fresh) apply(subgoal_tac "\c'::coname. c'\(trm{coname2:=(x).P},P,coname1,coname2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR) apply(drule fin_elims, simp) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(drule fin_elims, simp) apply(drule fin_elims, simp) apply(auto)[1] apply(simp add: abs_fresh fresh_atm) apply(drule freshn_after_substc) apply(drule freshn_after_substc) apply(simp add: fin.intros abs_fresh) done lemma subst_not_fic1: shows "\fic (M{a:=(x).P}) a" apply(nominal_induct M avoiding: a x P rule: trm.strong_induct) apply(auto) apply(erule fic.cases, simp_all add: trm.inject) apply(erule fic.cases, simp_all add: trm.inject) apply(erule fic.cases, simp_all add: trm.inject) apply(erule fic.cases, simp_all add: trm.inject) apply(subgoal_tac "\a'::coname. a'\(trm{coname:=(x).P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR) apply(erule fic.cases, simp_all add: trm.inject) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(erule fic.cases, simp_all add: trm.inject) apply(erule fic.cases, simp_all add: trm.inject) apply(subgoal_tac "\a'::coname. a'\(trm1{coname3:=(x).P},P,trm2{coname3:=(x).P},coname1,coname2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR) apply(erule fic.cases, simp_all add: trm.inject) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(erule fic.cases, simp_all add: trm.inject) apply(erule fic.cases, simp_all add: trm.inject) apply(erule fic.cases, simp_all add: trm.inject) apply(subgoal_tac "\a'::coname. a'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1) apply(erule fic.cases, simp_all add: trm.inject) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(erule fic.cases, simp_all add: trm.inject) apply(subgoal_tac "\a'::coname. a'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2) apply(erule fic.cases, simp_all add: trm.inject) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(erule fic.cases, simp_all add: trm.inject) apply(erule fic.cases, simp_all add: trm.inject) apply(subgoal_tac "\a'::coname. a'\(trm{coname2:=(x).P},P,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR) apply(erule fic.cases, simp_all add: trm.inject) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(erule fic.cases, simp_all add: trm.inject) apply(erule fic.cases, simp_all add: trm.inject) done lemma subst_not_fic2: assumes a: "\fic M a" shows "\fic(M{x:=.P}) a" using a apply(nominal_induct M avoiding: x a P b rule: trm.strong_induct) apply(auto) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(drule freshc_after_substn) apply(simp add: fic.intros) apply(subgoal_tac "\x'::name. x'\(trm{x:=.P},P)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL) apply(drule fic_elims, simp) apply(rule exists_fresh'(1)[OF fs_name1]) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(auto)[1] apply(simp add: abs_fresh fresh_atm) apply(drule freshc_after_substn) apply(drule freshc_after_substn) apply(simp add: fic.intros abs_fresh) apply(subgoal_tac "\x'::name. x'\(trm{x:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1) apply(drule fic_elims, simp) apply(rule exists_fresh'(1)[OF fs_name1]) apply(drule fic_elims, simp) apply(subgoal_tac "\x'::name. x'\(trm{x:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2) apply(drule fic_elims, simp) apply(rule exists_fresh'(1)[OF fs_name1]) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(simp add: abs_fresh fresh_atm) apply(drule freshc_after_substn) apply(simp add: fic.intros abs_fresh) apply(drule fic_elims, simp) apply(simp add: abs_fresh fresh_atm) apply(drule freshc_after_substn) apply(simp add: fic.intros abs_fresh) apply(subgoal_tac "\x'::name. x'\(trm1{x:=.P},P,name1,trm2{x:=.P},name2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL) apply(drule fic_elims, simp) apply(rule exists_fresh'(1)[OF fs_name1]) apply(drule fic_elims, simp) apply(drule fic_elims, simp) apply(simp add: abs_fresh fresh_atm) apply(drule freshc_after_substn) apply(simp add: fic.intros abs_fresh) apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.P},trm2{name2:=.P},P,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL) apply(drule fic_elims, simp) apply(rule exists_fresh'(1)[OF fs_name1]) apply(drule fic_elims, simp) done text \Reductions\ lemma fin_l_reduce: assumes a: "fin M x" and b: "M \\<^sub>l M'" shows "fin M' x" using b a apply(induct) apply(erule fin.cases) apply(simp_all add: trm.inject) apply(rotate_tac 3) apply(erule fin.cases) apply(simp_all add: trm.inject) apply(erule fin.cases, simp_all add: trm.inject)+ done lemma fin_c_reduce: assumes a: "fin M x" and b: "M \\<^sub>c M'" shows "fin M' x" using b a apply(induct) apply(erule fin.cases, simp_all add: trm.inject)+ done lemma fin_a_reduce: assumes a: "fin M x" and b: "M \\<^sub>a M'" shows "fin M' x" using a b apply(induct) apply(drule ax_do_not_a_reduce) apply(simp) apply(drule a_redu_NotL_elim) apply(auto) apply(rule fin.intros) apply(simp add: fresh_a_redu) apply(drule a_redu_AndL1_elim) apply(auto) apply(rule fin.intros) apply(force simp add: abs_fresh fresh_a_redu) apply(drule a_redu_AndL2_elim) apply(auto) apply(rule fin.intros) apply(force simp add: abs_fresh fresh_a_redu) apply(drule a_redu_OrL_elim) apply(auto) apply(rule fin.intros) apply(force simp add: abs_fresh fresh_a_redu) apply(force simp add: abs_fresh fresh_a_redu) apply(rule fin.intros) apply(force simp add: abs_fresh fresh_a_redu) apply(force simp add: abs_fresh fresh_a_redu) apply(drule a_redu_ImpL_elim) apply(auto) apply(rule fin.intros) apply(force simp add: abs_fresh fresh_a_redu) apply(force simp add: abs_fresh fresh_a_redu) apply(rule fin.intros) apply(force simp add: abs_fresh fresh_a_redu) apply(force simp add: abs_fresh fresh_a_redu) done lemma fin_a_star_reduce: assumes a: "fin M x" and b: "M \\<^sub>a* M'" shows "fin M' x" using b a apply(induct set: rtranclp) -apply(auto simp add: fin_a_reduce) +apply(auto simp: fin_a_reduce) done lemma fic_l_reduce: assumes a: "fic M x" and b: "M \\<^sub>l M'" shows "fic M' x" using b a apply(induct) apply(erule fic.cases) apply(simp_all add: trm.inject) apply(rotate_tac 3) apply(erule fic.cases) apply(simp_all add: trm.inject) apply(erule fic.cases, simp_all add: trm.inject)+ done lemma fic_c_reduce: assumes a: "fic M x" and b: "M \\<^sub>c M'" shows "fic M' x" using b a apply(induct) apply(erule fic.cases, simp_all add: trm.inject)+ done lemma fic_a_reduce: assumes a: "fic M x" and b: "M \\<^sub>a M'" shows "fic M' x" using a b apply(induct) apply(drule ax_do_not_a_reduce) apply(simp) apply(drule a_redu_NotR_elim) apply(auto) apply(rule fic.intros) apply(simp add: fresh_a_redu) apply(drule a_redu_AndR_elim) apply(auto) apply(rule fic.intros) apply(force simp add: abs_fresh fresh_a_redu) apply(force simp add: abs_fresh fresh_a_redu) apply(rule fic.intros) apply(force simp add: abs_fresh fresh_a_redu) apply(force simp add: abs_fresh fresh_a_redu) apply(drule a_redu_OrR1_elim) apply(auto) apply(rule fic.intros) apply(force simp add: abs_fresh fresh_a_redu) apply(drule a_redu_OrR2_elim) apply(auto) apply(rule fic.intros) apply(force simp add: abs_fresh fresh_a_redu) apply(drule a_redu_ImpR_elim) apply(auto) apply(rule fic.intros) apply(force simp add: abs_fresh fresh_a_redu) done lemma fic_a_star_reduce: assumes a: "fic M x" and b: "M \\<^sub>a* M'" shows "fic M' x" using b a apply(induct set: rtranclp) -apply(auto simp add: fic_a_reduce) +apply(auto simp: fic_a_reduce) done text \substitution properties\ lemma subst_with_ax1: shows "M{x:=.Ax y a} \\<^sub>a* M[x\n>y]" proof(nominal_induct M avoiding: x a y rule: trm.strong_induct) case (Ax z b x a y) show "(Ax z b){x:=.Ax y a} \\<^sub>a* (Ax z b)[x\n>y]" proof (cases "z=x") case True assume eq: "z=x" have "(Ax z b){x:=.Ax y a} = Cut .Ax y a (x).Ax x b" using eq by simp also have "\ \\<^sub>a* (Ax x b)[x\n>y]" by blast finally show "Ax z b{x:=.Ax y a} \\<^sub>a* (Ax z b)[x\n>y]" using eq by simp next case False assume neq: "z\x" then show "(Ax z b){x:=.Ax y a} \\<^sub>a* (Ax z b)[x\n>y]" using neq by simp qed next case (Cut b M z N x a y) have fs: "b\x" "b\a" "b\y" "b\N" "z\x" "z\a" "z\y" "z\M" by fact+ have ih1: "M{x:=.Ax y a} \\<^sub>a* M[x\n>y]" by fact have ih2: "N{x:=.Ax y a} \\<^sub>a* N[x\n>y]" by fact show "(Cut .M (z).N){x:=.Ax y a} \\<^sub>a* (Cut .M (z).N)[x\n>y]" proof (cases "M = Ax x b") case True assume eq: "M = Ax x b" have "(Cut .M (z).N){x:=.Ax y a} = Cut .Ax y a (z).(N{x:=.Ax y a})" using fs eq by simp also have "\ \\<^sub>a* Cut .Ax y a (z).(N[x\n>y])" using ih2 a_star_congs by blast also have "\ = Cut .(M[x\n>y]) (z).(N[x\n>y])" using eq by (simp add: trm.inject alpha calc_atm fresh_atm) finally show "(Cut .M (z).N){x:=.Ax y a} \\<^sub>a* (Cut .M (z).N)[x\n>y]" using fs by simp next case False assume neq: "M \ Ax x b" have "(Cut .M (z).N){x:=.Ax y a} = Cut .(M{x:=.Ax y a}) (z).(N{x:=.Ax y a})" using fs neq by simp also have "\ \\<^sub>a* Cut .(M[x\n>y]) (z).(N[x\n>y])" using ih1 ih2 a_star_congs by blast finally show "(Cut .M (z).N){x:=.Ax y a} \\<^sub>a* (Cut .M (z).N)[x\n>y]" using fs by simp qed next case (NotR z M b x a y) have fs: "z\x" "z\a" "z\y" "z\b" by fact+ have ih: "M{x:=.Ax y a} \\<^sub>a* M[x\n>y]" by fact have "(NotR (z).M b){x:=.Ax y a} = NotR (z).(M{x:=.Ax y a}) b" using fs by simp also have "\ \\<^sub>a* NotR (z).(M[x\n>y]) b" using ih by (auto intro: a_star_congs) finally show "(NotR (z).M b){x:=.Ax y a} \\<^sub>a* (NotR (z).M b)[x\n>y]" using fs by simp next case (NotL b M z x a y) have fs: "b\x" "b\a" "b\y" "b\z" by fact+ have ih: "M{x:=.Ax y a} \\<^sub>a* M[x\n>y]" by fact show "(NotL .M z){x:=.Ax y a} \\<^sub>a* (NotL .M z)[x\n>y]" proof(cases "z=x") case True assume eq: "z=x" obtain x'::"name" where new: "x'\(Ax y a,M{x:=.Ax y a})" by (rule exists_fresh(1)[OF fs_name1]) have "(NotL .M z){x:=.Ax y a} = fresh_fun (\x'. Cut .Ax y a (x').NotL .(M{x:=.Ax y a}) x')" using eq fs by simp also have "\ = Cut .Ax y a (x').NotL .(M{x:=.Ax y a}) x'" using new by (simp add: fresh_fun_simp_NotL fresh_prod) also have "\ \\<^sub>a* (NotL .(M{x:=.Ax y a}) x')[x'\n>y]" using new apply(rule_tac a_starI) apply(rule al_redu) apply(rule better_LAxL_intro) apply(auto) done also have "\ = NotL .(M{x:=.Ax y a}) y" using new by (simp add: nrename_fresh) also have "\ \\<^sub>a* NotL .(M[x\n>y]) y" using ih by (auto intro: a_star_congs) also have "\ = (NotL .M z)[x\n>y]" using eq by simp finally show "(NotL .M z){x:=.Ax y a} \\<^sub>a* (NotL .M z)[x\n>y]" by simp next case False assume neq: "z\x" have "(NotL .M z){x:=.Ax y a} = NotL .(M{x:=.Ax y a}) z" using fs neq by simp also have "\ \\<^sub>a* NotL .(M[x\n>y]) z" using ih by (auto intro: a_star_congs) finally show "(NotL .M z){x:=.Ax y a} \\<^sub>a* (NotL .M z)[x\n>y]" using neq by simp qed next case (AndR c M d N e x a y) have fs: "c\x" "c\a" "c\y" "d\x" "d\a" "d\y" "d\c" "c\N" "c\e" "d\M" "d\e" by fact+ have ih1: "M{x:=.Ax y a} \\<^sub>a* M[x\n>y]" by fact have ih2: "N{x:=.Ax y a} \\<^sub>a* N[x\n>y]" by fact have "(AndR .M .N e){x:=.Ax y a} = AndR .(M{x:=.Ax y a}) .(N{x:=.Ax y a}) e" using fs by simp also have "\ \\<^sub>a* AndR .(M[x\n>y]) .(N[x\n>y]) e" using ih1 ih2 by (auto intro: a_star_congs) finally show "(AndR .M .N e){x:=.Ax y a} \\<^sub>a* (AndR .M .N e)[x\n>y]" using fs by simp next case (AndL1 u M v x a y) have fs: "u\x" "u\a" "u\y" "u\v" by fact+ have ih: "M{x:=.Ax y a} \\<^sub>a* M[x\n>y]" by fact show "(AndL1 (u).M v){x:=.Ax y a} \\<^sub>a* (AndL1 (u).M v)[x\n>y]" proof(cases "v=x") case True assume eq: "v=x" obtain v'::"name" where new: "v'\(Ax y a,M{x:=.Ax y a},u)" by (rule exists_fresh(1)[OF fs_name1]) have "(AndL1 (u).M v){x:=.Ax y a} = fresh_fun (\v'. Cut .Ax y a (v').AndL1 (u).(M{x:=.Ax y a}) v')" using eq fs by simp also have "\ = Cut .Ax y a (v').AndL1 (u).(M{x:=.Ax y a}) v'" using new by (simp add: fresh_fun_simp_AndL1 fresh_prod) also have "\ \\<^sub>a* (AndL1 (u).(M{x:=.Ax y a}) v')[v'\n>y]" using new apply(rule_tac a_starI) apply(rule a_redu.intros) apply(rule better_LAxL_intro) apply(rule fin.intros) apply(simp add: abs_fresh) done also have "\ = AndL1 (u).(M{x:=.Ax y a}) y" using fs new - by (auto simp add: fresh_prod fresh_atm nrename_fresh) + by (auto simp: fresh_prod fresh_atm nrename_fresh) also have "\ \\<^sub>a* AndL1 (u).(M[x\n>y]) y" using ih by (auto intro: a_star_congs) also have "\ = (AndL1 (u).M v)[x\n>y]" using eq fs by simp finally show "(AndL1 (u).M v){x:=.Ax y a} \\<^sub>a* (AndL1 (u).M v)[x\n>y]" by simp next case False assume neq: "v\x" have "(AndL1 (u).M v){x:=.Ax y a} = AndL1 (u).(M{x:=.Ax y a}) v" using fs neq by simp also have "\ \\<^sub>a* AndL1 (u).(M[x\n>y]) v" using ih by (auto intro: a_star_congs) finally show "(AndL1 (u).M v){x:=.Ax y a} \\<^sub>a* (AndL1 (u).M v)[x\n>y]" using fs neq by simp qed next case (AndL2 u M v x a y) have fs: "u\x" "u\a" "u\y" "u\v" by fact+ have ih: "M{x:=.Ax y a} \\<^sub>a* M[x\n>y]" by fact show "(AndL2 (u).M v){x:=.Ax y a} \\<^sub>a* (AndL2 (u).M v)[x\n>y]" proof(cases "v=x") case True assume eq: "v=x" obtain v'::"name" where new: "v'\(Ax y a,M{x:=.Ax y a},u)" by (rule exists_fresh(1)[OF fs_name1]) have "(AndL2 (u).M v){x:=.Ax y a} = fresh_fun (\v'. Cut .Ax y a (v').AndL2 (u).(M{x:=.Ax y a}) v')" using eq fs by simp also have "\ = Cut .Ax y a (v').AndL2 (u).(M{x:=.Ax y a}) v'" using new by (simp add: fresh_fun_simp_AndL2 fresh_prod) also have "\ \\<^sub>a* (AndL2 (u).(M{x:=.Ax y a}) v')[v'\n>y]" using new apply(rule_tac a_starI) apply(rule a_redu.intros) apply(rule better_LAxL_intro) apply(rule fin.intros) apply(simp add: abs_fresh) done also have "\ = AndL2 (u).(M{x:=.Ax y a}) y" using fs new - by (auto simp add: fresh_prod fresh_atm nrename_fresh) + by (auto simp: fresh_prod fresh_atm nrename_fresh) also have "\ \\<^sub>a* AndL2 (u).(M[x\n>y]) y" using ih by (auto intro: a_star_congs) also have "\ = (AndL2 (u).M v)[x\n>y]" using eq fs by simp finally show "(AndL2 (u).M v){x:=.Ax y a} \\<^sub>a* (AndL2 (u).M v)[x\n>y]" by simp next case False assume neq: "v\x" have "(AndL2 (u).M v){x:=.Ax y a} = AndL2 (u).(M{x:=.Ax y a}) v" using fs neq by simp also have "\ \\<^sub>a* AndL2 (u).(M[x\n>y]) v" using ih by (auto intro: a_star_congs) finally show "(AndL2 (u).M v){x:=.Ax y a} \\<^sub>a* (AndL2 (u).M v)[x\n>y]" using fs neq by simp qed next case (OrR1 c M d x a y) have fs: "c\x" "c\a" "c\y" "c\d" by fact+ have ih: "M{x:=.Ax y a} \\<^sub>a* M[x\n>y]" by fact have "(OrR1 .M d){x:=.Ax y a} = OrR1 .(M{x:=.Ax y a}) d" using fs by (simp add: fresh_atm) also have "\ \\<^sub>a* OrR1 .(M[x\n>y]) d" using ih by (auto intro: a_star_congs) finally show "(OrR1 .M d){x:=.Ax y a} \\<^sub>a* (OrR1 .M d)[x\n>y]" using fs by simp next case (OrR2 c M d x a y) have fs: "c\x" "c\a" "c\y" "c\d" by fact+ have ih: "M{x:=.Ax y a} \\<^sub>a* M[x\n>y]" by fact have "(OrR2 .M d){x:=.Ax y a} = OrR2 .(M{x:=.Ax y a}) d" using fs by (simp add: fresh_atm) also have "\ \\<^sub>a* OrR2 .(M[x\n>y]) d" using ih by (auto intro: a_star_congs) finally show "(OrR2 .M d){x:=.Ax y a} \\<^sub>a* (OrR2 .M d)[x\n>y]" using fs by simp next case (OrL u M v N z x a y) have fs: "u\x" "u\a" "u\y" "v\x" "v\a" "v\y" "v\u" "u\N" "u\z" "v\M" "v\z" by fact+ have ih1: "M{x:=.Ax y a} \\<^sub>a* M[x\n>y]" by fact have ih2: "N{x:=.Ax y a} \\<^sub>a* N[x\n>y]" by fact show "(OrL (u).M (v).N z){x:=.Ax y a} \\<^sub>a* (OrL (u).M (v).N z)[x\n>y]" proof(cases "z=x") case True assume eq: "z=x" obtain z'::"name" where new: "z'\(Ax y a,M{x:=.Ax y a},N{x:=.Ax y a},u,v,y,a)" by (rule exists_fresh(1)[OF fs_name1]) have "(OrL (u).M (v).N z){x:=.Ax y a} = fresh_fun (\z'. Cut .Ax y a (z').OrL (u).(M{x:=.Ax y a}) (v).(N{x:=.Ax y a}) z')" using eq fs by simp also have "\ = Cut .Ax y a (z').OrL (u).(M{x:=.Ax y a}) (v).(N{x:=.Ax y a}) z'" using new by (simp add: fresh_fun_simp_OrL) also have "\ \\<^sub>a* (OrL (u).(M{x:=.Ax y a}) (v).(N{x:=.Ax y a}) z')[z'\n>y]" using new apply(rule_tac a_starI) apply(rule a_redu.intros) apply(rule better_LAxL_intro) apply(rule fin.intros) apply(simp_all add: abs_fresh) done also have "\ = OrL (u).(M{x:=.Ax y a}) (v).(N{x:=.Ax y a}) y" using fs new - by (auto simp add: fresh_prod fresh_atm nrename_fresh subst_fresh) + by (auto simp: fresh_prod fresh_atm nrename_fresh subst_fresh) also have "\ \\<^sub>a* OrL (u).(M[x\n>y]) (v).(N[x\n>y]) y" using ih1 ih2 by (auto intro: a_star_congs) also have "\ = (OrL (u).M (v).N z)[x\n>y]" using eq fs by simp finally show "(OrL (u).M (v).N z){x:=.Ax y a} \\<^sub>a* (OrL (u).M (v).N z)[x\n>y]" by simp next case False assume neq: "z\x" have "(OrL (u).M (v).N z){x:=.Ax y a} = OrL (u).(M{x:=.Ax y a}) (v).(N{x:=.Ax y a}) z" using fs neq by simp also have "\ \\<^sub>a* OrL (u).(M[x\n>y]) (v).(N[x\n>y]) z" using ih1 ih2 by (auto intro: a_star_congs) finally show "(OrL (u).M (v).N z){x:=.Ax y a} \\<^sub>a* (OrL (u).M (v).N z)[x\n>y]" using fs neq by simp qed next case (ImpR z c M d x a y) have fs: "z\x" "z\a" "z\y" "c\x" "c\a" "c\y" "z\d" "c\d" by fact+ have ih: "M{x:=.Ax y a} \\<^sub>a* M[x\n>y]" by fact have "(ImpR (z)..M d){x:=.Ax y a} = ImpR (z)..(M{x:=.Ax y a}) d" using fs by simp also have "\ \\<^sub>a* ImpR (z)..(M[x\n>y]) d" using ih by (auto intro: a_star_congs) finally show "(ImpR (z)..M d){x:=.Ax y a} \\<^sub>a* (ImpR (z)..M d)[x\n>y]" using fs by simp next case (ImpL c M u N v x a y) have fs: "c\x" "c\a" "c\y" "u\x" "u\a" "u\y" "c\N" "c\v" "u\M" "u\v" by fact+ have ih1: "M{x:=.Ax y a} \\<^sub>a* M[x\n>y]" by fact have ih2: "N{x:=.Ax y a} \\<^sub>a* N[x\n>y]" by fact show "(ImpL .M (u).N v){x:=.Ax y a} \\<^sub>a* (ImpL .M (u).N v)[x\n>y]" proof(cases "v=x") case True assume eq: "v=x" obtain v'::"name" where new: "v'\(Ax y a,M{x:=.Ax y a},N{x:=.Ax y a},y,a,u)" by (rule exists_fresh(1)[OF fs_name1]) have "(ImpL .M (u).N v){x:=.Ax y a} = fresh_fun (\v'. Cut .Ax y a (v').ImpL .(M{x:=.Ax y a}) (u).(N{x:=.Ax y a}) v')" using eq fs by simp also have "\ = Cut .Ax y a (v').ImpL .(M{x:=.Ax y a}) (u).(N{x:=.Ax y a}) v'" using new by (simp add: fresh_fun_simp_ImpL) also have "\ \\<^sub>a* (ImpL .(M{x:=.Ax y a}) (u).(N{x:=.Ax y a}) v')[v'\n>y]" using new apply(rule_tac a_starI) apply(rule a_redu.intros) apply(rule better_LAxL_intro) apply(rule fin.intros) apply(simp_all add: abs_fresh) done also have "\ = ImpL .(M{x:=.Ax y a}) (u).(N{x:=.Ax y a}) y" using fs new - by (auto simp add: fresh_prod subst_fresh fresh_atm trm.inject alpha rename_fresh) + by (auto simp: fresh_prod subst_fresh fresh_atm trm.inject alpha rename_fresh) also have "\ \\<^sub>a* ImpL .(M[x\n>y]) (u).(N[x\n>y]) y" using ih1 ih2 by (auto intro: a_star_congs) also have "\ = (ImpL .M (u).N v)[x\n>y]" using eq fs by simp finally show "(ImpL .M (u).N v){x:=.Ax y a} \\<^sub>a* (ImpL .M (u).N v)[x\n>y]" using fs by simp next case False assume neq: "v\x" have "(ImpL .M (u).N v){x:=.Ax y a} = ImpL .(M{x:=.Ax y a}) (u).(N{x:=.Ax y a}) v" using fs neq by simp also have "\ \\<^sub>a* ImpL .(M[x\n>y]) (u).(N[x\n>y]) v" using ih1 ih2 by (auto intro: a_star_congs) finally show "(ImpL .M (u).N v){x:=.Ax y a} \\<^sub>a* (ImpL .M (u).N v)[x\n>y]" using fs neq by simp qed qed lemma subst_with_ax2: shows "M{b:=(x).Ax x a} \\<^sub>a* M[b\c>a]" proof(nominal_induct M avoiding: b a x rule: trm.strong_induct) case (Ax z c b a x) show "(Ax z c){b:=(x).Ax x a} \\<^sub>a* (Ax z c)[b\c>a]" proof (cases "c=b") case True assume eq: "c=b" have "(Ax z c){b:=(x).Ax x a} = Cut .Ax z c (x).Ax x a" using eq by simp also have "\ \\<^sub>a* (Ax z c)[b\c>a]" using eq by blast finally show "(Ax z c){b:=(x).Ax x a} \\<^sub>a* (Ax z c)[b\c>a]" by simp next case False assume neq: "c\b" then show "(Ax z c){b:=(x).Ax x a} \\<^sub>a* (Ax z c)[b\c>a]" by simp qed next case (Cut c M z N b a x) have fs: "c\b" "c\a" "c\x" "c\N" "z\b" "z\a" "z\x" "z\M" by fact+ have ih1: "M{b:=(x).Ax x a} \\<^sub>a* M[b\c>a]" by fact have ih2: "N{b:=(x).Ax x a} \\<^sub>a* N[b\c>a]" by fact show "(Cut .M (z).N){b:=(x).Ax x a} \\<^sub>a* (Cut .M (z).N)[b\c>a]" proof (cases "N = Ax z b") case True assume eq: "N = Ax z b" have "(Cut .M (z).N){b:=(x).Ax x a} = Cut .(M{b:=(x).Ax x a}) (x).Ax x a" using eq fs by simp also have "\ \\<^sub>a* Cut .(M[b\c>a]) (x).Ax x a" using ih1 a_star_congs by blast also have "\ = Cut .(M[b\c>a]) (z).(N[b\c>a])" using eq fs by (simp add: trm.inject alpha calc_atm fresh_atm) finally show "(Cut .M (z).N){b:=(x).Ax x a} \\<^sub>a* (Cut .M (z).N)[b\c>a]" using fs by simp next case False assume neq: "N \ Ax z b" have "(Cut .M (z).N){b:=(x).Ax x a} = Cut .(M{b:=(x).Ax x a}) (z).(N{b:=(x).Ax x a})" using fs neq by simp also have "\ \\<^sub>a* Cut .(M[b\c>a]) (z).(N[b\c>a])" using ih1 ih2 a_star_congs by blast finally show "(Cut .M (z).N){b:=(x).Ax x a} \\<^sub>a* (Cut .M (z).N)[b\c>a]" using fs by simp qed next case (NotR z M c b a x) have fs: "z\b" "z\a" "z\x" "z\c" by fact+ have ih: "M{b:=(x).Ax x a} \\<^sub>a* M[b\c>a]" by fact show "(NotR (z).M c){b:=(x).Ax x a} \\<^sub>a* (NotR (z).M c)[b\c>a]" proof (cases "c=b") case True assume eq: "c=b" obtain a'::"coname" where new: "a'\(Ax x a,M{b:=(x).Ax x a})" by (rule exists_fresh(2)[OF fs_coname1]) have "(NotR (z).M c){b:=(x).Ax x a} = fresh_fun (\a'. Cut .NotR (z).M{b:=(x).Ax x a} a' (x).Ax x a)" using eq fs by simp also have "\ = Cut .NotR (z).M{b:=(x).Ax x a} a' (x).Ax x a" using new by (simp add: fresh_fun_simp_NotR fresh_prod) also have "\ \\<^sub>a* (NotR (z).(M{b:=(x).Ax x a}) a')[a'\c>a]" using new apply(rule_tac a_starI) apply(rule a_redu.intros) apply(rule better_LAxR_intro) apply(rule fic.intros) apply(simp) done also have "\ = NotR (z).(M{b:=(x).Ax x a}) a" using new by (simp add: crename_fresh) also have "\ \\<^sub>a* NotR (z).(M[b\c>a]) a" using ih by (auto intro: a_star_congs) also have "\ = (NotR (z).M c)[b\c>a]" using eq by simp finally show "(NotR (z).M c){b:=(x).Ax x a} \\<^sub>a* (NotR (z).M c)[b\c>a]" by simp next case False assume neq: "c\b" have "(NotR (z).M c){b:=(x).Ax x a} = NotR (z).(M{b:=(x).Ax x a}) c" using fs neq by simp also have "\ \\<^sub>a* NotR (z).(M[b\c>a]) c" using ih by (auto intro: a_star_congs) finally show "(NotR (z).M c){b:=(x).Ax x a} \\<^sub>a* (NotR (z).M c)[b\c>a]" using neq by simp qed next case (NotL c M z b a x) have fs: "c\b" "c\a" "c\x" "c\z" by fact+ have ih: "M{b:=(x).Ax x a} \\<^sub>a* M[b\c>a]" by fact have "(NotL .M z){b:=(x).Ax x a} = NotL .(M{b:=(x).Ax x a}) z" using fs by simp also have "\ \\<^sub>a* NotL .(M[b\c>a]) z" using ih by (auto intro: a_star_congs) finally show "(NotL .M z){b:=(x).Ax x a} \\<^sub>a* (NotL .M z)[b\c>a]" using fs by simp next case (AndR c M d N e b a x) have fs: "c\b" "c\a" "c\x" "d\b" "d\a" "d\x" "d\c" "c\N" "c\e" "d\M" "d\e" by fact+ have ih1: "M{b:=(x).Ax x a} \\<^sub>a* M[b\c>a]" by fact have ih2: "N{b:=(x).Ax x a} \\<^sub>a* N[b\c>a]" by fact show "(AndR .M .N e){b:=(x).Ax x a} \\<^sub>a* (AndR .M .N e)[b\c>a]" proof(cases "e=b") case True assume eq: "e=b" obtain e'::"coname" where new: "e'\(Ax x a,M{b:=(x).Ax x a},N{b:=(x).Ax x a},c,d)" by (rule exists_fresh(2)[OF fs_coname1]) have "(AndR .M .N e){b:=(x).Ax x a} = fresh_fun (\e'. Cut .AndR .(M{b:=(x).Ax x a}) .(N{b:=(x).Ax x a}) e' (x).Ax x a)" using eq fs by simp also have "\ = Cut .AndR .(M{b:=(x).Ax x a}) .(N{b:=(x).Ax x a}) e' (x).Ax x a" using new by (simp add: fresh_fun_simp_AndR fresh_prod) also have "\ \\<^sub>a* (AndR .(M{b:=(x).Ax x a}) .(N{b:=(x).Ax x a}) e')[e'\c>a]" using new apply(rule_tac a_starI) apply(rule a_redu.intros) apply(rule better_LAxR_intro) apply(rule fic.intros) apply(simp_all add: abs_fresh) done also have "\ = AndR .(M{b:=(x).Ax x a}) .(N{b:=(x).Ax x a}) a" using fs new - by (auto simp add: fresh_prod fresh_atm subst_fresh crename_fresh) + by (auto simp: fresh_prod fresh_atm subst_fresh crename_fresh) also have "\ \\<^sub>a* AndR .(M[b\c>a]) .(N[b\c>a]) a" using ih1 ih2 by (auto intro: a_star_congs) also have "\ = (AndR .M .N e)[b\c>a]" using eq fs by simp finally show "(AndR .M .N e){b:=(x).Ax x a} \\<^sub>a* (AndR .M .N e)[b\c>a]" by simp next case False assume neq: "e\b" have "(AndR .M .N e){b:=(x).Ax x a} = AndR .(M{b:=(x).Ax x a}) .(N{b:=(x).Ax x a}) e" using fs neq by simp also have "\ \\<^sub>a* AndR .(M[b\c>a]) .(N[b\c>a]) e" using ih1 ih2 by (auto intro: a_star_congs) finally show "(AndR .M .N e){b:=(x).Ax x a} \\<^sub>a* (AndR .M .N e)[b\c>a]" using fs neq by simp qed next case (AndL1 u M v b a x) have fs: "u\b" "u\a" "u\x" "u\v" by fact+ have ih: "M{b:=(x).Ax x a} \\<^sub>a* M[b\c>a]" by fact have "(AndL1 (u).M v){b:=(x).Ax x a} = AndL1 (u).(M{b:=(x).Ax x a}) v" using fs by simp also have "\ \\<^sub>a* AndL1 (u).(M[b\c>a]) v" using ih by (auto intro: a_star_congs) finally show "(AndL1 (u).M v){b:=(x).Ax x a} \\<^sub>a* (AndL1 (u).M v)[b\c>a]" using fs by simp next case (AndL2 u M v b a x) have fs: "u\b" "u\a" "u\x" "u\v" by fact+ have ih: "M{b:=(x).Ax x a} \\<^sub>a* M[b\c>a]" by fact have "(AndL2 (u).M v){b:=(x).Ax x a} = AndL2 (u).(M{b:=(x).Ax x a}) v" using fs by simp also have "\ \\<^sub>a* AndL2 (u).(M[b\c>a]) v" using ih by (auto intro: a_star_congs) finally show "(AndL2 (u).M v){b:=(x).Ax x a} \\<^sub>a* (AndL2 (u).M v)[b\c>a]" using fs by simp next case (OrR1 c M d b a x) have fs: "c\b" "c\a" "c\x" "c\d" by fact+ have ih: "M{b:=(x).Ax x a} \\<^sub>a* M[b\c>a]" by fact show "(OrR1 .M d){b:=(x).Ax x a} \\<^sub>a* (OrR1 .M d)[b\c>a]" proof(cases "d=b") case True assume eq: "d=b" obtain a'::"coname" where new: "a'\(Ax x a,M{b:=(x).Ax x a},c,x,a)" by (rule exists_fresh(2)[OF fs_coname1]) have "(OrR1 .M d){b:=(x).Ax x a} = fresh_fun (\a'. Cut .OrR1 .M{b:=(x).Ax x a} a' (x).Ax x a)" using fs eq by (simp) also have "\ = Cut .OrR1 .M{b:=(x).Ax x a} a' (x).Ax x a" using new by (simp add: fresh_fun_simp_OrR1) also have "\ \\<^sub>a* (OrR1 .M{b:=(x).Ax x a} a')[a'\c>a]" using new apply(rule_tac a_starI) apply(rule a_redu.intros) apply(rule better_LAxR_intro) apply(rule fic.intros) apply(simp_all add: abs_fresh) done also have "\ = OrR1 .M{b:=(x).Ax x a} a" using fs new - by (auto simp add: fresh_prod fresh_atm crename_fresh subst_fresh) + by (auto simp: fresh_prod fresh_atm crename_fresh subst_fresh) also have "\ \\<^sub>a* OrR1 .(M[b\c>a]) a" using ih by (auto intro: a_star_congs) also have "\ = (OrR1 .M d)[b\c>a]" using eq fs by simp finally show "(OrR1 .M d){b:=(x).Ax x a} \\<^sub>a* (OrR1 .M d)[b\c>a]" by simp next case False assume neq: "d\b" have "(OrR1 .M d){b:=(x).Ax x a} = OrR1 .(M{b:=(x).Ax x a}) d" using fs neq by (simp) also have "\ \\<^sub>a* OrR1 .(M[b\c>a]) d" using ih by (auto intro: a_star_congs) finally show "(OrR1 .M d){b:=(x).Ax x a} \\<^sub>a* (OrR1 .M d)[b\c>a]" using fs neq by simp qed next case (OrR2 c M d b a x) have fs: "c\b" "c\a" "c\x" "c\d" by fact+ have ih: "M{b:=(x).Ax x a} \\<^sub>a* M[b\c>a]" by fact show "(OrR2 .M d){b:=(x).Ax x a} \\<^sub>a* (OrR2 .M d)[b\c>a]" proof(cases "d=b") case True assume eq: "d=b" obtain a'::"coname" where new: "a'\(Ax x a,M{b:=(x).Ax x a},c,x,a)" by (rule exists_fresh(2)[OF fs_coname1]) have "(OrR2 .M d){b:=(x).Ax x a} = fresh_fun (\a'. Cut .OrR2 .M{b:=(x).Ax x a} a' (x).Ax x a)" using fs eq by (simp) also have "\ = Cut .OrR2 .M{b:=(x).Ax x a} a' (x).Ax x a" using new by (simp add: fresh_fun_simp_OrR2) also have "\ \\<^sub>a* (OrR2 .M{b:=(x).Ax x a} a')[a'\c>a]" using new apply(rule_tac a_starI) apply(rule a_redu.intros) apply(rule better_LAxR_intro) apply(rule fic.intros) apply(simp_all add: abs_fresh) done also have "\ = OrR2 .M{b:=(x).Ax x a} a" using fs new - by (auto simp add: fresh_prod fresh_atm crename_fresh subst_fresh) + by (auto simp: fresh_prod fresh_atm crename_fresh subst_fresh) also have "\ \\<^sub>a* OrR2 .(M[b\c>a]) a" using ih by (auto intro: a_star_congs) also have "\ = (OrR2 .M d)[b\c>a]" using eq fs by simp finally show "(OrR2 .M d){b:=(x).Ax x a} \\<^sub>a* (OrR2 .M d)[b\c>a]" by simp next case False assume neq: "d\b" have "(OrR2 .M d){b:=(x).Ax x a} = OrR2 .(M{b:=(x).Ax x a}) d" using fs neq by (simp) also have "\ \\<^sub>a* OrR2 .(M[b\c>a]) d" using ih by (auto intro: a_star_congs) finally show "(OrR2 .M d){b:=(x).Ax x a} \\<^sub>a* (OrR2 .M d)[b\c>a]" using fs neq by simp qed next case (OrL u M v N z b a x) have fs: "u\b" "u\a" "u\x" "v\b" "v\a" "v\x" "v\u" "u\N" "u\z" "v\M" "v\z" by fact+ have ih1: "M{b:=(x).Ax x a} \\<^sub>a* M[b\c>a]" by fact have ih2: "N{b:=(x).Ax x a} \\<^sub>a* N[b\c>a]" by fact have "(OrL (u).M (v).N z){b:=(x).Ax x a} = OrL (u).(M{b:=(x).Ax x a}) (v).(N{b:=(x).Ax x a}) z" using fs by simp also have "\ \\<^sub>a* OrL (u).(M[b\c>a]) (v).(N[b\c>a]) z" using ih1 ih2 by (auto intro: a_star_congs) finally show "(OrL (u).M (v).N z){b:=(x).Ax x a} \\<^sub>a* (OrL (u).M (v).N z)[b\c>a]" using fs by simp next case (ImpR z c M d b a x) have fs: "z\b" "z\a" "z\x" "c\b" "c\a" "c\x" "z\d" "c\d" by fact+ have ih: "M{b:=(x).Ax x a} \\<^sub>a* M[b\c>a]" by fact show "(ImpR (z)..M d){b:=(x).Ax x a} \\<^sub>a* (ImpR (z)..M d)[b\c>a]" proof(cases "b=d") case True assume eq: "b=d" obtain a'::"coname" where new: "a'\(Ax x a,M{b:=(x).Ax x a},x,a,c)" by (rule exists_fresh(2)[OF fs_coname1]) have "(ImpR (z)..M d){b:=(x).Ax x a} = fresh_fun (\a'. Cut .ImpR z..M{b:=(x).Ax x a} a' (x).Ax x a)" using fs eq by simp also have "\ = Cut .ImpR z..M{b:=(x).Ax x a} a' (x).Ax x a" using new by (simp add: fresh_fun_simp_ImpR) also have "\ \\<^sub>a* (ImpR z..M{b:=(x).Ax x a} a')[a'\c>a]" using new apply(rule_tac a_starI) apply(rule a_redu.intros) apply(rule better_LAxR_intro) apply(rule fic.intros) apply(simp_all add: abs_fresh) done also have "\ = ImpR z..M{b:=(x).Ax x a} a" using fs new - by (auto simp add: fresh_prod crename_fresh subst_fresh fresh_atm) + by (auto simp: fresh_prod crename_fresh subst_fresh fresh_atm) also have "\ \\<^sub>a* ImpR z..(M[b\c>a]) a" using ih by (auto intro: a_star_congs) also have "\ = (ImpR z..M b)[b\c>a]" using eq fs by simp finally show "(ImpR (z)..M d){b:=(x).Ax x a} \\<^sub>a* (ImpR (z)..M d)[b\c>a]" using eq by simp next case False assume neq: "b\d" have "(ImpR (z)..M d){b:=(x).Ax x a} = ImpR (z)..(M{b:=(x).Ax x a}) d" using fs neq by simp also have "\ \\<^sub>a* ImpR (z)..(M[b\c>a]) d" using ih by (auto intro: a_star_congs) finally show "(ImpR (z)..M d){b:=(x).Ax x a} \\<^sub>a* (ImpR (z)..M d)[b\c>a]" using neq fs by simp qed next case (ImpL c M u N v b a x) have fs: "c\b" "c\a" "c\x" "u\b" "u\a" "u\x" "c\N" "c\v" "u\M" "u\v" by fact+ have ih1: "M{b:=(x).Ax x a} \\<^sub>a* M[b\c>a]" by fact have ih2: "N{b:=(x).Ax x a} \\<^sub>a* N[b\c>a]" by fact have "(ImpL .M (u).N v){b:=(x).Ax x a} = ImpL .(M{b:=(x).Ax x a}) (u).(N{b:=(x).Ax x a}) v" using fs by simp also have "\ \\<^sub>a* ImpL .(M[b\c>a]) (u).(N[b\c>a]) v" using ih1 ih2 by (auto intro: a_star_congs) finally show "(ImpL .M (u).N v){b:=(x).Ax x a} \\<^sub>a* (ImpL .M (u).N v)[b\c>a]" using fs by simp qed text \substitution lemmas\ lemma not_Ax1: shows "\(b\M) \ M{b:=(y).Q} \ Ax x a" apply(nominal_induct M avoiding: b y Q x a rule: trm.strong_induct) -apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp) +apply(auto simp: fresh_atm abs_fresh abs_supp fin_supp) apply(subgoal_tac "\x'::coname. x'\(trm{coname:=(y).Q},Q)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname:=(y).Q},Q)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm1{coname3:=(y).Q},Q,trm2{coname3:=(y).Q},coname1,coname2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm1{coname3:=(y).Q},Q,trm2{coname3:=(y).Q},coname1,coname2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm1{coname3:=(y).Q},Q,trm2{coname3:=(y).Q},coname1,coname2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(y).Q},Q,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1 abs_fresh fresh_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(y).Q},Q,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1 abs_fresh fresh_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(y).Q},Q,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2 abs_fresh fresh_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(y).Q},Q,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2 abs_fresh fresh_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(y).Q},Q,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR abs_fresh abs_supp fin_supp fresh_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\x'::coname. x'\(trm{coname2:=(y).Q},Q,coname1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR abs_fresh abs_supp fin_supp fresh_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) done lemma not_Ax2: shows "\(x\M) \ M{x:=.Q} \ Ax y a" apply(nominal_induct M avoiding: b y Q x a rule: trm.strong_induct) -apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp) +apply(auto simp: fresh_atm abs_fresh abs_supp fin_supp) apply(subgoal_tac "\x'::name. x'\(trm{x:=.Q},Q)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{x:=.Q},Q)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{x:=.Q},Q,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1 abs_fresh fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{x:=.Q},Q,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1 abs_fresh fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{x:=.Q},Q,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2 abs_fresh fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm{x:=.Q},Q,name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2 abs_fresh fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{x:=.Q},Q,trm2{x:=.Q},name1,name2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{x:=.Q},Q,trm2{x:=.Q},name1,name2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{x:=.Q},Q,trm2{x:=.Q},name1,name2)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.Q},Q,trm2{name2:=.Q},name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.Q},Q,trm2{name2:=.Q},name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.Q},Q,trm2{name2:=.Q},name1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done lemma interesting_subst1: assumes a: "x\y" "x\P" "y\P" shows "N{y:=.P}{x:=.P} = N{x:=.Ax y c}{y:=.P}" using a proof(nominal_induct N avoiding: x y c P rule: trm.strong_induct) case Ax then show ?case - by (auto simp add: abs_fresh fresh_atm forget trm.inject) + by (auto simp: abs_fresh fresh_atm forget trm.inject) next case (Cut d M u M' x' y' c P) with assms show ?case apply(simp) apply(auto) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) apply(auto) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) apply(auto) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) apply(rule impI) apply(simp add: trm.inject alpha forget) apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) apply(auto) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) apply(auto) apply(case_tac "y'\M") apply(simp add: forget) apply(simp add: not_Ax2) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) apply(auto) apply(case_tac "x'\M") apply(simp add: forget) apply(simp add: not_Ax2) done next case NotR then show ?case - by (auto simp add: abs_fresh fresh_atm forget) + by (auto simp: abs_fresh fresh_atm forget) next case (NotL d M u) then show ?case - apply (auto simp add: abs_fresh fresh_atm forget) + apply (auto simp: abs_fresh fresh_atm forget) apply(subgoal_tac "\x'::name. x'\(P,M{y:=.P},M{x:=.Ax y c}{y:=.P},y,x)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) - apply(auto simp add: fresh_atm) + apply(auto simp: fresh_atm) apply(simp add: trm.inject alpha forget) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(P,M{x:=.Ax y c},M{x:=.Ax y c}{y:=.P},Ax y c,y,x)") apply(erule exE, simp only: fresh_prod) apply(erule conjE)+ apply(simp only: fresh_fun_simp_NotL) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) apply(simp add: trm.inject alpha forget subst_fresh) apply(rule trans) apply(rule substn.simps) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(simp add: fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done next case (AndR d1 M d2 M' d3) then show ?case - by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) + by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) next case (AndL1 u M d) then show ?case - apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) + apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) apply(subgoal_tac "\x'::name. x'\(P,M{y:=.P},M{x:=.Ax y c}{y:=.P},u,y,x)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) - apply(auto simp add: fresh_atm) + apply(auto simp: fresh_atm) apply(simp add: trm.inject alpha forget) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(P,Ax y c,M{x:=.Ax y c},M{x:=.Ax y c}{y:=.P},u,y,x)") apply(erule exE, simp only: fresh_prod) apply(erule conjE)+ apply(simp only: fresh_fun_simp_AndL1) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) - apply(auto simp add: fresh_atm) + apply(auto simp: fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done next case (AndL2 u M d) then show ?case - apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) + apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) apply(subgoal_tac "\x'::name. x'\(P,M{y:=.P},M{x:=.Ax y c}{y:=.P},u,y,x)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) - apply(auto simp add: fresh_atm) + apply(auto simp: fresh_atm) apply(simp add: trm.inject alpha forget) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(P,Ax y c,M{x:=.Ax y c},M{x:=.Ax y c}{y:=.P},u,y,x)") apply(erule exE, simp only: fresh_prod) apply(erule conjE)+ apply(simp only: fresh_fun_simp_AndL2) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) - apply(auto simp add: fresh_atm) + apply(auto simp: fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done next case OrR1 then show ?case - by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) + by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) next case OrR2 then show ?case - by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) + by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) next case (OrL x1 M x2 M' x3) then show ?case - apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) + apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) apply(subgoal_tac "\x'::name. x'\(P,M{y:=.P},M{x:=.Ax y c}{y:=.P}, M'{y:=.P},M'{x:=.Ax y c}{y:=.P},x1,x2,x3,y,x)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) - apply(auto simp add: fresh_atm) + apply(auto simp: fresh_atm) apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule substn.simps) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(force) apply(simp) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(P,Ax y c,M{x:=.Ax y c},M{x:=.Ax y c}{y:=.P}, M'{x:=.Ax y c},M'{x:=.Ax y c}{y:=.P},x1,x2,x3,y,x)") apply(erule exE, simp only: fresh_prod) apply(erule conjE)+ apply(simp only: fresh_fun_simp_OrL) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) apply(simp add: trm.inject alpha) apply(rule trans) apply(rule substn.simps) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(force) apply(simp) - apply(auto simp add: fresh_atm) + apply(auto simp: fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done next case ImpR then show ?case - by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) + by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) next case (ImpL a M x1 M' x2) then show ?case - apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) + apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) apply(subgoal_tac "\x'::name. x'\(P,M{x2:=.P},M{x:=.Ax x2 c}{x2:=.P}, M'{x2:=.P},M'{x:=.Ax x2 c}{x2:=.P},x1,y,x)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) - apply(auto simp add: fresh_atm) + apply(auto simp: fresh_atm) apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule substn.simps) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(force) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(P,Ax y c,M{x2:=.Ax y c},M{x2:=.Ax y c}{y:=.P}, M'{x2:=.Ax y c},M'{x2:=.Ax y c}{y:=.P},x1,x2,y,x)") apply(erule exE, simp only: fresh_prod) apply(erule conjE)+ apply(simp only: fresh_fun_simp_ImpL) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) apply(simp add: trm.inject alpha) apply(rule trans) apply(rule substn.simps) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp) - apply(auto simp add: fresh_atm) + apply(auto simp: fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done qed lemma interesting_subst1': assumes a: "x\y" "x\P" "y\P" shows "N{y:=.P}{x:=.P} = N{x:=.Ax y a}{y:=.P}" proof - show ?thesis proof (cases "c=a") case True then show ?thesis using a by (simp add: interesting_subst1) next case False then show ?thesis using a apply - apply(subgoal_tac "N{x:=.Ax y a} = N{x:=.([(c,a)]\Ax y a)}") apply(simp add: interesting_subst1 calc_atm) apply(rule subst_rename) apply(simp add: fresh_prod fresh_atm) done qed qed lemma interesting_subst2: assumes a: "a\b" "a\P" "b\P" shows "N{a:=(y).P}{b:=(y).P} = N{b:=(y).Ax y a}{a:=(y).P}" using a proof(nominal_induct N avoiding: a b y P rule: trm.strong_induct) case Ax then show ?case - by (auto simp add: abs_fresh fresh_atm forget trm.inject) + by (auto simp: abs_fresh fresh_atm forget trm.inject) next case (Cut d M u M' x' y' c P) with assms show ?case apply(simp) - apply(auto simp add: trm.inject) + apply(auto simp: trm.inject) apply(rule trans) apply(rule better_Cut_substc) apply(simp) apply(simp add: abs_fresh) apply(simp add: forget) apply(auto) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(simp) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(auto)[1] apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(simp) apply(rule impI) apply(simp add: fresh_atm trm.inject alpha forget) apply(case_tac "x'\M'") apply(simp add: forget) apply(simp add: not_Ax1) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(auto) apply(case_tac "y'\M'") apply(simp add: forget) apply(simp add: not_Ax1) done next case NotL then show ?case - by (auto simp add: abs_fresh fresh_atm forget) + by (auto simp: abs_fresh fresh_atm forget) next case (NotR u M d) then show ?case - apply (auto simp add: abs_fresh fresh_atm forget) + apply (auto simp: abs_fresh fresh_atm forget) apply(subgoal_tac "\a'::coname. a'\(b,P,M{d:=(y).P},M{b:=(y).Ax y d}{d:=(y).P},u,y)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(simp) - apply(auto simp add: fresh_atm) + apply(auto simp: fresh_atm) apply(simp add: trm.inject alpha forget) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\a'::coname. a'\(P,M{d:=(y).Ax y a},M{d:=(y).Ax y a}{a:=(y).P},Ax y a,y,d)") apply(erule exE, simp only: fresh_prod) apply(erule conjE)+ apply(simp only: fresh_fun_simp_NotR) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(simp) apply(simp add: trm.inject alpha forget subst_fresh) apply(rule trans) apply(rule substc.simps) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(simp add: fresh_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (AndR d1 M d2 M' d3) then show ?case - apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) + apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) apply(subgoal_tac "\a'::coname. a'\(P,M{d3:=(y).P},M{b:=(y).Ax y d3}{d3:=(y).P}, M'{d3:=(y).P},M'{b:=(y).Ax y d3}{d3:=(y).P},d1,d2,d3,b,y)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh fresh_atm) apply(simp add: abs_fresh fresh_atm) apply(simp) - apply(auto simp add: fresh_atm) + apply(auto simp: fresh_atm) apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule substc.simps) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(force) apply(simp) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\a'::coname. a'\(P,Ax y a,M{d3:=(y).Ax y a},M{d3:=(y).Ax y a}{a:=(y).P}, M'{d3:=(y).Ax y a},M'{d3:=(y).Ax y a}{a:=(y).P},d1,d2,d3,y,b)") apply(erule exE, simp only: fresh_prod) apply(erule conjE)+ apply(simp only: fresh_fun_simp_AndR) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(simp) apply(simp add: trm.inject alpha) apply(rule trans) apply(rule substc.simps) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(force) apply(simp) - apply(auto simp add: fresh_atm) + apply(auto simp: fresh_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (AndL1 u M d) then show ?case - by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) + by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) next case (AndL2 u M d) then show ?case - by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) + by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) next case (OrR1 d M e) then show ?case - apply (auto simp add: abs_fresh fresh_atm forget) + apply (auto simp: abs_fresh fresh_atm forget) apply(subgoal_tac "\a'::coname. a'\(b,P,M{e:=(y).P},M{b:=(y).Ax y e}{e:=(y).P},d,e)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(simp) - apply(auto simp add: fresh_atm) + apply(auto simp: fresh_atm) apply(simp add: trm.inject alpha forget) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\a'::coname. a'\(b,P,Ax y a,M{e:=(y).Ax y a},M{e:=(y).Ax y a}{a:=(y).P},d,e)") apply(erule exE, simp only: fresh_prod) apply(erule conjE)+ apply(simp only: fresh_fun_simp_OrR1) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(simp) apply(simp add: trm.inject alpha forget subst_fresh) apply(rule trans) apply(rule substc.simps) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(simp add: fresh_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (OrR2 d M e) then show ?case - apply (auto simp add: abs_fresh fresh_atm forget) + apply (auto simp: abs_fresh fresh_atm forget) apply(subgoal_tac "\a'::coname. a'\(b,P,M{e:=(y).P},M{b:=(y).Ax y e}{e:=(y).P},d,e)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(simp) - apply(auto simp add: fresh_atm) + apply(auto simp: fresh_atm) apply(simp add: trm.inject alpha forget) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\a'::coname. a'\(b,P,Ax y a,M{e:=(y).Ax y a},M{e:=(y).Ax y a}{a:=(y).P},d,e)") apply(erule exE, simp only: fresh_prod) apply(erule conjE)+ apply(simp only: fresh_fun_simp_OrR2) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(simp) apply(simp add: trm.inject alpha forget subst_fresh) apply(rule trans) apply(rule substc.simps) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(simp add: fresh_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (OrL x1 M x2 M' x3) then show ?case - by(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) + by(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) next case ImpL then show ?case - by (auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) + by (auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) next case (ImpR u e M d) then show ?case - apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) + apply(auto simp: abs_fresh fresh_atm forget trm.inject subst_fresh) apply(subgoal_tac "\a'::coname. a'\(b,e,d,P,M{d:=(y).P},M{b:=(y).Ax y d}{d:=(y).P})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(simp) - apply(auto simp add: fresh_atm) + apply(auto simp: fresh_atm) apply(simp add: trm.inject alpha forget) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "\a'::coname. a'\(e,d,P,Ax y a,M{d:=(y).Ax y a},M{d:=(y).Ax y a}{a:=(y).P})") apply(erule exE, simp only: fresh_prod) apply(erule conjE)+ apply(simp only: fresh_fun_simp_ImpR) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(simp) apply(simp add: trm.inject alpha) apply(rule trans) apply(rule substc.simps) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp) - apply(auto simp add: fresh_atm) + apply(auto simp: fresh_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) done qed lemma interesting_subst2': assumes a: "a\b" "a\P" "b\P" shows "N{a:=(y).P}{b:=(y).P} = N{b:=(z).Ax z a}{a:=(y).P}" proof - show ?thesis proof (cases "z=y") case True then show ?thesis using a by (simp add: interesting_subst2) next case False then show ?thesis using a apply - apply(subgoal_tac "N{b:=(z).Ax z a} = N{b:=(y).([(y,z)]\Ax z a)}") apply(simp add: interesting_subst2 calc_atm) apply(rule subst_rename) apply(simp add: fresh_prod fresh_atm) done qed qed lemma subst_subst1: assumes a: "a\(Q,b)" "x\(y,P,Q)" "b\Q" "y\P" shows "M{x:=.P}{b:=(y).Q} = M{b:=(y).Q}{x:=.(P{b:=(y).Q})}" using a proof(nominal_induct M avoiding: x a P b y Q rule: trm.strong_induct) case (Ax z c) have fs: "a\(Q,b)" "x\(y,P,Q)" "b\Q" "y\P" by fact+ { assume asm: "z=x \ c=b" have "(Ax x b){x:=.P}{b:=(y).Q} = (Cut .P (x).Ax x b){b:=(y).Q}" using fs by simp also have "\ = Cut .(P{b:=(y).Q}) (y).Q" using fs by (simp_all add: fresh_prod fresh_atm) also have "\ = Cut .(P{b:=(y).Q}) (y).(Q{x:=.(P{b:=(y).Q})})" using fs by (simp add: forget) also have "\ = (Cut .Ax x b (y).Q){x:=.(P{b:=(y).Q})}" - using fs asm by (auto simp add: fresh_prod fresh_atm subst_fresh) + using fs asm by (auto simp: fresh_prod fresh_atm subst_fresh) also have "\ = (Ax x b){b:=(y).Q}{x:=.(P{b:=(y).Q})}" using fs by simp finally have "(Ax z c){x:=.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=.(P{b:=(y).Q})}" using asm by simp } moreover { assume asm: "z\x \ c=b" have "(Ax z c){x:=.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}" using asm by simp also have "\ = Cut .Ax z c (y).Q" using fs asm by simp also have "\ = Cut .(Ax z c{x:=.(P{b:=(y).Q})}) (y).(Q{x:=.(P{b:=(y).Q})})" using fs asm by (simp add: forget) also have "\ = (Cut .Ax z c (y).Q){x:=.(P{b:=(y).Q})}" using asm fs - by (auto simp add: trm.inject subst_fresh fresh_prod fresh_atm abs_fresh) + by (auto simp: trm.inject subst_fresh fresh_prod fresh_atm abs_fresh) also have "\ = (Ax z c){b:=(y).Q}{x:=.(P{b:=(y).Q})}" using asm fs by simp finally have "(Ax z c){x:=.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=.(P{b:=(y).Q})}" by simp } moreover { assume asm: "z=x \ c\b" have "(Ax z c){x:=.P}{b:=(y).Q} = (Cut .P (x).Ax z c){b:=(y).Q}" using fs asm by simp - also have "\ = Cut .(P{b:=(y).Q}) (x).Ax z c" using fs asm by (auto simp add: trm.inject abs_fresh) + also have "\ = Cut .(P{b:=(y).Q}) (x).Ax z c" using fs asm by (auto simp: trm.inject abs_fresh) also have "\ = (Ax z c){x:=.(P{b:=(y).Q})}" using fs asm by simp also have "\ = (Ax z c){b:=(y).Q}{x:=.(P{b:=(y).Q})}" using asm by auto finally have "(Ax z c){x:=.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=.(P{b:=(y).Q})}" by simp } moreover { assume asm: "z\x \ c\b" have "(Ax z c){x:=.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=.(P{b:=(y).Q})}" using asm by auto } ultimately show ?case by blast next case (Cut c M z N) { assume asm: "M = Ax x c \ N = Ax z b" have "(Cut .M (z).N){x:=.P}{b:=(y).Q} = (Cut .P (z).(N{x:=.P})){b:=(y).Q}" using Cut asm by simp also have "\ = (Cut .P (z).N){b:=(y).Q}" using Cut asm by (simp add: fresh_atm) - also have "\ = (Cut .(P{b:=(y).Q}) (y).Q)" using Cut asm by (auto simp add: fresh_prod fresh_atm) + also have "\ = (Cut .(P{b:=(y).Q}) (y).Q)" using Cut asm by (auto simp: fresh_prod fresh_atm) finally have eq1: "(Cut .M (z).N){x:=.P}{b:=(y).Q} = (Cut .(P{b:=(y).Q}) (y).Q)" by simp have "(Cut .M (z).N){b:=(y).Q}{x:=.(P{b:=(y).Q})} = (Cut .M (y).Q){x:=.(P{b:=(y).Q})}" using Cut asm by (simp add: fresh_atm) also have "\ = Cut .(P{b:=(y).Q}) (y).(Q{x:=.(P{b:=(y).Q})})" using Cut asm - by (auto simp add: fresh_prod fresh_atm subst_fresh) + by (auto simp: fresh_prod fresh_atm subst_fresh) also have "\ = Cut .(P{b:=(y).Q}) (y).Q" using Cut asm by (simp add: forget) finally have eq2: "(Cut .M (z).N){b:=(y).Q}{x:=.(P{b:=(y).Q})} = Cut .(P{b:=(y).Q}) (y).Q" by simp have "(Cut .M (z).N){x:=.P}{b:=(y).Q} = (Cut .M (z).N){b:=(y).Q}{x:=.(P{b:=(y).Q})}" using eq1 eq2 by simp } moreover { assume asm: "M \ Ax x c \ N = Ax z b" have neq: "M{b:=(y).Q} \ Ax x c" proof (cases "b\M") case True then show ?thesis using asm by (simp add: forget) next case False then show ?thesis by (simp add: not_Ax1) qed have "(Cut .M (z).N){x:=.P}{b:=(y).Q} = (Cut .(M{x:=.P}) (z).(N{x:=.P})){b:=(y).Q}" using Cut asm by simp also have "\ = (Cut .(M{x:=.P}) (z).N){b:=(y).Q}" using Cut asm by (simp add: fresh_atm) also have "\ = Cut .(M{x:=.P}{b:=(y).Q}) (y).Q" using Cut asm by (simp add: abs_fresh) also have "\ = Cut .(M{b:=(y).Q}{x:=.P{b:=(y).Q}}) (y).Q" using Cut asm by simp finally have eq1: "(Cut .M (z).N){x:=.P}{b:=(y).Q} = Cut .(M{b:=(y).Q}{x:=.P{b:=(y).Q}}) (y).Q" by simp have "(Cut .M (z).N){b:=(y).Q}{x:=.(P{b:=(y).Q})} = (Cut .(M{b:=(y).Q}) (y).Q){x:=.(P{b:=(y).Q})}" using Cut asm by simp also have "\ = Cut .(M{b:=(y).Q}{x:=.(P{b:=(y).Q})}) (y).(Q{x:=.(P{b:=(y).Q})})" - using Cut asm neq by (auto simp add: fresh_prod fresh_atm subst_fresh abs_fresh) + using Cut asm neq by (auto simp: fresh_prod fresh_atm subst_fresh abs_fresh) also have "\ = Cut .(M{b:=(y).Q}{x:=.(P{b:=(y).Q})}) (y).Q" using Cut asm by (simp add: forget) finally have eq2: "(Cut .M (z).N){b:=(y).Q}{x:=.(P{b:=(y).Q})} = Cut .(M{b:=(y).Q}{x:=.(P{b:=(y).Q})}) (y).Q" by simp have "(Cut .M (z).N){x:=.P}{b:=(y).Q} = (Cut .M (z).N){b:=(y).Q}{x:=.(P{b:=(y).Q})}" using eq1 eq2 by simp } moreover { assume asm: "M = Ax x c \ N \ Ax z b" have neq: "N{x:=.P} \ Ax z b" proof (cases "x\N") case True then show ?thesis using asm by (simp add: forget) next case False then show ?thesis by (simp add: not_Ax2) qed have "(Cut .M (z).N){x:=.P}{b:=(y).Q} = (Cut .P (z).(N{x:=.P})){b:=(y).Q}" using Cut asm by simp also have "\ = Cut .(P{b:=(y).Q}) (z).(N{x:=.P}{b:=(y).Q})" using Cut asm neq by (simp add: abs_fresh) also have "\ = Cut .(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=.(P{b:=(y).Q})})" using Cut asm by simp finally have eq1: "(Cut .M (z).N){x:=.P}{b:=(y).Q} = Cut .(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=.(P{b:=(y).Q})})" by simp have "(Cut .M (z).N){b:=(y).Q}{x:=.(P{b:=(y).Q})} = (Cut .(M{b:=(y).Q}) (z).(N{b:=(y).Q})){x:=.(P{b:=(y).Q})}" using Cut asm by auto also have "\ = (Cut .M (z).(N{b:=(y).Q})){x:=.(P{b:=(y).Q})}" - using Cut asm by (auto simp add: fresh_atm) + using Cut asm by (auto simp: fresh_atm) also have "\ = Cut .(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=.(P{b:=(y).Q})})" using Cut asm by (simp add: fresh_prod fresh_atm subst_fresh) finally have eq2: "(Cut .M (z).N){b:=(y).Q}{x:=.(P{b:=(y).Q})} = Cut .(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=.(P{b:=(y).Q})})" by simp have "(Cut .M (z).N){x:=.P}{b:=(y).Q} = (Cut .M (z).N){b:=(y).Q}{x:=.(P{b:=(y).Q})}" using eq1 eq2 by simp } moreover { assume asm: "M \ Ax x c \ N \ Ax z b" have neq1: "N{x:=.P} \ Ax z b" proof (cases "x\N") case True then show ?thesis using asm by (simp add: forget) next case False then show ?thesis by (simp add: not_Ax2) qed have neq2: "M{b:=(y).Q} \ Ax x c" proof (cases "b\M") case True then show ?thesis using asm by (simp add: forget) next case False then show ?thesis by (simp add: not_Ax1) qed have "(Cut .M (z).N){x:=.P}{b:=(y).Q} = (Cut .(M{x:=.P}) (z).(N{x:=.P})){b:=(y).Q}" using Cut asm by simp also have "\ = Cut .(M{x:=.P}{b:=(y).Q}) (z).(N{x:=.P}{b:=(y).Q})" using Cut asm neq1 by (simp add: abs_fresh) also have "\ = Cut .(M{b:=(y).Q}{x:=.(P{b:=(y).Q})}) (z).(N{b:=(y).Q}{x:=.(P{b:=(y).Q})})" using Cut asm by simp finally have eq1: "(Cut .M (z).N){x:=.P}{b:=(y).Q} = Cut .(M{b:=(y).Q}{x:=.(P{b:=(y).Q})}) (z).(N{b:=(y).Q}{x:=.(P{b:=(y).Q})})" by simp have "(Cut .M (z).N){b:=(y).Q}{x:=.(P{b:=(y).Q})} = (Cut .(M{b:=(y).Q}) (z).(N{b:=(y).Q})){x:=.(P{b:=(y).Q})}" using Cut asm neq1 by simp also have "\ = Cut .(M{b:=(y).Q}{x:=.(P{b:=(y).Q})}) (z).(N{b:=(y).Q}{x:=.(P{b:=(y).Q})})" using Cut asm neq2 by (simp add: fresh_prod fresh_atm subst_fresh) finally have eq2: "(Cut .M (z).N){b:=(y).Q}{x:=.(P{b:=(y).Q})} = Cut .(M{b:=(y).Q}{x:=.(P{b:=(y).Q})}) (z).(N{b:=(y).Q}{x:=.(P{b:=(y).Q})})" by simp have "(Cut .M (z).N){x:=.P}{b:=(y).Q} = (Cut .M (z).N){b:=(y).Q}{x:=.(P{b:=(y).Q})}" using eq1 eq2 by simp } ultimately show ?case by blast next case (NotR z M c) then show ?case - apply(auto simp add: fresh_prod fresh_atm subst_fresh) + apply(auto simp: fresh_prod fresh_atm subst_fresh) apply(subgoal_tac "\a'::coname. a'\(M{c:=(y).Q},M{c:=(y).Q}{x:=.P{c:=(y).Q}},Q,a,P,c,y)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR abs_fresh fresh_atm) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: fresh_prod fresh_atm subst_fresh abs_fresh) apply(simp add: fresh_prod fresh_atm subst_fresh abs_fresh) apply(simp add: forget) apply(simp add: fresh_prod fresh_atm subst_fresh) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (NotL c M z) then show ?case - apply(auto simp add: fresh_prod fresh_atm subst_fresh) + apply(auto simp: fresh_prod fresh_atm subst_fresh) apply(subgoal_tac "\x'::name. x'\(P,M{x:=.P},P{b:=(y).Q},M{b:=(y).Q}{x:=.P{b:=(y).Q}},y,Q)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL abs_fresh fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done next case (AndR c1 M c2 N c3) then show ?case - apply(auto simp add: fresh_prod fresh_atm subst_fresh) + apply(auto simp: fresh_prod fresh_atm subst_fresh) apply(subgoal_tac "\a'::coname. a'\(Q,M{c3:=(y).Q},M{c3:=(y).Q}{x:=.P{c3:=(y).Q}},c2,c3,a, P{c3:=(y).Q},N{c3:=(y).Q},N{c3:=(y).Q}{x:=.P{c3:=(y).Q}},c1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR abs_fresh fresh_atm) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp_all add: fresh_atm abs_fresh subst_fresh) apply(simp add: forget) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (AndL1 z1 M z2) then show ?case - apply(auto simp add: fresh_prod fresh_atm subst_fresh) + apply(auto simp: fresh_prod fresh_atm subst_fresh) apply(subgoal_tac "\x'::name. x'\(P,M{x:=.P},P{b:=(y).Q},z1,y,Q,M{b:=(y).Q}{x:=.P{b:=(y).Q}})") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1 abs_fresh fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done next case (AndL2 z1 M z2) then show ?case - apply(auto simp add: fresh_prod fresh_atm subst_fresh) + apply(auto simp: fresh_prod fresh_atm subst_fresh) apply(subgoal_tac "\x'::name. x'\(P,M{x:=.P},P{b:=(y).Q},z1,y,Q,M{b:=(y).Q}{x:=.P{b:=(y).Q}})") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2 abs_fresh fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done next case (OrL z1 M z2 N z3) then show ?case - apply(auto simp add: fresh_prod fresh_atm subst_fresh) + apply(auto simp: fresh_prod fresh_atm subst_fresh) apply(subgoal_tac "\x'::name. x'\(P,M{x:=.P},M{b:=(y).Q}{x:=.P{b:=(y).Q}},z2,z3,a,y,Q, P{b:=(y).Q},N{x:=.P},N{b:=(y).Q}{x:=.P{b:=(y).Q}},z1)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL abs_fresh fresh_atm) apply(simp add: trm.inject alpha) apply(rule trans) apply(rule substc.simps) apply(simp_all add: fresh_atm subst_fresh) apply(rule exists_fresh'(1)[OF fs_name1]) done next case (OrR1 c1 M c2) then show ?case - apply(auto simp add: fresh_prod fresh_atm subst_fresh) + apply(auto simp: fresh_prod fresh_atm subst_fresh) apply(subgoal_tac "\a'::coname. a'\(Q,M{c2:=(y).Q},a,P{c2:=(y).Q},c1, M{c2:=(y).Q}{x:=.P{c2:=(y).Q}})") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1 abs_fresh fresh_atm) apply(simp_all add: fresh_atm subst_fresh abs_fresh) apply(simp add: forget) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (OrR2 c1 M c2) then show ?case - apply(auto simp add: fresh_prod fresh_atm subst_fresh) + apply(auto simp: fresh_prod fresh_atm subst_fresh) apply(subgoal_tac "\a'::coname. a'\(Q,M{c2:=(y).Q},a,P{c2:=(y).Q},c1, M{c2:=(y).Q}{x:=.P{c2:=(y).Q}})") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2 abs_fresh fresh_atm) apply(simp_all add: fresh_atm subst_fresh abs_fresh) apply(simp add: forget) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (ImpR z c M d) then show ?case - apply(auto simp add: fresh_prod fresh_atm subst_fresh) + apply(auto simp: fresh_prod fresh_atm subst_fresh) apply(subgoal_tac "\a'::coname. a'\(Q,M{d:=(y).Q},a,P{d:=(y).Q},c, M{d:=(y).Q}{x:=.P{d:=(y).Q}})") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR abs_fresh fresh_atm) apply(simp_all add: fresh_atm subst_fresh forget abs_fresh) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (ImpL c M z N u) then show ?case - apply(auto simp add: fresh_prod fresh_atm subst_fresh) + apply(auto simp: fresh_prod fresh_atm subst_fresh) apply(subgoal_tac "\z'::name. z'\(P,P{b:=(y).Q},M{u:=.P},N{u:=.P},y,Q, M{b:=(y).Q}{u:=.P{b:=(y).Q}},N{b:=(y).Q}{u:=.P{b:=(y).Q}},z)") apply(erule exE) apply(simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL abs_fresh fresh_atm) apply(simp add: trm.inject alpha) apply(rule trans) apply(rule substc.simps) apply(simp_all add: fresh_atm subst_fresh forget) apply(rule exists_fresh'(1)[OF fs_name1]) done qed lemma subst_subst2: assumes a: "a\(b,P,N)" "x\(y,P,M)" "b\(M,N)" "y\P" shows "M{a:=(x).N}{y:=.P} = M{y:=.P}{a:=(x).N{y:=.P}}" using a proof(nominal_induct M avoiding: a x N y b P rule: trm.strong_induct) case (Ax z c) then show ?case - by (auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) + by (auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) next case (Cut d M' u M'') then show ?case apply(simp add: fresh_atm fresh_prod trm.inject abs_fresh) apply(auto) apply(simp add: fresh_atm) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh subst_fresh fresh_prod fresh_atm) apply(simp add: fresh_prod subst_fresh fresh_atm abs_fresh) apply(simp) apply(simp add: forget) apply(simp add: fresh_atm) apply(case_tac "a\M'") apply(simp add: forget) apply(simp add: not_Ax1) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh subst_fresh fresh_prod fresh_atm) apply(simp add: fresh_prod subst_fresh fresh_atm abs_fresh) apply(auto)[1] apply(case_tac "y\M''") apply(simp add: forget) apply(simp add: not_Ax2) apply(simp add: forget) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: subst_fresh fresh_atm) apply(simp add: abs_fresh subst_fresh) apply(auto)[1] apply(case_tac "y\M''") apply(simp add: forget) apply(simp add: not_Ax2) apply(case_tac "a\M'") apply(simp add: forget) apply(simp add: not_Ax1) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: subst_fresh) apply(simp add: subst_fresh abs_fresh) apply(simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: subst_fresh fresh_atm) apply(simp add: subst_fresh abs_fresh) apply(auto)[1] apply(case_tac "y\M''") apply(simp add: forget) apply(simp add: not_Ax2) done next case (NotR z M' d) then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) apply(subgoal_tac "\a'::coname. a'\(y,P,N,N{y:=.P},M'{d:=(x).N},M'{y:=.P}{d:=(x).N{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotR) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh) apply(simp add: fresh_prod subst_fresh fresh_atm) apply(simp) apply(simp add: trm.inject alpha) apply(rule trans) apply(rule substn.simps) apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_atm) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (NotL d M' z) then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) apply(subgoal_tac "\x'::name. x'\(z,y,P,N,N{y:=.P},M'{y:=.P},M'{y:=.P}{a:=(x).N{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp add: fresh_prod subst_fresh fresh_atm abs_fresh) apply(simp) apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule substc.simps) apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_atm subst_fresh) apply(simp) apply(rule exists_fresh'(1)[OF fs_name1]) done next case (AndR d M' e M'' f) then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) apply(subgoal_tac "\a'::coname. a'\(P,b,d,e,N,N{y:=.P},M'{f:=(x).N},M''{f:=(x).N}, M'{y:=.P}{f:=(x).N{y:=.P}},M''{y:=.P}{f:=(x).N{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndR) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp add: fresh_prod subst_fresh fresh_atm abs_fresh) apply(simp) apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule substn.simps) apply(simp add: fresh_prod fresh_atm subst_fresh) apply(simp add: fresh_atm subst_fresh) apply(simp add: fresh_atm) apply(simp) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (AndL1 z M' u) then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) apply(subgoal_tac "\x'::name. x'\(P,b,z,u,x,N,M'{y:=.P},M'{y:=.P}{a:=(x).N{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp add: fresh_prod subst_fresh fresh_atm abs_fresh) apply(simp) apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule substc.simps) apply(simp add: fresh_prod fresh_atm subst_fresh) apply(simp) apply(rule exists_fresh'(1)[OF fs_name1]) done next case (AndL2 z M' u) then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) apply(subgoal_tac "\x'::name. x'\(P,b,z,u,x,N,M'{y:=.P},M'{y:=.P}{a:=(x).N{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp add: fresh_prod subst_fresh fresh_atm abs_fresh) apply(simp) apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule substc.simps) apply(simp add: fresh_prod fresh_atm subst_fresh) apply(simp) apply(rule exists_fresh'(1)[OF fs_name1]) done next case (OrL u M' v M'' w) then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) apply(subgoal_tac "\z'::name. z'\(P,b,u,w,v,N,N{y:=.P},M'{y:=.P},M''{y:=.P}, M'{y:=.P}{a:=(x).N{y:=.P}},M''{y:=.P}{a:=(x).N{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp add: fresh_prod subst_fresh fresh_atm abs_fresh) apply(simp) apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule substc.simps) apply(simp add: fresh_prod fresh_atm subst_fresh) apply(simp add: fresh_atm subst_fresh) apply(simp add: fresh_atm) apply(simp) apply(rule exists_fresh'(1)[OF fs_name1]) done next case (OrR1 e M' f) then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) apply(subgoal_tac "\c'::coname. c'\(P,b,e,f,x,N,N{y:=.P}, M'{f:=(x).N},M'{y:=.P}{f:=(x).N{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR1) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp add: fresh_prod subst_fresh fresh_atm abs_fresh) apply(simp) apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule substn.simps) apply(simp add: fresh_prod fresh_atm subst_fresh) apply(simp) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (OrR2 e M' f) then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) apply(subgoal_tac "\c'::coname. c'\(P,b,e,f,x,N,N{y:=.P}, M'{f:=(x).N},M'{y:=.P}{f:=(x).N{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrR2) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp add: fresh_prod subst_fresh fresh_atm abs_fresh) apply(simp) apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule substn.simps) apply(simp add: fresh_prod fresh_atm subst_fresh) apply(simp) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (ImpR x e M' f) then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) apply(subgoal_tac "\c'::coname. c'\(P,b,e,f,x,N,N{y:=.P}, M'{f:=(x).N},M'{y:=.P}{f:=(x).N{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpR) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp add: fresh_prod subst_fresh fresh_atm abs_fresh) apply(simp) apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule substn.simps) apply(simp add: fresh_prod fresh_atm subst_fresh) apply(simp add: fresh_atm) apply(simp add: fresh_atm trm.inject alpha abs_fresh fin_supp abs_supp) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(simp add: fresh_atm trm.inject alpha abs_fresh fin_supp abs_supp) done next case (ImpL e M' v M'' w) then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget trm.inject) apply(subgoal_tac "\z'::name. z'\(P,b,e,w,v,N,N{y:=.P},M'{w:=.P},M''{w:=.P}, M'{w:=.P}{a:=(x).N{w:=.P}},M''{w:=.P}{a:=(x).N{w:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp add: fresh_prod subst_fresh fresh_atm abs_fresh) apply(simp) apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule substc.simps) apply(simp add: fresh_prod fresh_atm subst_fresh) apply(simp add: fresh_atm subst_fresh) apply(simp add: fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done qed lemma subst_subst3: assumes a: "a\(P,N,c)" "c\(M,N)" "x\(y,P,M)" "y\(P,x)" "M\Ax y a" shows "N{x:=.M}{y:=.P} = N{y:=.P}{x:=.(M{y:=.P})}" using a proof(nominal_induct N avoiding: x y a c M P rule: trm.strong_induct) case (Ax z c) then show ?case - by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) next case (Cut d M' u M'') then show ?case apply(simp add: fresh_atm fresh_prod trm.inject abs_fresh) apply(auto) apply(simp add: fresh_atm) apply(simp add: trm.inject) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh) apply(simp add: fresh_prod subst_fresh fresh_atm) apply(subgoal_tac "P \ Ax x c") apply(simp) apply(simp add: forget) apply(clarify) apply(simp add: fresh_atm) apply(case_tac "x\M'") apply(simp add: forget) apply(simp add: not_Ax2) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh) apply(simp add: fresh_prod subst_fresh fresh_atm) apply(simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh) apply(simp add: fresh_prod subst_fresh fresh_atm) apply(auto) apply(case_tac "y\M'") apply(simp add: forget) apply(simp add: not_Ax2) done next case NotR then show ?case - by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) next case (NotL d M' u) then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) apply(subgoal_tac "\x'::name. x'\(y,P,M,M{y:=.P},M'{x:=.M},M'{y:=.P}{x:=.M{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh) apply(simp add: fresh_prod subst_fresh fresh_atm) apply(simp) apply(simp add: trm.inject alpha) apply(rule trans) apply(rule substn.simps) apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(x,y,P,M,M'{y:=.P},M'{y:=.P}{x:=.M{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_NotL) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh) apply(simp add: fresh_atm subst_fresh fresh_prod) apply(subgoal_tac "P \ Ax x c") apply(simp) apply(simp add: forget trm.inject alpha) apply(rule trans) apply(rule substn.simps) apply(simp add: fresh_atm subst_fresh) apply(simp add: fresh_atm) apply(clarify) apply(simp add: fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done next case AndR then show ?case - by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) next case (AndL1 u M' v) then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) apply(subgoal_tac "\x'::name. x'\(u,y,v,P,M,M{y:=.P},M'{x:=.M},M'{y:=.P}{x:=.M{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh) apply(simp add: fresh_prod subst_fresh fresh_atm) apply(simp) apply(simp add: trm.inject alpha) apply(rule trans) apply(rule substn.simps) apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(x,y,u,v,P,M,M'{y:=.P},M'{y:=.P}{x:=.M{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL1) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh) apply(simp add: fresh_atm subst_fresh fresh_prod) apply(subgoal_tac "P \ Ax x c") apply(simp) apply(simp add: forget trm.inject alpha) apply(rule trans) apply(rule substn.simps) apply(simp add: fresh_atm subst_fresh) apply(simp add: fresh_atm) apply(clarify) apply(simp add: fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done next case (AndL2 u M' v) then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) apply(subgoal_tac "\x'::name. x'\(u,y,v,P,M,M{y:=.P},M'{x:=.M},M'{y:=.P}{x:=.M{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh) apply(simp add: fresh_prod subst_fresh fresh_atm) apply(simp) apply(simp add: trm.inject alpha) apply(rule trans) apply(rule substn.simps) apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(x,y,u,v,P,M,M'{y:=.P},M'{y:=.P}{x:=.M{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_AndL2) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh) apply(simp add: fresh_atm subst_fresh fresh_prod) apply(subgoal_tac "P \ Ax x c") apply(simp) apply(simp add: forget trm.inject alpha) apply(rule trans) apply(rule substn.simps) apply(simp add: fresh_atm subst_fresh) apply(simp add: fresh_atm) apply(clarify) apply(simp add: fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done next case OrR1 then show ?case - by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) next case OrR2 then show ?case - by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) next case (OrL x1 M' x2 M'' x3) then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) apply(subgoal_tac "\x'::name. x'\(y,P,M,M{y:=.P},M'{x:=.M},M'{y:=.P}{x:=.M{y:=.P}}, x1,x2,x3,M''{x:=.M},M''{y:=.P}{x:=.M{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh) apply(simp add: fresh_prod subst_fresh fresh_atm) apply(simp) apply(simp add: trm.inject alpha) apply(rule trans) apply(rule substn.simps) apply(simp add: fresh_prod fresh_atm subst_fresh) apply(simp add: fresh_prod fresh_atm subst_fresh) apply(simp add: fresh_atm) apply(simp add: fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(x,y,P,M,M'{y:=.P},M'{y:=.P}{x:=.M{y:=.P}}, x1,x2,x3,M''{y:=.P},M''{y:=.P}{x:=.M{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh) apply(simp add: fresh_atm subst_fresh fresh_prod) apply(simp add: fresh_prod fresh_atm) apply(auto) apply(simp add: fresh_atm) apply(simp add: forget trm.inject alpha) apply(rule trans) apply(rule substn.simps) apply(simp add: fresh_atm subst_fresh) apply(simp add: fresh_atm subst_fresh) apply(simp add: fresh_atm) apply(simp add: fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done next case ImpR then show ?case - by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) next case (ImpL d M' x1 M'' x2) then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) apply(subgoal_tac "\x'::name. x'\(y,P,M,M{y:=.P},M'{x2:=.M},M'{y:=.P}{x2:=.M{y:=.P}}, x1,x2,M''{x2:=.M},M''{y:=.P}{x2:=.M{y:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh) apply(simp add: fresh_prod subst_fresh fresh_atm) apply(simp) apply(simp add: trm.inject alpha) apply(rule trans) apply(rule substn.simps) apply(simp add: fresh_prod fresh_atm subst_fresh) apply(simp add: fresh_prod fresh_atm subst_fresh) apply(simp add: fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "\x'::name. x'\(x,y,P,M,M'{x2:=.P},M'{x2:=.P}{x:=.M{x2:=.P}}, x1,x2,M''{x2:=.P},M''{x2:=.P}{x:=.M{x2:=.P}})") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh subst_fresh) apply(simp add: fresh_atm subst_fresh fresh_prod) apply(simp add: fresh_prod fresh_atm) apply(auto) apply(simp add: fresh_atm) apply(simp add: forget trm.inject alpha) apply(rule trans) apply(rule substn.simps) apply(simp add: fresh_atm subst_fresh) apply(simp add: fresh_atm subst_fresh) apply(simp add: fresh_atm) apply(rule exists_fresh'(1)[OF fs_name1]) done qed lemma subst_subst4: assumes a: "x\(P,N,y)" "y\(M,N)" "a\(c,P,M)" "c\(P,a)" "M\Ax x c" shows "N{a:=(x).M}{c:=(y).P} = N{c:=(y).P}{a:=(x).(M{c:=(y).P})}" using a proof(nominal_induct N avoiding: x y a c M P rule: trm.strong_induct) case (Ax z c) then show ?case - by (auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + by (auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) next case (Cut d M' u M'') then show ?case apply(simp add: fresh_atm fresh_prod trm.inject abs_fresh) apply(auto) apply(simp add: fresh_atm) apply(simp add: trm.inject) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: abs_fresh subst_fresh fresh_atm) apply(simp add: fresh_prod subst_fresh abs_fresh fresh_atm) apply(subgoal_tac "P \ Ax y a") apply(simp) apply(simp add: forget) apply(clarify) apply(simp add: fresh_atm) apply(case_tac "a\M''") apply(simp add: forget) apply(simp add: not_Ax1) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: fresh_prod subst_fresh fresh_atm) apply(simp add: abs_fresh subst_fresh) apply(simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: fresh_prod subst_fresh fresh_atm) apply(simp add: abs_fresh subst_fresh) apply(auto) apply(case_tac "c\M''") apply(simp add: forget) apply(simp add: not_Ax1) done next case NotL then show ?case - by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) next case (NotR u M' d) then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: abs_fresh subst_fresh) apply(rule trans) apply(rule better_Cut_substc) apply(simp) apply(simp add: abs_fresh) apply(simp) apply(simp add: trm.inject alpha) apply(rule trans) apply(rule substc.simps) apply(simp add: fresh_prod fresh_atm) - apply(auto simp add: fresh_atm fresh_prod)[1] + apply(auto simp: fresh_atm fresh_prod)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: fresh_prod fresh_atm subst_fresh) apply(simp add: abs_fresh subst_fresh) - apply(auto simp add: fresh_atm) + apply(auto simp: fresh_atm) apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule substc.simps) apply(simp add: fresh_atm subst_fresh) - apply(auto simp add: fresh_prod fresh_atm) + apply(auto simp: fresh_prod fresh_atm) done next case AndL1 then show ?case - by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) next case AndL2 then show ?case - by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) next case (AndR d M e M' f) then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) - apply(generate_fresh "coname") - apply(fresh_fun_simp) - apply(fresh_fun_simp) - apply(simp add: abs_fresh subst_fresh) - apply(rule trans) - apply(rule better_Cut_substc) - apply(simp) - apply(simp add: abs_fresh) - apply(simp) - apply(simp add: trm.inject alpha) - apply(rule trans) - apply(rule substc.simps) - apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] - apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] - apply(simp) - apply(auto simp add: fresh_atm fresh_prod)[1] - apply(generate_fresh "coname") - apply(fresh_fun_simp) - apply(fresh_fun_simp) - apply(rule sym) - apply(rule trans) - apply(rule better_Cut_substc) - apply(simp add: subst_fresh fresh_atm fresh_prod) - apply(simp add: abs_fresh subst_fresh) - apply(auto simp add: fresh_atm)[1] - apply(simp add: trm.inject alpha forget) - apply(rule trans) - apply(rule substc.simps) - apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] - apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] - apply(simp) - apply(auto simp add: fresh_atm fresh_prod)[1] - done -next - case OrL - then show ?case - by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) -next - case (OrR1 d M' e) - then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: abs_fresh subst_fresh) apply(rule trans) apply(rule better_Cut_substc) apply(simp) apply(simp add: abs_fresh) apply(simp) apply(simp add: trm.inject alpha) apply(rule trans) apply(rule substc.simps) - apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] - apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] + apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] + apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] + apply(simp) + apply(auto simp: fresh_atm fresh_prod)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: subst_fresh fresh_atm fresh_prod) apply(simp add: abs_fresh subst_fresh) - apply(auto simp add: fresh_atm)[1] + apply(auto simp: fresh_atm)[1] apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule substc.simps) - apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] - apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] + apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] + apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] + apply(simp) + apply(auto simp: fresh_atm fresh_prod)[1] done next - case (OrR2 d M' e) + case OrL then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) +next + case (OrR1 d M' e) + then show ?case + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: abs_fresh subst_fresh) apply(rule trans) apply(rule better_Cut_substc) apply(simp) apply(simp add: abs_fresh) apply(simp) apply(simp add: trm.inject alpha) apply(rule trans) apply(rule substc.simps) - apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] - apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] + apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] + apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: subst_fresh fresh_atm fresh_prod) apply(simp add: abs_fresh subst_fresh) - apply(auto simp add: fresh_atm)[1] + apply(auto simp: fresh_atm)[1] apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule substc.simps) - apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] - apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] + apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] + apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] done next - case ImpL + case (OrR2 d M' e) then show ?case - by(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) -next - case (ImpR u d M' e) - then show ?case - apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: abs_fresh subst_fresh) apply(rule trans) apply(rule better_Cut_substc) apply(simp) apply(simp add: abs_fresh) apply(simp) apply(simp add: trm.inject alpha) apply(rule trans) apply(rule substc.simps) - apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] - apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] - apply(auto simp add: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1] + apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] + apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp add: subst_fresh fresh_atm fresh_prod) apply(simp add: abs_fresh subst_fresh) - apply(auto simp add: fresh_atm)[1] + apply(auto simp: fresh_atm)[1] apply(simp add: trm.inject alpha forget) apply(rule trans) apply(rule substc.simps) - apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] - apply(auto simp add: fresh_prod fresh_atm subst_fresh)[1] - apply(auto simp add: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1] - apply(auto simp add: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1] + apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] + apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] + done +next + case ImpL + then show ?case + by(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) +next + case (ImpR u d M' e) + then show ?case + apply(auto simp: subst_fresh abs_fresh fresh_atm fresh_prod forget) + apply(generate_fresh "coname") + apply(fresh_fun_simp) + apply(fresh_fun_simp) + apply(simp add: abs_fresh subst_fresh) + apply(rule trans) + apply(rule better_Cut_substc) + apply(simp) + apply(simp add: abs_fresh) + apply(simp) + apply(simp add: trm.inject alpha) + apply(rule trans) + apply(rule substc.simps) + apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] + apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] + apply(auto simp: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1] + apply(generate_fresh "coname") + apply(fresh_fun_simp) + apply(fresh_fun_simp) + apply(rule sym) + apply(rule trans) + apply(rule better_Cut_substc) + apply(simp add: subst_fresh fresh_atm fresh_prod) + apply(simp add: abs_fresh subst_fresh) + apply(auto simp: fresh_atm)[1] + apply(simp add: trm.inject alpha forget) + apply(rule trans) + apply(rule substc.simps) + apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] + apply(auto simp: fresh_prod fresh_atm subst_fresh)[1] + apply(auto simp: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1] + apply(auto simp: fresh_prod fresh_atm subst_fresh abs_fresh abs_supp fin_supp)[1] done qed end