(* $Id: Class.thy,v 1.23 2008/05/22 14:34:45 urbanc Exp $ *) theory Class imports "../Nominal" begin section {* Term-Calculus from Urban's PhD *} atom_decl name coname text {* types *} 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) instance ty :: size .. nominal_primrec "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)+ 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\<sharp>T" and "x\<sharp>T" by (nominal_induct T rule: ty.strong_induct) (auto simp add: 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 *} consts nrename :: "trm => name => name => trm" ("_[_\<turnstile>n>_]" [100,100,100] 100) crename :: "trm => coname => coname => trm" ("_[_\<turnstile>c>_]" [100,100,100] 100) nominal_primrec (freshness_context: "(d::coname,e::coname)") "(Ax x a)[d\<turnstile>c>e] = (if a=d then Ax x e else Ax x a)" "[|a\<sharp>(d,e,N);x\<sharp>M|] ==> (Cut <a>.M (x).N)[d\<turnstile>c>e] = Cut <a>.(M[d\<turnstile>c>e]) (x).(N[d\<turnstile>c>e])" "(NotR (x).M a)[d\<turnstile>c>e] = (if a=d then NotR (x).(M[d\<turnstile>c>e]) e else NotR (x).(M[d\<turnstile>c>e]) a)" "a\<sharp>(d,e) ==> (NotL <a>.M x)[d\<turnstile>c>e] = (NotL <a>.(M[d\<turnstile>c>e]) x)" "[|a\<sharp>(d,e,N,c);b\<sharp>(d,e,M,c);b≠a|] ==> (AndR <a>.M <b>.N c)[d\<turnstile>c>e] = (if c=d then AndR <a>.(M[d\<turnstile>c>e]) <b>.(N[d \<turnstile>c>e]) e else AndR <a>.(M[d\<turnstile>c>e]) <b>.(N[d\<turnstile>c>e]) c)" "x\<sharp>y ==> (AndL1 (x).M y)[d\<turnstile>c>e] = AndL1 (x).(M[d\<turnstile>c>e]) y" "x\<sharp>y ==> (AndL2 (x).M y)[d\<turnstile>c>e] = AndL2 (x).(M[d\<turnstile>c>e]) y" "a\<sharp>(d,e,b) ==> (OrR1 <a>.M b)[d\<turnstile>c>e] = (if b=d then OrR1 <a>.(M[d\<turnstile>c>e]) e else OrR1 <a>.(M[d\<turnstile>c>e]) b)" "a\<sharp>(d,e,b) ==> (OrR2 <a>.M b)[d\<turnstile>c>e] = (if b=d then OrR2 <a>.(M[d\<turnstile>c>e]) e else OrR2 <a>.(M[d\<turnstile>c>e]) b)" "[|x\<sharp>(N,z);y\<sharp>(M,z);y≠x|] ==> (OrL (x).M (y).N z)[d\<turnstile>c>e] = OrL (x).(M[d\<turnstile>c>e]) (y).(N[d\<turnstile>c>e]) z" "a\<sharp>(d,e,b) ==> (ImpR (x).<a>.M b)[d\<turnstile>c>e] = (if b=d then ImpR (x).<a>.(M[d\<turnstile>c>e]) e else ImpR (x).<a>.(M[d\<turnstile>c>e]) b)" "[|a\<sharp>(d,e,N);x\<sharp>(M,y)|] ==> (ImpL <a>.M (x).N y)[d\<turnstile>c>e] = ImpL <a>.(M[d\<turnstile>c>e]) (x).(N[d\<turnstile>c>e]) y" apply(finite_guess)+ apply(rule TrueI)+ apply(simp add: abs_fresh abs_supp fin_supp)+ apply(fresh_guess)+ done nominal_primrec (freshness_context: "(u::name,v::name)") "(Ax x a)[u\<turnstile>n>v] = (if x=u then Ax v a else Ax x a)" "[|a\<sharp>N;x\<sharp>(u,v,M)|] ==> (Cut <a>.M (x).N)[u\<turnstile>n>v] = Cut <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v])" "x\<sharp>(u,v) ==> (NotR (x).M a)[u\<turnstile>n>v] = NotR (x).(M[u\<turnstile>n>v]) a" "(NotL <a>.M x)[u\<turnstile>n>v] = (if x=u then NotL <a>.(M[u\<turnstile>n>v]) v else NotL <a>.(M[u\<turnstile>n>v]) x)" "[|a\<sharp>(N,c);b\<sharp>(M,c);b≠a|] ==> (AndR <a>.M <b>.N c)[u\<turnstile>n>v] = AndR <a>.(M[u\<turnstile>n>v]) <b>.(N[u\<turnstile>n>v]) c" "x\<sharp>(u,v,y) ==> (AndL1 (x).M y)[u\<turnstile>n>v] = (if y=u then AndL1 (x).(M[u\<turnstile>n>v]) v else AndL1 (x).(M[u\<turnstile>n>v]) y)" "x\<sharp>(u,v,y) ==> (AndL2 (x).M y)[u\<turnstile>n>v] = (if y=u then AndL2 (x).(M[u\<turnstile>n>v]) v else AndL2 (x).(M[u\<turnstile>n>v]) y)" "a\<sharp>b ==> (OrR1 <a>.M b)[u\<turnstile>n>v] = OrR1 <a>.(M[u\<turnstile>n>v]) b" "a\<sharp>b ==> (OrR2 <a>.M b)[u\<turnstile>n>v] = OrR2 <a>.(M[u\<turnstile>n>v]) b" "[|x\<sharp>(u,v,N,z);y\<sharp>(u,v,M,z);y≠x|] ==> (OrL (x).M (y).N z)[u\<turnstile>n>v] = (if z=u then OrL (x).(M[u\<turnstile>n>v]) (y).(N[u\<turnstile>n>v]) v else OrL (x).(M[u\<turnstile>n>v]) (y).(N[u\<turnstile>n>v]) z)" "[|a\<sharp>b; x\<sharp>(u,v)|] ==> (ImpR (x).<a>.M b)[u\<turnstile>n>v] = ImpR (x).<a>.(M[u\<turnstile>n>v]) b" "[|a\<sharp>N;x\<sharp>(u,v,M,y)|] ==> (ImpL <a>.M (x).N y)[u\<turnstile>n>v] = (if y=u then ImpL <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v]) v else ImpL <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v]) y)" apply(finite_guess)+ apply(rule TrueI)+ apply(simp add: abs_fresh abs_supp fs_name1 fs_coname1)+ apply(fresh_guess)+ done 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\<turnstile>c>e]) = (pi•M)[(pi•d)\<turnstile>c>(pi•e)]" apply(nominal_induct M avoiding: d e rule: trm.strong_induct) apply(auto simp add: fresh_bij eq_bij) done lemma crename_coname_eqvt[eqvt]: fixes pi::"coname prm" shows "pi•(M[d\<turnstile>c>e]) = (pi•M)[(pi•d)\<turnstile>c>(pi•e)]" apply(nominal_induct M avoiding: d e rule: trm.strong_induct) apply(auto simp add: fresh_bij eq_bij) done lemma nrename_name_eqvt[eqvt]: fixes pi::"name prm" shows "pi•(M[x\<turnstile>n>y]) = (pi•M)[(pi•x)\<turnstile>n>(pi•y)]" apply(nominal_induct M avoiding: x y rule: trm.strong_induct) apply(auto simp add: fresh_bij eq_bij) done lemma nrename_coname_eqvt[eqvt]: fixes pi::"coname prm" shows "pi•(M[x\<turnstile>n>y]) = (pi•M)[(pi•x)\<turnstile>n>(pi•y)]" apply(nominal_induct M avoiding: x y rule: trm.strong_induct) apply(auto simp add: fresh_bij eq_bij) done lemmas rename_eqvts = crename_name_eqvt crename_coname_eqvt nrename_name_eqvt nrename_coname_eqvt lemma nrename_fresh: assumes a: "x\<sharp>M" shows "M[x\<turnstile>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) lemma crename_fresh: assumes a: "a\<sharp>M" shows "M[a\<turnstile>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) lemma nrename_nfresh: fixes x::"name" shows "x\<sharp>y==>x\<sharp>M[x\<turnstile>n>y]" by (nominal_induct M avoiding: x y rule: trm.strong_induct) (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) lemma crename_nfresh: fixes x::"name" shows "x\<sharp>M==>x\<sharp>M[a\<turnstile>c>b]" by (nominal_induct M avoiding: a b rule: trm.strong_induct) (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) lemma crename_cfresh: fixes a::"coname" shows "a\<sharp>b==>a\<sharp>M[a\<turnstile>c>b]" by (nominal_induct M avoiding: a b rule: trm.strong_induct) (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) lemma nrename_cfresh: fixes c::"coname" shows "c\<sharp>M==>c\<sharp>M[x\<turnstile>n>y]" by (nominal_induct M avoiding: x y rule: trm.strong_induct) (auto simp add: fresh_atm abs_fresh abs_supp fin_supp) lemma nrename_nfresh': fixes x::"name" shows "x\<sharp>(M,z,y)==>x\<sharp>M[z\<turnstile>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) lemma crename_cfresh': fixes a::"coname" shows "a\<sharp>(M,b,c)==>a\<sharp>M[b\<turnstile>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) lemma nrename_rename: assumes a: "x'\<sharp>M" shows "([(x',x)]•M)[x'\<turnstile>n>y]= M[x\<turnstile>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) done lemma crename_rename: assumes a: "a'\<sharp>M" shows "([(a',a)]•M)[a'\<turnstile>c>b]= M[a\<turnstile>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) 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\<sharp>(u,v)" shows "(Cut <a>.M (x).N)[u\<turnstile>n>v] = Cut <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v])" proof - obtain x'::"name" where fs1: "x'\<sharp>(M,N,a,x,u,v)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,x,u,v)" by (rule exists_fresh(2), rule fin_supp, blast) have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(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) have "(Cut <a'>.([(a',a)]•M) (x').([(x',x)]•N))[u\<turnstile>n>v] = Cut <a'>.(([(a',a)]•M)[u\<turnstile>n>v]) (x').(([(x',x)]•N)[u\<turnstile>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 also have "… = Cut <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>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 finally show "(Cut <a>.M (x).N)[u\<turnstile>n>v] = Cut <a>.(M[u\<turnstile>n>v]) (x).(N[u\<turnstile>n>v])" using eq1 by simp qed lemma better_crename_Cut: assumes a: "a\<sharp>(b,c)" shows "(Cut <a>.M (x).N)[b\<turnstile>c>c] = Cut <a>.(M[b\<turnstile>c>c]) (x).(N[b\<turnstile>c>c])" proof - obtain x'::"name" where fs1: "x'\<sharp>(M,N,a,x,b,c)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,x,b,c)" by (rule exists_fresh(2), rule fin_supp, blast) have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(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) have "(Cut <a'>.([(a',a)]•M) (x').([(x',x)]•N))[b\<turnstile>c>c] = Cut <a'>.(([(a',a)]•M)[b\<turnstile>c>c]) (x').(([(x',x)]•N)[b\<turnstile>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 also have "… = Cut <a>.(M[b\<turnstile>c>c]) (x).(N[b\<turnstile>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 finally show "(Cut <a>.M (x).N)[b\<turnstile>c>c] = Cut <a>.(M[b\<turnstile>c>c]) (x).(N[b\<turnstile>c>c])" using eq1 by simp qed lemma crename_id: shows "M[a\<turnstile>c>a] = M" by (nominal_induct M avoiding: a rule: trm.strong_induct) (auto) lemma nrename_id: shows "M[x\<turnstile>n>x] = M" by (nominal_induct M avoiding: x rule: trm.strong_induct) (auto) lemma nrename_swap: shows "x\<sharp>M ==> [(x,y)]•M = M[y\<turnstile>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\<sharp>M ==> [(a,b)]•M = M[b\<turnstile>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\<turnstile>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\<turnstile>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\<sharp>pi" "c\<sharp>M" shows "c\<sharp>(pi•M)" using a apply - apply(simp add: fresh_left) apply(simp add: at_prm_fresh[OF at_coname_inst] fresh_list_rev) done lemma fresh_perm_name: fixes x::"name" and pi::"name prm" and M::"trm" assumes a: "x\<sharp>pi" "x\<sharp>M" shows "x\<sharp>(pi•M)" using a apply - apply(simp add: fresh_left) apply(simp add: at_prm_fresh[OF at_name_inst] fresh_list_rev) done lemma fresh_fun_simp_NotL: assumes a: "x'\<sharp>P" "x'\<sharp>M" shows "fresh_fun (λx'. Cut <c>.P (x').NotL <a>.M x') = Cut <c>.P (x').NotL <a>.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\<sharp>(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 lemma fresh_fun_NotL[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1•fresh_fun (λx'. Cut <c>.P (x').NotL <a>.M x')= fresh_fun (pi1•(λx'. Cut <c>.P (x').NotL <a>.M x'))" and "pi2•fresh_fun (λx'. Cut <c>.P (x').NotL <a>.M x')= fresh_fun (pi2•(λx'. Cut <c>.P (x').NotL <a>.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]) apply(perm_simp) apply(subgoal_tac "∃n::name. n\<sharp>(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 lemma fresh_fun_simp_AndL1: assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>x" shows "fresh_fun (λz'. Cut <c>.P (z').AndL1 (x).M z') = Cut <c>.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\<sharp>(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 lemma fresh_fun_AndL1[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1•fresh_fun (λz'. Cut <c>.P (z').AndL1 (x).M z')= fresh_fun (pi1•(λz'. Cut <c>.P (z').AndL1 (x).M z'))" and "pi2•fresh_fun (λz'. Cut <c>.P (z').AndL1 (x).M z')= fresh_fun (pi2•(λz'. Cut <c>.P (z').AndL1 (x).M z'))" apply - apply(perm_simp) apply(subgoal_tac "∃n::name. n\<sharp>(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]) apply(rule exists_fresh') apply(simp add: fin_supp) apply(perm_simp) apply(subgoal_tac "∃n::name. n\<sharp>(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 lemma fresh_fun_simp_AndL2: assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>x" shows "fresh_fun (λz'. Cut <c>.P (z').AndL2 (x).M z') = Cut <c>.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\<sharp>(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 lemma fresh_fun_AndL2[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1•fresh_fun (λz'. Cut <c>.P (z').AndL2 (x).M z')= fresh_fun (pi1•(λz'. Cut <c>.P (z').AndL2 (x).M z'))" and "pi2•fresh_fun (λz'. Cut <c>.P (z').AndL2 (x).M z')= fresh_fun (pi2•(λz'. Cut <c>.P (z').AndL2 (x).M z'))" apply - apply(perm_simp) apply(subgoal_tac "∃n::name. n\<sharp>(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]) apply(rule exists_fresh') apply(simp add: fin_supp) apply(perm_simp) apply(subgoal_tac "∃n::name. n\<sharp>(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 lemma fresh_fun_simp_OrL: assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>N" "z'\<sharp>u" "z'\<sharp>x" shows "fresh_fun (λz'. Cut <c>.P (z').OrL (x).M (u).N z') = Cut <c>.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\<sharp>(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 lemma fresh_fun_OrL[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1•fresh_fun (λz'. Cut <c>.P (z').OrL (x).M (u).N z')= fresh_fun (pi1•(λz'. Cut <c>.P (z').OrL (x).M (u).N z'))" and "pi2•fresh_fun (λz'. Cut <c>.P (z').OrL (x).M (u).N z')= fresh_fun (pi2•(λz'. Cut <c>.P (z').OrL (x).M (u).N z'))" apply - apply(perm_simp) apply(subgoal_tac "∃n::name. n\<sharp>(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]) apply(rule exists_fresh') apply(simp add: fin_supp) apply(perm_simp) apply(subgoal_tac "∃n::name. n\<sharp>(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 lemma fresh_fun_simp_ImpL: assumes a: "z'\<sharp>P" "z'\<sharp>M" "z'\<sharp>N" "z'\<sharp>x" shows "fresh_fun (λz'. Cut <c>.P (z').ImpL <a>.M (x).N z') = Cut <c>.P (z').ImpL <a>.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\<sharp>(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 lemma fresh_fun_ImpL[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1•fresh_fun (λz'. Cut <c>.P (z').ImpL <a>.M (x).N z')= fresh_fun (pi1•(λz'. Cut <c>.P (z').ImpL <a>.M (x).N z'))" and "pi2•fresh_fun (λz'. Cut <c>.P (z').ImpL <a>.M (x).N z')= fresh_fun (pi2•(λz'. Cut <c>.P (z').ImpL <a>.M (x).N z'))" apply - apply(perm_simp) apply(subgoal_tac "∃n::name. n\<sharp>(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]) apply(rule exists_fresh') apply(simp add: fin_supp) apply(perm_simp) apply(subgoal_tac "∃n::name. n\<sharp>(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 lemma fresh_fun_simp_NotR: assumes a: "a'\<sharp>P" "a'\<sharp>M" shows "fresh_fun (λa'. Cut <a'>.(NotR (y).M a') (x).P) = Cut <a'>.(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\<sharp>(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 lemma fresh_fun_NotR[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1•fresh_fun (λa'. Cut <a'>.(NotR (y).M a') (x).P)= fresh_fun (pi1•(λa'. Cut <a'>.(NotR (y).M a') (x).P))" and "pi2•fresh_fun (λa'. Cut <a'>.(NotR (y).M a') (x).P)= fresh_fun (pi2•(λa'. Cut <a'>.(NotR (y).M a') (x).P))" apply - apply(perm_simp) apply(subgoal_tac "∃n::coname. n\<sharp>(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\<sharp>(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]) apply(rule exists_fresh') apply(simp add: fin_supp) done lemma fresh_fun_simp_AndR: assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>N" "a'\<sharp>b" "a'\<sharp>c" shows "fresh_fun (λa'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P) = Cut <a'>.(AndR <b>.M <c>.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\<sharp>(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 lemma fresh_fun_AndR[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1•fresh_fun (λa'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P)= fresh_fun (pi1•(λa'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P))" and "pi2•fresh_fun (λa'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P)= fresh_fun (pi2•(λa'. Cut <a'>.(AndR <b>.M <c>.N a') (x).P))" apply - apply(perm_simp) apply(subgoal_tac "∃n::coname. n\<sharp>(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\<sharp>(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]) apply(rule exists_fresh') apply(simp add: fin_supp) done lemma fresh_fun_simp_OrR1: assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>b" shows "fresh_fun (λa'. Cut <a'>.(OrR1 <b>.M a') (x).P) = Cut <a'>.(OrR1 <b>.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\<sharp>(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 lemma fresh_fun_OrR1[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1•fresh_fun (λa'. Cut <a'>.(OrR1 <b>.M a') (x).P)= fresh_fun (pi1•(λa'. Cut <a'>.(OrR1 <b>.M a') (x).P))" and "pi2•fresh_fun (λa'. Cut <a'>.(OrR1 <b>.M a') (x).P)= fresh_fun (pi2•(λa'. Cut <a'>.(OrR1 <b>.M a') (x).P))" apply - apply(perm_simp) apply(subgoal_tac "∃n::coname. n\<sharp>(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\<sharp>(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]) apply(rule exists_fresh') apply(simp add: fin_supp) done lemma fresh_fun_simp_OrR2: assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>b" shows "fresh_fun (λa'. Cut <a'>.(OrR2 <b>.M a') (x).P) = Cut <a'>.(OrR2 <b>.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\<sharp>(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 lemma fresh_fun_OrR2[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1•fresh_fun (λa'. Cut <a'>.(OrR2 <b>.M a') (x).P)= fresh_fun (pi1•(λa'. Cut <a'>.(OrR2 <b>.M a') (x).P))" and "pi2•fresh_fun (λa'. Cut <a'>.(OrR2 <b>.M a') (x).P)= fresh_fun (pi2•(λa'. Cut <a'>.(OrR2 <b>.M a') (x).P))" apply - apply(perm_simp) apply(subgoal_tac "∃n::coname. n\<sharp>(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\<sharp>(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]) apply(rule exists_fresh') apply(simp add: fin_supp) done lemma fresh_fun_simp_ImpR: assumes a: "a'\<sharp>P" "a'\<sharp>M" "a'\<sharp>b" shows "fresh_fun (λa'. Cut <a'>.(ImpR (y).<b>.M a') (x).P) = Cut <a'>.(ImpR (y).<b>.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\<sharp>(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 lemma fresh_fun_ImpR[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1•fresh_fun (λa'. Cut <a'>.(ImpR (y).<b>.M a') (x).P)= fresh_fun (pi1•(λa'. Cut <a'>.(ImpR (y).<b>.M a') (x).P))" and "pi2•fresh_fun (λa'. Cut <a'>.(ImpR (y).<b>.M a') (x).P)= fresh_fun (pi2•(λa'. Cut <a'>.(ImpR (y).<b>.M a') (x).P))" apply - apply(perm_simp) apply(subgoal_tac "∃n::coname. n\<sharp>(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\<sharp>(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]) apply(rule exists_fresh') apply(simp add: fin_supp) done consts substn :: "trm => name => coname => trm => trm" ("_{_:=<_>._}" [100,100,100,100] 100) substc :: "trm => coname => name => trm => trm" ("_{_:=(_)._}" [100,100,100,100] 100) nominal_primrec (freshness_context: "(y::name,c::coname,P::trm)") "(Ax x a){y:=<c>.P} = (if x=y then Cut <c>.P (y).Ax y a else Ax x a)" "[|a\<sharp>(c,P,N);x\<sharp>(y,P,M)|] ==> (Cut <a>.M (x).N){y:=<c>.P} = (if M=Ax y a then Cut <c>.P (x).(N{y:=<c>.P}) else Cut <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}))" "x\<sharp>(y,P) ==> (NotR (x).M a){y:=<c>.P} = NotR (x).(M{y:=<c>.P}) a" "a\<sharp>(c,P) ==> (NotL <a>.M x){y:=<c>.P} = (if x=y then fresh_fun (λx'. Cut <c>.P (x').NotL <a>.(M{y:=<c>.P}) x') else NotL <a>.(M{y:=<c>.P}) x)" "[|a\<sharp>(c,P,N,d);b\<sharp>(c,P,M,d);b≠a|] ==> (AndR <a>.M <b>.N d){y:=<c>.P} = AndR <a>.(M{y:=<c>.P}) <b>.(N{y:=<c>.P}) d" "x\<sharp>(y,P,z) ==> (AndL1 (x).M z){y:=<c>.P} = (if z=y then fresh_fun (λz'. Cut <c>.P (z').AndL1 (x).(M{y:=<c>.P}) z') else AndL1 (x).(M{y:=<c>.P}) z)" "x\<sharp>(y,P,z) ==> (AndL2 (x).M z){y:=<c>.P} = (if z=y then fresh_fun (λz'. Cut <c>.P (z').AndL2 (x).(M{y:=<c>.P}) z') else AndL2 (x).(M{y:=<c>.P}) z)" "a\<sharp>(c,P,b) ==> (OrR1 <a>.M b){y:=<c>.P} = OrR1 <a>.(M{y:=<c>.P}) b" "a\<sharp>(c,P,b) ==> (OrR2 <a>.M b){y:=<c>.P} = OrR2 <a>.(M{y:=<c>.P}) b" "[|x\<sharp>(y,N,P,z);u\<sharp>(y,M,P,z);x≠u|] ==> (OrL (x).M (u).N z){y:=<c>.P} = (if z=y then fresh_fun (λz'. Cut <c>.P (z').OrL (x).(M{y:=<c>.P}) (u).(N{y:=<c>.P}) z') else OrL (x).(M{y:=<c>.P}) (u).(N{y:=<c>.P}) z)" "[|a\<sharp>(b,c,P); x\<sharp>(y,P)|] ==> (ImpR (x).<a>.M b){y:=<c>.P} = ImpR (x).<a>.(M{y:=<c>.P}) b" "[|a\<sharp>(N,c,P);x\<sharp>(y,P,M,z)|] ==> (ImpL <a>.M (x).N z){y:=<c>.P} = (if y=z then fresh_fun (λz'. Cut <c>.P (z').ImpL <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}) z') else ImpL <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}) z)" apply(finite_guess)+ apply(rule TrueI)+ apply(simp add: abs_fresh abs_supp)+ apply(rule impI) apply(subgoal_tac "∃x::name. x\<sharp>(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\<sharp>(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\<sharp>(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\<sharp>(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\<sharp>(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\<sharp>(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\<sharp>(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(fresh_guess)+ done nominal_primrec (freshness_context: "(d::name,z::coname,P::trm)") "(Ax x a){d:=(z).P} = (if d=a then Cut <a>.(Ax x a) (z).P else Ax x a)" "[|a\<sharp>(d,P,N);x\<sharp>(z,P,M)|] ==> (Cut <a>.M (x).N){d:=(z).P} = (if N=Ax x d then Cut <a>.(M{d:=(z).P}) (z).P else Cut <a>.(M{d:=(z).P}) (x).(N{d:=(z).P}))" "x\<sharp>(z,P) ==> (NotR (x).M a){d:=(z).P} = (if d=a then fresh_fun (λa'. Cut <a'>.NotR (x).(M{d:=(z).P}) a' (z).P) else NotR (x).(M{d:=(z).P}) a)" "a\<sharp>(d,P) ==> (NotL <a>.M x){d:=(z).P} = NotL <a>.(M{d:=(z).P}) x" "[|a\<sharp>(P,c,N,d);b\<sharp>(P,c,M,d);b≠a|] ==> (AndR <a>.M <b>.N c){d:=(z).P} = (if d=c then fresh_fun (λa'. Cut <a'>.(AndR <a>.(M{d:=(z).P}) <b>.(N{d:=(z).P}) a') (z).P) else AndR <a>.(M{d:=(z).P}) <b>.(N{d:=(z).P}) c)" "x\<sharp>(y,z,P) ==> (AndL1 (x).M y){d:=(z).P} = AndL1 (x).(M{d:=(z).P}) y" "x\<sharp>(y,P,z) ==> (AndL2 (x).M y){d:=(z).P} = AndL2 (x).(M{d:=(z).P}) y" "a\<sharp>(d,P,b) ==> (OrR1 <a>.M b){d:=(z).P} = (if d=b then fresh_fun (λa'. Cut <a'>.OrR1 <a>.(M{d:=(z).P}) a' (z).P) else OrR1 <a>.(M{d:=(z).P}) b)" "a\<sharp>(d,P,b) ==> (OrR2 <a>.M b){d:=(z).P} = (if d=b then fresh_fun (λa'. Cut <a'>.OrR2 <a>.(M{d:=(z).P}) a' (z).P) else OrR2 <a>.(M{d:=(z).P}) b)" "[|x\<sharp>(N,z,P,u);y\<sharp>(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\<sharp>(b,d,P); x\<sharp>(z,P)|] ==> (ImpR (x).<a>.M b){d:=(z).P} = (if d=b then fresh_fun (λa'. Cut <a'>.ImpR (x).<a>.(M{d:=(z).P}) a' (z).P) else ImpR (x).<a>.(M{d:=(z).P}) b)" "[|a\<sharp>(N,d,P);x\<sharp>(y,z,P,M)|] ==> (ImpL <a>.M (x).N y){d:=(z).P} = ImpL <a>.(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\<sharp>(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\<sharp>(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\<sharp>(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\<sharp>(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\<sharp>(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\<sharp>(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\<sharp>(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)+ 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(perm_simp)+ done lemma nsubst_eqvt[eqvt]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1•(M{x:=<c>.N}) = (pi1•M){(pi1•x):=<(pi1•c)>.(pi1•N)}" and "pi2•(M{x:=<c>.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(perm_simp)+ done lemma supp_subst1: shows "supp (M{y:=<c>.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(blast)+ apply(subgoal_tac "∃x'::name. x'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm1{y:=<c>.P},P,name1,trm2{y:=<c>.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'\<sharp>(trm1{y:=<c>.P},P,name1,trm2{y:=<c>.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'\<sharp>(trm1{y:=<c>.P},P,name1,trm2{y:=<c>.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'\<sharp>(trm1{y:=<c>.P},P,name1,trm2{y:=<c>.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'\<sharp>(trm1{name2:=<c>.P},P,name1,trm2{name2:=<c>.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'\<sharp>(trm1{name2:=<c>.P},P,name1,trm2{name2:=<c>.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'\<sharp>(trm1{name2:=<c>.P},P,name1,trm2{name2:=<c>.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:=<c>.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(blast)+ apply(subgoal_tac "∃x'::name. x'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm1{y:=<c>.P},P,name1,trm2{y:=<c>.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'\<sharp>(trm1{y:=<c>.P},P,name1,trm2{y:=<c>.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'\<sharp>(trm1{name2:=<c>.P},P,name1,trm2{name2:=<c>.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'\<sharp>(trm1{name2:=<c>.P},P,name1,trm2{name2:=<c>.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'\<sharp>(trm1{name2:=<c>.P},P,name1,trm2{name2:=<c>.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'\<sharp>(trm1{name2:=<c>.P},P,name1,trm2{name2:=<c>.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(blast)+ apply(subgoal_tac "∃x'::coname. x'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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(blast)+ apply(subgoal_tac "∃x'::coname. x'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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:=<c>.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(blast)+ apply(subgoal_tac "∃x'::name. x'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm1{y:=<c>.P},P,name1,trm2{y:=<c>.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'\<sharp>(trm1{y:=<c>.P},P,name1,trm2{y:=<c>.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'\<sharp>(trm1{name2:=<c>.P},P,name1,trm2{name2:=<c>.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'\<sharp>(trm1{name2:=<c>.P},P,name1,trm2{name2:=<c>.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:=<c>.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(blast)+ apply(subgoal_tac "∃x'::name. x'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm1{y:=<c>.P},P,name1,trm2{y:=<c>.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'\<sharp>(trm1{y:=<c>.P},P,name1,trm2{y:=<c>.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'\<sharp>(trm1{name2:=<c>.P},P,name1,trm2{name2:=<c>.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'\<sharp>(trm1{name2:=<c>.P},P,name1,trm2{name2:=<c>.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(blast)+ apply(subgoal_tac "∃x'::coname. x'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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(blast)+ apply(subgoal_tac "∃x'::coname. x'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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\<sharp>P ==> x\<sharp>M{x:=<c>.P}" and "b\<sharp>P ==> b\<sharp>M{b:=(y).P}" and "x\<sharp>(M,P) ==> x\<sharp>M{y:=<c>.P}" and "x\<sharp>M ==> x\<sharp>M{c:=(x).P}" and "x\<sharp>(M,P) ==> x\<sharp>M{c:=(y).P}" and "b\<sharp>(M,P) ==> b\<sharp>M{c:=(y).P}" and "b\<sharp>M ==> b\<sharp>M{y:=<b>.P}" and "b\<sharp>(M,P) ==> b\<sharp>M{y:=<c>.P}" apply - apply(insert subst_supp) apply(simp_all add: fresh_def supp_prod) apply(blast)+ done lemma forget: shows "x\<sharp>M ==> M{x:=<c>.P} = M" and "c\<sharp>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) done lemma substc_rename1: assumes a: "c\<sharp>(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) next case NotL then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) next case (NotR y M d) then show ?case apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) apply(subgoal_tac "∃a'::coname. a'\<sharp>(N,M{d:=(x).N},([(c,d)]•M){c:=(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) apply(rule exists_fresh'(2)[OF fs_coname1]) done next case (AndR c1 M c2 M' c3) then show ?case apply(simp) apply(auto) apply(simp add: fresh_prod calc_atm fresh_atm abs_fresh) apply(simp add: fresh_prod calc_atm fresh_atm abs_fresh fresh_left) apply(subgoal_tac "∃a'::coname. a'\<sharp>(N,M{c3:=(x).N}, M'{c3:=(x).N},c1,c2,c3,([(c,c3)]•M){c:=(x).N},([(c,c3)]•M'){c:=(x).N})") 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) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(simp add: fresh_prod calc_atm fresh_atm abs_fresh fresh_left) apply(simp add: fresh_prod calc_atm fresh_atm abs_fresh fresh_left) apply(auto simp add: trm.inject alpha) done next case AndL1 then show ?case by (auto simp add: 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) next case (OrR1 d M e) then show ?case apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) apply(subgoal_tac "∃a'::coname. a'\<sharp>(N,M{e:=(x).N},([(c,e)]•M){c:=(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) 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) apply(subgoal_tac "∃a'::coname. a'\<sharp>(N,M{e:=(x).N},([(c,e)]•M){c:=(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) 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) next case ImpL then show ?case by (auto simp add: 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(subgoal_tac "∃a'::coname. a'\<sharp>(N,M{e:=(x).N},([(c,e)]•M){c:=(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) apply(rule exists_fresh'(2)[OF fs_coname1]) done 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(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm) done qed lemma substc_rename2: assumes a: "y\<sharp>(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) next case NotL then show ?case by (auto simp add: 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(subgoal_tac "∃a'::coname. a'\<sharp>(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(subgoal_tac "∃a'::coname. a'\<sharp>(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(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) next case AndL2 then show ?case by (auto simp add: 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(subgoal_tac "∃a'::coname. a'\<sharp>(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(subgoal_tac "∃a'::coname. a'\<sharp>(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) next case ImpL then show ?case by (auto simp add: 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(subgoal_tac "∃a'::coname. a'\<sharp>(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) qed lemma substn_rename3: assumes a: "y\<sharp>(M,x)" shows "M{x:=<a>.N} = ([(y,x)]•M){y:=<a>.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) next case NotR then show ?case by (auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) next case (NotL d M z) then show ?case apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) apply(subgoal_tac "∃a'::name. a'\<sharp>(N,M{x:=<a>.N},([(y,x)]•M){y:=<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) 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) next case OrR1 then show ?case by (auto simp add: 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) next case (AndL1 u M v) then show ?case apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod) apply(subgoal_tac "∃a'::name. a'\<sharp>(N,M{x:=<a>.N},([(y,x)]•M){y:=<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) 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) apply(subgoal_tac "∃a'::name. a'\<sharp>(N,M{x:=<a>.N},([(y,x)]•M){y:=<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) 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(subgoal_tac "∃a'::name. a'\<sharp>(N,M{x:=<a>.N},M'{x:=<a>.N},([(y,x)]•M){y:=<a>.N},([(y,x)]•M'){y:=<a>.N},x1,x2)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_OrL) apply(simp add: trm.inject alpha) apply(rule exists_fresh'(1)[OF fs_name1]) done 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) next case (ImpL d M v M' u) then show ?case apply(auto simp add: calc_atm trm.inject alpha fresh_atm abs_fresh fresh_prod fresh_left) apply(subgoal_tac "∃a'::name. a'\<sharp>(N,M{u:=<a>.N},M'{u:=<a>.N},([(y,u)]•M){y:=<a>.N},([(y,u)]•M'){y:=<a>.N},d,v)") apply(erule exE, simp add: fresh_prod) apply(erule conjE)+ apply(simp add: fresh_fun_simp_ImpL) apply(simp add: trm.inject alpha) apply(rule exists_fresh'(1)[OF fs_name1]) done 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(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm) done qed lemma substn_rename4: assumes a: "c\<sharp>(N,a)" shows "M{x:=<a>.N} = M{x:=<c>.([(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) next case NotR then show ?case by (auto simp add: 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(subgoal_tac "∃a'::name. a'\<sharp>(N,M{x:=<c>.([(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(subgoal_tac "∃a'::name. a'\<sharp>(N,M{x:=<c>.([(c,a)]•N)},M'{x:=<c>.([(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(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) next case OrR2 then show ?case by (auto simp add: 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(subgoal_tac "∃a'::name. a'\<sharp>(N,M{x:=<c>.([(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(subgoal_tac "∃a'::name. a'\<sharp>(N,M{x:=<c>.([(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) next case ImpR then show ?case by (auto simp add: 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(subgoal_tac "∃a'::name. a'\<sharp>(N,M{u:=<c>.([(c,a)]•N)},M'{u:=<c>.([(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) qed lemma subst_rename5: assumes a: "c'\<sharp>(c,N)" "x'\<sharp>(x,M)" shows "M{x:=<c>.N} = ([(x',x)]•M){x':=<c'>.([(c',c)]•N)}" proof - have "M{x:=<c>.N} = ([(x',x)]•M){x':=<c>.N}" using a by (simp add: substn_rename3) also have "… = ([(x',x)]•M){x':=<c'>.([(c',c)]•N)}" using a by (simp add: substn_rename4) finally show ?thesis by simp qed lemma subst_rename6: assumes a: "c'\<sharp>(c,M)" "x'\<sharp>(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\<sharp>[c].P" "x\<sharp>(y,P)" shows "(Cut <a>.M (x).N){y:=<c>.P} = (if M=Ax y a then Cut <c>.P (x).(N{y:=<c>.P}) else Cut <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}))" proof - obtain x'::"name" where fs1: "x'\<sharp>(M,N,c,P,x,y)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\<sharp>(M,N,c,P,a)" by (rule exists_fresh(2), rule fin_supp, blast) have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(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) have eq2: "(M=Ax y a) = (([(a',a)]•M)=Ax y a')" apply(auto simp add: calc_atm) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm) done have "(Cut <a>.M (x).N){y:=<c>.P} = (Cut <a'>.([(a',a)]•M) (x').([(x',x)]•N)){y:=<c>.P}" using eq1 by simp also have "… = (if ([(a',a)]•M)=Ax y a' then Cut <c>.P (x').(([(x',x)]•N){y:=<c>.P}) else Cut <a'>.(([(a',a)]•M){y:=<c>.P}) (x').(([(x',x)]•N){y:=<c>.P}))" using fs1 fs2 by (auto simp add: fresh_prod fresh_left calc_atm fresh_atm) also have "… =(if M=Ax y a then Cut <c>.P (x).(N{y:=<c>.P}) else Cut <a>.(M{y:=<c>.P}) (x).(N{y:=<c>.P}))" using fs1 fs2 a apply - apply(simp only: eq2[symmetric]) apply(auto simp add: 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\<sharp>(c,P)" "x\<sharp>[y].P" shows "(Cut <a>.M (x).N){c:=(y).P} = (if N=Ax x c then Cut <a>.(M{c:=(y).P}) (y).P else Cut <a>.(M{c:=(y).P}) (x).(N{c:=(y).P}))" proof - obtain x'::"name" where fs1: "x'\<sharp>(M,N,c,P,x,y)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\<sharp>(M,N,c,P,a)" by (rule exists_fresh(2), rule fin_supp, blast) have eq1: "(Cut <a>.M (x).N) = (Cut <a'>.([(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) have eq2: "(N=Ax x c) = (([(x',x)]•N)=Ax x' c)" apply(auto simp add: calc_atm) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm) done have "(Cut <a>.M (x).N){c:=(y).P} = (Cut <a'>.([(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',a)]•M){c:=(y).P}) (y).P else Cut <a'>.(([(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 <a>.(M{c:=(y).P}) (y).P else Cut <a>.(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(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\<sharp>[c].P" "y\<sharp>(N,x)" "M≠Ax y a" shows "(Cut <a>.M (x).N){y:=<c>.P} = Cut <a>.(M{y:=<c>.P}) (x).N" using a apply - apply(generate_fresh "name") apply(subgoal_tac "Cut <a>.M (x).N = Cut <a>.M (ca).([(ca,x)]•N)") apply(simp) apply(subgoal_tac"y\<sharp>([(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(simp add: trm.inject) apply(rule sym) apply(simp add: alpha fresh_prod fresh_atm) done lemma better_NotR_substc: assumes a: "d\<sharp>M" shows "(NotR (x).M d){d:=(z).P} = fresh_fun (λa'. Cut <a'>.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(generate_fresh "coname") apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: expand_fun_eq) 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\<sharp>M" shows "(NotL <a>.M y){y:=<c>.P} = fresh_fun (λx'. Cut <c>.P (x').NotL <a>.M x')" using a apply - apply(generate_fresh "coname") apply(subgoal_tac "NotL <a>.M y = NotL <ca>.([(ca,a)]•M) y") apply(auto simp add: fresh_left calc_atm forget) apply(generate_fresh "name") apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: expand_fun_eq) 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\<sharp>[x].M" shows "(AndL1 (x).M y){y:=<c>.P} = fresh_fun (λz'. Cut <c>.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(generate_fresh "name") apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: expand_fun_eq) 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: expand_fun_eq) 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\<sharp>[x].M" shows "(AndL2 (x).M y){y:=<c>.P} = fresh_fun (λz'. Cut <c>.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(generate_fresh "name") apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: expand_fun_eq) 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: expand_fun_eq) 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\<sharp>([a].M,[b].N)" shows "(AndR <a>.M <b>.N c){c:=(z).P} = fresh_fun (λa'. Cut <a'>.(AndR <a>.M <b>.N a') (z).P)" using a apply - apply(generate_fresh "coname") apply(generate_fresh "coname") apply(subgoal_tac "AndR <a>.M <b>.N c = AndR <ca>.([(ca,a)]•M) <caa>.([(caa,b)]•N) c") apply(auto simp add: 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(simp) apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: expand_fun_eq) 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(rule forget) apply(auto simp add: 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\<sharp>([y].M,[z].N)" shows "(OrL (y).M (z).N x){x:=<c>.P} = fresh_fun (λz'. Cut <c>.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(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(simp) apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: expand_fun_eq) 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(rule forget) apply(auto simp add: 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\<sharp>[a].M" shows "(OrR1 <a>.M d){d:=(z).P} = fresh_fun (λa'. Cut <a'>.OrR1 <a>.M a' (z).P)" using a apply - apply(generate_fresh "coname") apply(subgoal_tac "OrR1 <a>.M d = OrR1 <c>.([(c,a)]•M) d") apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: expand_fun_eq) 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: expand_fun_eq) 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\<sharp>[a].M" shows "(OrR2 <a>.M d){d:=(z).P} = fresh_fun (λa'. Cut <a'>.OrR2 <a>.M a' (z).P)" using a apply - apply(generate_fresh "coname") apply(subgoal_tac "OrR2 <a>.M d = OrR2 <c>.([(c,a)]•M) d") apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: expand_fun_eq) 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: expand_fun_eq) 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\<sharp>[a].M" shows "(ImpR (x).<a>.M d){d:=(z).P} = fresh_fun (λa'. Cut <a'>.ImpR (x).<a>.M a' (z).P)" using a apply - apply(generate_fresh "coname") apply(generate_fresh "name") apply(subgoal_tac "ImpR (x).<a>.M d = ImpR (ca).<c>.([(c,a)]•[(ca,x)]•M) d") apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: expand_fun_eq) 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: expand_fun_eq) 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\<sharp>(M,[x].N)" shows "(ImpL <a>.M (x).N y){y:=<c>.P} = fresh_fun (λz'. Cut <c>.P (z').ImpL <a>.M (x).N z')" using a apply - apply(generate_fresh "coname") apply(generate_fresh "name") apply(subgoal_tac "ImpL <a>.M (x).N y = ImpL <ca>.([(ca,a)]•M) (caa).([(caa,x)]•N) y") apply(auto simp add: fresh_left calc_atm forget abs_fresh)[1] apply(rule_tac f="fresh_fun" in arg_cong) apply(simp add: expand_fun_eq) 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\<sharp>M{c:=(y).P}" shows "x\<sharp>M" using a supp_subst8 apply(simp add: fresh_def) apply(blast) done lemma freshn_after_substn: fixes x::"name" assumes a: "x\<sharp>M{y:=<c>.P}" "x≠y" shows "x\<sharp>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\<sharp>M{c:=(y).P}" "a≠c" shows "a\<sharp>M" using a supp_subst7 apply(simp add: fresh_def) apply(blast) done lemma freshc_after_substn: fixes a::"coname" assumes a: "a\<sharp>M{y:=<c>.P}" shows "a\<sharp>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:=<c>.P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{x:=<c>.(P[a\<turnstile>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(subgoal_tac "∃x'::name. x'\<sharp>(P,x,c)") apply(erule exE) apply(subgoal_tac "Cut <c>.P (x).Ax x a = Cut <c>.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(rule trans) apply(rule better_crename_Cut) apply(simp add: fresh_atm) apply(auto simp add: 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'\<sharp>(trm{x:=<c>.P},P,P[a\<turnstile>c>b],x,trm[a\<turnstile>c>b]{x:=<c>.P[a\<turnstile>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'\<sharp>(trm{x:=<c>.P},P,P[a\<turnstile>c>b],name1,trm[a\<turnstile>c>b]{x:=<c>.P[a\<turnstile>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'\<sharp>(trm{x:=<c>.P},P,P[a\<turnstile>c>b],name1,trm[a\<turnstile>c>b]{x:=<c>.P[a\<turnstile>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'\<sharp>(trm1{x:=<c>.P},trm2{x:=<c>.P},P,P[a\<turnstile>c>b],name1,name2, trm1[a\<turnstile>c>b]{x:=<c>.P[a\<turnstile>c>b]},trm2[a\<turnstile>c>b]{x:=<c>.P[a\<turnstile>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'\<sharp>(trm1{name2:=<c>.P},trm2{name2:=<c>.P},P,P[a\<turnstile>c>b],name1, trm1[a\<turnstile>c>b]{name2:=<c>.P[a\<turnstile>c>b]},trm2[a\<turnstile>c>b]{name2:=<c>.P[a\<turnstile>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\<turnstile>c>b] = M[a\<turnstile>c>b]{c:=(x).(P[a\<turnstile>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(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'\<sharp>(a,b,trm{coname:=(x).P},P,P[a\<turnstile>c>b],x,trm[a\<turnstile>c>b]{coname:=(x).P[a\<turnstile>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'\<sharp>(coname1,coname2,a,b,trm1{coname3:=(x).P},trm2{coname3:=(x).P}, P,P[a\<turnstile>c>b],x,trm1[a\<turnstile>c>b]{coname3:=(x).P[a\<turnstile>c>b]},trm2[a\<turnstile>c>b]{coname3:=(x).P[a\<turnstile>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'\<sharp>(coname1,trm{coname2:=(x).P},P,P[a\<turnstile>c>b],a,b, trm[a\<turnstile>c>b]{coname2:=(x).P[a\<turnstile>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'\<sharp>(coname1,trm{coname2:=(x).P},P,P[a\<turnstile>c>b],a,b, trm[a\<turnstile>c>b]{coname2:=(x).P[a\<turnstile>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'\<sharp>(coname1,trm{coname2:=(x).P},P,P[a\<turnstile>c>b],a,b, trm[a\<turnstile>c>b]{coname2:=(x).P[a\<turnstile>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:=<c>.P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{x:=<c>.(P[y\<turnstile>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(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'\<sharp>(y,z,trm{x:=<c>.P},P,P[y\<turnstile>n>z],x,trm[y\<turnstile>n>z]{x:=<c>.P[y\<turnstile>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'\<sharp>(trm{x:=<c>.P},P,P[y\<turnstile>n>z],name1,trm[y\<turnstile>n>z]{x:=<c>.P[y\<turnstile>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'\<sharp>(y,z,trm{x:=<c>.P},P,P[y\<turnstile>n>z],name1,trm[y\<turnstile>n>z]{x:=<c>.P[y\<turnstile>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'\<sharp>(trm1{x:=<c>.P},trm2{x:=<c>.P},P,P[y\<turnstile>n>z],name1,name2,y,z, trm1[y\<turnstile>n>z]{x:=<c>.P[y\<turnstile>n>z]},trm2[y\<turnstile>n>z]{x:=<c>.P[y\<turnstile>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'\<sharp>(trm1{name2:=<c>.P},trm2{name2:=<c>.P},P,P[y\<turnstile>n>z],y,z,name1, trm1[y\<turnstile>n>z]{name2:=<c>.P[y\<turnstile>n>z]},trm2[y\<turnstile>n>z]{name2:=<c>.P[y\<turnstile>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\<turnstile>n>z] = M[y\<turnstile>n>z]{c:=(x).(P[y\<turnstile>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(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'\<sharp>(y,z,trm{coname:=(x).P},P,P[y\<turnstile>n>z],x,trm[y\<turnstile>n>z]{coname:=(x).P[y\<turnstile>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'\<sharp>(coname1,coname2,y,z,trm1{coname3:=(x).P},trm2{coname3:=(x).P}, P,P[y\<turnstile>n>z],x,trm1[y\<turnstile>n>z]{coname3:=(x).P[y\<turnstile>n>z]},trm2[y\<turnstile>n>z]{coname3:=(x).P[y\<turnstile>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'\<sharp>(coname1,trm{coname2:=(x).P},P,P[y\<turnstile>n>z],y,z, trm[y\<turnstile>n>z]{coname2:=(x).P[y\<turnstile>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'\<sharp>(coname1,trm{coname2:=(x).P},P,P[y\<turnstile>n>z],y,z, trm[y\<turnstile>n>z]{coname2:=(x).P[y\<turnstile>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'\<sharp>(coname1,trm{coname2:=(x).P},P,P[y\<turnstile>n>z],y,z, trm[y\<turnstile>n>z]{coname2:=(x).P[y\<turnstile>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\<sharp>P" shows "M{x:=<c>.P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{x:=<c>.P}" using a proof - assume a1: "a≠c" assume a2: "a\<sharp>P" obtain c'::"coname" where fs2: "c'\<sharp>(c,P,a,b)" by (rule exists_fresh(2), rule fin_supp, blast) have eq: "M{x:=<c>.P} = M{x:=<c'>.([(c',c)]•P)}" using fs2 apply - apply(rule subst_rename) apply(simp) done have eq': "M[a\<turnstile>c>b]{x:=<c>.P} = M[a\<turnstile>c>b]{x:=<c'>.([(c',c)]•P)}" using fs2 apply - apply(rule subst_rename) apply(simp) done have eq2: "([(c',c)]•P)[a\<turnstile>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:=<c>.P}[a\<turnstile>c>b] = M{x:=<c'>.([(c',c)]•P)}[a\<turnstile>c>b]" using eq by simp also have "… = M[a\<turnstile>c>b]{x:=<c'>.(([(c',c)]•P)[a\<turnstile>c>b])}" using fs2 apply - apply(rule substn_crename_comm) apply(simp_all add: fresh_prod fresh_atm) done also have "… = M[a\<turnstile>c>b]{x:=<c'>.(([(c',c)]•P))}" using eq2 by simp also have "… = M[a\<turnstile>c>b]{x:=<c>.P}" using eq' by simp finally show ?thesis by simp qed lemma substc_crename_comm': assumes a: "c≠a" "c≠b" "a\<sharp>P" shows "M{c:=(x).P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{c:=(x).P}" using a proof - assume a1: "c≠a" assume a1': "c≠b" assume a2: "a\<sharp>P" obtain c'::"coname" where fs2: "c'\<sharp>(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\<turnstile>c>b])){c':=(x).P} = M[a\<turnstile>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\<turnstile>c>b] = ([(c',c)]•(M[a\<turnstile>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\<turnstile>c>b] = ([(c',c)]•M){c':=(x).P}[a\<turnstile>c>b]" using eq by simp also have "… = ([(c',c)]•M)[a\<turnstile>c>b]{c':=(x).P[a\<turnstile>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\<turnstile>c>b])){c':=(x).P[a\<turnstile>c>b]}" using eq2 by simp also have "… = ([(c',c)]•(M[a\<turnstile>c>b])){c':=(x).P}" using a2 by (simp add: rename_fresh) also have "… = M[a\<turnstile>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\<sharp>P" shows "M{x:=<c>.P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{x:=<c>.P}" using a proof - assume a1: "x≠y" assume a1': "x≠z" assume a2: "y\<sharp>P" obtain x'::"name" where fs2: "x'\<sharp>(x,M,y,z)" by (rule exists_fresh(1), rule fin_supp, blast) have eq: "M{x:=<c>.P} = ([(x',x)]•M){x':=<c>.P}" using fs2 apply - apply(rule subst_rename) apply(simp) done have eq': "([(x',x)]•(M[y\<turnstile>n>z])){x':=<c>.P} = M[y\<turnstile>n>z]{x:=<c>.P}" using fs2 apply - apply(rule subst_rename[symmetric]) apply(simp add: rename_fresh) done have eq2: "([(x',x)]•M)[y\<turnstile>n>z] = ([(x',x)]•(M[y\<turnstile>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:=<c>.P}[y\<turnstile>n>z] = ([(x',x)]•M){x':=<c>.P}[y\<turnstile>n>z]" using eq by simp also have "… = ([(x',x)]•M)[y\<turnstile>n>z]{x':=<c>.P[y\<turnstile>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\<turnstile>n>z])){x':=<c>.P[y\<turnstile>n>z]}" using eq2 by simp also have "… = ([(x',x)]•(M[y\<turnstile>n>z])){x':=<c>.P}" using a2 by (simp add: rename_fresh) also have "… = M[y\<turnstile>n>z]{x:=<c>.P}" using eq' by simp finally show ?thesis by simp qed lemma substc_nrename_comm': assumes a: "x≠y" "y\<sharp>P" shows "M{c:=(x).P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{c:=(x).P}" using a proof - assume a1: "x≠y" assume a2: "y\<sharp>P" obtain x'::"name" where fs2: "x'\<sharp>(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\<turnstile>n>z]{c:=(x).P} = M[y\<turnstile>n>z]{c:=(x').([(x',x)]•P)}" using fs2 apply - apply(rule subst_rename) apply(simp) done have eq2: "([(x',x)]•P)[y\<turnstile>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\<turnstile>n>z] = M{c:=(x').([(x',x)]•P)}[y\<turnstile>n>z]" using eq by simp also have "… = M[y\<turnstile>n>z]{c:=(x').(([(x',x)]•P)[y\<turnstile>n>z])}" using fs2 apply - apply(rule substc_nrename_comm) apply(simp_all add: fresh_prod fresh_atm) done also have "… = M[y\<turnstile>n>z]{c:=(x').(([(x',x)]•P))}" using eq2 by simp also have "… = M[y\<turnstile>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 *} types ctxtn = "(name×ty) list" ctxtc = "(coname×ty) list" inductive validc :: "ctxtc => bool" where vc1[intro]: "validc []" | vc2[intro]: "[|a\<sharp>Δ; validc Δ|] ==> validc ((a,T)#Δ)" equivariance validc inductive validn :: "ctxtn => bool" where vn1[intro]: "validn []" | vn2[intro]: "[|x\<sharp>Γ; validn Γ|] ==> validn ((x,T)#Γ)" equivariance validn lemma fresh_ctxt: fixes a::"coname" and x::"name" and Γ::"ctxtn" and Δ::"ctxtc" shows "a\<sharp>Γ" and "x\<sharp>Δ" proof - show "a\<sharp>Γ" by (induct Γ) (auto simp add: fresh_list_nil fresh_list_cons fresh_prod fresh_atm fresh_ty) next show "x\<sharp>Δ" by (induct Δ) (auto simp add: 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\<sharp>M ==> fin (NotL <a>.M x) x" | [intro]: "y\<sharp>[x].M ==> fin (AndL1 (x).M y) y" | [intro]: "y\<sharp>[x].M ==> fin (AndL2 (x).M y) y" | [intro]: "[|z\<sharp>[x].M;z\<sharp>[y].N|] ==> fin (OrL (x).M (y).N z) z" | [intro]: "[|y\<sharp>M;y\<sharp>[x].N|] ==> fin (ImpL <a>.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) done lemma fin_NotL_elim: assumes a: "fin (NotL <a>.M x) y" shows "x=y ∧ x\<sharp>M" using a apply(erule_tac fin.cases) apply(auto simp add: trm.inject) apply(subgoal_tac "y\<sharp>[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\<sharp>[x].M" using a apply(erule_tac fin.cases) apply(auto simp add: trm.inject) done lemma fin_AndL2_elim: assumes a: "fin (AndL2 (x).M y) z" shows "z=y ∧ z\<sharp>[x].M" using a apply(erule_tac fin.cases) apply(auto simp add: trm.inject) done lemma fin_OrL_elim: assumes a: "fin (OrL (x).M (y).N u) z" shows "z=u ∧ z\<sharp>[x].M ∧ z\<sharp>[y].N" using a apply(erule_tac fin.cases) apply(auto simp add: trm.inject) done lemma fin_ImpL_elim: assumes a: "fin (ImpL <a>.M (x).N z) y" shows "z=y ∧ z\<sharp>M ∧ z\<sharp>[x].N" using a apply(erule_tac fin.cases) apply(auto simp add: trm.inject) apply(subgoal_tac "y\<sharp>[aa].Ma") apply(drule sym) apply(simp_all add: abs_fresh) done lemma fin_rest_elims: shows "fin (Cut <a>.M (x).N) y ==> False" and "fin (NotR (x).M c) y ==> False" and "fin (AndR <a>.M <b>.N c) y ==> False" and "fin (OrR1 <a>.M b) y ==> False" and "fin (OrR2 <a>.M b) y ==> False" and "fin (ImpR (x).<a>.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) lemma not_fin_subst1: assumes a: "¬(fin M x)" shows "¬(fin (M{c:=(y).P}) x)" using a 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'\<sharp>(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'\<sharp>(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'\<sharp>(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(drule freshn_after_substc) apply(subgoal_tac "name2\<sharp>[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(drule freshn_after_substc) apply(subgoal_tac "name2\<sharp>[name1].trm") apply(simp add: fin.intros) apply(simp add: abs_fresh) apply(subgoal_tac "∃a'::coname. a'\<sharp>(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'\<sharp>(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(drule freshn_after_substc)+ apply(subgoal_tac "name3\<sharp>[name1].trm1 ∧ name3\<sharp>[name2].trm2") apply(simp add: fin.intros) apply(simp add: abs_fresh) apply(subgoal_tac "∃a'::coname. a'\<sharp>(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(drule freshn_after_substc)+ apply(subgoal_tac "x\<sharp>[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:=<c>.P}) x)" using a 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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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(drule freshn_after_substn) apply(simp) apply(subgoal_tac "name2\<sharp>[name1]. trm") apply(simp add: fin.intros) apply(simp add: abs_fresh) apply(subgoal_tac "∃a'::name. a'\<sharp>(trm{y:=<c>.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(drule freshn_after_substn) apply(simp) apply(subgoal_tac "name2\<sharp>[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'\<sharp>(trm1{y:=<c>.P},trm2{y:=<c>.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(drule freshn_after_substn) apply(simp) apply(drule freshn_after_substn) apply(simp) apply(subgoal_tac "name3\<sharp>[name1].trm1 ∧ name3\<sharp>[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'\<sharp>(trm1{name2:=<c>.P},trm2{name2:=<c>.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(drule freshn_after_substn) apply(simp) apply(drule freshn_after_substn) apply(simp) apply(subgoal_tac "x\<sharp>[name1].trm2") apply(simp add: fin.intros) apply(simp add: abs_fresh) done lemma fin_subst1: assumes a: "fin M x" "x≠y" "x\<sharp>P" shows "fin (M{y:=<c>.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\<sharp>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(auto)[1] 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\<sharp>P" shows "M[x\<turnstile>n>y]{y:=<c>.P} = Cut <c>.P (x).(M{y:=<c>.P})" using a 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\<sharp>(trm,y,x,P,trm[x\<turnstile>n>y]{y:=<c>.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\<sharp>(name2,name1,P,trm[name2\<turnstile>n>y]{y:=<c>.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\<sharp>(name2,name1,P,trm[name2\<turnstile>n>y]{y:=<c>.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\<sharp>(name3,name2,name1,P,trm1[name3\<turnstile>n>y]{y:=<c>.P},trm2[name3\<turnstile>n>y]{y:=<c>.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\<sharp>(name1,x,P,trm1[x\<turnstile>n>y]{y:=<c>.P},trm2[x\<turnstile>n>y]{y:=<c>.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\<sharp>M ==> fic (NotR (x).M a) a" | [intro]: "[|c\<sharp>[a].M;c\<sharp>[b].N|] ==> fic (AndR <a>.M <b>.N c) c" | [intro]: "b\<sharp>[a].M ==> fic (OrR1 <a>.M b) b" | [intro]: "b\<sharp>[a].M ==> fic (OrR2 <a>.M b) b" | [intro]: "[|b\<sharp>[a].M|] ==> fic (ImpR (x).<a>.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) done lemma fic_NotR_elim: assumes a: "fic (NotR (x).M a) b" shows "a=b ∧ b\<sharp>M" using a apply(erule_tac fic.cases) apply(auto simp add: trm.inject) apply(subgoal_tac "b\<sharp>[xa].Ma") apply(drule sym) apply(simp_all add: abs_fresh) done lemma fic_OrR1_elim: assumes a: "fic (OrR1 <a>.M b) c" shows "b=c ∧ c\<sharp>[a].M" using a apply(erule_tac fic.cases) apply(auto simp add: trm.inject) done lemma fic_OrR2_elim: assumes a: "fic (OrR2 <a>.M b) c" shows "b=c ∧ c\<sharp>[a].M" using a apply(erule_tac fic.cases) apply(auto simp add: trm.inject) done lemma fic_AndR_elim: assumes a: "fic (AndR <a>.M <b>.N c) d" shows "c=d ∧ d\<sharp>[a].M ∧ d\<sharp>[b].N" using a apply(erule_tac fic.cases) apply(auto simp add: trm.inject) done lemma fic_ImpR_elim: assumes a: "fic (ImpR (x).<a>.M b) c" shows "b=c ∧ b\<sharp>[a].M" using a apply(erule_tac fic.cases) apply(auto simp add: trm.inject) apply(subgoal_tac "c\<sharp>[xa].[aa].Ma") apply(drule sym) apply(simp_all add: abs_fresh) done lemma fic_rest_elims: shows "fic (Cut <a>.M (x).N) d ==> False" and "fic (NotL <a>.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 <a>.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) lemma not_fic_subst1: assumes a: "¬(fic M a)" shows "¬(fic (M{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm{y:=<c>.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'\<sharp>(trm1{y:=<c>.P},trm2{y:=<c>.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(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'\<sharp>(trm1{name2:=<c>.P},trm2{name2:=<c>.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'\<sharp>(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(erule conjE)+ 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'\<sharp>(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'\<sharp>(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(auto)[1] 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'\<sharp>(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(auto)[1] 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'\<sharp>(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(auto)[1] 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\<sharp>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(auto)[1] 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\<sharp>P" "M≠Ax x a" shows "fic (M{x:=<c>.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(auto)[1] 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\<sharp>P" shows "M[a\<turnstile>c>b]{b:=(y).P} = Cut <a>.(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(auto)[1] 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" ("_ -->l _" [100,100] 100) where LAxR: "[|x\<sharp>M; a\<sharp>b; fic M a|] ==> Cut <a>.M (x).(Ax x b) -->l M[a\<turnstile>c>b]" | LAxL: "[|a\<sharp>M; x\<sharp>y; fin M x|] ==> Cut <a>.(Ax y a) (x).M -->l M[x\<turnstile>n>y]" | LNot: "[|y\<sharp>(M,N); x\<sharp>(N,y); a\<sharp>(M,N,b); b\<sharp>M; y≠x; b≠a|] ==> Cut <a>.(NotR (x).M a) (y).(NotL <b>.N y) -->l Cut <b>.N (x).M" | LAnd1: "[|b\<sharp>([a1].M1,[a2].M2,N,a1,a2); y\<sharp>([x].N,M1,M2,x); x\<sharp>(M1,M2); a1\<sharp>(M2,N); a2\<sharp>(M1,N); a1≠a2|] ==> Cut <b>.(AndR <a1>.M1 <a2>.M2 b) (y).(AndL1 (x).N y) -->l Cut <a1>.M1 (x).N" | LAnd2: "[|b\<sharp>([a1].M1,[a2].M2,N,a1,a2); y\<sharp>([x].N,M1,M2,x); x\<sharp>(M1,M2); a1\<sharp>(M2,N); a2\<sharp>(M1,N); a1≠a2|] ==> Cut <b>.(AndR <a1>.M1 <a2>.M2 b) (y).(AndL2 (x).N y) -->l Cut <a2>.M2 (x).N" | LOr1: "[|b\<sharp>([a].M,N1,N2,a); y\<sharp>([x1].N1,[x2].N2,M,x1,x2); x1\<sharp>(M,N2); x2\<sharp>(M,N1); a\<sharp>(N1,N2); x1≠x2|] ==> Cut <b>.(OrR1 <a>.M b) (y).(OrL (x1).N1 (x2).N2 y) -->l Cut <a>.M (x1).N1" | LOr2: "[|b\<sharp>([a].M,N1,N2,a); y\<sharp>([x1].N1,[x2].N2,M,x1,x2); x1\<sharp>(M,N2); x2\<sharp>(M,N1); a\<sharp>(N1,N2); x1≠x2|] ==> Cut <b>.(OrR2 <a>.M b) (y).(OrL (x1).N1 (x2).N2 y) -->l Cut <a>.M (x2).N2" | LImp: "[|z\<sharp>(N,[y].P,[x].M,y,x); b\<sharp>([a].M,[c].N,P,c,a); x\<sharp>(N,[y].P,y); c\<sharp>(P,[a].M,b,a); a\<sharp>([c].N,P); y\<sharp>(N,[x].M)|] ==> Cut <b>.(ImpR (x).<a>.M b) (z).(ImpL <c>.N (y).P z) -->l Cut <a>.(Cut <c>.N (x).M) (y).P" equivariance l_redu lemma l_redu_eqvt': fixes pi1::"name prm" and pi2::"coname prm" shows "(pi1•M) -->l (pi1•M') ==> M -->l M'" and "(pi2•M) -->l (pi2•M') ==> M -->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 -->l M' ==> x\<sharp>M ==> x\<sharp>M'" and "M -->l M' ==> a\<sharp>M ==> a\<sharp>M'" apply - apply(induct rule: l_redu.induct) apply(auto simp add: 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(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 <a>.M (x).(Ax x b) -->l M[a\<turnstile>c>b]" proof - assume fin: "fic M a" obtain x'::"name" where fs1: "x'\<sharp>(M,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\<sharp>(a,M,b)" by (rule exists_fresh(2), rule fin_supp, blast) have "Cut <a>.M (x).(Ax x b) = Cut <a'>.([(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) also have "… -->l ([(a',a)]•M)[a'\<turnstile>c>b]" using fs1 fs2 fin by (auto intro: l_redu.intros simp add: fresh_left calc_atm fic_rename) also have "… = M[a\<turnstile>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 <a>.(Ax y a) (x).M -->l M[x\<turnstile>n>y]" proof - assume fin: "fin M x" obtain x'::"name" where fs1: "x'\<sharp>(y,M,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\<sharp>(a,M)" by (rule exists_fresh(2), rule fin_supp, blast) have "Cut <a>.(Ax y a) (x).M = Cut <a'>.(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) also have "… -->l ([(x',x)]•M)[x'\<turnstile>n>y]" using fs1 fs2 fin by (auto intro: l_redu.intros simp add: fresh_left calc_atm fin_rename) also have "… = M[x\<turnstile>n>y]" using fs1 fs2 by (simp add: nrename_rename) finally show ?thesis by simp qed lemma better_LNot_intro[intro]: shows "[|y\<sharp>N; a\<sharp>M|] ==> Cut <a>.(NotR (x).M a) (y).(NotL <b>.N y) -->l Cut <b>.N (x).M" proof - assume fs: "y\<sharp>N" "a\<sharp>M" obtain x'::"name" where f1: "x'\<sharp>(y,N,M,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain y'::"name" where f2: "y'\<sharp>(y,N,M,x,x')" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where f3: "a'\<sharp>(a,M,N,b)" by (rule exists_fresh(2), rule fin_supp, blast) obtain b'::"coname" where f4: "b'\<sharp>(a,M,N,b,a')" by (rule exists_fresh(2), rule fin_supp, blast) have "Cut <a>.(NotR (x).M a) (y).(NotL <b>.N y) = Cut <a'>.(NotR (x).([(a',a)]•M) a') (y').(NotL <b>.([(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) also have "… = Cut <a'>.(NotR (x).M a') (y').(NotL <b>.N y')" using f1 f2 f3 f4 fs by (perm_simp) also have "… = Cut <a'>.(NotR (x').([(x',x)]•M) a') (y').(NotL <b'>.([(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) also have "… -->l Cut <b'>.([(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 <b>.N (x).M" using f1 f2 f3 f4 by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) finally show ?thesis by simp qed lemma better_LAnd1_intro[intro]: shows "[|a\<sharp>([b1].M1,[b2].M2); y\<sharp>[x].N|] ==> Cut <a>.(AndR <b1>.M1 <b2>.M2 a) (y).(AndL1 (x).N y) -->l Cut <b1>.M1 (x).N" proof - assume fs: "a\<sharp>([b1].M1,[b2].M2)" "y\<sharp>[x].N" obtain x'::"name" where f1: "x'\<sharp>(y,N,M1,M2,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain y'::"name" where f2: "y'\<sharp>(y,N,M1,M2,x,x')" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where f3: "a'\<sharp>(a,M1,M2,N,b1,b2)" by (rule exists_fresh(2), rule fin_supp, blast) obtain b1'::"coname" where f4:"b1'\<sharp>(a,M1,M2,N,b1,b2,a')" by (rule exists_fresh(2), rule fin_supp, blast) obtain b2'::"coname" where f5:"b2'\<sharp>(a,M1,M2,N,b1,b2,a',b1')" by (rule exists_fresh(2),rule fin_supp, blast) have "Cut <a>.(AndR <b1>.M1 <b2>.M2 a) (y).(AndL1 (x).N y) = Cut <a'>.(AndR <b1>.M1 <b2>.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) done also have "… = Cut <a'>.(AndR <b1'>.([(b1',b1)]•M1) <b2'>.([(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 "… -->l Cut <b1'>.([(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) done also have "… = Cut <b1>.M1 (x).N" using f1 f2 f3 f4 f5 fs by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) finally show ?thesis by simp qed lemma better_LAnd2_intro[intro]: shows "[|a\<sharp>([b1].M1,[b2].M2); y\<sharp>[x].N|] ==> Cut <a>.(AndR <b1>.M1 <b2>.M2 a) (y).(AndL2 (x).N y) -->l Cut <b2>.M2 (x).N" proof - assume fs: "a\<sharp>([b1].M1,[b2].M2)" "y\<sharp>[x].N" obtain x'::"name" where f1: "x'\<sharp>(y,N,M1,M2,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain y'::"name" where f2: "y'\<sharp>(y,N,M1,M2,x,x')" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where f3: "a'\<sharp>(a,M1,M2,N,b1,b2)" by (rule exists_fresh(2), rule fin_supp, blast) obtain b1'::"coname" where f4:"b1'\<sharp>(a,M1,M2,N,b1,b2,a')" by (rule exists_fresh(2), rule fin_supp, blast) obtain b2'::"coname" where f5:"b2'\<sharp>(a,M1,M2,N,b1,b2,a',b1')" by (rule exists_fresh(2),rule fin_supp, blast) have "Cut <a>.(AndR <b1>.M1 <b2>.M2 a) (y).(AndL2 (x).N y) = Cut <a'>.(AndR <b1>.M1 <b2>.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) done also have "… = Cut <a'>.(AndR <b1'>.([(b1',b1)]•M1) <b2'>.([(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 "… -->l Cut <b2'>.([(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) done also have "… = Cut <b2>.M2 (x).N" using f1 f2 f3 f4 f5 fs by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) finally show ?thesis by simp qed lemma better_LOr1_intro[intro]: shows "[|y\<sharp>([x1].N1,[x2].N2); b\<sharp>[a].M|] ==> Cut <b>.(OrR1 <a>.M b) (y).(OrL (x1).N1 (x2).N2 y) -->l Cut <a>.M (x1).N1" proof - assume fs: "y\<sharp>([x1].N1,[x2].N2)" "b\<sharp>[a].M" obtain y'::"name" where f1: "y'\<sharp>(y,M,N1,N2,x1,x2)" by (rule exists_fresh(1), rule fin_supp, blast) obtain x1'::"name" where f2: "x1'\<sharp>(y,M,N1,N2,x1,x2,y')" by (rule exists_fresh(1), rule fin_supp, blast) obtain x2'::"name" where f3: "x2'\<sharp>(y,M,N1,N2,x1,x2,y',x1')" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where f4: "a'\<sharp>(a,N1,N2,M,b)" by (rule exists_fresh(2), rule fin_supp, blast) obtain b'::"coname" where f5: "b'\<sharp>(a,N1,N2,M,b,a')" by (rule exists_fresh(2),rule fin_supp, blast) have "Cut <b>.(OrR1 <a>.M b) (y).(OrL (x1).N1 (x2).N2 y) = Cut <b'>.(OrR1 <a>.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) done also have "… = Cut <b'>.(OrR1 <a'>.([(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 "… -->l Cut <a'>.([(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) done also have "… = Cut <a>.M (x1).N1" using f1 f2 f3 f4 f5 fs by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) finally show ?thesis by simp qed lemma better_LOr2_intro[intro]: shows "[|y\<sharp>([x1].N1,[x2].N2); b\<sharp>[a].M|] ==> Cut <b>.(OrR2 <a>.M b) (y).(OrL (x1).N1 (x2).N2 y) -->l Cut <a>.M (x2).N2" proof - assume fs: "y\<sharp>([x1].N1,[x2].N2)" "b\<sharp>[a].M" obtain y'::"name" where f1: "y'\<sharp>(y,M,N1,N2,x1,x2)" by (rule exists_fresh(1), rule fin_supp, blast) obtain x1'::"name" where f2: "x1'\<sharp>(y,M,N1,N2,x1,x2,y')" by (rule exists_fresh(1), rule fin_supp, blast) obtain x2'::"name" where f3: "x2'\<sharp>(y,M,N1,N2,x1,x2,y',x1')" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where f4: "a'\<sharp>(a,N1,N2,M,b)" by (rule exists_fresh(2), rule fin_supp, blast) obtain b'::"coname" where f5: "b'\<sharp>(a,N1,N2,M,b,a')" by (rule exists_fresh(2),rule fin_supp, blast) have "Cut <b>.(OrR2 <a>.M b) (y).(OrL (x1).N1 (x2).N2 y) = Cut <b'>.(OrR2 <a>.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) done also have "… = Cut <b'>.(OrR2 <a'>.([(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 "… -->l Cut <a'>.([(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) done also have "… = Cut <a>.M (x2).N2" using f1 f2 f3 f4 f5 fs by (auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) finally show ?thesis by simp qed lemma better_LImp_intro[intro]: shows "[|z\<sharp>(N,[y].P); b\<sharp>[a].M; a\<sharp>N|] ==> Cut <b>.(ImpR (x).<a>.M b) (z).(ImpL <c>.N (y).P z) -->l Cut <a>.(Cut <c>.N (x).M) (y).P" proof - assume fs: "z\<sharp>(N,[y].P)" "b\<sharp>[a].M" "a\<sharp>N" obtain y'::"name" where f1: "y'\<sharp>(y,M,N,P,z,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain x'::"name" where f2: "x'\<sharp>(y,M,N,P,z,x,y')" by (rule exists_fresh(1), rule fin_supp, blast) obtain z'::"name" where f3: "z'\<sharp>(y,M,N,P,z,x,y',x')" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where f4: "a'\<sharp>(a,N,P,M,b)" by (rule exists_fresh(2), rule fin_supp, blast) obtain b'::"coname" where f5: "b'\<sharp>(a,N,P,M,b,c,a')" by (rule exists_fresh(2),rule fin_supp, blast) obtain c'::"coname" where f6: "c'\<sharp>(a,N,P,M,b,c,a',b')" by (rule exists_fresh(2),rule fin_supp, blast) have " Cut <b>.(ImpR (x).<a>.M b) (z).(ImpL <c>.N (y).P z) = Cut <b'>.(ImpR (x).<a>.M b') (z').(ImpL <c>.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) done also have "… = Cut <b'>.(ImpR (x').<a'>.([(a',a)]•([(x',x)]•M)) b') (z').(ImpL <c'>.([(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 "… -->l Cut <a'>.(Cut <c'>.([(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) done also have "… = Cut <a>.(Cut <c>.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(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\<sharp>(a,b,M,N)" shows "M = [(a,c)]•[(b,c)]•N" using a apply(auto simp add: 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\<sharp>(x,y,M,N)" shows "M = [(x,z)]•[(y,z)]•N" using a apply(auto simp add: 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\<sharp>(x,y,M,N)" "a\<sharp>(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 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 <a>.M (x).N -->l R" shows "(∃b. R = M[a\<turnstile>c>b]) ∨ (∃y. R = N[x\<turnstile>n>y]) ∨ (∃y M' b N'. M = NotR (y).M' a ∧ N = NotL <b>.N' x ∧ R = Cut <b>.N' (y).M' ∧ fic M a ∧ fin N x) ∨ (∃b M1 c M2 y N'. M = AndR <b>.M1 <c>.M2 a ∧ N = AndL1 (y).N' x ∧ R = Cut <b>.M1 (y).N' ∧ fic M a ∧ fin N x) ∨ (∃b M1 c M2 y N'. M = AndR <b>.M1 <c>.M2 a ∧ N = AndL2 (y).N' x ∧ R = Cut <c>.M2 (y).N' ∧ fic M a ∧ fin N x) ∨ (∃b N' z M1 y M2. M = OrR1 <b>.N' a ∧ N = OrL (z).M1 (y).M2 x ∧ R = Cut <b>.N' (z).M1 ∧ fic M a ∧ fin N x) ∨ (∃b N' z M1 y M2. M = OrR2 <b>.N' a ∧ N = OrL (z).M1 (y).M2 x ∧ R = Cut <b>.N' (y).M2 ∧ fic M a ∧ fin N x) ∨ (∃z b M' c N1 y N2. M = ImpR (z).<b>.M' a ∧ N = ImpL <c>.N1 (y).N2 x ∧ R = Cut <b>.(Cut <c>.N1 (z).M') (y).N2 ∧ b\<sharp>(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(perm_simp)+ done inductive c_redu :: "trm => trm => bool" ("_ -->c _" [100,100] 100) where left[intro]: "[|¬fic M a; a\<sharp>N; x\<sharp>M|] ==> Cut <a>.M (x).N -->c M{a:=(x).N}" | right[intro]: "[|¬fin N x; a\<sharp>N; x\<sharp>M|] ==> Cut <a>.M (x).N -->c N{x:=<a>.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 <a>.M (x).N -->c M{a:=(x).N}" proof - assume not_fic: "¬fic M a" obtain x'::"name" where fs1: "x'\<sharp>(N,M,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\<sharp>(a,M,N)" by (rule exists_fresh(2), rule fin_supp, blast) have "Cut <a>.M (x).N = Cut <a'>.([(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) also have "… -->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 <a>.M (x).N -->c N{x:=<a>.M}" proof - assume not_fin: "¬fin N x" obtain x'::"name" where fs1: "x'\<sharp>(N,M,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\<sharp>(a,M,N)" by (rule exists_fresh(2), rule fin_supp, blast) have "Cut <a>.M (x).N = Cut <a'>.([(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) also have "… -->c ([(x',x)]•N){x':=<a'>.([(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:=<a>.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 -->c M' ==> x\<sharp>M ==> x\<sharp>M'" and "M -->c M' ==> c\<sharp>M ==> c\<sharp>M'" apply - apply(induct rule: c_redu.induct) apply(auto simp add: abs_fresh rename_fresh subst_fresh) apply(induct rule: c_redu.induct) apply(auto simp add: abs_fresh rename_fresh subst_fresh) done inductive a_redu :: "trm => trm => bool" ("_ -->a _" [100,100] 100) where al_redu[intro]: "M-->l M' ==> M -->a M'" | ac_redu[intro]: "M-->c M' ==> M -->a M'" | a_Cut_l: "[|a\<sharp>N; x\<sharp>M; M-->a M'|] ==> Cut <a>.M (x).N -->a Cut <a>.M' (x).N" | a_Cut_r: "[|a\<sharp>N; x\<sharp>M; N-->a N'|] ==> Cut <a>.M (x).N -->a Cut <a>.M (x).N'" | a_NotL[intro]: "M-->a M' ==> NotL <a>.M x -->a NotL <a>.M' x" | a_NotR[intro]: "M-->a M' ==> NotR (x).M a -->a NotR (x).M' a" | a_AndR_l: "[|a\<sharp>(N,c); b\<sharp>(M,c); b≠a; M-->a M'|] ==> AndR <a>.M <b>.N c -->a AndR <a>.M' <b>.N c" | a_AndR_r: "[|a\<sharp>(N,c); b\<sharp>(M,c); b≠a; N-->a N'|] ==> AndR <a>.M <b>.N c -->a AndR <a>.M <b>.N' c" | a_AndL1: "[|x\<sharp>y; M-->a M'|] ==> AndL1 (x).M y -->a AndL1 (x).M' y" | a_AndL2: "[|x\<sharp>y; M-->a M'|] ==> AndL2 (x).M y -->a AndL2 (x).M' y" | a_OrL_l: "[|x\<sharp>(N,z); y\<sharp>(M,z); y≠x; M-->a M'|] ==> OrL (x).M (y).N z -->a OrL (x).M' (y).N z" | a_OrL_r: "[|x\<sharp>(N,z); y\<sharp>(M,z); y≠x; N-->a N'|] ==> OrL (x).M (y).N z -->a OrL (x).M (y).N' z" | a_OrR1: "[|a\<sharp>b; M-->a M'|] ==> OrR1 <a>.M b -->a OrR1 <a>.M' b" | a_OrR2: "[|a\<sharp>b; M-->a M'|] ==> OrR2 <a>.M b -->a OrR2 <a>.M' b" | a_ImpL_l: "[|a\<sharp>N; x\<sharp>(M,y); M-->a M'|] ==> ImpL <a>.M (x).N y -->a ImpL <a>.M' (x).N y" | a_ImpL_r: "[|a\<sharp>N; x\<sharp>(M,y); N-->a N'|] ==> ImpL <a>.M (x).N y -->a ImpL <a>.M (x).N' y" | a_ImpR: "[|a\<sharp>b; M-->a M'|] ==> ImpR (x).<a>.M b -->a ImpR (x).<a>.M' b" lemma fresh_a_redu: fixes x::"name" and c::"coname" shows "M -->a M' ==> x\<sharp>M ==> x\<sharp>M'" and "M -->a M' ==> c\<sharp>M ==> c\<sharp>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(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) 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-->a M' ==> Cut <a>.M (x).N -->a Cut <a>.M' (x).N" proof - assume red: "M-->a M'" obtain x'::"name" where fs1: "x'\<sharp>(M,N,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast) have "Cut <a>.M (x).N = Cut <a'>.([(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) also have "… -->a Cut <a'>.([(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 <a>.M' (x).N" using fs1 fs2 red by (auto simp add: 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-->a N' ==> Cut <a>.M (x).N -->a Cut <a>.M (x).N'" proof - assume red: "N-->a N'" obtain x'::"name" where fs1: "x'\<sharp>(M,N,x)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast) have "Cut <a>.M (x).N = Cut <a'>.([(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) also have "… -->a Cut <a'>.([(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 <a>.M (x).N'" using fs1 fs2 red by (auto simp add: 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-->a M' ==> AndR <a>.M <b>.N c -->a AndR <a>.M' <b>.N c" proof - assume red: "M-->a M'" obtain b'::"coname" where fs1: "b'\<sharp>(M,N,a,b,c)" by (rule exists_fresh(2), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,b,c,b')" by (rule exists_fresh(2), rule fin_supp, blast) have "AndR <a>.M <b>.N c = AndR <a'>.([(a',a)]•M) <b'>.([(b',b)]•N) c" using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "… -->a AndR <a'>.([(a',a)]•M') <b'>.([(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 <a>.M' <b>.N c" using fs1 fs2 red by (auto simp add: 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-->a N' ==> AndR <a>.M <b>.N c -->a AndR <a>.M <b>.N' c" proof - assume red: "N-->a N'" obtain b'::"coname" where fs1: "b'\<sharp>(M,N,a,b,c)" by (rule exists_fresh(2), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a,b,c,b')" by (rule exists_fresh(2), rule fin_supp, blast) have "AndR <a>.M <b>.N c = AndR <a'>.([(a',a)]•M) <b'>.([(b',b)]•N) c" using fs1 fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "… -->a AndR <a'>.([(a',a)]•M) <b'>.([(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 <a>.M <b>.N' c" using fs1 fs2 red by (auto simp add: 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-->a M' ==> AndL1 (x).M y -->a AndL1 (x).M' y" proof - assume red: "M-->a M'" obtain x'::"name" where fs1: "x'\<sharp>(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) also have "… -->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) finally show ?thesis by simp qed lemma better_AndL2_intro[intro]: shows "M-->a M' ==> AndL2 (x).M y -->a AndL2 (x).M' y" proof - assume red: "M-->a M'" obtain x'::"name" where fs1: "x'\<sharp>(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) also have "… -->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) finally show ?thesis by simp qed lemma better_OrLL_intro[intro]: shows "M-->a M' ==> OrL (x).M (y).N z -->a OrL (x).M' (y).N z" proof - assume red: "M-->a M'" obtain x'::"name" where fs1: "x'\<sharp>(M,N,x,y,z)" by (rule exists_fresh(1), rule fin_supp, blast) obtain y'::"name" where fs2: "y'\<sharp>(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) also have "… -->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) finally show ?thesis by simp qed lemma better_OrLR_intro[intro]: shows "N-->a N' ==> OrL (x).M (y).N z -->a OrL (x).M (y).N' z" proof - assume red: "N-->a N'" obtain x'::"name" where fs1: "x'\<sharp>(M,N,x,y,z)" by (rule exists_fresh(1), rule fin_supp, blast) obtain y'::"name" where fs2: "y'\<sharp>(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) also have "… -->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) finally show ?thesis by simp qed lemma better_OrR1_intro[intro]: shows "M-->a M' ==> OrR1 <a>.M b -->a OrR1 <a>.M' b" proof - assume red: "M-->a M'" obtain a'::"coname" where fs1: "a'\<sharp>(M,b,a)" by (rule exists_fresh(2), rule fin_supp, blast) have "OrR1 <a>.M b = OrR1 <a'>.([(a',a)]•M) b" using fs1 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "… -->a OrR1 <a'>.([(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 <a>.M' b" using fs1 red by (auto simp add: 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-->a M' ==> OrR2 <a>.M b -->a OrR2 <a>.M' b" proof - assume red: "M-->a M'" obtain a'::"coname" where fs1: "a'\<sharp>(M,b,a)" by (rule exists_fresh(2), rule fin_supp, blast) have "OrR2 <a>.M b = OrR2 <a'>.([(a',a)]•M) b" using fs1 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "… -->a OrR2 <a'>.([(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 <a>.M' b" using fs1 red by (auto simp add: 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-->a M' ==> ImpL <a>.M (x).N y -->a ImpL <a>.M' (x).N y" proof - assume red: "M-->a M'" obtain x'::"name" where fs1: "x'\<sharp>(M,N,x,y)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast) have "ImpL <a>.M (x).N y = ImpL <a'>.([(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) also have "… -->a ImpL <a'>.([(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 <a>.M' (x).N y" using fs1 fs2 red by (auto simp add: 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-->a N' ==> ImpL <a>.M (x).N y -->a ImpL <a>.M (x).N' y" proof - assume red: "N-->a N'" obtain x'::"name" where fs1: "x'\<sharp>(M,N,x,y)" by (rule exists_fresh(1), rule fin_supp, blast) obtain a'::"coname" where fs2: "a'\<sharp>(M,N,a)" by (rule exists_fresh(2), rule fin_supp, blast) have "ImpL <a>.M (x).N y = ImpL <a'>.([(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) also have "… -->a ImpL <a'>.([(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 <a>.M (x).N' y" using fs1 fs2 red by (auto simp add: 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-->a M' ==> ImpR (x).<a>.M b -->a ImpR (x).<a>.M' b" proof - assume red: "M-->a M'" obtain a'::"coname" where fs2: "a'\<sharp>(M,a,b)" by (rule exists_fresh(2), rule fin_supp, blast) have "ImpR (x).<a>.M b = ImpR (x).<a'>.([(a',a)]•M) b" using fs2 by (rule_tac sym, auto simp add: trm.inject alpha fresh_atm fresh_prod calc_atm) also have "… -->a ImpR (x).<a'>.([(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).<a>.M' b" using fs2 red by (auto simp add: 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 -->l M ==> False" by (erule_tac l_redu.cases) (simp_all add: trm.inject) lemma ax_do_not_c_reduce: shows "Ax x a -->c M ==> False" by (erule_tac c_redu.cases) (simp_all add: trm.inject) lemma ax_do_not_a_reduce: shows "Ax x a -->a M ==> False" apply(erule_tac a_redu.cases) apply(auto simp add: 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 <a>.M x -->a R" shows "∃M'. R = NotL <a>.M' x ∧ M-->aM'" using a 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 1) 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(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(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(simp add: perm_swap) done lemma a_redu_NotR_elim: assumes a: "NotR (x).M a -->a R" shows "∃M'. R = NotR (x).M' a ∧ M-->aM'" using a 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 1) 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(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(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(simp add: perm_swap) done lemma a_redu_AndR_elim: assumes a: "AndR <a>.M <b>.N c-->a R" shows "(∃M'. R = AndR <a>.M' <b>.N c ∧ M-->aM') ∨ (∃N'. R = AndR <a>.M <b>.N' c ∧ N-->aN')" using a 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(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(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(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(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 disjI2) apply(auto simp add: 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(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(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(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(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(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(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(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(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(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(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(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(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 disjI2) apply(auto simp add: 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(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(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(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(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(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] done lemma a_redu_AndL1_elim: assumes a: "AndL1 (x).M y -->a R" shows "∃M'. R = AndL1 (x).M' y ∧ M-->aM'" using a 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(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(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(simp add: perm_swap) done lemma a_redu_AndL2_elim: assumes a: "AndL2 (x).M y -->a R" shows "∃M'. R = AndL2 (x).M' y ∧ M-->aM'" using a 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(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(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(simp add: perm_swap) done lemma a_redu_OrL_elim: assumes a: "OrL (x).M (y).N z-->a R" shows "(∃M'. R = OrL (x).M' (y).N z ∧ M-->aM') ∨ (∃N'. R = OrL (x).M (y).N' z ∧ N-->aN')" using a 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(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(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(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(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 disjI2) apply(auto simp add: 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(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(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(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(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(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(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(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(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(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(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(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(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 disjI2) apply(auto simp add: 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(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(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(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(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(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] done lemma a_redu_OrR1_elim: assumes a: "OrR1 <a>.M b -->a R" shows "∃M'. R = OrR1 <a>.M' b ∧ M-->aM'" using a 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(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(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(simp add: perm_swap) done lemma a_redu_OrR2_elim: assumes a: "OrR2 <a>.M b -->a R" shows "∃M'. R = OrR2 <a>.M' b ∧ M-->aM'" using a 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(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(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(simp add: perm_swap) done lemma a_redu_ImpL_elim: assumes a: "ImpL <a>.M (y).N z-->a R" shows "(∃M'. R = ImpL <a>.M' (y).N z ∧ M-->aM') ∨ (∃N'. R = ImpL <a>.M (y).N' z ∧ N-->aN')" using a 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(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(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(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(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 disjI2) apply(auto simp add: 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(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(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(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(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(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(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(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(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 disjI2) apply(auto simp add: 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(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(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(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] done lemma a_redu_ImpR_elim: assumes a: "ImpR (x).<a>.M b -->a R" shows "∃M'. R = ImpR (x).<a>.M' b ∧ M-->aM'" using a 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 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(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(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(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(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(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(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(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(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(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(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" ("_ -->a* _" [100,100] 100) where "M -->a* M' ≡ (a_redu)^** M M'" lemma a_starI: assumes a: "M -->a M'" shows "M -->a* M'" using a by blast lemma a_starE: assumes a: "M -->a* M'" shows "M = M' ∨ (∃N. M -->a N ∧ N -->a* M')" using a by (induct) (auto) lemma a_star_refl: shows "M -->a* M" by blast lemma a_star_trans[trans]: assumes a1: "M1-->a* M2" and a2: "M2-->a* M3" shows "M1 -->a* M3" using a2 a1 by (induct) (auto) text {* congruence rules for -->a* *} lemma ax_do_not_a_star_reduce: shows "Ax x a -->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 -->a* M' ==> Cut <a>.M (x).N -->a* Cut <a>.M' (x).N" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_CutR: "N -->a* N'==> Cut <a>.M (x).N -->a* Cut <a>.M (x).N'" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_Cut: "[|M -->a* M'; N -->a* N'|] ==> Cut <a>.M (x).N -->a* Cut <a>.M' (x).N'" by (blast intro!: a_star_CutL a_star_CutR intro: rtranclp_trans) lemma a_star_NotR: "M -->a* M' ==> NotR (x).M a -->a* NotR (x).M' a" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_NotL: "M -->a* M' ==> NotL <a>.M x -->a* NotL <a>.M' x" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_AndRL: "M -->a* M'==> AndR <a>.M <b>.N c -->a* AndR <a>.M' <b>.N c" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_AndRR: "N -->a* N'==> AndR <a>.M <b>.N c -->a* AndR <a>.M <b>.N' c" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_AndR: "[|M -->a* M'; N -->a* N'|] ==> AndR <a>.M <b>.N c -->a* AndR <a>.M' <b>.N' c" by (blast intro!: a_star_AndRL a_star_AndRR intro: rtranclp_trans) lemma a_star_AndL1: "M -->a* M' ==> AndL1 (x).M y -->a* AndL1 (x).M' y" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_AndL2: "M -->a* M' ==> AndL2 (x).M y -->a* AndL2 (x).M' y" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_OrLL: "M -->a* M'==> OrL (x).M (y).N z -->a* OrL (x).M' (y).N z" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_OrLR: "N -->a* N'==> OrL (x).M (y).N z -->a* OrL (x).M (y).N' z" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_OrL: "[|M -->a* M'; N -->a* N'|] ==> OrL (x).M (y).N z -->a* OrL (x).M' (y).N' z" by (blast intro!: a_star_OrLL a_star_OrLR intro: rtranclp_trans) lemma a_star_OrR1: "M -->a* M' ==> OrR1 <a>.M b -->a* OrR1 <a>.M' b" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_OrR2: "M -->a* M' ==> OrR2 <a>.M b -->a* OrR2 <a>.M' b" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_ImpLL: "M -->a* M'==> ImpL <a>.M (y).N z -->a* ImpL <a>.M' (y).N z" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_ImpLR: "N -->a* N'==> ImpL <a>.M (y).N z -->a* ImpL <a>.M (y).N' z" by (induct set: rtranclp) (blast intro: rtranclp.rtrancl_into_rtrancl)+ lemma a_star_ImpL: "[|M -->a* M'; N -->a* N'|] ==> ImpL <a>.M (y).N z -->a* ImpL <a>.M' (y).N' z" by (blast intro!: a_star_ImpLL a_star_ImpLR intro: rtranclp_trans) lemma a_star_ImpR: "M -->a* M' ==> ImpR (x).<a>.M b -->a* ImpR (x).<a>.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 <a>.M x -->a* R" shows "∃M'. R = NotL <a>.M' x ∧ M -->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 -->a* R" shows "∃M'. R = NotR (x).M' a ∧ M -->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 <a>.M <b>.N c-->a* R" shows "(∃M' N'. R = AndR <a>.M' <b>.N' c ∧ M -->a* M' ∧ N -->a* N')" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_AndR_elim) apply(auto simp add: alpha trm.inject) done lemma a_star_redu_AndL1_elim: assumes a: "AndL1 (x).M y -->a* R" shows "∃M'. R = AndL1 (x).M' y ∧ M -->a* M'" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_AndL1_elim) apply(auto simp add: alpha trm.inject) done lemma a_star_redu_AndL2_elim: assumes a: "AndL2 (x).M y -->a* R" shows "∃M'. R = AndL2 (x).M' y ∧ M -->a* M'" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_AndL2_elim) apply(auto simp add: alpha trm.inject) done lemma a_star_redu_OrL_elim: assumes a: "OrL (x).M (y).N z -->a* R" shows "(∃M' N'. R = OrL (x).M' (y).N' z ∧ M -->a* M' ∧ N -->a* N')" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_OrL_elim) apply(auto simp add: alpha trm.inject) done lemma a_star_redu_OrR1_elim: assumes a: "OrR1 <a>.M y -->a* R" shows "∃M'. R = OrR1 <a>.M' y ∧ M -->a* M'" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_OrR1_elim) apply(auto simp add: alpha trm.inject) done lemma a_star_redu_OrR2_elim: assumes a: "OrR2 <a>.M y -->a* R" shows "∃M'. R = OrR2 <a>.M' y ∧ M -->a* M'" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_OrR2_elim) apply(auto simp add: alpha trm.inject) done lemma a_star_redu_ImpR_elim: assumes a: "ImpR (x).<a>.M y -->a* R" shows "∃M'. R = ImpR (x).<a>.M' y ∧ M -->a* M'" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_ImpR_elim) apply(auto simp add: alpha trm.inject) done lemma a_star_redu_ImpL_elim: assumes a: "ImpL <a>.M (y).N z -->a* R" shows "(∃M' N'. R = ImpL <a>.M' (y).N' z ∧ M -->a* M' ∧ N -->a* N')" using a apply(induct set: rtranclp) apply(auto) apply(drule a_redu_ImpL_elim) apply(auto simp add: alpha trm.inject) done text {* Substitution *} lemma subst_not_fin1: shows "¬fin(M{x:=<c>.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'\<sharp>(trm{x:=<c>.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'\<sharp>(trm{x:=<c>.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'\<sharp>(trm{x:=<c>.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'\<sharp>(trm1{x:=<c>.P},P,name1,trm2{x:=<c>.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'\<sharp>(trm1{name2:=<c>.P},P,name1,trm2{name2:=<c>.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'\<sharp>(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(auto)[1] apply(drule freshn_after_substc) apply(simp add: fin.intros) apply(subgoal_tac "∃c'::coname. c'\<sharp>(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(auto)[1] 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(auto)[1] 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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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:=<b>.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(auto)[1] apply(drule freshc_after_substn) apply(simp add: fic.intros) apply(subgoal_tac "∃x'::name. x'\<sharp>(trm{x:=<b>.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'\<sharp>(trm{x:=<b>.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'\<sharp>(trm{x:=<b>.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(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, simp) 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'\<sharp>(trm1{x:=<b>.P},P,name1,trm2{x:=<b>.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(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'\<sharp>(trm1{name2:=<b>.P},trm2{name2:=<b>.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 -->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 -->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 -->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 -->a* M'" shows "fin M' x" using b a apply(induct set: rtranclp) apply(auto simp add: fin_a_reduce) done lemma fic_l_reduce: assumes a: "fic M x" and b: "M -->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 -->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 -->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 -->a* M'" shows "fic M' x" using b a apply(induct set: rtranclp) apply(auto simp add: fic_a_reduce) done text {* substitution properties *} lemma subst_with_ax1: shows "M{x:=<a>.Ax y a} -->a* M[x\<turnstile>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:=<a>.Ax y a} -->a* (Ax z b)[x\<turnstile>n>y]" proof (cases "z=x") case True assume eq: "z=x" have "(Ax z b){x:=<a>.Ax y a} = Cut <a>.Ax y a (x).Ax x b" using eq by simp also have "… -->a* (Ax x b)[x\<turnstile>n>y]" by blast finally show "Ax z b{x:=<a>.Ax y a} -->a* (Ax z b)[x\<turnstile>n>y]" using eq by simp next case False assume neq: "z≠x" then show "(Ax z b){x:=<a>.Ax y a} -->a* (Ax z b)[x\<turnstile>n>y]" using neq by simp qed next case (Cut b M z N x a y) have fs: "b\<sharp>x" "b\<sharp>a" "b\<sharp>y" "b\<sharp>N" "z\<sharp>x" "z\<sharp>a" "z\<sharp>y" "z\<sharp>M" by fact+ have ih1: "M{x:=<a>.Ax y a} -->a* M[x\<turnstile>n>y]" by fact have ih2: "N{x:=<a>.Ax y a} -->a* N[x\<turnstile>n>y]" by fact show "(Cut <b>.M (z).N){x:=<a>.Ax y a} -->a* (Cut <b>.M (z).N)[x\<turnstile>n>y]" proof (cases "M = Ax x b") case True assume eq: "M = Ax x b" have "(Cut <b>.M (z).N){x:=<a>.Ax y a} = Cut <a>.Ax y a (z).(N{x:=<a>.Ax y a})" using fs eq by simp also have "… -->a* Cut <a>.Ax y a (z).(N[x\<turnstile>n>y])" using ih2 a_star_congs by blast also have "… = Cut <b>.(M[x\<turnstile>n>y]) (z).(N[x\<turnstile>n>y])" using eq by (simp add: trm.inject alpha calc_atm fresh_atm) finally show "(Cut <b>.M (z).N){x:=<a>.Ax y a} -->a* (Cut <b>.M (z).N)[x\<turnstile>n>y]" using fs by simp next case False assume neq: "M ≠ Ax x b" have "(Cut <b>.M (z).N){x:=<a>.Ax y a} = Cut <b>.(M{x:=<a>.Ax y a}) (z).(N{x:=<a>.Ax y a})" using fs neq by simp also have "… -->a* Cut <b>.(M[x\<turnstile>n>y]) (z).(N[x\<turnstile>n>y])" using ih1 ih2 a_star_congs by blast finally show "(Cut <b>.M (z).N){x:=<a>.Ax y a} -->a* (Cut <b>.M (z).N)[x\<turnstile>n>y]" using fs by simp qed next case (NotR z M b x a y) have fs: "z\<sharp>x" "z\<sharp>a" "z\<sharp>y" "z\<sharp>b" by fact+ have ih: "M{x:=<a>.Ax y a} -->a* M[x\<turnstile>n>y]" by fact have "(NotR (z).M b){x:=<a>.Ax y a} = NotR (z).(M{x:=<a>.Ax y a}) b" using fs by simp also have "… -->a* NotR (z).(M[x\<turnstile>n>y]) b" using ih by (auto intro: a_star_congs) finally show "(NotR (z).M b){x:=<a>.Ax y a} -->a* (NotR (z).M b)[x\<turnstile>n>y]" using fs by simp next case (NotL b M z x a y) have fs: "b\<sharp>x" "b\<sharp>a" "b\<sharp>y" "b\<sharp>z" by fact+ have ih: "M{x:=<a>.Ax y a} -->a* M[x\<turnstile>n>y]" by fact show "(NotL <b>.M z){x:=<a>.Ax y a} -->a* (NotL <b>.M z)[x\<turnstile>n>y]" proof(cases "z=x") case True assume eq: "z=x" obtain x'::"name" where new: "x'\<sharp>(Ax y a,M{x:=<a>.Ax y a})" by (rule exists_fresh(1)[OF fs_name1]) have "(NotL <b>.M z){x:=<a>.Ax y a} = fresh_fun (λx'. Cut <a>.Ax y a (x').NotL <b>.(M{x:=<a>.Ax y a}) x')" using eq fs by simp also have "… = Cut <a>.Ax y a (x').NotL <b>.(M{x:=<a>.Ax y a}) x'" using new by (simp add: fresh_fun_simp_NotL fresh_prod) also have "… -->a* (NotL <b>.(M{x:=<a>.Ax y a}) x')[x'\<turnstile>n>y]" using new apply(rule_tac a_starI) apply(rule al_redu) apply(rule better_LAxL_intro) apply(auto) done also have "… = NotL <b>.(M{x:=<a>.Ax y a}) y" using new by (simp add: nrename_fresh) also have "… -->a* NotL <b>.(M[x\<turnstile>n>y]) y" using ih by (auto intro: a_star_congs) also have "… = (NotL <b>.M z)[x\<turnstile>n>y]" using eq by simp finally show "(NotL <b>.M z){x:=<a>.Ax y a} -->a* (NotL <b>.M z)[x\<turnstile>n>y]" by simp next case False assume neq: "z≠x" have "(NotL <b>.M z){x:=<a>.Ax y a} = NotL <b>.(M{x:=<a>.Ax y a}) z" using fs neq by simp also have "… -->a* NotL <b>.(M[x\<turnstile>n>y]) z" using ih by (auto intro: a_star_congs) finally show "(NotL <b>.M z){x:=<a>.Ax y a} -->a* (NotL <b>.M z)[x\<turnstile>n>y]" using neq by simp qed next case (AndR c M d N e x a y) have fs: "c\<sharp>x" "c\<sharp>a" "c\<sharp>y" "d\<sharp>x" "d\<sharp>a" "d\<sharp>y" "d≠c" "c\<sharp>N" "c\<sharp>e" "d\<sharp>M" "d\<sharp>e" by fact+ have ih1: "M{x:=<a>.Ax y a} -->a* M[x\<turnstile>n>y]" by fact have ih2: "N{x:=<a>.Ax y a} -->a* N[x\<turnstile>n>y]" by fact have "(AndR <c>.M <d>.N e){x:=<a>.Ax y a} = AndR <c>.(M{x:=<a>.Ax y a}) <d>.(N{x:=<a>.Ax y a}) e" using fs by simp also have "… -->a* AndR <c>.(M[x\<turnstile>n>y]) <d>.(N[x\<turnstile>n>y]) e" using ih1 ih2 by (auto intro: a_star_congs) finally show "(AndR <c>.M <d>.N e){x:=<a>.Ax y a} -->a* (AndR <c>.M <d>.N e)[x\<turnstile>n>y]" using fs by simp next case (AndL1 u M v x a y) have fs: "u\<sharp>x" "u\<sharp>a" "u\<sharp>y" "u\<sharp>v" by fact+ have ih: "M{x:=<a>.Ax y a} -->a* M[x\<turnstile>n>y]" by fact show "(AndL1 (u).M v){x:=<a>.Ax y a} -->a* (AndL1 (u).M v)[x\<turnstile>n>y]" proof(cases "v=x") case True assume eq: "v=x" obtain v'::"name" where new: "v'\<sharp>(Ax y a,M{x:=<a>.Ax y a},u)" by (rule exists_fresh(1)[OF fs_name1]) have "(AndL1 (u).M v){x:=<a>.Ax y a} = fresh_fun (λv'. Cut <a>.Ax y a (v').AndL1 (u).(M{x:=<a>.Ax y a}) v')" using eq fs by simp also have "… = Cut <a>.Ax y a (v').AndL1 (u).(M{x:=<a>.Ax y a}) v'" using new by (simp add: fresh_fun_simp_AndL1 fresh_prod) also have "… -->a* (AndL1 (u).(M{x:=<a>.Ax y a}) v')[v'\<turnstile>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:=<a>.Ax y a}) y" using fs new by (auto simp add: fresh_prod fresh_atm nrename_fresh) also have "… -->a* AndL1 (u).(M[x\<turnstile>n>y]) y" using ih by (auto intro: a_star_congs) also have "… = (AndL1 (u).M v)[x\<turnstile>n>y]" using eq fs by simp finally show "(AndL1 (u).M v){x:=<a>.Ax y a} -->a* (AndL1 (u).M v)[x\<turnstile>n>y]" by simp next case False assume neq: "v≠x" have "(AndL1 (u).M v){x:=<a>.Ax y a} = AndL1 (u).(M{x:=<a>.Ax y a}) v" using fs neq by simp also have "… -->a* AndL1 (u).(M[x\<turnstile>n>y]) v" using ih by (auto intro: a_star_congs) finally show "(AndL1 (u).M v){x:=<a>.Ax y a} -->a* (AndL1 (u).M v)[x\<turnstile>n>y]" using fs neq by simp qed next case (AndL2 u M v x a y) have fs: "u\<sharp>x" "u\<sharp>a" "u\<sharp>y" "u\<sharp>v" by fact+ have ih: "M{x:=<a>.Ax y a} -->a* M[x\<turnstile>n>y]" by fact show "(AndL2 (u).M v){x:=<a>.Ax y a} -->a* (AndL2 (u).M v)[x\<turnstile>n>y]" proof(cases "v=x") case True assume eq: "v=x" obtain v'::"name" where new: "v'\<sharp>(Ax y a,M{x:=<a>.Ax y a},u)" by (rule exists_fresh(1)[OF fs_name1]) have "(AndL2 (u).M v){x:=<a>.Ax y a} = fresh_fun (λv'. Cut <a>.Ax y a (v').AndL2 (u).(M{x:=<a>.Ax y a}) v')" using eq fs by simp also have "… = Cut <a>.Ax y a (v').AndL2 (u).(M{x:=<a>.Ax y a}) v'" using new by (simp add: fresh_fun_simp_AndL2 fresh_prod) also have "… -->a* (AndL2 (u).(M{x:=<a>.Ax y a}) v')[v'\<turnstile>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:=<a>.Ax y a}) y" using fs new by (auto simp add: fresh_prod fresh_atm nrename_fresh) also have "… -->a* AndL2 (u).(M[x\<turnstile>n>y]) y" using ih by (auto intro: a_star_congs) also have "… = (AndL2 (u).M v)[x\<turnstile>n>y]" using eq fs by simp finally show "(AndL2 (u).M v){x:=<a>.Ax y a} -->a* (AndL2 (u).M v)[x\<turnstile>n>y]" by simp next case False assume neq: "v≠x" have "(AndL2 (u).M v){x:=<a>.Ax y a} = AndL2 (u).(M{x:=<a>.Ax y a}) v" using fs neq by simp also have "… -->a* AndL2 (u).(M[x\<turnstile>n>y]) v" using ih by (auto intro: a_star_congs) finally show "(AndL2 (u).M v){x:=<a>.Ax y a} -->a* (AndL2 (u).M v)[x\<turnstile>n>y]" using fs neq by simp qed next case (OrR1 c M d x a y) have fs: "c\<sharp>x" "c\<sharp>a" "c\<sharp>y" "c\<sharp>d" by fact+ have ih: "M{x:=<a>.Ax y a} -->a* M[x\<turnstile>n>y]" by fact have "(OrR1 <c>.M d){x:=<a>.Ax y a} = OrR1 <c>.(M{x:=<a>.Ax y a}) d" using fs by (simp add: fresh_atm) also have "… -->a* OrR1 <c>.(M[x\<turnstile>n>y]) d" using ih by (auto intro: a_star_congs) finally show "(OrR1 <c>.M d){x:=<a>.Ax y a} -->a* (OrR1 <c>.M d)[x\<turnstile>n>y]" using fs by simp next case (OrR2 c M d x a y) have fs: "c\<sharp>x" "c\<sharp>a" "c\<sharp>y" "c\<sharp>d" by fact+ have ih: "M{x:=<a>.Ax y a} -->a* M[x\<turnstile>n>y]" by fact have "(OrR2 <c>.M d){x:=<a>.Ax y a} = OrR2 <c>.(M{x:=<a>.Ax y a}) d" using fs by (simp add: fresh_atm) also have "… -->a* OrR2 <c>.(M[x\<turnstile>n>y]) d" using ih by (auto intro: a_star_congs) finally show "(OrR2 <c>.M d){x:=<a>.Ax y a} -->a* (OrR2 <c>.M d)[x\<turnstile>n>y]" using fs by simp next case (OrL u M v N z x a y) have fs: "u\<sharp>x" "u\<sharp>a" "u\<sharp>y" "v\<sharp>x" "v\<sharp>a" "v\<sharp>y" "v≠u" "u\<sharp>N" "u\<sharp>z" "v\<sharp>M" "v\<sharp>z" by fact+ have ih1: "M{x:=<a>.Ax y a} -->a* M[x\<turnstile>n>y]" by fact have ih2: "N{x:=<a>.Ax y a} -->a* N[x\<turnstile>n>y]" by fact show "(OrL (u).M (v).N z){x:=<a>.Ax y a} -->a* (OrL (u).M (v).N z)[x\<turnstile>n>y]" proof(cases "z=x") case True assume eq: "z=x" obtain z'::"name" where new: "z'\<sharp>(Ax y a,M{x:=<a>.Ax y a},N{x:=<a>.Ax y a},u,v,y,a)" by (rule exists_fresh(1)[OF fs_name1]) have "(OrL (u).M (v).N z){x:=<a>.Ax y a} = fresh_fun (λz'. Cut <a>.Ax y a (z').OrL (u).(M{x:=<a>.Ax y a}) (v).(N{x:=<a>.Ax y a}) z')" using eq fs by simp also have "… = Cut <a>.Ax y a (z').OrL (u).(M{x:=<a>.Ax y a}) (v).(N{x:=<a>.Ax y a}) z'" using new by (simp add: fresh_fun_simp_OrL) also have "… -->a* (OrL (u).(M{x:=<a>.Ax y a}) (v).(N{x:=<a>.Ax y a}) z')[z'\<turnstile>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:=<a>.Ax y a}) (v).(N{x:=<a>.Ax y a}) y" using fs new by (auto simp add: fresh_prod fresh_atm nrename_fresh subst_fresh) also have "… -->a* OrL (u).(M[x\<turnstile>n>y]) (v).(N[x\<turnstile>n>y]) y" using ih1 ih2 by (auto intro: a_star_congs) also have "… = (OrL (u).M (v).N z)[x\<turnstile>n>y]" using eq fs by simp finally show "(OrL (u).M (v).N z){x:=<a>.Ax y a} -->a* (OrL (u).M (v).N z)[x\<turnstile>n>y]" by simp next case False assume neq: "z≠x" have "(OrL (u).M (v).N z){x:=<a>.Ax y a} = OrL (u).(M{x:=<a>.Ax y a}) (v).(N{x:=<a>.Ax y a}) z" using fs neq by simp also have "… -->a* OrL (u).(M[x\<turnstile>n>y]) (v).(N[x\<turnstile>n>y]) z" using ih1 ih2 by (auto intro: a_star_congs) finally show "(OrL (u).M (v).N z){x:=<a>.Ax y a} -->a* (OrL (u).M (v).N z)[x\<turnstile>n>y]" using fs neq by simp qed next case (ImpR z c M d x a y) have fs: "z\<sharp>x" "z\<sharp>a" "z\<sharp>y" "c\<sharp>x" "c\<sharp>a" "c\<sharp>y" "z\<sharp>d" "c\<sharp>d" by fact+ have ih: "M{x:=<a>.Ax y a} -->a* M[x\<turnstile>n>y]" by fact have "(ImpR (z).<c>.M d){x:=<a>.Ax y a} = ImpR (z).<c>.(M{x:=<a>.Ax y a}) d" using fs by simp also have "… -->a* ImpR (z).<c>.(M[x\<turnstile>n>y]) d" using ih by (auto intro: a_star_congs) finally show "(ImpR (z).<c>.M d){x:=<a>.Ax y a} -->a* (ImpR (z).<c>.M d)[x\<turnstile>n>y]" using fs by simp next case (ImpL c M u N v x a y) have fs: "c\<sharp>x" "c\<sharp>a" "c\<sharp>y" "u\<sharp>x" "u\<sharp>a" "u\<sharp>y" "c\<sharp>N" "c\<sharp>v" "u\<sharp>M" "u\<sharp>v" by fact+ have ih1: "M{x:=<a>.Ax y a} -->a* M[x\<turnstile>n>y]" by fact have ih2: "N{x:=<a>.Ax y a} -->a* N[x\<turnstile>n>y]" by fact show "(ImpL <c>.M (u).N v){x:=<a>.Ax y a} -->a* (ImpL <c>.M (u).N v)[x\<turnstile>n>y]" proof(cases "v=x") case True assume eq: "v=x" obtain v'::"name" where new: "v'\<sharp>(Ax y a,M{x:=<a>.Ax y a},N{x:=<a>.Ax y a},y,a,u)" by (rule exists_fresh(1)[OF fs_name1]) have "(ImpL <c>.M (u).N v){x:=<a>.Ax y a} = fresh_fun (λv'. Cut <a>.Ax y a (v').ImpL <c>.(M{x:=<a>.Ax y a}) (u).(N{x:=<a>.Ax y a}) v')" using eq fs by simp also have "… = Cut <a>.Ax y a (v').ImpL <c>.(M{x:=<a>.Ax y a}) (u).(N{x:=<a>.Ax y a}) v'" using new by (simp add: fresh_fun_simp_ImpL) also have "… -->a* (ImpL <c>.(M{x:=<a>.Ax y a}) (u).(N{x:=<a>.Ax y a}) v')[v'\<turnstile>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 <c>.(M{x:=<a>.Ax y a}) (u).(N{x:=<a>.Ax y a}) y" using fs new by (auto simp add: fresh_prod subst_fresh fresh_atm trm.inject alpha rename_fresh) also have "… -->a* ImpL <c>.(M[x\<turnstile>n>y]) (u).(N[x\<turnstile>n>y]) y" using ih1 ih2 by (auto intro: a_star_congs) also have "… = (ImpL <c>.M (u).N v)[x\<turnstile>n>y]" using eq fs by simp finally show "(ImpL <c>.M (u).N v){x:=<a>.Ax y a} -->a* (ImpL <c>.M (u).N v)[x\<turnstile>n>y]" using fs by simp next case False assume neq: "v≠x" have "(ImpL <c>.M (u).N v){x:=<a>.Ax y a} = ImpL <c>.(M{x:=<a>.Ax y a}) (u).(N{x:=<a>.Ax y a}) v" using fs neq by simp also have "… -->a* ImpL <c>.(M[x\<turnstile>n>y]) (u).(N[x\<turnstile>n>y]) v" using ih1 ih2 by (auto intro: a_star_congs) finally show "(ImpL <c>.M (u).N v){x:=<a>.Ax y a} -->a* (ImpL <c>.M (u).N v)[x\<turnstile>n>y]" using fs neq by simp qed qed lemma subst_with_ax2: shows "M{b:=(x).Ax x a} -->a* M[b\<turnstile>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} -->a* (Ax z c)[b\<turnstile>c>a]" proof (cases "c=b") case True assume eq: "c=b" have "(Ax z c){b:=(x).Ax x a} = Cut <b>.Ax z c (x).Ax x a" using eq by simp also have "… -->a* (Ax z c)[b\<turnstile>c>a]" using eq by blast finally show "(Ax z c){b:=(x).Ax x a} -->a* (Ax z c)[b\<turnstile>c>a]" by simp next case False assume neq: "c≠b" then show "(Ax z c){b:=(x).Ax x a} -->a* (Ax z c)[b\<turnstile>c>a]" by simp qed next case (Cut c M z N b a x) have fs: "c\<sharp>b" "c\<sharp>a" "c\<sharp>x" "c\<sharp>N" "z\<sharp>b" "z\<sharp>a" "z\<sharp>x" "z\<sharp>M" by fact+ have ih1: "M{b:=(x).Ax x a} -->a* M[b\<turnstile>c>a]" by fact have ih2: "N{b:=(x).Ax x a} -->a* N[b\<turnstile>c>a]" by fact show "(Cut <c>.M (z).N){b:=(x).Ax x a} -->a* (Cut <c>.M (z).N)[b\<turnstile>c>a]" proof (cases "N = Ax z b") case True assume eq: "N = Ax z b" have "(Cut <c>.M (z).N){b:=(x).Ax x a} = Cut <c>.(M{b:=(x).Ax x a}) (x).Ax x a" using eq fs by simp also have "… -->a* Cut <c>.(M[b\<turnstile>c>a]) (x).Ax x a" using ih1 a_star_congs by blast also have "… = Cut <c>.(M[b\<turnstile>c>a]) (z).(N[b\<turnstile>c>a])" using eq fs by (simp add: trm.inject alpha calc_atm fresh_atm) finally show "(Cut <c>.M (z).N){b:=(x).Ax x a} -->a* (Cut <c>.M (z).N)[b\<turnstile>c>a]" using fs by simp next case False assume neq: "N ≠ Ax z b" have "(Cut <c>.M (z).N){b:=(x).Ax x a} = Cut <c>.(M{b:=(x).Ax x a}) (z).(N{b:=(x).Ax x a})" using fs neq by simp also have "… -->a* Cut <c>.(M[b\<turnstile>c>a]) (z).(N[b\<turnstile>c>a])" using ih1 ih2 a_star_congs by blast finally show "(Cut <c>.M (z).N){b:=(x).Ax x a} -->a* (Cut <c>.M (z).N)[b\<turnstile>c>a]" using fs by simp qed next case (NotR z M c b a x) have fs: "z\<sharp>b" "z\<sharp>a" "z\<sharp>x" "z\<sharp>c" by fact+ have ih: "M{b:=(x).Ax x a} -->a* M[b\<turnstile>c>a]" by fact show "(NotR (z).M c){b:=(x).Ax x a} -->a* (NotR (z).M c)[b\<turnstile>c>a]" proof (cases "c=b") case True assume eq: "c=b" obtain a'::"coname" where new: "a'\<sharp>(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 <a'>.NotR (z).M{b:=(x).Ax x a} a' (x).Ax x a)" using eq fs by simp also have "… = Cut <a'>.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 "… -->a* (NotR (z).(M{b:=(x).Ax x a}) a')[a'\<turnstile>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 "… -->a* NotR (z).(M[b\<turnstile>c>a]) a" using ih by (auto intro: a_star_congs) also have "… = (NotR (z).M c)[b\<turnstile>c>a]" using eq by simp finally show "(NotR (z).M c){b:=(x).Ax x a} -->a* (NotR (z).M c)[b\<turnstile>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 "… -->a* NotR (z).(M[b\<turnstile>c>a]) c" using ih by (auto intro: a_star_congs) finally show "(NotR (z).M c){b:=(x).Ax x a} -->a* (NotR (z).M c)[b\<turnstile>c>a]" using neq by simp qed next case (NotL c M z b a x) have fs: "c\<sharp>b" "c\<sharp>a" "c\<sharp>x" "c\<sharp>z" by fact+ have ih: "M{b:=(x).Ax x a} -->a* M[b\<turnstile>c>a]" by fact have "(NotL <c>.M z){b:=(x).Ax x a} = NotL <c>.(M{b:=(x).Ax x a}) z" using fs by simp also have "… -->a* NotL <c>.(M[b\<turnstile>c>a]) z" using ih by (auto intro: a_star_congs) finally show "(NotL <c>.M z){b:=(x).Ax x a} -->a* (NotL <c>.M z)[b\<turnstile>c>a]" using fs by simp next case (AndR c M d N e b a x) have fs: "c\<sharp>b" "c\<sharp>a" "c\<sharp>x" "d\<sharp>b" "d\<sharp>a" "d\<sharp>x" "d≠c" "c\<sharp>N" "c\<sharp>e" "d\<sharp>M" "d\<sharp>e" by fact+ have ih1: "M{b:=(x).Ax x a} -->a* M[b\<turnstile>c>a]" by fact have ih2: "N{b:=(x).Ax x a} -->a* N[b\<turnstile>c>a]" by fact show "(AndR <c>.M <d>.N e){b:=(x).Ax x a} -->a* (AndR <c>.M <d>.N e)[b\<turnstile>c>a]" proof(cases "e=b") case True assume eq: "e=b" obtain e'::"coname" where new: "e'\<sharp>(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 <c>.M <d>.N e){b:=(x).Ax x a} = fresh_fun (λe'. Cut <e'>.AndR <c>.(M{b:=(x).Ax x a}) <d>.(N{b:=(x).Ax x a}) e' (x).Ax x a)" using eq fs by simp also have "… = Cut <e'>.AndR <c>.(M{b:=(x).Ax x a}) <d>.(N{b:=(x).Ax x a}) e' (x).Ax x a" using new by (simp add: fresh_fun_simp_AndR fresh_prod) also have "… -->a* (AndR <c>.(M{b:=(x).Ax x a}) <d>.(N{b:=(x).Ax x a}) e')[e'\<turnstile>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 <c>.(M{b:=(x).Ax x a}) <d>.(N{b:=(x).Ax x a}) a" using fs new by (auto simp add: fresh_prod fresh_atm subst_fresh crename_fresh) also have "… -->a* AndR <c>.(M[b\<turnstile>c>a]) <d>.(N[b\<turnstile>c>a]) a" using ih1 ih2 by (auto intro: a_star_congs) also have "… = (AndR <c>.M <d>.N e)[b\<turnstile>c>a]" using eq fs by simp finally show "(AndR <c>.M <d>.N e){b:=(x).Ax x a} -->a* (AndR <c>.M <d>.N e)[b\<turnstile>c>a]" by simp next case False assume neq: "e≠b" have "(AndR <c>.M <d>.N e){b:=(x).Ax x a} = AndR <c>.(M{b:=(x).Ax x a}) <d>.(N{b:=(x).Ax x a}) e" using fs neq by simp also have "… -->a* AndR <c>.(M[b\<turnstile>c>a]) <d>.(N[b\<turnstile>c>a]) e" using ih1 ih2 by (auto intro: a_star_congs) finally show "(AndR <c>.M <d>.N e){b:=(x).Ax x a} -->a* (AndR <c>.M <d>.N e)[b\<turnstile>c>a]" using fs neq by simp qed next case (AndL1 u M v b a x) have fs: "u\<sharp>b" "u\<sharp>a" "u\<sharp>x" "u\<sharp>v" by fact+ have ih: "M{b:=(x).Ax x a} -->a* M[b\<turnstile>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 "… -->a* AndL1 (u).(M[b\<turnstile>c>a]) v" using ih by (auto intro: a_star_congs) finally show "(AndL1 (u).M v){b:=(x).Ax x a} -->a* (AndL1 (u).M v)[b\<turnstile>c>a]" using fs by simp next case (AndL2 u M v b a x) have fs: "u\<sharp>b" "u\<sharp>a" "u\<sharp>x" "u\<sharp>v" by fact+ have ih: "M{b:=(x).Ax x a} -->a* M[b\<turnstile>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 "… -->a* AndL2 (u).(M[b\<turnstile>c>a]) v" using ih by (auto intro: a_star_congs) finally show "(AndL2 (u).M v){b:=(x).Ax x a} -->a* (AndL2 (u).M v)[b\<turnstile>c>a]" using fs by simp next case (OrR1 c M d b a x) have fs: "c\<sharp>b" "c\<sharp>a" "c\<sharp>x" "c\<sharp>d" by fact+ have ih: "M{b:=(x).Ax x a} -->a* M[b\<turnstile>c>a]" by fact show "(OrR1 <c>.M d){b:=(x).Ax x a} -->a* (OrR1 <c>.M d)[b\<turnstile>c>a]" proof(cases "d=b") case True assume eq: "d=b" obtain a'::"coname" where new: "a'\<sharp>(Ax x a,M{b:=(x).Ax x a},c,x,a)" by (rule exists_fresh(2)[OF fs_coname1]) have "(OrR1 <c>.M d){b:=(x).Ax x a} = fresh_fun (λa'. Cut <a'>.OrR1 <c>.M{b:=(x).Ax x a} a' (x).Ax x a)" using fs eq by (simp) also have "… = Cut <a'>.OrR1 <c>.M{b:=(x).Ax x a} a' (x).Ax x a" using new by (simp add: fresh_fun_simp_OrR1) also have "… -->a* (OrR1 <c>.M{b:=(x).Ax x a} a')[a'\<turnstile>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 <c>.M{b:=(x).Ax x a} a" using fs new by (auto simp add: fresh_prod fresh_atm crename_fresh subst_fresh) also have "… -->a* OrR1 <c>.(M[b\<turnstile>c>a]) a" using ih by (auto intro: a_star_congs) also have "… = (OrR1 <c>.M d)[b\<turnstile>c>a]" using eq fs by simp finally show "(OrR1 <c>.M d){b:=(x).Ax x a} -->a* (OrR1 <c>.M d)[b\<turnstile>c>a]" by simp next case False assume neq: "d≠b" have "(OrR1 <c>.M d){b:=(x).Ax x a} = OrR1 <c>.(M{b:=(x).Ax x a}) d" using fs neq by (simp) also have "… -->a* OrR1 <c>.(M[b\<turnstile>c>a]) d" using ih by (auto intro: a_star_congs) finally show "(OrR1 <c>.M d){b:=(x).Ax x a} -->a* (OrR1 <c>.M d)[b\<turnstile>c>a]" using fs neq by simp qed next case (OrR2 c M d b a x) have fs: "c\<sharp>b" "c\<sharp>a" "c\<sharp>x" "c\<sharp>d" by fact+ have ih: "M{b:=(x).Ax x a} -->a* M[b\<turnstile>c>a]" by fact show "(OrR2 <c>.M d){b:=(x).Ax x a} -->a* (OrR2 <c>.M d)[b\<turnstile>c>a]" proof(cases "d=b") case True assume eq: "d=b" obtain a'::"coname" where new: "a'\<sharp>(Ax x a,M{b:=(x).Ax x a},c,x,a)" by (rule exists_fresh(2)[OF fs_coname1]) have "(OrR2 <c>.M d){b:=(x).Ax x a} = fresh_fun (λa'. Cut <a'>.OrR2 <c>.M{b:=(x).Ax x a} a' (x).Ax x a)" using fs eq by (simp) also have "… = Cut <a'>.OrR2 <c>.M{b:=(x).Ax x a} a' (x).Ax x a" using new by (simp add: fresh_fun_simp_OrR2) also have "… -->a* (OrR2 <c>.M{b:=(x).Ax x a} a')[a'\<turnstile>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 <c>.M{b:=(x).Ax x a} a" using fs new by (auto simp add: fresh_prod fresh_atm crename_fresh subst_fresh) also have "… -->a* OrR2 <c>.(M[b\<turnstile>c>a]) a" using ih by (auto intro: a_star_congs) also have "… = (OrR2 <c>.M d)[b\<turnstile>c>a]" using eq fs by simp finally show "(OrR2 <c>.M d){b:=(x).Ax x a} -->a* (OrR2 <c>.M d)[b\<turnstile>c>a]" by simp next case False assume neq: "d≠b" have "(OrR2 <c>.M d){b:=(x).Ax x a} = OrR2 <c>.(M{b:=(x).Ax x a}) d" using fs neq by (simp) also have "… -->a* OrR2 <c>.(M[b\<turnstile>c>a]) d" using ih by (auto intro: a_star_congs) finally show "(OrR2 <c>.M d){b:=(x).Ax x a} -->a* (OrR2 <c>.M d)[b\<turnstile>c>a]" using fs neq by simp qed next case (OrL u M v N z b a x) have fs: "u\<sharp>b" "u\<sharp>a" "u\<sharp>x" "v\<sharp>b" "v\<sharp>a" "v\<sharp>x" "v≠u" "u\<sharp>N" "u\<sharp>z" "v\<sharp>M" "v\<sharp>z" by fact+ have ih1: "M{b:=(x).Ax x a} -->a* M[b\<turnstile>c>a]" by fact have ih2: "N{b:=(x).Ax x a} -->a* N[b\<turnstile>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 "… -->a* OrL (u).(M[b\<turnstile>c>a]) (v).(N[b\<turnstile>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} -->a* (OrL (u).M (v).N z)[b\<turnstile>c>a]" using fs by simp next case (ImpR z c M d b a x) have fs: "z\<sharp>b" "z\<sharp>a" "z\<sharp>x" "c\<sharp>b" "c\<sharp>a" "c\<sharp>x" "z\<sharp>d" "c\<sharp>d" by fact+ have ih: "M{b:=(x).Ax x a} -->a* M[b\<turnstile>c>a]" by fact show "(ImpR (z).<c>.M d){b:=(x).Ax x a} -->a* (ImpR (z).<c>.M d)[b\<turnstile>c>a]" proof(cases "b=d") case True assume eq: "b=d" obtain a'::"coname" where new: "a'\<sharp>(Ax x a,M{b:=(x).Ax x a},x,a,c)" by (rule exists_fresh(2)[OF fs_coname1]) have "(ImpR (z).<c>.M d){b:=(x).Ax x a} = fresh_fun (λa'. Cut <a'>.ImpR z.<c>.M{b:=(x).Ax x a} a' (x).Ax x a)" using fs eq by simp also have "… = Cut <a'>.ImpR z.<c>.M{b:=(x).Ax x a} a' (x).Ax x a" using new by (simp add: fresh_fun_simp_ImpR) also have "… -->a* (ImpR z.<c>.M{b:=(x).Ax x a} a')[a'\<turnstile>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.<c>.M{b:=(x).Ax x a} a" using fs new by (auto simp add: fresh_prod crename_fresh subst_fresh fresh_atm) also have "… -->a* ImpR z.<c>.(M[b\<turnstile>c>a]) a" using ih by (auto intro: a_star_congs) also have "… = (ImpR z.<c>.M b)[b\<turnstile>c>a]" using eq fs by simp finally show "(ImpR (z).<c>.M d){b:=(x).Ax x a} -->a* (ImpR (z).<c>.M d)[b\<turnstile>c>a]" using eq by simp next case False assume neq: "b≠d" have "(ImpR (z).<c>.M d){b:=(x).Ax x a} = ImpR (z).<c>.(M{b:=(x).Ax x a}) d" using fs neq by simp also have "… -->a* ImpR (z).<c>.(M[b\<turnstile>c>a]) d" using ih by (auto intro: a_star_congs) finally show "(ImpR (z).<c>.M d){b:=(x).Ax x a} -->a* (ImpR (z).<c>.M d)[b\<turnstile>c>a]" using neq fs by simp qed next case (ImpL c M u N v b a x) have fs: "c\<sharp>b" "c\<sharp>a" "c\<sharp>x" "u\<sharp>b" "u\<sharp>a" "u\<sharp>x" "c\<sharp>N" "c\<sharp>v" "u\<sharp>M" "u\<sharp>v" by fact+ have ih1: "M{b:=(x).Ax x a} -->a* M[b\<turnstile>c>a]" by fact have ih2: "N{b:=(x).Ax x a} -->a* N[b\<turnstile>c>a]" by fact have "(ImpL <c>.M (u).N v){b:=(x).Ax x a} = ImpL <c>.(M{b:=(x).Ax x a}) (u).(N{b:=(x).Ax x a}) v" using fs by simp also have "… -->a* ImpL <c>.(M[b\<turnstile>c>a]) (u).(N[b\<turnstile>c>a]) v" using ih1 ih2 by (auto intro: a_star_congs) finally show "(ImpL <c>.M (u).N v){b:=(x).Ax x a} -->a* (ImpL <c>.M (u).N v)[b\<turnstile>c>a]" using fs by simp qed text {* substitution lemmas *} lemma not_Ax1: shows "¬(b\<sharp>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(subgoal_tac "∃x'::coname. x'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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'\<sharp>(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\<sharp>M) ==> M{x:=<b>.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(subgoal_tac "∃x'::name. x'\<sharp>(trm{x:=<b>.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'\<sharp>(trm{x:=<b>.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'\<sharp>(trm{x:=<b>.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'\<sharp>(trm{x:=<b>.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'\<sharp>(trm{x:=<b>.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'\<sharp>(trm{x:=<b>.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'\<sharp>(trm1{x:=<b>.Q},Q,trm2{x:=<b>.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'\<sharp>(trm1{x:=<b>.Q},Q,trm2{x:=<b>.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'\<sharp>(trm1{x:=<b>.Q},Q,trm2{x:=<b>.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'\<sharp>(trm1{name2:=<b>.Q},Q,trm2{name2:=<b>.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'\<sharp>(trm1{name2:=<b>.Q},Q,trm2{name2:=<b>.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'\<sharp>(trm1{name2:=<b>.Q},Q,trm2{name2:=<b>.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\<sharp>P" "y\<sharp>P" shows "N{y:=<c>.P}{x:=<c>.P} = N{x:=<c>.Ax y c}{y:=<c>.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) next case (Cut d M u M' x' y' c P) from prems 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'\<sharp>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'\<sharp>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) next case (NotL d M u) then show ?case apply (auto simp add: abs_fresh fresh_atm forget) apply(subgoal_tac "∃x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.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(simp add: trm.inject alpha forget) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "∃x'::name. x'\<sharp>(P,M{x:=<c>.Ax y c},M{x:=<c>.Ax y c}{y:=<c>.P},Ax y c,y,x)") 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) next case (AndL1 u M d) then show ?case apply(auto simp add: abs_fresh fresh_atm forget trm.inject subst_fresh) apply(subgoal_tac "∃x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.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(simp add: trm.inject alpha forget) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "∃x'::name. x'\<sharp>(P,Ax y c,M{x:=<c>.Ax y c},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)") 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(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(subgoal_tac "∃x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.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(simp add: trm.inject alpha forget) apply(rule exists_fresh'(1)[OF fs_name1]) apply(subgoal_tac "∃x'::name. x'\<sharp>(P,Ax y c,M{x:=<c>.Ax y c},M{x:=<c>.Ax y c}{y:=<c>.P},u,y,x)") 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(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) next case OrR2 then show ?case by (auto simp add: 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(subgoal_tac "∃x'::name. x'\<sharp>(P,M{y:=<c>.P},M{x:=<c>.Ax y c}{y:=<c>.P}, M'{y:=<c>.P},M'{x:=<c>.Ax y c}{y:=<c>.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(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'\<sharp>(P,Ax y c,M{x:=<c>.Ax y c},M{x:=<c>.Ax y c}{y:=<c>.P}, M'{x:=<c>.Ax y c},M'{x:=<c>.Ax y c}{y:=<c>.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(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) 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(subgoal_tac "∃x'::name. x'\<sharp>(P,M{x2:=<c>.P},M{x:=<c>.Ax x2 c}{x2:=<c>.P}, M'{x2:=<c>.P},M'{x:=<c>.Ax x2 c}{x2:=<c>.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(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'\<sharp>(P,Ax y c,M{x2:=<c>.Ax y c},M{x2:=<c>.Ax y c}{y:=<c>.P}, M'{x2:=<c>.Ax y c},M'{x2:=<c>.Ax y c}{y:=<c>.P},x1,x2,x3,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(rule exists_fresh'(1)[OF fs_name1]) done qed lemma interesting_subst1': assumes a: "x≠y" "x\<sharp>P" "y\<sharp>P" shows "N{y:=<c>.P}{x:=<c>.P} = N{x:=<a>.Ax y a}{y:=<c>.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:=<a>.Ax y a} = N{x:=<c>.([(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\<sharp>P" "b\<sharp>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) next case (Cut d M u M' x' y' c P) from prems show ?case apply(simp) apply(auto simp add: 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'\<sharp>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'\<sharp>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) next case (NotR u M d) then show ?case apply (auto simp add: abs_fresh fresh_atm forget) apply(subgoal_tac "∃a'::coname. a'\<sharp>(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(simp add: trm.inject alpha forget) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "∃a'::coname. a'\<sharp>(P,M{d:=(y).Ax y a},M{d:=(y).Ax y a}{a:=(y).P},Ax y a,y,d)") 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(subgoal_tac "∃a'::coname. a'\<sharp>(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(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'\<sharp>(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(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) next case (AndL2 u M d) then show ?case by (auto simp add: 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(subgoal_tac "∃a'::coname. a'\<sharp>(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(simp add: trm.inject alpha forget) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "∃a'::coname. a'\<sharp>(b,P,Ax y a,M{e:=(y).Ax y a},M{e:=(y).Ax y a}{a:=(y).P},d,e)") 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(subgoal_tac "∃a'::coname. a'\<sharp>(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(simp add: trm.inject alpha forget) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "∃a'::coname. a'\<sharp>(b,P,Ax y a,M{e:=(y).Ax y a},M{e:=(y).Ax y a}{a:=(y).P},d,e)") 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) next case ImpL then show ?case by (auto simp add: 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(subgoal_tac "∃a'::coname. a'\<sharp>(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(simp add: trm.inject alpha forget) apply(rule exists_fresh'(2)[OF fs_coname1]) apply(subgoal_tac "∃a'::coname. a'\<sharp>(e,d,P,Ax y a,M{d:=(y).Ax y a},M{d:=(y).Ax y a}{a:=(y).P})") 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(rule exists_fresh'(2)[OF fs_coname1]) done qed lemma interesting_subst2': assumes a: "a≠b" "a\<sharp>P" "b\<sharp>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\<sharp>(Q,b)" "x\<sharp>(y,P,Q)" "b\<sharp>Q" "y\<sharp>P" shows "M{x:=<a>.P}{b:=(y).Q} = M{b:=(y).Q}{x:=<a>.(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\<sharp>(Q,b)" "x\<sharp>(y,P,Q)" "b\<sharp>Q" "y\<sharp>P" by fact+ { assume asm: "z=x ∧ c=b" have "(Ax x b){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (x).Ax x b){b:=(y).Q}" using fs by simp also have "… = Cut <a>.(P{b:=(y).Q}) (y).Q" using fs by (simp_all add: fresh_prod fresh_atm) also have "… = Cut <a>.(P{b:=(y).Q}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" using fs by (simp add: forget) also have "… = (Cut <b>.Ax x b (y).Q){x:=<a>.(P{b:=(y).Q})}" using fs asm by (auto simp add: fresh_prod fresh_atm subst_fresh) also have "… = (Ax x b){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using fs by simp finally have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using asm by simp } moreover { assume asm: "z≠x ∧ c=b" have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}" using asm by simp also have "… = Cut <b>.Ax z c (y).Q" using fs asm by simp also have "… = Cut <b>.(Ax z c{x:=<a>.(P{b:=(y).Q})}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" using fs asm by (simp add: forget) also have "… = (Cut <b>.Ax z c (y).Q){x:=<a>.(P{b:=(y).Q})}" using asm fs by (auto simp add: trm.inject subst_fresh fresh_prod fresh_atm abs_fresh) also have "… = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using asm fs by simp finally have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" by simp } moreover { assume asm: "z=x ∧ c≠b" have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (x).Ax z c){b:=(y).Q}" using fs asm by simp also have "… = Cut <a>.(P{b:=(y).Q}) (x).Ax z c" using fs asm by (auto simp add: trm.inject abs_fresh) also have "… = (Ax z c){x:=<a>.(P{b:=(y).Q})}" using fs asm by simp also have "… = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using asm by auto finally have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" by simp } moreover { assume asm: "z≠x ∧ c≠b" have "(Ax z c){x:=<a>.P}{b:=(y).Q} = (Ax z c){b:=(y).Q}{x:=<a>.(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 <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (z).(N{x:=<a>.P})){b:=(y).Q}" using asm prems by simp also have "… = (Cut <a>.P (z).N){b:=(y).Q}" using asm prems by (simp add: fresh_atm) also have "… = (Cut <a>.(P{b:=(y).Q}) (y).Q)" using asm prems by (auto simp add: fresh_prod fresh_atm) finally have eq1: "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <a>.(P{b:=(y).Q}) (y).Q)" by simp have "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = (Cut <c>.M (y).Q){x:=<a>.(P{b:=(y).Q})}" using prems asm by (simp add: fresh_atm) also have "… = Cut <a>.(P{b:=(y).Q}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" using asm prems by (auto simp add: fresh_prod fresh_atm subst_fresh) also have "… = Cut <a>.(P{b:=(y).Q}) (y).Q" using asm prems by (simp add: forget) finally have eq2: "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = Cut <a>.(P{b:=(y).Q}) (y).Q" by simp have "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" 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\<sharp>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 <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <c>.(M{x:=<a>.P}) (z).(N{x:=<a>.P})){b:=(y).Q}" using asm prems by simp also have "… = (Cut <c>.(M{x:=<a>.P}) (z).N){b:=(y).Q}" using asm prems by (simp add: fresh_atm) also have "… = Cut <c>.(M{x:=<a>.P}{b:=(y).Q}) (y).Q" using asm prems by (simp add: abs_fresh) also have "… = Cut <c>.(M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}}) (y).Q" using asm prems by simp finally have eq1: "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = Cut <c>.(M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}}) (y).Q" by simp have "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = (Cut <c>.(M{b:=(y).Q}) (y).Q){x:=<a>.(P{b:=(y).Q})}" using asm prems by simp also have "… = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (y).(Q{x:=<a>.(P{b:=(y).Q})})" using asm prems neq by (auto simp add: fresh_prod fresh_atm subst_fresh abs_fresh) also have "… = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (y).Q" using asm prems by (simp add: forget) finally have eq2: "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (y).Q" by simp have "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using eq1 eq2 by simp } moreover { assume asm: "M = Ax x c ∧ N ≠ Ax z b" have neq: "N{x:=<a>.P} ≠ Ax z b" proof (cases "x\<sharp>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 <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <a>.P (z).(N{x:=<a>.P})){b:=(y).Q}" using asm prems by simp also have "… = Cut <a>.(P{b:=(y).Q}) (z).(N{x:=<a>.P}{b:=(y).Q})" using asm prems neq by (simp add: abs_fresh) also have "… = Cut <a>.(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" using asm prems by simp finally have eq1: "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = Cut <a>.(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" by simp have "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = (Cut <c>.(M{b:=(y).Q}) (z).(N{b:=(y).Q})){x:=<a>.(P{b:=(y).Q})}" using asm prems by auto also have "… = (Cut <c>.M (z).(N{b:=(y).Q})){x:=<a>.(P{b:=(y).Q})}" using asm prems by (auto simp add: fresh_atm) also have "… = Cut <a>.(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" using asm prems by (simp add: fresh_prod fresh_atm subst_fresh) finally have eq2: "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = Cut <a>.(P{b:=(y).Q}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" by simp have "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" using eq1 eq2 by simp } moreover { assume asm: "M ≠ Ax x c ∧ N ≠ Ax z b" have neq1: "N{x:=<a>.P} ≠ Ax z b" proof (cases "x\<sharp>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\<sharp>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 <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <c>.(M{x:=<a>.P}) (z).(N{x:=<a>.P})){b:=(y).Q}" using asm prems by simp also have "… = Cut <c>.(M{x:=<a>.P}{b:=(y).Q}) (z).(N{x:=<a>.P}{b:=(y).Q})" using asm prems neq1 by (simp add: abs_fresh) also have "… = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" using asm prems by simp finally have eq1: "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" by simp have "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = (Cut <c>.(M{b:=(y).Q}) (z).(N{b:=(y).Q})){x:=<a>.(P{b:=(y).Q})}" using asm neq1 prems by simp also have "… = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" using asm neq2 prems by (simp add: fresh_prod fresh_atm subst_fresh) finally have eq2: "(Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})} = Cut <c>.(M{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}) (z).(N{b:=(y).Q}{x:=<a>.(P{b:=(y).Q})})" by simp have "(Cut <c>.M (z).N){x:=<a>.P}{b:=(y).Q} = (Cut <c>.M (z).N){b:=(y).Q}{x:=<a>.(P{b:=(y).Q})}" 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(subgoal_tac "∃a'::coname. a'\<sharp>(M{c:=(y).Q},M{c:=(y).Q}{x:=<a>.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(subgoal_tac "∃x'::name. x'\<sharp>(P,M{x:=<a>.P},P{b:=(y).Q},M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}},y,Q)") 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(subgoal_tac "∃a'::coname. a'\<sharp>(Q,M{c3:=(y).Q},M{c3:=(y).Q}{x:=<a>.P{c3:=(y).Q}},c2,c3,a, P{c3:=(y).Q},N{c3:=(y).Q},N{c3:=(y).Q}{x:=<a>.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(subgoal_tac "∃x'::name. x'\<sharp>(P,M{x:=<a>.P},P{b:=(y).Q},z1,y,Q,M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}})") 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(subgoal_tac "∃x'::name. x'\<sharp>(P,M{x:=<a>.P},P{b:=(y).Q},z1,y,Q,M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}})") 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(subgoal_tac "∃x'::name. x'\<sharp>(P,M{x:=<a>.P},M{b:=(y).Q}{x:=<a>.P{b:=(y).Q}},z2,z3,a,y,Q, P{b:=(y).Q},N{x:=<a>.P},N{b:=(y).Q}{x:=<a>.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(subgoal_tac "∃a'::coname. a'\<sharp>(Q,M{c2:=(y).Q},a,P{c2:=(y).Q},c1, M{c2:=(y).Q}{x:=<a>.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(subgoal_tac "∃a'::coname. a'\<sharp>(Q,M{c2:=(y).Q},a,P{c2:=(y).Q},c1, M{c2:=(y).Q}{x:=<a>.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(subgoal_tac "∃a'::coname. a'\<sharp>(Q,M{d:=(y).Q},a,P{d:=(y).Q},c, M{d:=(y).Q}{x:=<a>.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(subgoal_tac "∃z'::name. z'\<sharp>(P,P{b:=(y).Q},M{u:=<a>.P},N{u:=<a>.P},y,Q, M{b:=(y).Q}{u:=<a>.P{b:=(y).Q}},N{b:=(y).Q}{u:=<a>.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\<sharp>(b,P,N)" "x\<sharp>(y,P,M)" "b\<sharp>(M,N)" "y\<sharp>P" shows "M{a:=(x).N}{y:=<b>.P} = M{y:=<b>.P}{a:=(x).N{y:=<b>.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) 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\<sharp>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\<sharp>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\<sharp>M''") apply(simp add: forget) apply(simp add: not_Ax2) apply(case_tac "a\<sharp>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\<sharp>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(subgoal_tac "∃a'::coname. a'\<sharp>(y,P,N,N{y:=<b>.P},M'{d:=(x).N},M'{y:=<b>.P}{d:=(x).N{y:=<b>.P}})") 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(subgoal_tac "∃x'::name. x'\<sharp>(z,y,P,N,N{y:=<b>.P},M'{y:=<b>.P},M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}})") 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(subgoal_tac "∃a'::coname. a'\<sharp>(P,b,d,e,N,N{y:=<b>.P},M'{f:=(x).N},M''{f:=(x).N}, M'{y:=<b>.P}{f:=(x).N{y:=<b>.P}},M''{y:=<b>.P}{f:=(x).N{y:=<b>.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(subgoal_tac "∃x'::name. x'\<sharp>(P,b,z,u,x,N,M'{y:=<b>.P},M'{y:=<b>.P}{a:=(x).N{y:=<b>.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(subgoal_tac "∃x'::name. x'\<sharp>(P,b,z,u,x,N,M'{y:=<b>.P},M'{y:=<b>.P}{a:=(x).N{y:=<b>.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(subgoal_tac "∃z'::name. z'\<sharp>(P,b,u,w,v,N,N{y:=<b>.P},M'{y:=<b>.P},M''{y:=<b>.P}, M'{y:=<b>.P}{a:=(x).N{y:=<b>.P}},M''{y:=<b>.P}{a:=(x).N{y:=<b>.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(subgoal_tac "∃c'::coname. c'\<sharp>(P,b,e,f,x,N,N{y:=<b>.P}, M'{f:=(x).N},M'{y:=<b>.P}{f:=(x).N{y:=<b>.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(subgoal_tac "∃c'::coname. c'\<sharp>(P,b,e,f,x,N,N{y:=<b>.P}, M'{f:=(x).N},M'{y:=<b>.P}{f:=(x).N{y:=<b>.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(subgoal_tac "∃c'::coname. c'\<sharp>(P,b,e,f,x,N,N{y:=<b>.P}, M'{f:=(x).N},M'{y:=<b>.P}{f:=(x).N{y:=<b>.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(subgoal_tac "∃z'::name. z'\<sharp>(P,b,e,w,v,N,N{y:=<b>.P},M'{w:=<b>.P},M''{w:=<b>.P}, M'{w:=<b>.P}{a:=(x).N{w:=<b>.P}},M''{w:=<b>.P}{a:=(x).N{w:=<b>.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\<sharp>(P,N,c)" "c\<sharp>(M,N)" "x\<sharp>(y,P,M)" "y\<sharp>(P,x)" "M≠Ax y a" shows "N{x:=<a>.M}{y:=<c>.P} = N{y:=<c>.P}{x:=<a>.(M{y:=<c>.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) 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\<sharp>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\<sharp>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) next case (NotL d M' u) then show ?case apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) apply(subgoal_tac "∃x'::name. x'\<sharp>(y,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})") 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'\<sharp>(x,y,P,M,M'{y:=<c>.P},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.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) next case (AndL1 u M' v) then show ?case apply(auto simp add: subst_fresh abs_fresh fresh_atm fresh_prod forget) apply(subgoal_tac "∃x'::name. x'\<sharp>(u,y,v,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})") 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'\<sharp>(x,y,u,v,P,M,M'{y:=<c>.P},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.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(subgoal_tac "∃x'::name. x'\<sharp>(u,y,v,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}})") 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'\<sharp>(x,y,u,v,P,M,M'{y:=<c>.P},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.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) next case OrR2 then show ?case by(auto simp add: 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(subgoal_tac "∃x'::name. x'\<sharp>(y,P,M,M{y:=<c>.P},M'{x:=<a>.M},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}}, x1,x2,x3,M''{x:=<a>.M},M''{y:=<c>.P}{x:=<a>.M{y:=<c>.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'\<sharp>(x,y,P,M,M'{y:=<c>.P},M'{y:=<c>.P}{x:=<a>.M{y:=<c>.P}}, x1,x2,x3,M''{y:=<c>.P},M''{y:=<c>.P}{x:=<a>.M{y:=<c>.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) 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(subgoal_tac "∃x'::name. x'\<sharp>(y,P,M,M{y:=<c>.P},M'{x2:=<a>.M},M'{y:=<c>.P}{x2:=<a>.M{y:=<c>.P}}, x1,x2,M''{x2:=<a>.M},M''{y:=<c>.P}{x2:=<a>.M{y:=<c>.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'\<sharp>(x,y,P,M,M'{x2:=<c>.P},M'{x2:=<c>.P}{x:=<a>.M{x2:=<c>.P}}, x1,x2,M''{x2:=<c>.P},M''{x2:=<c>.P}{x:=<a>.M{x2:=<c>.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\<sharp>(P,N,y)" "y\<sharp>(M,N)" "a\<sharp>(c,P,M)" "c\<sharp>(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) 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\<sharp>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\<sharp>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) next case (NotR u M' d) 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(simp add: fresh_prod fresh_atm) 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: fresh_prod fresh_atm subst_fresh) apply(simp add: abs_fresh subst_fresh) apply(auto simp add: 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) done next case AndL1 then show ?case by(auto simp add: 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) 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(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(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] done next case (OrR2 d M' e) 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(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] done next case ImpL 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(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(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(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] done qed text {* Reduction *} lemma fin_not_Cut: assumes a: "fin M x" shows "¬(∃a M' x N'. M = Cut <a>.M' (x).N')" using a by (induct) (auto) lemma fresh_not_fin: assumes a: "x\<sharp>M" shows "¬fin M x" proof - have "fin M x ==> x\<sharp>M ==> False" by (induct rule: fin.induct) (auto simp add: abs_fresh fresh_atm) with a show "¬fin M x" by blast qed lemma fresh_not_fic: assumes a: "a\<sharp>M" shows "¬fic M a" proof - have "fic M a ==> a\<sharp>M ==> False" by (induct rule: fic.induct) (auto simp add: abs_fresh fresh_atm) with a show "¬fic M a" by blast qed lemma c_redu_subst1: assumes a: "M -->c M'" "c\<sharp>M" "y\<sharp>P" shows "M{y:=<c>.P} -->c M'{y:=<c>.P}" using a proof(nominal_induct avoiding: y c P rule: c_redu.strong_induct) case (left M a N x) then show ?case apply - apply(simp) apply(rule conjI) apply(force) apply(auto) apply(subgoal_tac "M{a:=(x).N}{y:=<c>.P} = M{y:=<c>.P}{a:=(x).(N{y:=<c>.P})}")(*A*) apply(simp) apply(rule c_redu.intros) apply(rule not_fic_subst1) apply(simp) apply(simp add: subst_fresh) apply(simp add: subst_fresh) apply(simp add: abs_fresh fresh_atm) apply(rule subst_subst2) apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_prod fresh_atm) apply(simp) done next case (right N x a M) then show ?case apply - apply(simp) apply(rule conjI) (* case M = Ax y a *) apply(rule impI) apply(subgoal_tac "N{x:=<a>.Ax y a}{y:=<c>.P} = N{y:=<c>.P}{x:=<c>.P}") apply(simp) apply(rule c_redu.right) apply(rule not_fin_subst2) apply(simp) apply(rule subst_fresh) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(rule sym) apply(rule interesting_subst1') apply(simp add: fresh_atm) apply(simp) apply(simp) (* case M ≠ Ax y a*) apply(rule impI) apply(subgoal_tac "N{x:=<a>.M}{y:=<c>.P} = N{y:=<c>.P}{x:=<a>.(M{y:=<c>.P})}") apply(simp) apply(rule c_redu.right) apply(rule not_fin_subst2) apply(simp) apply(simp add: subst_fresh) apply(simp add: subst_fresh) apply(simp add: abs_fresh fresh_atm) apply(rule subst_subst3) apply(simp_all add: fresh_atm fresh_prod) done qed lemma c_redu_subst2: assumes a: "M -->c M'" "c\<sharp>P" "y\<sharp>M" shows "M{c:=(y).P} -->c M'{c:=(y).P}" using a proof(nominal_induct avoiding: y c P rule: c_redu.strong_induct) case (right N x a M) then show ?case apply - apply(simp) apply(rule conjI) apply(force) apply(auto) apply(subgoal_tac "N{x:=<a>.M}{c:=(y).P} = N{c:=(y).P}{x:=<a>.(M{c:=(y).P})}")(*A*) apply(simp) apply(rule c_redu.intros) apply(rule not_fin_subst1) apply(simp) apply(simp add: subst_fresh) apply(simp add: subst_fresh) apply(simp add: abs_fresh fresh_atm) apply(rule subst_subst1) apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_prod fresh_atm) apply(simp) done next case (left M a N x) then show ?case apply - apply(simp) apply(rule conjI) (* case N = Ax x c *) apply(rule impI) apply(subgoal_tac "M{a:=(x).Ax x c}{c:=(y).P} = M{c:=(y).P}{a:=(y).P}") apply(simp) apply(rule c_redu.left) apply(rule not_fic_subst2) apply(simp) apply(simp) apply(rule subst_fresh) apply(simp add: abs_fresh) apply(rule sym) apply(rule interesting_subst2') apply(simp add: fresh_atm) apply(simp) apply(simp) (* case M ≠ Ax y a*) apply(rule impI) apply(subgoal_tac "M{a:=(x).N}{c:=(y).P} = M{c:=(y).P}{a:=(x).(N{c:=(y).P})}") apply(simp) apply(rule c_redu.left) apply(rule not_fic_subst2) apply(simp) apply(simp add: subst_fresh) apply(simp add: subst_fresh) apply(simp add: abs_fresh fresh_atm) apply(rule subst_subst4) apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_prod fresh_atm) apply(simp) done qed lemma c_redu_subst1': assumes a: "M -->c M'" shows "M{y:=<c>.P} -->c M'{y:=<c>.P}" using a proof - obtain y'::"name" where fs1: "y'\<sharp>(M,M',P,P,y)" by (rule exists_fresh(1), rule fin_supp, blast) obtain c'::"coname" where fs2: "c'\<sharp>(M,M',P,P,c)" by (rule exists_fresh(2), rule fin_supp, blast) have "M{y:=<c>.P} = ([(y',y)]•M){y':=<c'>.([(c',c)]•P)}" using fs1 fs2 apply - apply(rule trans) apply(rule_tac y="y'" in subst_rename(3)) apply(simp) apply(rule subst_rename(4)) apply(simp) done also have "… -->c ([(y',y)]•M'){y':=<c'>.([(c',c)]•P)}" using fs1 fs2 apply - apply(rule c_redu_subst1) apply(simp add: c_redu.eqvt a) apply(simp_all add: fresh_left calc_atm fresh_prod) done also have "… = M'{y:=<c>.P}" using fs1 fs2 apply - apply(rule sym) apply(rule trans) apply(rule_tac y="y'" in subst_rename(3)) apply(simp) apply(rule subst_rename(4)) apply(simp) done finally show ?thesis by simp qed lemma c_redu_subst2': assumes a: "M -->c M'" shows "M{c:=(y).P} -->c M'{c:=(y).P}" using a proof - obtain y'::"name" where fs1: "y'\<sharp>(M,M',P,P,y)" by (rule exists_fresh(1), rule fin_supp, blast) obtain c'::"coname" where fs2: "c'\<sharp>(M,M',P,P,c)" by (rule exists_fresh(2), rule fin_supp, blast) have "M{c:=(y).P} = ([(c',c)]•M){c':=(y').([(y',y)]•P)}" using fs1 fs2 apply - apply(rule trans) apply(rule_tac c="c'" in subst_rename(1)) apply(simp) apply(rule subst_rename(2)) apply(simp) done also have "… -->c ([(c',c)]•M'){c':=(y').([(y',y)]•P)}" using fs1 fs2 apply - apply(rule c_redu_subst2) apply(simp add: c_redu.eqvt a) apply(simp_all add: fresh_left calc_atm fresh_prod) done also have "… = M'{c:=(y).P}" using fs1 fs2 apply - apply(rule sym) apply(rule trans) apply(rule_tac c="c'" in subst_rename(1)) apply(simp) apply(rule subst_rename(2)) apply(simp) done finally show ?thesis by simp qed lemma aux1: assumes a: "M = M'" "M' -->l M''" shows "M -->l M''" using a by simp lemma aux2: assumes a: "M -->l M'" "M' = M''" shows "M -->l M''" using a by simp lemma aux3: assumes a: "M = M'" "M' -->a* M''" shows "M -->a* M''" using a by simp lemma aux4: assumes a: "M = M'" shows "M -->a* M'" using a by blast lemma l_redu_subst1: assumes a: "M -->l M'" shows "M{y:=<c>.P} -->a* M'{y:=<c>.P}" using a proof(nominal_induct M M' avoiding: y c P rule: l_redu.strong_induct) case LAxR then show ?case apply - apply(rule aux3) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp add: fresh_atm) apply(auto) apply(rule aux4) apply(simp add: trm.inject alpha calc_atm fresh_atm) apply(rule a_star_trans) apply(rule a_starI) apply(rule al_redu) apply(rule l_redu.intros) apply(simp add: subst_fresh) apply(simp add: fresh_atm) apply(rule fic_subst2) apply(simp_all) apply(rule aux4) apply(rule subst_comm') apply(simp_all) done next case LAxL then show ?case apply - apply(rule aux3) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp add: trm.inject fresh_atm) apply(auto) apply(rule aux4) apply(rule sym) apply(rule fin_substn_nrename) apply(simp_all) apply(rule a_starI) apply(rule al_redu) apply(rule aux2) apply(rule l_redu.intros) apply(simp add: subst_fresh) apply(simp add: fresh_atm) apply(rule fin_subst1) apply(simp_all) apply(rule subst_comm') apply(simp_all) done next case (LNot v M N u a b) then show ?case proof - { assume asm: "N≠Ax y b" have "(Cut <a>.NotR (u).M a (v).NotL <b>.N v){y:=<c>.P} = (Cut <a>.NotR (u).(M{y:=<c>.P}) a (v).NotL <b>.(N{y:=<c>.P}) v)" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->l (Cut <b>.(N{y:=<c>.P}) (u).(M{y:=<c>.P}))" using prems by (auto intro: l_redu.intros simp add: subst_fresh) also have "… = (Cut <b>.N (u).M){y:=<c>.P}" using prems by (simp add: subst_fresh abs_fresh fresh_atm) finally have ?thesis by auto } moreover { assume asm: "N=Ax y b" have "(Cut <a>.NotR (u).M a (v).NotL <b>.N v){y:=<c>.P} = (Cut <a>.NotR (u).(M{y:=<c>.P}) a (v).NotL <b>.(N{y:=<c>.P}) v)" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* (Cut <b>.(N{y:=<c>.P}) (u).(M{y:=<c>.P}))" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = (Cut <b>.(Cut <c>.P (y).Ax y b) (u).(M{y:=<c>.P}))" using prems by simp also have "… -->a* (Cut <b>.(P[c\<turnstile>c>b]) (u).(M{y:=<c>.P}))" proof (cases "fic P c") case True assume "fic P c" then show ?thesis using prems apply - apply(rule a_starI) apply(rule better_CutL_intro) apply(rule al_redu) apply(rule better_LAxR_intro) apply(simp) done next case False assume "¬fic P c" then show ?thesis apply - apply(rule a_star_CutL) apply(rule a_star_trans) apply(rule a_starI) apply(rule ac_redu) apply(rule better_left) apply(simp) apply(simp add: subst_with_ax2) done qed also have "… = (Cut <b>.N (u).M){y:=<c>.P}" using prems apply - apply(auto simp add: subst_fresh abs_fresh) apply(simp add: trm.inject) apply(simp add: alpha fresh_atm) apply(rule sym) apply(rule crename_swap) apply(simp) done finally have "(Cut <a>.NotR (u).M a (v).NotL <b>.N v){y:=<c>.P} -->a* (Cut <b>.N (u).M){y:=<c>.P}" by simp } ultimately show ?thesis by blast qed next case (LAnd1 b a1 M1 a2 M2 N z u) then show ?case proof - { assume asm: "M1≠Ax y a1" have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL1 (u).N z){y:=<c>.P} = Cut <b>.AndR <a1>.(M1{y:=<c>.P}) <a2>.(M2{y:=<c>.P}) b (z).AndL1 (u).(N{y:=<c>.P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* Cut <a1>.(M1{y:=<c>.P}) (u).(N{y:=<c>.P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = (Cut <a1>.M1 (u).N){y:=<c>.P}" using prems by (simp add: subst_fresh abs_fresh fresh_atm) finally have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL1 (u).N z){y:=<c>.P} -->a* (Cut <a1>.M1 (u).N){y:=<c>.P}" by simp } moreover { assume asm: "M1=Ax y a1" have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL1 (u).N z){y:=<c>.P} = Cut <b>.AndR <a1>.(M1{y:=<c>.P}) <a2>.(M2{y:=<c>.P}) b (z).AndL1 (u).(N{y:=<c>.P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* Cut <a1>.(M1{y:=<c>.P}) (u).(N{y:=<c>.P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = Cut <a1>.(Cut <c>.P (y). Ax y a1) (u).(N{y:=<c>.P})" using prems by simp also have "… -->a* Cut <a1>.P[c\<turnstile>c>a1] (u).(N{y:=<c>.P})" proof (cases "fic P c") case True assume "fic P c" then show ?thesis using prems apply - apply(rule a_starI) apply(rule better_CutL_intro) apply(rule al_redu) apply(rule better_LAxR_intro) apply(simp) done next case False assume "¬fic P c" then show ?thesis apply - apply(rule a_star_CutL) apply(rule a_star_trans) apply(rule a_starI) apply(rule ac_redu) apply(rule better_left) apply(simp) apply(simp add: subst_with_ax2) done qed also have "… = (Cut <a1>.M1 (u).N){y:=<c>.P}" using prems apply - apply(auto simp add: subst_fresh abs_fresh) apply(simp add: trm.inject) apply(simp add: alpha fresh_atm) apply(rule sym) apply(rule crename_swap) apply(simp) done finally have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL1 (u).N z){y:=<c>.P} -->a* (Cut <a1>.M1 (u).N){y:=<c>.P}" by simp } ultimately show ?thesis by blast qed next case (LAnd2 b a1 M1 a2 M2 N z u) then show ?case proof - { assume asm: "M2≠Ax y a2" have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL2 (u).N z){y:=<c>.P} = Cut <b>.AndR <a1>.(M1{y:=<c>.P}) <a2>.(M2{y:=<c>.P}) b (z).AndL2 (u).(N{y:=<c>.P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* Cut <a2>.(M2{y:=<c>.P}) (u).(N{y:=<c>.P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = (Cut <a2>.M2 (u).N){y:=<c>.P}" using prems by (simp add: subst_fresh abs_fresh fresh_atm) finally have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL2 (u).N z){y:=<c>.P} -->a* (Cut <a2>.M2 (u).N){y:=<c>.P}" by simp } moreover { assume asm: "M2=Ax y a2" have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL2 (u).N z){y:=<c>.P} = Cut <b>.AndR <a1>.(M1{y:=<c>.P}) <a2>.(M2{y:=<c>.P}) b (z).AndL2 (u).(N{y:=<c>.P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* Cut <a2>.(M2{y:=<c>.P}) (u).(N{y:=<c>.P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = Cut <a2>.(Cut <c>.P (y). Ax y a2) (u).(N{y:=<c>.P})" using prems by simp also have "… -->a* Cut <a2>.P[c\<turnstile>c>a2] (u).(N{y:=<c>.P})" proof (cases "fic P c") case True assume "fic P c" then show ?thesis using prems apply - apply(rule a_starI) apply(rule better_CutL_intro) apply(rule al_redu) apply(rule better_LAxR_intro) apply(simp) done next case False assume "¬fic P c" then show ?thesis apply - apply(rule a_star_CutL) apply(rule a_star_trans) apply(rule a_starI) apply(rule ac_redu) apply(rule better_left) apply(simp) apply(simp add: subst_with_ax2) done qed also have "… = (Cut <a2>.M2 (u).N){y:=<c>.P}" using prems apply - apply(auto simp add: subst_fresh abs_fresh) apply(simp add: trm.inject) apply(simp add: alpha fresh_atm) apply(rule sym) apply(rule crename_swap) apply(simp) done finally have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL2 (u).N z){y:=<c>.P} -->a* (Cut <a2>.M2 (u).N){y:=<c>.P}" by simp } ultimately show ?thesis by blast qed next case (LOr1 b a M N1 N2 z x1 x2 y c P) then show ?case proof - { assume asm: "M≠Ax y a" have "(Cut <b>.OrR1 <a>.M b (z).OrL (x1).N1 (x2).N2 z){y:=<c>.P} = Cut <b>.OrR1 <a>.(M{y:=<c>.P}) b (z).OrL (x1).(N1{y:=<c>.P}) (x2).(N2{y:=<c>.P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* Cut <a>.(M{y:=<c>.P}) (x1).(N1{y:=<c>.P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = (Cut <a>.M (x1).N1){y:=<c>.P}" using prems by (simp add: subst_fresh abs_fresh fresh_atm) finally have "(Cut <b>.OrR1 <a>.M b (z).OrL (x1).N1 (x2).N2 z){y:=<c>.P} -->a* (Cut <a>.M (x1).N1){y:=<c>.P}" by simp } moreover { assume asm: "M=Ax y a" have "(Cut <b>.OrR1 <a>.M b (z).OrL (x1).N1 (x2).N2 z){y:=<c>.P} = Cut <b>.OrR1 <a>.(M{y:=<c>.P}) b (z).OrL (x1).(N1{y:=<c>.P}) (x2).(N2{y:=<c>.P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* Cut <a>.(M{y:=<c>.P}) (x1).(N1{y:=<c>.P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = Cut <a>.(Cut <c>.P (y). Ax y a) (x1).(N1{y:=<c>.P})" using prems by simp also have "… -->a* Cut <a>.P[c\<turnstile>c>a] (x1).(N1{y:=<c>.P})" proof (cases "fic P c") case True assume "fic P c" then show ?thesis using prems apply - apply(rule a_starI) apply(rule better_CutL_intro) apply(rule al_redu) apply(rule better_LAxR_intro) apply(simp) done next case False assume "¬fic P c" then show ?thesis apply - apply(rule a_star_CutL) apply(rule a_star_trans) apply(rule a_starI) apply(rule ac_redu) apply(rule better_left) apply(simp) apply(simp add: subst_with_ax2) done qed also have "… = (Cut <a>.M (x1).N1){y:=<c>.P}" using prems apply - apply(auto simp add: subst_fresh abs_fresh) apply(simp add: trm.inject) apply(simp add: alpha fresh_atm) apply(rule sym) apply(rule crename_swap) apply(simp) done finally have "(Cut <b>.OrR1 <a>.M b (z).OrL (x1).N1 (x2).N2 z){y:=<c>.P} -->a* (Cut <a>.M (x1).N1){y:=<c>.P}" by simp } ultimately show ?thesis by blast qed next case (LOr2 b a M N1 N2 z x1 x2 y c P) then show ?case proof - { assume asm: "M≠Ax y a" have "(Cut <b>.OrR2 <a>.M b (z).OrL (x1).N1 (x2).N2 z){y:=<c>.P} = Cut <b>.OrR2 <a>.(M{y:=<c>.P}) b (z).OrL (x1).(N1{y:=<c>.P}) (x2).(N2{y:=<c>.P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* Cut <a>.(M{y:=<c>.P}) (x2).(N2{y:=<c>.P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = (Cut <a>.M (x2).N2){y:=<c>.P}" using prems by (simp add: subst_fresh abs_fresh fresh_atm) finally have "(Cut <b>.OrR2 <a>.M b (z).OrL (x1).N1 (x2).N2 z){y:=<c>.P} -->a* (Cut <a>.M (x2).N2){y:=<c>.P}" by simp } moreover { assume asm: "M=Ax y a" have "(Cut <b>.OrR2 <a>.M b (z).OrL (x1).N1 (x2).N2 z){y:=<c>.P} = Cut <b>.OrR2 <a>.(M{y:=<c>.P}) b (z).OrL (x1).(N1{y:=<c>.P}) (x2).(N2{y:=<c>.P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* Cut <a>.(M{y:=<c>.P}) (x2).(N2{y:=<c>.P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = Cut <a>.(Cut <c>.P (y). Ax y a) (x2).(N2{y:=<c>.P})" using prems by simp also have "… -->a* Cut <a>.P[c\<turnstile>c>a] (x2).(N2{y:=<c>.P})" proof (cases "fic P c") case True assume "fic P c" then show ?thesis using prems apply - apply(rule a_starI) apply(rule better_CutL_intro) apply(rule al_redu) apply(rule better_LAxR_intro) apply(simp) done next case False assume "¬fic P c" then show ?thesis apply - apply(rule a_star_CutL) apply(rule a_star_trans) apply(rule a_starI) apply(rule ac_redu) apply(rule better_left) apply(simp) apply(simp add: subst_with_ax2) done qed also have "… = (Cut <a>.M (x2).N2){y:=<c>.P}" using prems apply - apply(auto simp add: subst_fresh abs_fresh) apply(simp add: trm.inject) apply(simp add: alpha fresh_atm) apply(rule sym) apply(rule crename_swap) apply(simp) done finally have "(Cut <b>.OrR2 <a>.M b (z).OrL (x1).N1 (x2).N2 z){y:=<c>.P} -->a* (Cut <a>.M (x2).N2){y:=<c>.P}" by simp } ultimately show ?thesis by blast qed next case (LImp z N u Q x M b a d y c P) then show ?case proof - { assume asm: "N≠Ax y d" have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){y:=<c>.P} = Cut <b>.ImpR (x).<a>.(M{y:=<c>.P}) b (z).ImpL <d>.(N{y:=<c>.P}) (u).(Q{y:=<c>.P}) z" using prems by (simp add: fresh_prod abs_fresh fresh_atm) also have "… -->a* Cut <a>.(Cut <d>.(N{y:=<c>.P}) (x).(M{y:=<c>.P})) (u).(Q{y:=<c>.P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = (Cut <a>.(Cut <d>.N (x).M) (u).Q){y:=<c>.P}" using prems by (simp add: subst_fresh abs_fresh fresh_atm) finally have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){y:=<c>.P} -->a* (Cut <a>.(Cut <d>.N (x).M) (u).Q){y:=<c>.P}" by simp } moreover { assume asm: "N=Ax y d" have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){y:=<c>.P} = Cut <b>.ImpR (x).<a>.(M{y:=<c>.P}) b (z).ImpL <d>.(N{y:=<c>.P}) (u).(Q{y:=<c>.P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm fresh_prod) also have "… -->a* Cut <a>.(Cut <d>.(N{y:=<c>.P}) (x).(M{y:=<c>.P})) (u).(Q{y:=<c>.P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = Cut <a>.(Cut <d>.(Cut <c>.P (y).Ax y d) (x).(M{y:=<c>.P})) (u).(Q{y:=<c>.P})" using prems by simp also have "… -->a* Cut <a>.(Cut <d>.(P[c\<turnstile>c>d]) (x).(M{y:=<c>.P})) (u).(Q{y:=<c>.P})" proof (cases "fic P c") case True assume "fic P c" then show ?thesis using prems apply - apply(rule a_starI) apply(rule better_CutL_intro) apply(rule a_Cut_l) apply(simp add: subst_fresh abs_fresh) apply(simp add: abs_fresh fresh_atm) apply(rule al_redu) apply(rule better_LAxR_intro) apply(simp) done next case False assume "¬fic P c" then show ?thesis using prems apply - apply(rule a_star_CutL) apply(rule a_star_CutL) apply(rule a_star_trans) apply(rule a_starI) apply(rule ac_redu) apply(rule better_left) apply(simp) apply(simp add: subst_with_ax2) done qed also have "… = (Cut <a>.(Cut <d>.N (x).M) (u).Q){y:=<c>.P}" using prems apply - apply(auto simp add: subst_fresh abs_fresh) apply(simp add: trm.inject) apply(simp add: alpha fresh_atm) apply(simp add: trm.inject) apply(simp add: alpha) apply(rule sym) apply(rule crename_swap) apply(simp) done finally have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){y:=<c>.P} -->a* (Cut <a>.(Cut <d>.N (x).M) (u).Q){y:=<c>.P}" by simp } ultimately show ?thesis by blast qed qed lemma l_redu_subst2: assumes a: "M -->l M'" shows "M{c:=(y).P} -->a* M'{c:=(y).P}" using a proof(nominal_induct M M' avoiding: y c P rule: l_redu.strong_induct) case LAxR then show ?case apply - apply(rule aux3) apply(rule better_Cut_substc) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(simp add: trm.inject fresh_atm) apply(auto) apply(rule aux4) apply(rule sym) apply(rule fic_substc_crename) apply(simp_all) apply(rule a_starI) apply(rule al_redu) apply(rule aux2) apply(rule l_redu.intros) apply(simp add: subst_fresh) apply(simp add: fresh_atm) apply(rule fic_subst1) apply(simp_all) apply(rule subst_comm') apply(simp_all) done next case LAxL then show ?case apply - apply(rule aux3) apply(rule better_Cut_substc) apply(simp) apply(simp add: abs_fresh) apply(simp add: fresh_atm) apply(auto) apply(rule aux4) apply(simp add: trm.inject alpha calc_atm fresh_atm) apply(rule a_star_trans) apply(rule a_starI) apply(rule al_redu) apply(rule l_redu.intros) apply(simp add: subst_fresh) apply(simp add: fresh_atm) apply(rule fin_subst2) apply(simp_all) apply(rule aux4) apply(rule subst_comm') apply(simp_all) done next case (LNot v M N u a b) then show ?case proof - { assume asm: "M≠Ax u c" have "(Cut <a>.NotR (u).M a (v).NotL <b>.N v){c:=(y).P} = (Cut <a>.NotR (u).(M{c:=(y).P}) a (v).NotL <b>.(N{c:=(y).P}) v)" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->l (Cut <b>.(N{c:=(y).P}) (u).(M{c:=(y).P}))" using prems by (auto intro: l_redu.intros simp add: subst_fresh) also have "… = (Cut <b>.N (u).M){c:=(y).P}" using prems by (simp add: subst_fresh abs_fresh fresh_atm) finally have ?thesis by auto } moreover { assume asm: "M=Ax u c" have "(Cut <a>.NotR (u).M a (v).NotL <b>.N v){c:=(y).P} = (Cut <a>.NotR (u).(M{c:=(y).P}) a (v).NotL <b>.(N{c:=(y).P}) v)" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* (Cut <b>.(N{c:=(y).P}) (u).(M{c:=(y).P}))" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = (Cut <b>.(N{c:=(y).P}) (u).(Cut <c>.(Ax u c) (y).P))" using prems by simp also have "… -->a* (Cut <b>.(N{c:=(y).P}) (u).(P[y\<turnstile>n>u]))" proof (cases "fin P y") case True assume "fin P y" then show ?thesis using prems apply - apply(rule a_starI) apply(rule better_CutR_intro) apply(rule al_redu) apply(rule better_LAxL_intro) apply(simp) done next case False assume "¬fin P y" then show ?thesis apply - apply(rule a_star_CutR) apply(rule a_star_trans) apply(rule a_starI) apply(rule ac_redu) apply(rule better_right) apply(simp) apply(simp add: subst_with_ax1) done qed also have "… = (Cut <b>.N (u).M){c:=(y).P}" using prems apply - apply(auto simp add: subst_fresh abs_fresh) apply(simp add: trm.inject) apply(simp add: alpha fresh_atm) apply(rule sym) apply(rule nrename_swap) apply(simp) done finally have "(Cut <a>.NotR (u).M a (v).NotL <b>.N v){c:=(y).P} -->a* (Cut <b>.N (u).M){c:=(y).P}" by simp } ultimately show ?thesis by blast qed next case (LAnd1 b a1 M1 a2 M2 N z u) then show ?case proof - { assume asm: "N≠Ax u c" have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL1 (u).N z){c:=(y).P} = Cut <b>.AndR <a1>.(M1{c:=(y).P}) <a2>.(M2{c:=(y).P}) b (z).AndL1 (u).(N{c:=(y).P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* Cut <a1>.(M1{c:=(y).P}) (u).(N{c:=(y).P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = (Cut <a1>.M1 (u).N){c:=(y).P}" using prems by (simp add: subst_fresh abs_fresh fresh_atm) finally have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL1 (u).N z){c:=(y).P} -->a* (Cut <a1>.M1 (u).N){c:=(y).P}" by simp } moreover { assume asm: "N=Ax u c" have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL1 (u).N z){c:=(y).P} = Cut <b>.AndR <a1>.(M1{c:=(y).P}) <a2>.(M2{c:=(y).P}) b (z).AndL1 (u).(N{c:=(y).P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* Cut <a1>.(M1{c:=(y).P}) (u).(N{c:=(y).P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = Cut <a1>.(M1{c:=(y).P}) (u).(Cut <c>.(Ax u c) (y).P)" using prems by simp also have "… -->a* Cut <a1>.(M1{c:=(y).P}) (u).(P[y\<turnstile>n>u])" proof (cases "fin P y") case True assume "fin P y" then show ?thesis using prems apply - apply(rule a_starI) apply(rule better_CutR_intro) apply(rule al_redu) apply(rule better_LAxL_intro) apply(simp) done next case False assume "¬fin P y" then show ?thesis apply - apply(rule a_star_CutR) apply(rule a_star_trans) apply(rule a_starI) apply(rule ac_redu) apply(rule better_right) apply(simp) apply(simp add: subst_with_ax1) done qed also have "… = (Cut <a1>.M1 (u).N){c:=(y).P}" using prems apply - apply(auto simp add: subst_fresh abs_fresh) apply(simp add: trm.inject) apply(simp add: alpha fresh_atm) apply(rule sym) apply(rule nrename_swap) apply(simp) done finally have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL1 (u).N z){c:=(y).P} -->a* (Cut <a1>.M1 (u).N){c:=(y).P}" by simp } ultimately show ?thesis by blast qed next case (LAnd2 b a1 M1 a2 M2 N z u) then show ?case proof - { assume asm: "N≠Ax u c" have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL2 (u).N z){c:=(y).P} = Cut <b>.AndR <a1>.(M1{c:=(y).P}) <a2>.(M2{c:=(y).P}) b (z).AndL2 (u).(N{c:=(y).P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* Cut <a2>.(M2{c:=(y).P}) (u).(N{c:=(y).P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = (Cut <a2>.M2 (u).N){c:=(y).P}" using prems by (simp add: subst_fresh abs_fresh fresh_atm) finally have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL2 (u).N z){c:=(y).P} -->a* (Cut <a2>.M2 (u).N){c:=(y).P}" by simp } moreover { assume asm: "N=Ax u c" have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL2 (u).N z){c:=(y).P} = Cut <b>.AndR <a1>.(M1{c:=(y).P}) <a2>.(M2{c:=(y).P}) b (z).AndL2 (u).(N{c:=(y).P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* Cut <a2>.(M2{c:=(y).P}) (u).(N{c:=(y).P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = Cut <a2>.(M2{c:=(y).P}) (u).(Cut <c>.(Ax u c) (y).P)" using prems by simp also have "… -->a* Cut <a2>.(M2{c:=(y).P}) (u).(P[y\<turnstile>n>u])" proof (cases "fin P y") case True assume "fin P y" then show ?thesis using prems apply - apply(rule a_starI) apply(rule better_CutR_intro) apply(rule al_redu) apply(rule better_LAxL_intro) apply(simp) done next case False assume "¬fin P y" then show ?thesis apply - apply(rule a_star_CutR) apply(rule a_star_trans) apply(rule a_starI) apply(rule ac_redu) apply(rule better_right) apply(simp) apply(simp add: subst_with_ax1) done qed also have "… = (Cut <a2>.M2 (u).N){c:=(y).P}" using prems apply - apply(auto simp add: subst_fresh abs_fresh) apply(simp add: trm.inject) apply(simp add: alpha fresh_atm) apply(rule sym) apply(rule nrename_swap) apply(simp) done finally have "(Cut <b>.AndR <a1>.M1 <a2>.M2 b (z).AndL2 (u).N z){c:=(y).P} -->a* (Cut <a2>.M2 (u).N){c:=(y).P}" by simp } ultimately show ?thesis by blast qed next case (LOr1 b a M N1 N2 z x1 x2 y c P) then show ?case proof - { assume asm: "N1≠Ax x1 c" have "(Cut <b>.OrR1 <a>.M b (z).OrL (x1).N1 (x2).N2 z){c:=(y).P} = Cut <b>.OrR1 <a>.(M{c:=(y).P}) b (z).OrL (x1).(N1{c:=(y).P}) (x2).(N2{c:=(y).P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* Cut <a>.(M{c:=(y).P}) (x1).(N1{c:=(y).P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = (Cut <a>.M (x1).N1){c:=(y).P}" using prems by (simp add: subst_fresh abs_fresh fresh_atm) finally have "(Cut <b>.OrR1 <a>.M b (z).OrL (x1).N1 (x2).N2 z){c:=(y).P} -->a* (Cut <a>.M (x1).N1){c:=(y).P}" by simp } moreover { assume asm: "N1=Ax x1 c" have "(Cut <b>.OrR1 <a>.M b (z).OrL (x1).N1 (x2).N2 z){c:=(y).P} = Cut <b>.OrR1 <a>.(M{c:=(y).P}) b (z).OrL (x1).(N1{c:=(y).P}) (x2).(N2{c:=(y).P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* Cut <a>.(M{c:=(y).P}) (x1).(N1{c:=(y).P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = Cut <a>.(M{c:=(y).P}) (x1).(Cut <c>.(Ax x1 c) (y).P)" using prems by simp also have "… -->a* Cut <a>.(M{c:=(y).P}) (x1).(P[y\<turnstile>n>x1])" proof (cases "fin P y") case True assume "fin P y" then show ?thesis using prems apply - apply(rule a_starI) apply(rule better_CutR_intro) apply(rule al_redu) apply(rule better_LAxL_intro) apply(simp) done next case False assume "¬fin P y" then show ?thesis apply - apply(rule a_star_CutR) apply(rule a_star_trans) apply(rule a_starI) apply(rule ac_redu) apply(rule better_right) apply(simp) apply(simp add: subst_with_ax1) done qed also have "… = (Cut <a>.M (x1).N1){c:=(y).P}" using prems apply - apply(auto simp add: subst_fresh abs_fresh) apply(simp add: trm.inject) apply(simp add: alpha fresh_atm) apply(rule sym) apply(rule nrename_swap) apply(simp) done finally have "(Cut <b>.OrR1 <a>.M b (z).OrL (x1).N1 (x2).N2 z){c:=(y).P} -->a* (Cut <a>.M (x1).N1){c:=(y).P}" by simp } ultimately show ?thesis by blast qed next case (LOr2 b a M N1 N2 z x1 x2 y c P) then show ?case proof - { assume asm: "N2≠Ax x2 c" have "(Cut <b>.OrR2 <a>.M b (z).OrL (x1).N1 (x2).N2 z){c:=(y).P} = Cut <b>.OrR2 <a>.(M{c:=(y).P}) b (z).OrL (x1).(N1{c:=(y).P}) (x2).(N2{c:=(y).P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* Cut <a>.(M{c:=(y).P}) (x2).(N2{c:=(y).P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = (Cut <a>.M (x2).N2){c:=(y).P}" using prems by (simp add: subst_fresh abs_fresh fresh_atm) finally have "(Cut <b>.OrR2 <a>.M b (z).OrL (x1).N1 (x2).N2 z){c:=(y).P} -->a* (Cut <a>.M (x2).N2){c:=(y).P}" by simp } moreover { assume asm: "N2=Ax x2 c" have "(Cut <b>.OrR2 <a>.M b (z).OrL (x1).N1 (x2).N2 z){c:=(y).P} = Cut <b>.OrR2 <a>.(M{c:=(y).P}) b (z).OrL (x1).(N1{c:=(y).P}) (x2).(N2{c:=(y).P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm) also have "… -->a* Cut <a>.(M{c:=(y).P}) (x2).(N2{c:=(y).P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = Cut <a>.(M{c:=(y).P}) (x2).(Cut <c>.(Ax x2 c) (y).P)" using prems by simp also have "… -->a* Cut <a>.(M{c:=(y).P}) (x2).(P[y\<turnstile>n>x2])" proof (cases "fin P y") case True assume "fin P y" then show ?thesis using prems apply - apply(rule a_starI) apply(rule better_CutR_intro) apply(rule al_redu) apply(rule better_LAxL_intro) apply(simp) done next case False assume "¬fin P y" then show ?thesis apply - apply(rule a_star_CutR) apply(rule a_star_trans) apply(rule a_starI) apply(rule ac_redu) apply(rule better_right) apply(simp) apply(simp add: subst_with_ax1) done qed also have "… = (Cut <a>.M (x2).N2){c:=(y).P}" using prems apply - apply(auto simp add: subst_fresh abs_fresh) apply(simp add: trm.inject) apply(simp add: alpha fresh_atm) apply(rule sym) apply(rule nrename_swap) apply(simp) done finally have "(Cut <b>.OrR2 <a>.M b (z).OrL (x1).N1 (x2).N2 z){c:=(y).P} -->a* (Cut <a>.M (x2).N2){c:=(y).P}" by simp } ultimately show ?thesis by blast qed next case (LImp z N u Q x M b a d y c P) then show ?case proof - { assume asm: "M≠Ax x c ∧ Q≠Ax u c" have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){c:=(y).P} = Cut <b>.ImpR (x).<a>.(M{c:=(y).P}) b (z).ImpL <d>.(N{c:=(y).P}) (u).(Q{c:=(y).P}) z" using prems by (simp add: fresh_prod abs_fresh fresh_atm) also have "… -->a* Cut <a>.(Cut <d>.(N{c:=(y).P}) (x).(M{c:=(y).P})) (u).(Q{c:=(y).P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = (Cut <a>.(Cut <d>.N (x).M) (u).Q){c:=(y).P}" using prems by (simp add: subst_fresh abs_fresh fresh_atm) finally have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){c:=(y).P} -->a* (Cut <a>.(Cut <d>.N (x).M) (u).Q){c:=(y).P}" by simp } moreover { assume asm: "M=Ax x c ∧ Q≠Ax u c" have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){c:=(y).P} = Cut <b>.ImpR (x).<a>.(M{c:=(y).P}) b (z).ImpL <d>.(N{c:=(y).P}) (u).(Q{c:=(y).P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm fresh_prod) also have "… -->a* Cut <a>.(Cut <d>.(N{c:=(y).P}) (x).(M{c:=(y).P})) (u).(Q{c:=(y).P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = Cut <a>.(Cut <d>.(N{c:=(y).P}) (x).(Cut <c>.Ax x c (y).P)) (u).(Q{c:=(y).P})" using prems by simp also have "… -->a* Cut <a>.(Cut <d>.(N{c:=(y).P}) (x).(P[y\<turnstile>n>x])) (u).(Q{c:=(y).P})" proof (cases "fin P y") case True assume "fin P y" then show ?thesis using prems apply - apply(rule a_star_CutL) apply(rule a_star_CutR) apply(rule a_star_trans) apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxL_intro) apply(simp) apply(simp) done next case False assume "¬fin P y" then show ?thesis using prems apply - apply(rule a_star_CutL) apply(rule a_star_CutR) apply(rule a_star_trans) apply(rule a_starI) apply(rule ac_redu) apply(rule better_right) apply(simp) apply(simp add: subst_with_ax1) done qed also have "… = (Cut <a>.(Cut <d>.N (x).M) (u).Q){c:=(y).P}" using prems apply - apply(auto simp add: subst_fresh abs_fresh) apply(simp add: trm.inject) apply(simp add: alpha fresh_atm) apply(simp add: trm.inject) apply(simp add: alpha) apply(simp add: nrename_swap) done finally have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){c:=(y).P} -->a* (Cut <a>.(Cut <d>.N (x).M) (u).Q){c:=(y).P}" by simp } moreover { assume asm: "M≠Ax x c ∧ Q=Ax u c" have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){c:=(y).P} = Cut <b>.ImpR (x).<a>.(M{c:=(y).P}) b (z).ImpL <d>.(N{c:=(y).P}) (u).(Q{c:=(y).P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm fresh_prod) also have "… -->a* Cut <a>.(Cut <d>.(N{c:=(y).P}) (x).(M{c:=(y).P})) (u).(Q{c:=(y).P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = Cut <a>.(Cut <d>.(N{c:=(y).P}) (x).(M{c:=(y).P})) (u).(Cut <c>.Ax u c (y).P)" using prems by simp also have "… -->a* Cut <a>.(Cut <d>.(N{c:=(y).P}) (x).(M{c:=(y).P})) (u).(P[y\<turnstile>n>u])" proof (cases "fin P y") case True assume "fin P y" then show ?thesis using prems apply - apply(rule a_star_CutR) apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxL_intro) apply(simp) done next case False assume "¬fin P y" then show ?thesis using prems apply - apply(rule a_star_CutR) apply(rule a_star_trans) apply(rule a_starI) apply(rule ac_redu) apply(rule better_right) apply(simp) apply(simp add: subst_with_ax1) done qed also have "… = (Cut <a>.(Cut <d>.N (x).M) (u).Q){c:=(y).P}" using prems apply - apply(auto simp add: subst_fresh abs_fresh) apply(simp add: trm.inject) apply(simp add: alpha fresh_atm) apply(simp add: nrename_swap) done finally have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){c:=(y).P} -->a* (Cut <a>.(Cut <d>.N (x).M) (u).Q){c:=(y).P}" by simp } moreover { assume asm: "M=Ax x c ∧ Q=Ax u c" have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){c:=(y).P} = Cut <b>.ImpR (x).<a>.(M{c:=(y).P}) b (z).ImpL <d>.(N{c:=(y).P}) (u).(Q{c:=(y).P}) z" using prems by (simp add: subst_fresh abs_fresh fresh_atm fresh_prod) also have "… -->a* Cut <a>.(Cut <d>.(N{c:=(y).P}) (x).(M{c:=(y).P})) (u).(Q{c:=(y).P})" using prems apply - apply(rule a_starI) apply(rule al_redu) apply(auto intro: l_redu.intros simp add: subst_fresh abs_fresh) done also have "… = Cut <a>.(Cut <d>.(N{c:=(y).P}) (x).(Cut <c>.Ax x c (y).P)) (u).(Cut <c>.Ax u c (y).P)" using prems by simp also have "… -->a* Cut <a>.(Cut <d>.(N{c:=(y).P}) (x).(Cut <c>.Ax x c (y).P)) (u).(P[y\<turnstile>n>u])" proof (cases "fin P y") case True assume "fin P y" then show ?thesis using prems apply - apply(rule a_star_CutR) apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxL_intro) apply(simp) done next case False assume "¬fin P y" then show ?thesis using prems apply - apply(rule a_star_CutR) apply(rule a_star_trans) apply(rule a_starI) apply(rule ac_redu) apply(rule better_right) apply(simp) apply(simp add: subst_with_ax1) done qed also have "… -->a* Cut <a>.(Cut <d>.(N{c:=(y).P}) (x).(P[y\<turnstile>n>x])) (u).(P[y\<turnstile>n>u])" proof (cases "fin P y") case True assume "fin P y" then show ?thesis using prems apply - apply(rule a_star_CutL) apply(rule a_star_CutR) apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxL_intro) apply(simp) done next case False assume "¬fin P y" then show ?thesis using prems apply - apply(rule a_star_CutL) apply(rule a_star_CutR) apply(rule a_star_trans) apply(rule a_starI) apply(rule ac_redu) apply(rule better_right) apply(simp) apply(simp add: subst_with_ax1) done qed also have "… = (Cut <a>.(Cut <d>.N (x).M) (u).Q){c:=(y).P}" using prems apply - apply(auto simp add: subst_fresh abs_fresh) apply(simp add: trm.inject) apply(rule conjI) apply(simp add: alpha fresh_atm trm.inject) apply(simp add: nrename_swap) apply(simp add: alpha fresh_atm trm.inject) apply(simp add: nrename_swap) done finally have "(Cut <b>.ImpR (x).<a>.M b (z).ImpL <d>.N (u).Q z){c:=(y).P} -->a* (Cut <a>.(Cut <d>.N (x).M) (u).Q){c:=(y).P}" by simp } ultimately show ?thesis by blast qed qed lemma a_redu_subst1: assumes a: "M -->a M'" shows "M{y:=<c>.P} -->a* M'{y:=<c>.P}" using a proof(nominal_induct avoiding: y c P rule: a_redu.strong_induct) case al_redu then show ?case by (simp only: l_redu_subst1) next case ac_redu then show ?case apply - apply(rule a_starI) apply(rule a_redu.ac_redu) apply(simp only: c_redu_subst1') done next case (a_Cut_l a N x M M' y c P) then show ?case apply(simp add: subst_fresh fresh_a_redu) apply(rule conjI) apply(rule impI)+ apply(simp) apply(drule ax_do_not_a_reduce) apply(simp) apply(rule impI) apply(rule conjI) apply(rule impI) apply(simp) apply(drule_tac x="y" in meta_spec) apply(drule_tac x="c" in meta_spec) apply(drule_tac x="P" in meta_spec) apply(simp) apply(rule a_star_trans) apply(rule a_star_CutL) apply(assumption) apply(rule a_star_trans) apply(rule_tac M'="P[c\<turnstile>c>a]" in a_star_CutL) apply(case_tac "fic P c") apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxR_intro) apply(simp) apply(rule a_star_trans) apply(rule a_starI) apply(rule ac_redu) apply(rule better_left) apply(simp) apply(rule subst_with_ax2) apply(rule aux4) apply(simp add: trm.inject) apply(simp add: alpha fresh_atm) apply(simp add: crename_swap) apply(rule impI) apply(rule a_star_CutL) apply(auto) done next case (a_Cut_r a N x M M' y c P) then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(rule a_star_CutR) apply(auto)[1] apply(rule a_star_CutR) apply(auto)[1] done next case a_NotL then show ?case apply(auto) apply(generate_fresh "name") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: subst_fresh) apply(rule a_star_CutR) apply(rule a_star_NotL) apply(auto)[1] apply(rule a_star_NotL) apply(auto)[1] done next case a_NotR then show ?case apply(auto) apply(rule a_star_NotR) apply(auto)[1] done next case a_AndR_l then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(rule a_star_AndR) apply(auto) done next case a_AndR_r then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(rule a_star_AndR) apply(auto) done next case a_AndL1 then show ?case apply(auto) apply(generate_fresh "name") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: subst_fresh) apply(rule a_star_CutR) apply(rule a_star_AndL1) apply(auto)[1] apply(rule a_star_AndL1) apply(auto)[1] done next case a_AndL2 then show ?case apply(auto) apply(generate_fresh "name") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: subst_fresh) apply(rule a_star_CutR) apply(rule a_star_AndL2) apply(auto)[1] apply(rule a_star_AndL2) apply(auto)[1] done next case a_OrR1 then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(rule a_star_OrR1) apply(auto) done next case a_OrR2 then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(rule a_star_OrR2) apply(auto) done next case a_OrL_l then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(generate_fresh "name") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: subst_fresh) apply(rule a_star_CutR) apply(rule a_star_OrL) apply(auto) apply(rule a_star_OrL) apply(auto) done next case a_OrL_r then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(generate_fresh "name") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: subst_fresh) apply(rule a_star_CutR) apply(rule a_star_OrL) apply(auto) apply(rule a_star_OrL) apply(auto) done next case a_ImpR then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(rule a_star_ImpR) apply(auto) done next case a_ImpL_r then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(generate_fresh "name") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: subst_fresh) apply(rule a_star_CutR) apply(rule a_star_ImpL) apply(auto) apply(rule a_star_ImpL) apply(auto) done next case a_ImpL_l then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(generate_fresh "name") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: subst_fresh) apply(rule a_star_CutR) apply(rule a_star_ImpL) apply(auto) apply(rule a_star_ImpL) apply(auto) done qed lemma a_redu_subst2: assumes a: "M -->a M'" shows "M{c:=(y).P} -->a* M'{c:=(y).P}" using a proof(nominal_induct avoiding: y c P rule: a_redu.strong_induct) case al_redu then show ?case by (simp only: l_redu_subst2) next case ac_redu then show ?case apply - apply(rule a_starI) apply(rule a_redu.ac_redu) apply(simp only: c_redu_subst2') done next case (a_Cut_r a N x M M' y c P) then show ?case apply(simp add: subst_fresh fresh_a_redu) apply(rule conjI) apply(rule impI)+ apply(simp) apply(drule ax_do_not_a_reduce) apply(simp) apply(rule impI) apply(rule conjI) apply(rule impI) apply(simp) apply(drule_tac x="c" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(drule_tac x="P" in meta_spec) apply(simp) apply(rule a_star_trans) apply(rule a_star_CutR) apply(assumption) apply(rule a_star_trans) apply(rule_tac N'="P[y\<turnstile>n>x]" in a_star_CutR) apply(case_tac "fin P y") apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxL_intro) apply(simp) apply(rule a_star_trans) apply(rule a_starI) apply(rule ac_redu) apply(rule better_right) apply(simp) apply(rule subst_with_ax1) apply(rule aux4) apply(simp add: trm.inject) apply(simp add: alpha fresh_atm) apply(simp add: nrename_swap) apply(rule impI) apply(rule a_star_CutR) apply(auto) done next case (a_Cut_l a N x M M' y c P) then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(rule a_star_CutL) apply(auto)[1] apply(rule a_star_CutL) apply(auto)[1] done next case a_NotR then show ?case apply(auto) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: subst_fresh) apply(rule a_star_CutL) apply(rule a_star_NotR) apply(auto)[1] apply(rule a_star_NotR) apply(auto)[1] done next case a_NotL then show ?case apply(auto) apply(rule a_star_NotL) apply(auto)[1] done next case a_AndR_l then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: subst_fresh) apply(rule a_star_CutL) apply(rule a_star_AndR) apply(auto) apply(rule a_star_AndR) apply(auto) done next case a_AndR_r then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: subst_fresh) apply(rule a_star_CutL) apply(rule a_star_AndR) apply(auto) apply(rule a_star_AndR) apply(auto) done next case a_AndL1 then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(rule a_star_AndL1) apply(auto) done next case a_AndL2 then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(rule a_star_AndL2) apply(auto) done next case a_OrR1 then show ?case apply(auto) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: subst_fresh) apply(rule a_star_CutL) apply(rule a_star_OrR1) apply(auto)[1] apply(rule a_star_OrR1) apply(auto)[1] done next case a_OrR2 then show ?case apply(auto) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: subst_fresh) apply(rule a_star_CutL) apply(rule a_star_OrR2) apply(auto)[1] apply(rule a_star_OrR2) apply(auto)[1] done next case a_OrL_l then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(rule a_star_OrL) apply(auto) done next case a_OrL_r then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(rule a_star_OrL) apply(auto) done next case a_ImpR then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: subst_fresh) apply(rule a_star_CutL) apply(rule a_star_ImpR) apply(auto) apply(rule a_star_ImpR) apply(auto) done next case a_ImpL_l then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(rule a_star_ImpL) apply(auto) done next case a_ImpL_r then show ?case apply(auto simp add: subst_fresh fresh_a_redu) apply(rule a_star_ImpL) apply(auto) done qed lemma a_star_subst1: assumes a: "M -->a* M'" shows "M{y:=<c>.P} -->a* M'{y:=<c>.P}" using a apply(induct) apply(blast) apply(drule_tac y="y" and c="c" and P="P" in a_redu_subst1) apply(auto) done lemma a_star_subst2: assumes a: "M -->a* M'" shows "M{c:=(y).P} -->a* M'{c:=(y).P}" using a apply(induct) apply(blast) apply(drule_tac y="y" and c="c" and P="P" in a_redu_subst2) apply(auto) done text {* Candidates and SN *} text {* SNa *} inductive SNa :: "trm => bool" where SNaI: "(!!M'. M -->a M' ==> SNa M') ==> SNa M" lemma SNa_induct[consumes 1]: assumes major: "SNa M" assumes hyp: "!!M'. SNa M' ==> (∀M''. M'-->a M'' --> P M'' ==> P M')" shows "P M" apply (rule major[THEN SNa.induct]) apply (rule hyp) apply (rule SNaI) apply (blast)+ done lemma double_SNa_aux: assumes a_SNa: "SNa a" and b_SNa: "SNa b" and hyp: "!!x z. (!!y. x-->a y ==> SNa y) ==> (!!y. x-->a y ==> P y z) ==> (!!u. z-->a u ==> SNa u) ==> (!!u. z-->a u ==> P x u) ==> P x z" shows "P a b" proof - from a_SNa have r: "!!b. SNa b ==> P a b" proof (induct a rule: SNa.induct) case (SNaI x) note SNa' = this have "SNa b" by fact thus ?case proof (induct b rule: SNa.induct) case (SNaI y) show ?case apply (rule hyp) apply (erule SNa') apply (erule SNa') apply (rule SNa.SNaI) apply (erule SNaI)+ done qed qed from b_SNa show ?thesis by (rule r) qed lemma double_SNa: "[|SNa a; SNa b; ∀x z. ((∀y. x-->ay --> P y z) ∧ (∀u. z-->a u --> P x u)) --> P x z|] ==> P a b" apply(rule_tac double_SNa_aux) apply(assumption)+ apply(blast) done lemma a_preserves_SNa: assumes a: "SNa M" "M-->a M'" shows "SNa M'" using a by (erule_tac SNa.cases) (simp) lemma a_star_preserves_SNa: assumes a: "SNa M" and b: "M-->a* M'" shows "SNa M'" using b a by (induct) (auto simp add: a_preserves_SNa) lemma Ax_in_SNa: shows "SNa (Ax x a)" apply(rule SNaI) apply(erule a_redu.cases, auto) apply(erule l_redu.cases, auto) apply(erule c_redu.cases, auto) done lemma NotL_in_SNa: assumes a: "SNa M" shows "SNa (NotL <a>.M x)" using a apply(induct) apply(rule SNaI) apply(erule a_redu.cases, auto) apply(erule l_redu.cases, auto) apply(erule c_redu.cases, auto) apply(auto simp add: trm.inject alpha) apply(rotate_tac 1) apply(drule_tac x="[(a,aa)]•M'a" in meta_spec) apply(simp add: a_redu.eqvt) apply(subgoal_tac "NotL <a>.([(a,aa)]•M'a) x = NotL <aa>.M'a x") apply(simp) apply(simp add: trm.inject alpha fresh_a_redu) done lemma NotR_in_SNa: assumes a: "SNa M" shows "SNa (NotR (x).M a)" using a apply(induct) apply(rule SNaI) apply(erule a_redu.cases, auto) apply(erule l_redu.cases, auto) apply(erule c_redu.cases, auto) apply(auto simp add: trm.inject alpha) apply(rotate_tac 1) apply(drule_tac x="[(x,xa)]•M'a" in meta_spec) apply(simp add: a_redu.eqvt) apply(rule_tac s="NotR (x).([(x,xa)]•M'a) a" in subst) apply(simp add: trm.inject alpha fresh_a_redu) apply(simp) done lemma AndL1_in_SNa: assumes a: "SNa M" shows "SNa (AndL1 (x).M y)" using a apply(induct) apply(rule SNaI) apply(erule a_redu.cases, auto) apply(erule l_redu.cases, auto) apply(erule c_redu.cases, auto) apply(auto simp add: trm.inject alpha) apply(rotate_tac 1) apply(drule_tac x="[(x,xa)]•M'a" in meta_spec) apply(simp add: a_redu.eqvt) apply(rule_tac s="AndL1 x.([(x,xa)]•M'a) y" in subst) apply(simp add: trm.inject alpha fresh_a_redu) apply(simp) done lemma AndL2_in_SNa: assumes a: "SNa M" shows "SNa (AndL2 (x).M y)" using a apply(induct) apply(rule SNaI) apply(erule a_redu.cases, auto) apply(erule l_redu.cases, auto) apply(erule c_redu.cases, auto) apply(auto simp add: trm.inject alpha) apply(rotate_tac 1) apply(drule_tac x="[(x,xa)]•M'a" in meta_spec) apply(simp add: a_redu.eqvt) apply(rule_tac s="AndL2 x.([(x,xa)]•M'a) y" in subst) apply(simp add: trm.inject alpha fresh_a_redu) apply(simp) done lemma OrR1_in_SNa: assumes a: "SNa M" shows "SNa (OrR1 <a>.M b)" using a apply(induct) apply(rule SNaI) apply(erule a_redu.cases, auto) apply(erule l_redu.cases, auto) apply(erule c_redu.cases, auto) apply(auto simp add: trm.inject alpha) apply(rotate_tac 1) apply(drule_tac x="[(a,aa)]•M'a" in meta_spec) apply(simp add: a_redu.eqvt) apply(rule_tac s="OrR1 <a>.([(a,aa)]•M'a) b" in subst) apply(simp add: trm.inject alpha fresh_a_redu) apply(simp) done lemma OrR2_in_SNa: assumes a: "SNa M" shows "SNa (OrR2 <a>.M b)" using a apply(induct) apply(rule SNaI) apply(erule a_redu.cases, auto) apply(erule l_redu.cases, auto) apply(erule c_redu.cases, auto) apply(auto simp add: trm.inject alpha) apply(rotate_tac 1) apply(drule_tac x="[(a,aa)]•M'a" in meta_spec) apply(simp add: a_redu.eqvt) apply(rule_tac s="OrR2 <a>.([(a,aa)]•M'a) b" in subst) apply(simp add: trm.inject alpha fresh_a_redu) apply(simp) done lemma ImpR_in_SNa: assumes a: "SNa M" shows "SNa (ImpR (x).<a>.M b)" using a apply(induct) apply(rule SNaI) apply(erule a_redu.cases, auto) apply(erule l_redu.cases, auto) apply(erule c_redu.cases, auto) apply(auto simp add: trm.inject alpha abs_fresh abs_perm calc_atm) apply(rotate_tac 1) apply(drule_tac x="[(a,aa)]•M'a" in meta_spec) apply(simp add: a_redu.eqvt) apply(rule_tac s="ImpR (x).<a>.([(a,aa)]•M'a) b" in subst) apply(simp add: trm.inject alpha fresh_a_redu) apply(simp) apply(rotate_tac 1) apply(drule_tac x="[(x,xa)]•M'a" in meta_spec) apply(simp add: a_redu.eqvt) apply(rule_tac s="ImpR (x).<a>.([(x,xa)]•M'a) b" in subst) apply(simp add: trm.inject alpha fresh_a_redu abs_fresh abs_perm calc_atm) apply(simp) apply(rotate_tac 1) apply(drule_tac x="[(a,aa)]•[(x,xa)]•M'a" in meta_spec) apply(simp add: a_redu.eqvt) apply(rule_tac s="ImpR (x).<a>.([(a,aa)]•[(x,xa)]•M'a) b" in subst) apply(simp add: trm.inject alpha fresh_a_redu abs_fresh abs_perm calc_atm) apply(simp add: fresh_left calc_atm fresh_a_redu) apply(simp) done lemma AndR_in_SNa: assumes a: "SNa M" "SNa N" shows "SNa (AndR <a>.M <b>.N c)" apply(rule_tac a="M" and b="N" in double_SNa) apply(rule a)+ apply(auto) apply(rule SNaI) apply(drule a_redu_AndR_elim) apply(auto) done lemma OrL_in_SNa: assumes a: "SNa M" "SNa N" shows "SNa (OrL (x).M (y).N z)" apply(rule_tac a="M" and b="N" in double_SNa) apply(rule a)+ apply(auto) apply(rule SNaI) apply(drule a_redu_OrL_elim) apply(auto) done lemma ImpL_in_SNa: assumes a: "SNa M" "SNa N" shows "SNa (ImpL <a>.M (y).N z)" apply(rule_tac a="M" and b="N" in double_SNa) apply(rule a)+ apply(auto) apply(rule SNaI) apply(drule a_redu_ImpL_elim) apply(auto) done lemma SNa_eqvt: fixes pi1::"name prm" and pi2::"coname prm" shows "SNa M ==> SNa (pi1•M)" and "SNa M ==> SNa (pi2•M)" apply - apply(induct rule: SNa.induct) apply(rule SNaI) apply(drule_tac pi="(rev pi1)" in a_redu.eqvt(1)) apply(rotate_tac 1) apply(drule_tac x="(rev pi1)•M'" in meta_spec) apply(perm_simp) apply(induct rule: SNa.induct) apply(rule SNaI) apply(drule_tac pi="(rev pi2)" in a_redu.eqvt(2)) apply(rotate_tac 1) apply(drule_tac x="(rev pi2)•M'" in meta_spec) apply(perm_simp) done text {* set operators *} constdefs AXIOMSn::"ty => ntrm set" "AXIOMSn B ≡ { (x):(Ax y b) | x y b. True }" AXIOMSc::"ty => ctrm set" "AXIOMSc B ≡ { <a>:(Ax y b) | a y b. True }" BINDINGn::"ty => ctrm set => ntrm set" "BINDINGn B X ≡ { (x):M | x M. ∀a P. <a>:P∈X --> SNa (M{x:=<a>.P})}" BINDINGc::"ty => ntrm set => ctrm set" "BINDINGc B X ≡ { <a>:M | a M. ∀x P. (x):P∈X --> SNa (M{a:=(x).P})}" lemma BINDINGn_decreasing: shows "X⊆Y ==> BINDINGn B Y ⊆ BINDINGn B X" by (simp add: BINDINGn_def) (blast) lemma BINDINGc_decreasing: shows "X⊆Y ==> BINDINGc B Y ⊆ BINDINGc B X" by (simp add: BINDINGc_def) (blast) consts NOTRIGHT::"ty => ntrm set => ctrm set" nominal_primrec "NOTRIGHT (NOT B) X = { <a>:NotR (x).M a | a x M. fic (NotR (x).M a) a ∧ (x):M ∈ X }" apply(rule TrueI)+ done lemma NOTRIGHT_eqvt_name: fixes pi::"name prm" shows "(pi•(NOTRIGHT (NOT B) X)) = NOTRIGHT (NOT B) (pi•X)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•xb" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fic.eqvt(1)) apply(simp) apply(rule_tac x="(xb):M" in exI) apply(simp) apply(rule_tac x="(rev pi)•(<a>:NotR (xa).M a)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•a" in exI) apply(rule_tac x="(rev pi)•xa" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(simp) apply(drule_tac pi="rev pi" in fic.eqvt(1)) apply(simp) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp) done lemma NOTRIGHT_eqvt_coname: fixes pi::"coname prm" shows "(pi•(NOTRIGHT (NOT B) X)) = NOTRIGHT (NOT B) (pi•X)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•xb" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fic.eqvt(2)) apply(simp) apply(rule_tac x="(xb):M" in exI) apply(simp) apply(rule_tac x="<((rev pi)•a)>:NotR ((rev pi)•xa).((rev pi)•M) ((rev pi)•a)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•a" in exI) apply(rule_tac x="(rev pi)•xa" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(simp) apply(drule_tac pi="rev pi" in fic.eqvt(2)) apply(simp) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp) done consts NOTLEFT::"ty => ctrm set => ntrm set" nominal_primrec "NOTLEFT (NOT B) X = { (x):NotL <a>.M x | a x M. fin (NotL <a>.M x) x ∧ <a>:M ∈ X }" apply(rule TrueI)+ done lemma NOTLEFT_eqvt_name: fixes pi::"name prm" shows "(pi•(NOTLEFT (NOT B) X)) = NOTLEFT (NOT B) (pi•X)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•xb" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fin.eqvt(1)) apply(simp) apply(rule_tac x="<a>:M" in exI) apply(simp) apply(rule_tac x="(((rev pi)•xa)):NotL <((rev pi)•a)>.((rev pi)•M) ((rev pi)•xa)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•a" in exI) apply(rule_tac x="(rev pi)•xa" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(simp) apply(drule_tac pi="rev pi" in fin.eqvt(1)) apply(simp) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp) done lemma NOTLEFT_eqvt_coname: fixes pi::"coname prm" shows "(pi•(NOTLEFT (NOT B) X)) = NOTLEFT (NOT B) (pi•X)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•xb" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fin.eqvt(2)) apply(simp) apply(rule_tac x="<a>:M" in exI) apply(simp) apply(rule_tac x="(((rev pi)•xa)):NotL <((rev pi)•a)>.((rev pi)•M) ((rev pi)•xa)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•a" in exI) apply(rule_tac x="(rev pi)•xa" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(simp) apply(drule_tac pi="rev pi" in fin.eqvt(2)) apply(simp) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp) done consts ANDRIGHT::"ty => ctrm set => ctrm set => ctrm set" nominal_primrec "ANDRIGHT (B AND C) X Y = { <c>:AndR <a>.M <b>.N c | c a b M N. fic (AndR <a>.M <b>.N c) c ∧ <a>:M ∈ X ∧ <b>:N ∈ Y }" apply(rule TrueI)+ done lemma ANDRIGHT_eqvt_name: fixes pi::"name prm" shows "(pi•(ANDRIGHT (A AND B) X Y)) = ANDRIGHT (A AND B) (pi•X) (pi•Y)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•c" in exI) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•b" in exI) apply(rule_tac x="pi•M" in exI) apply(rule_tac x="pi•N" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fic.eqvt(1)) apply(simp) apply(rule conjI) apply(rule_tac x="<a>:M" in exI) apply(simp) apply(rule_tac x="<b>:N" in exI) apply(simp) apply(rule_tac x="(rev pi)•(<c>:AndR <a>.M <b>.N c)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•c" in exI) apply(rule_tac x="(rev pi)•a" in exI) apply(rule_tac x="(rev pi)•b" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(rule_tac x="(rev pi)•N" in exI) apply(simp) apply(drule_tac pi="rev pi" in fic.eqvt(1)) apply(simp) apply(drule sym) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp) done lemma ANDRIGHT_eqvt_coname: fixes pi::"coname prm" shows "(pi•(ANDRIGHT (A AND B) X Y)) = ANDRIGHT (A AND B) (pi•X) (pi•Y)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•c" in exI) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•b" in exI) apply(rule_tac x="pi•M" in exI) apply(rule_tac x="pi•N" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fic.eqvt(2)) apply(simp) apply(rule conjI) apply(rule_tac x="<a>:M" in exI) apply(simp) apply(rule_tac x="<b>:N" in exI) apply(simp) apply(rule_tac x="(rev pi)•(<c>:AndR <a>.M <b>.N c)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•c" in exI) apply(rule_tac x="(rev pi)•a" in exI) apply(rule_tac x="(rev pi)•b" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(rule_tac x="(rev pi)•N" in exI) apply(simp) apply(drule_tac pi="rev pi" in fic.eqvt(2)) apply(simp) apply(drule sym) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp) done consts ANDLEFT1::"ty => ntrm set => ntrm set" nominal_primrec "ANDLEFT1 (B AND C) X = { (y):AndL1 (x).M y | x y M. fin (AndL1 (x).M y) y ∧ (x):M ∈ X }" apply(rule TrueI)+ done lemma ANDLEFT1_eqvt_name: fixes pi::"name prm" shows "(pi•(ANDLEFT1 (A AND B) X)) = ANDLEFT1 (A AND B) (pi•X)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•xb" in exI) apply(rule_tac x="pi•y" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fin.eqvt(1)) apply(simp) apply(rule_tac x="(xb):M" in exI) apply(simp) apply(rule_tac x="(rev pi)•((y):AndL1 (xa).M y)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•xa" in exI) apply(rule_tac x="(rev pi)•y" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(simp) apply(drule_tac pi="rev pi" in fin.eqvt(1)) apply(simp) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp) done lemma ANDLEFT1_eqvt_coname: fixes pi::"coname prm" shows "(pi•(ANDLEFT1 (A AND B) X)) = ANDLEFT1 (A AND B) (pi•X)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•xb" in exI) apply(rule_tac x="pi•y" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fin.eqvt(2)) apply(simp) apply(rule_tac x="(xb):M" in exI) apply(simp) apply(rule_tac x="(rev pi)•((y):AndL1 (xa).M y)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•xa" in exI) apply(rule_tac x="(rev pi)•y" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(simp) apply(drule_tac pi="rev pi" in fin.eqvt(2)) apply(simp) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp) done consts ANDLEFT2::"ty => ntrm set => ntrm set" nominal_primrec "ANDLEFT2 (B AND C) X = { (y):AndL2 (x).M y | x y M. fin (AndL2 (x).M y) y ∧ (x):M ∈ X }" apply(rule TrueI)+ done lemma ANDLEFT2_eqvt_name: fixes pi::"name prm" shows "(pi•(ANDLEFT2 (A AND B) X)) = ANDLEFT2 (A AND B) (pi•X)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•xb" in exI) apply(rule_tac x="pi•y" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fin.eqvt(1)) apply(simp) apply(rule_tac x="(xb):M" in exI) apply(simp) apply(rule_tac x="(rev pi)•((y):AndL2 (xa).M y)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•xa" in exI) apply(rule_tac x="(rev pi)•y" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(simp) apply(drule_tac pi="rev pi" in fin.eqvt(1)) apply(simp) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp) done lemma ANDLEFT2_eqvt_coname: fixes pi::"coname prm" shows "(pi•(ANDLEFT2 (A AND B) X)) = ANDLEFT2 (A AND B) (pi•X)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•xb" in exI) apply(rule_tac x="pi•y" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fin.eqvt(2)) apply(simp) apply(rule_tac x="(xb):M" in exI) apply(simp) apply(rule_tac x="(rev pi)•((y):AndL2 (xa).M y)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•xa" in exI) apply(rule_tac x="(rev pi)•y" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(simp) apply(drule_tac pi="rev pi" in fin.eqvt(2)) apply(simp) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp) done consts ORLEFT::"ty => ntrm set => ntrm set => ntrm set" nominal_primrec "ORLEFT (B OR C) X Y = { (z):OrL (x).M (y).N z | x y z M N. fin (OrL (x).M (y).N z) z ∧ (x):M ∈ X ∧ (y):N ∈ Y }" apply(rule TrueI)+ done lemma ORLEFT_eqvt_name: fixes pi::"name prm" shows "(pi•(ORLEFT (A OR B) X Y)) = ORLEFT (A OR B) (pi•X) (pi•Y)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•xb" in exI) apply(rule_tac x="pi•y" in exI) apply(rule_tac x="pi•z" in exI) apply(rule_tac x="pi•M" in exI) apply(rule_tac x="pi•N" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fin.eqvt(1)) apply(simp) apply(rule conjI) apply(rule_tac x="(xb):M" in exI) apply(simp) apply(rule_tac x="(y):N" in exI) apply(simp) apply(rule_tac x="(rev pi)•((z):OrL (xa).M (y).N z)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•xa" in exI) apply(rule_tac x="(rev pi)•y" in exI) apply(rule_tac x="(rev pi)•z" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(rule_tac x="(rev pi)•N" in exI) apply(simp) apply(drule_tac pi="rev pi" in fin.eqvt(1)) apply(simp) apply(drule sym) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp) done lemma ORLEFT_eqvt_coname: fixes pi::"coname prm" shows "(pi•(ORLEFT (A OR B) X Y)) = ORLEFT (A OR B) (pi•X) (pi•Y)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•xb" in exI) apply(rule_tac x="pi•y" in exI) apply(rule_tac x="pi•z" in exI) apply(rule_tac x="pi•M" in exI) apply(rule_tac x="pi•N" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fin.eqvt(2)) apply(simp) apply(rule conjI) apply(rule_tac x="(xb):M" in exI) apply(simp) apply(rule_tac x="(y):N" in exI) apply(simp) apply(rule_tac x="(rev pi)•((z):OrL (xa).M (y).N z)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•xa" in exI) apply(rule_tac x="(rev pi)•y" in exI) apply(rule_tac x="(rev pi)•z" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(rule_tac x="(rev pi)•N" in exI) apply(simp) apply(drule_tac pi="rev pi" in fin.eqvt(2)) apply(simp) apply(drule sym) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp) done consts ORRIGHT1::"ty => ctrm set => ctrm set" nominal_primrec "ORRIGHT1 (B OR C) X = { <b>:OrR1 <a>.M b | a b M. fic (OrR1 <a>.M b) b ∧ <a>:M ∈ X }" apply(rule TrueI)+ done lemma ORRIGHT1_eqvt_name: fixes pi::"name prm" shows "(pi•(ORRIGHT1 (A OR B) X)) = ORRIGHT1 (A OR B) (pi•X)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•b" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fic.eqvt(1)) apply(simp) apply(rule_tac x="<a>:M" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•(<b>:OrR1 <a>.M b)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•a" in exI) apply(rule_tac x="(rev pi)•b" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(simp) apply(drule_tac pi="rev pi" in fic.eqvt(1)) apply(simp) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp) done lemma ORRIGHT1_eqvt_coname: fixes pi::"coname prm" shows "(pi•(ORRIGHT1 (A OR B) X)) = ORRIGHT1 (A OR B) (pi•X)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•b" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fic.eqvt(2)) apply(simp) apply(rule_tac x="<a>:M" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•(<b>:OrR1 <a>.M b)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•a" in exI) apply(rule_tac x="(rev pi)•b" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(simp) apply(drule_tac pi="rev pi" in fic.eqvt(2)) apply(simp) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp) done consts ORRIGHT2::"ty => ctrm set => ctrm set" nominal_primrec "ORRIGHT2 (B OR C) X = { <b>:OrR2 <a>.M b | a b M. fic (OrR2 <a>.M b) b ∧ <a>:M ∈ X }" apply(rule TrueI)+ done lemma ORRIGHT2_eqvt_name: fixes pi::"name prm" shows "(pi•(ORRIGHT2 (A OR B) X)) = ORRIGHT2 (A OR B) (pi•X)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•b" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fic.eqvt(1)) apply(simp) apply(rule_tac x="<a>:M" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•(<b>:OrR2 <a>.M b)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•a" in exI) apply(rule_tac x="(rev pi)•b" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(simp) apply(drule_tac pi="rev pi" in fic.eqvt(1)) apply(simp) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp) done lemma ORRIGHT2_eqvt_coname: fixes pi::"coname prm" shows "(pi•(ORRIGHT2 (A OR B) X)) = ORRIGHT2 (A OR B) (pi•X)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•b" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fic.eqvt(2)) apply(simp) apply(rule_tac x="<a>:M" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•(<b>:OrR2 <a>.M b)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•a" in exI) apply(rule_tac x="(rev pi)•b" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(simp) apply(drule_tac pi="rev pi" in fic.eqvt(2)) apply(simp) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp) done consts IMPRIGHT::"ty => ntrm set => ctrm set => ntrm set => ctrm set => ctrm set" nominal_primrec "IMPRIGHT (B IMP C) X Y Z U= { <b>:ImpR (x).<a>.M b | x a b M. fic (ImpR (x).<a>.M b) b ∧ (∀z P. x\<sharp>(z,P) ∧ (z):P ∈ Z --> (x):(M{a:=(z).P}) ∈ X) ∧ (∀c Q. a\<sharp>(c,Q) ∧ <c>:Q ∈ U --> <a>:(M{x:=<c>.Q}) ∈ Y)}" apply(rule TrueI)+ done lemma IMPRIGHT_eqvt_name: fixes pi::"name prm" shows "(pi•(IMPRIGHT (A IMP B) X Y Z U)) = IMPRIGHT (A IMP B) (pi•X) (pi•Y) (pi•Z) (pi•U)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•xb" in exI) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•b" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fic.eqvt(1)) apply(simp) apply(rule conjI) apply(auto)[1] apply(rule_tac x="(xb):(M{a:=((rev pi)•z).((rev pi)•P)})" in exI) apply(perm_simp add: csubst_eqvt) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp) apply(simp add: fresh_right) apply(auto)[1] apply(rule_tac x="<a>:(M{xb:=<((rev pi)•c)>.((rev pi)•Q)})" in exI) apply(perm_simp add: nsubst_eqvt) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp add: fresh_right) apply(rule_tac x="(rev pi)•(<b>:ImpR xa.<a>.M b)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•xa" in exI) apply(rule_tac x="(rev pi)•a" in exI) apply(rule_tac x="(rev pi)•b" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(simp) apply(drule_tac pi="rev pi" in fic.eqvt(1)) apply(simp) apply(rule conjI) apply(auto)[1] apply(drule_tac x="pi•z" in spec) apply(drule_tac x="pi•P" in spec) apply(drule mp) apply(simp add: fresh_right) apply(rule_tac x="(z):P" in exI) apply(simp) apply(auto)[1] apply(drule sym) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(perm_simp add: csubst_eqvt fresh_right) apply(auto)[1] apply(drule_tac x="pi•c" in spec) apply(drule_tac x="pi•Q" in spec) apply(drule mp) apply(simp add: fresh_right) apply(rule_tac x="<c>:Q" in exI) apply(simp) apply(auto)[1] apply(drule sym) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(perm_simp add: nsubst_eqvt) done lemma IMPRIGHT_eqvt_coname: fixes pi::"coname prm" shows "(pi•(IMPRIGHT (A IMP B) X Y Z U)) = IMPRIGHT (A IMP B) (pi•X) (pi•Y) (pi•Z) (pi•U)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•xb" in exI) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•b" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fic.eqvt(2)) apply(simp) apply(rule conjI) apply(auto)[1] apply(rule_tac x="(xb):(M{a:=((rev pi)•z).((rev pi)•P)})" in exI) apply(perm_simp add: csubst_eqvt) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: fresh_right) apply(auto)[1] apply(rule_tac x="<a>:(M{xb:=<((rev pi)•c)>.((rev pi)•Q)})" in exI) apply(perm_simp add: nsubst_eqvt) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: fresh_right) apply(rule_tac x="(rev pi)•(<b>:ImpR xa.<a>.M b)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•xa" in exI) apply(rule_tac x="(rev pi)•a" in exI) apply(rule_tac x="(rev pi)•b" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(simp) apply(drule_tac pi="rev pi" in fic.eqvt(2)) apply(simp) apply(rule conjI) apply(auto)[1] apply(drule_tac x="pi•z" in spec) apply(drule_tac x="pi•P" in spec) apply(simp add: fresh_right) apply(drule mp) apply(rule_tac x="(z):P" in exI) apply(simp) apply(auto)[1] apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(perm_simp add: csubst_eqvt fresh_right) apply(auto)[1] apply(drule_tac x="pi•c" in spec) apply(drule_tac x="pi•Q" in spec) apply(simp add: fresh_right) apply(drule mp) apply(rule_tac x="<c>:Q" in exI) apply(simp) apply(auto)[1] apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(perm_simp add: nsubst_eqvt fresh_right) done consts IMPLEFT::"ty => ctrm set => ntrm set => ntrm set" nominal_primrec "IMPLEFT (B IMP C) X Y = { (y):ImpL <a>.M (x).N y | x a y M N. fin (ImpL <a>.M (x).N y) y ∧ <a>:M ∈ X ∧ (x):N ∈ Y }" apply(rule TrueI)+ done lemma IMPLEFT_eqvt_name: fixes pi::"name prm" shows "(pi•(IMPLEFT (A IMP B) X Y)) = IMPLEFT (A IMP B) (pi•X) (pi•Y)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•xb" in exI) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•y" in exI) apply(rule_tac x="pi•M" in exI) apply(rule_tac x="pi•N" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fin.eqvt(1)) apply(simp) apply(rule conjI) apply(rule_tac x="<a>:M" in exI) apply(simp) apply(rule_tac x="(xb):N" in exI) apply(simp) apply(rule_tac x="(rev pi)•((y):ImpL <a>.M (xa).N y)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•xa" in exI) apply(rule_tac x="(rev pi)•a" in exI) apply(rule_tac x="(rev pi)•y" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(rule_tac x="(rev pi)•N" in exI) apply(simp) apply(drule_tac pi="rev pi" in fin.eqvt(1)) apply(simp) apply(drule sym) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp) done lemma IMPLEFT_eqvt_coname: fixes pi::"coname prm" shows "(pi•(IMPLEFT (A IMP B) X Y)) = IMPLEFT (A IMP B) (pi•X) (pi•Y)" apply(auto simp add: perm_set_eq) apply(rule_tac x="pi•xb" in exI) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•y" in exI) apply(rule_tac x="pi•M" in exI) apply(rule_tac x="pi•N" in exI) apply(simp) apply(rule conjI) apply(drule_tac pi="pi" in fin.eqvt(2)) apply(simp) apply(rule conjI) apply(rule_tac x="<a>:M" in exI) apply(simp) apply(rule_tac x="(xb):N" in exI) apply(simp) apply(rule_tac x="(rev pi)•((y):ImpL <a>.M (xa).N y)" in exI) apply(perm_simp) apply(rule_tac x="(rev pi)•xa" in exI) apply(rule_tac x="(rev pi)•a" in exI) apply(rule_tac x="(rev pi)•y" in exI) apply(rule_tac x="(rev pi)•M" in exI) apply(rule_tac x="(rev pi)•N" in exI) apply(simp) apply(drule_tac pi="rev pi" in fin.eqvt(2)) apply(simp) apply(drule sym) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp) done lemma sum_cases: shows "(∃y. x=Inl y) ∨ (∃y. x=Inr y)" apply(rule_tac s="x" in sumE) apply(auto) done function NEGc::"ty => ntrm set => ctrm set" and NEGn::"ty => ctrm set => ntrm set" where "NEGc (PR A) X = AXIOMSc (PR A) ∪ BINDINGc (PR A) X" | "NEGc (NOT C) X = AXIOMSc (NOT C) ∪ BINDINGc (NOT C) X ∪ NOTRIGHT (NOT C) (lfp (NEGn C o NEGc C))" | "NEGc (C AND D) X = AXIOMSc (C AND D) ∪ BINDINGc (C AND D) X ∪ ANDRIGHT (C AND D) (NEGc C (lfp (NEGn C o NEGc C))) (NEGc D (lfp (NEGn D o NEGc D)))" | "NEGc (C OR D) X = AXIOMSc (C OR D) ∪ BINDINGc (C OR D) X ∪ ORRIGHT1 (C OR D) (NEGc C (lfp (NEGn C o NEGc C))) ∪ ORRIGHT2 (C OR D) (NEGc D (lfp (NEGn D o NEGc D)))" | "NEGc (C IMP D) X = AXIOMSc (C IMP D) ∪ BINDINGc (C IMP D) X ∪ IMPRIGHT (C IMP D) (lfp (NEGn C o NEGc C)) (NEGc D (lfp (NEGn D o NEGc D))) (lfp (NEGn D o NEGc D)) (NEGc C (lfp (NEGn C o NEGc C)))" | "NEGn (PR A) X = AXIOMSn (PR A) ∪ BINDINGn (PR A) X" | "NEGn (NOT C) X = AXIOMSn (NOT C) ∪ BINDINGn (NOT C) X ∪ NOTLEFT (NOT C) (NEGc C (lfp (NEGn C o NEGc C)))" | "NEGn (C AND D) X = AXIOMSn (C AND D) ∪ BINDINGn (C AND D) X ∪ ANDLEFT1 (C AND D) (lfp (NEGn C o NEGc C)) ∪ ANDLEFT2 (C AND D) (lfp (NEGn D o NEGc D))" | "NEGn (C OR D) X = AXIOMSn (C OR D) ∪ BINDINGn (C OR D) X ∪ ORLEFT (C OR D) (lfp (NEGn C o NEGc C)) (lfp (NEGn D o NEGc D))" | "NEGn (C IMP D) X = AXIOMSn (C IMP D) ∪ BINDINGn (C IMP D) X ∪ IMPLEFT (C IMP D) (NEGc C (lfp (NEGn C o NEGc C))) (lfp (NEGn D o NEGc D))" using ty_cases sum_cases apply(auto simp add: ty.inject) apply(drule_tac x="x" in meta_spec) apply(auto simp add: ty.inject) apply(rotate_tac 10) apply(drule_tac x="a" in meta_spec) apply(auto simp add: ty.inject) apply(blast) apply(blast) apply(blast) apply(rotate_tac 10) apply(drule_tac x="a" in meta_spec) apply(auto simp add: ty.inject) apply(blast) apply(blast) apply(blast) done termination apply(relation "measure (sum_case (sizeofst) (sizeofst))") apply(simp_all) done text {* Candidates *} lemma test1: shows "x∈(X∪Y) = (x∈X ∨ x∈Y)" by blast lemma test2: shows "x∈(X∩Y) = (x∈X ∧ x∈Y)" by blast lemma big_inter_eqvt: fixes pi1::"name prm" and X::"('a::pt_name) set set" and pi2::"coname prm" and Y::"('b::pt_coname) set set" shows "(pi1•(\<Inter> X)) = \<Inter> (pi1•X)" and "(pi2•(\<Inter> Y)) = \<Inter> (pi2•Y)" apply(auto simp add: perm_set_eq) apply(rule_tac x="(rev pi1)•x" in exI) apply(perm_simp) apply(rule ballI) apply(drule_tac x="pi1•xa" in spec) apply(auto) apply(drule_tac x="xa" in spec) apply(auto)[1] apply(rule_tac x="(rev pi1)•xb" in exI) apply(perm_simp) apply(simp add: pt_set_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp add: pt_set_bij[OF pt_name_inst, OF at_name_inst]) apply(simp add: pt_set_bij1[OF pt_name_inst, OF at_name_inst]) apply(rule_tac x="(rev pi2)•x" in exI) apply(perm_simp) apply(rule ballI) apply(drule_tac x="pi2•xa" in spec) apply(auto) apply(drule_tac x="xa" in spec) apply(auto)[1] apply(rule_tac x="(rev pi2)•xb" in exI) apply(perm_simp) apply(simp add: pt_set_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: pt_set_bij[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: pt_set_bij1[OF pt_coname_inst, OF at_coname_inst]) done lemma lfp_eqvt: fixes pi1::"name prm" and f::"'a set => ('a::pt_name) set" and pi2::"coname prm" and g::"'b set => ('b::pt_coname) set" shows "pi1•(lfp f) = lfp (pi1•f)" and "pi2•(lfp g) = lfp (pi2•g)" apply(simp add: lfp_def) apply(simp add: Inf_set_eq) apply(simp add: big_inter_eqvt) apply(simp add: pt_Collect_eqvt[OF pt_name_inst, OF at_name_inst]) apply(subgoal_tac "{u. (pi1•f) u ⊆ u} = {u. ((rev pi1)•((pi1•f) u)) ⊆ ((rev pi1)•u)}") apply(perm_simp) apply(rule Collect_cong) apply(rule iffI) apply(rule subseteq_eqvt(1)[THEN iffD1]) apply(simp add: perm_bool) apply(drule subseteq_eqvt(1)[THEN iffD2]) apply(simp add: perm_bool) apply(simp add: lfp_def) apply(simp add: Inf_set_eq) apply(simp add: big_inter_eqvt) apply(simp add: pt_Collect_eqvt[OF pt_coname_inst, OF at_coname_inst]) apply(subgoal_tac "{u. (pi2•g) u ⊆ u} = {u. ((rev pi2)•((pi2•g) u)) ⊆ ((rev pi2)•u)}") apply(perm_simp) apply(rule Collect_cong) apply(rule iffI) apply(rule subseteq_eqvt(2)[THEN iffD1]) apply(simp add: perm_bool) apply(drule subseteq_eqvt(2)[THEN iffD2]) apply(simp add: perm_bool) done abbreviation CANDn::"ty => ntrm set" ("\<parallel>'(_')\<parallel>" [60] 60) where "\<parallel>(B)\<parallel> ≡ lfp (NEGn B o NEGc B)" abbreviation CANDc::"ty => ctrm set" ("\<parallel><_>\<parallel>" [60] 60) where "\<parallel><B>\<parallel> ≡ NEGc B (\<parallel>(B)\<parallel>)" lemma NEGn_decreasing: shows "X⊆Y ==> NEGn B Y ⊆ NEGn B X" by (nominal_induct B rule: ty.strong_induct) (auto dest: BINDINGn_decreasing) lemma NEGc_decreasing: shows "X⊆Y ==> NEGc B Y ⊆ NEGc B X" by (nominal_induct B rule: ty.strong_induct) (auto dest: BINDINGc_decreasing) lemma mono_NEGn_NEGc: shows "mono (NEGn B o NEGc B)" and "mono (NEGc B o NEGn B)" proof - have "∀X Y. X⊆Y --> NEGn B (NEGc B X) ⊆ NEGn B (NEGc B Y)" proof (intro strip) fix X::"ntrm set" and Y::"ntrm set" assume "X⊆Y" then have "NEGc B Y ⊆ NEGc B X" by (simp add: NEGc_decreasing) then show "NEGn B (NEGc B X) ⊆ NEGn B (NEGc B Y)" by (simp add: NEGn_decreasing) qed then show "mono (NEGn B o NEGc B)" by (simp add: mono_def) next have "∀X Y. X⊆Y --> NEGc B (NEGn B X) ⊆ NEGc B (NEGn B Y)" proof (intro strip) fix X::"ctrm set" and Y::"ctrm set" assume "X⊆Y" then have "NEGn B Y ⊆ NEGn B X" by (simp add: NEGn_decreasing) then show "NEGc B (NEGn B X) ⊆ NEGc B (NEGn B Y)" by (simp add: NEGc_decreasing) qed then show "mono (NEGc B o NEGn B)" by (simp add: mono_def) qed lemma NEG_simp: shows "\<parallel><B>\<parallel> = NEGc B (\<parallel>(B)\<parallel>)" and "\<parallel>(B)\<parallel> = NEGn B (\<parallel><B>\<parallel>)" proof - show "\<parallel><B>\<parallel> = NEGc B (\<parallel>(B)\<parallel>)" by simp next have "\<parallel>(B)\<parallel> ≡ lfp (NEGn B o NEGc B)" by simp then have "\<parallel>(B)\<parallel> = (NEGn B o NEGc B) (\<parallel>(B)\<parallel>)" using mono_NEGn_NEGc def_lfp_unfold by blast then show "\<parallel>(B)\<parallel> = NEGn B (\<parallel><B>\<parallel>)" by simp qed lemma NEG_elim: shows "M ∈ \<parallel><B>\<parallel> ==> M ∈ NEGc B (\<parallel>(B)\<parallel>)" and "N ∈ \<parallel>(B)\<parallel> ==> N ∈ NEGn B (\<parallel><B>\<parallel>)" using NEG_simp by (blast)+ lemma NEG_intro: shows "M ∈ NEGc B (\<parallel>(B)\<parallel>) ==> M ∈ \<parallel><B>\<parallel>" and "N ∈ NEGn B (\<parallel><B>\<parallel>) ==> N ∈ \<parallel>(B)\<parallel>" using NEG_simp by (blast)+ lemma NEGc_simps: shows "NEGc (PR A) (\<parallel>(PR A)\<parallel>) = AXIOMSc (PR A) ∪ BINDINGc (PR A) (\<parallel>(PR A)\<parallel>)" and "NEGc (NOT C) (\<parallel>(NOT C)\<parallel>) = AXIOMSc (NOT C) ∪ BINDINGc (NOT C) (\<parallel>(NOT C)\<parallel>) ∪ (NOTRIGHT (NOT C) (\<parallel>(C)\<parallel>))" and "NEGc (C AND D) (\<parallel>(C AND D)\<parallel>) = AXIOMSc (C AND D) ∪ BINDINGc (C AND D) (\<parallel>(C AND D)\<parallel>) ∪ (ANDRIGHT (C AND D) (\<parallel><C>\<parallel>) (\<parallel><D>\<parallel>))" and "NEGc (C OR D) (\<parallel>(C OR D)\<parallel>) = AXIOMSc (C OR D) ∪ BINDINGc (C OR D) (\<parallel>(C OR D)\<parallel>) ∪ (ORRIGHT1 (C OR D) (\<parallel><C>\<parallel>)) ∪ (ORRIGHT2 (C OR D) (\<parallel><D>\<parallel>))" and "NEGc (C IMP D) (\<parallel>(C IMP D)\<parallel>) = AXIOMSc (C IMP D) ∪ BINDINGc (C IMP D) (\<parallel>(C IMP D)\<parallel>) ∪ (IMPRIGHT (C IMP D) (\<parallel>(C)\<parallel>) (\<parallel><D>\<parallel>) (\<parallel>(D)\<parallel>) (\<parallel><C>\<parallel>))" by (simp_all only: NEGc.simps) lemma AXIOMS_in_CANDs: shows "AXIOMSn B ⊆ (\<parallel>(B)\<parallel>)" and "AXIOMSc B ⊆ (\<parallel><B>\<parallel>)" proof - have "AXIOMSn B ⊆ NEGn B (\<parallel><B>\<parallel>)" by (nominal_induct B rule: ty.strong_induct) (auto) then show "AXIOMSn B ⊆ \<parallel>(B)\<parallel>" using NEG_simp by blast next have "AXIOMSc B ⊆ NEGc B (\<parallel>(B)\<parallel>)" by (nominal_induct B rule: ty.strong_induct) (auto) then show "AXIOMSc B ⊆ \<parallel><B>\<parallel>" using NEG_simp by blast qed lemma Ax_in_CANDs: shows "(y):Ax x a ∈ \<parallel>(B)\<parallel>" and "<b>:Ax x a ∈ \<parallel><B>\<parallel>" proof - have "(y):Ax x a ∈ AXIOMSn B" by (auto simp add: AXIOMSn_def) also have "AXIOMSn B ⊆ \<parallel>(B)\<parallel>" by (rule AXIOMS_in_CANDs) finally show "(y):Ax x a ∈ \<parallel>(B)\<parallel>" by simp next have "<b>:Ax x a ∈ AXIOMSc B" by (auto simp add: AXIOMSc_def) also have "AXIOMSc B ⊆ \<parallel><B>\<parallel>" by (rule AXIOMS_in_CANDs) finally show "<b>:Ax x a ∈ \<parallel><B>\<parallel>" by simp qed lemma AXIOMS_eqvt_aux_name: fixes pi::"name prm" shows "M ∈ AXIOMSn B ==> (pi•M) ∈ AXIOMSn B" and "N ∈ AXIOMSc B ==> (pi•N) ∈ AXIOMSc B" apply(auto simp add: AXIOMSn_def AXIOMSc_def) apply(rule_tac x="pi•x" in exI) apply(rule_tac x="pi•y" in exI) apply(rule_tac x="pi•b" in exI) apply(simp) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•y" in exI) apply(rule_tac x="pi•b" in exI) apply(simp) done lemma AXIOMS_eqvt_aux_coname: fixes pi::"coname prm" shows "M ∈ AXIOMSn B ==> (pi•M) ∈ AXIOMSn B" and "N ∈ AXIOMSc B ==> (pi•N) ∈ AXIOMSc B" apply(auto simp add: AXIOMSn_def AXIOMSc_def) apply(rule_tac x="pi•x" in exI) apply(rule_tac x="pi•y" in exI) apply(rule_tac x="pi•b" in exI) apply(simp) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•y" in exI) apply(rule_tac x="pi•b" in exI) apply(simp) done lemma AXIOMS_eqvt_name: fixes pi::"name prm" shows "(pi•AXIOMSn B) = AXIOMSn B" and "(pi•AXIOMSc B) = AXIOMSc B" apply(auto) apply(simp add: pt_set_bij1a[OF pt_name_inst, OF at_name_inst]) apply(drule_tac pi="pi" in AXIOMS_eqvt_aux_name(1)) apply(perm_simp) apply(drule_tac pi="rev pi" in AXIOMS_eqvt_aux_name(1)) apply(simp add: pt_set_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp add: pt_set_bij1a[OF pt_name_inst, OF at_name_inst]) apply(drule_tac pi="pi" in AXIOMS_eqvt_aux_name(2)) apply(perm_simp) apply(drule_tac pi="rev pi" in AXIOMS_eqvt_aux_name(2)) apply(simp add: pt_set_bij1[OF pt_name_inst, OF at_name_inst]) done lemma AXIOMS_eqvt_coname: fixes pi::"coname prm" shows "(pi•AXIOMSn B) = AXIOMSn B" and "(pi•AXIOMSc B) = AXIOMSc B" apply(auto) apply(simp add: pt_set_bij1a[OF pt_coname_inst, OF at_coname_inst]) apply(drule_tac pi="pi" in AXIOMS_eqvt_aux_coname(1)) apply(perm_simp) apply(drule_tac pi="rev pi" in AXIOMS_eqvt_aux_coname(1)) apply(simp add: pt_set_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: pt_set_bij1a[OF pt_coname_inst, OF at_coname_inst]) apply(drule_tac pi="pi" in AXIOMS_eqvt_aux_coname(2)) apply(perm_simp) apply(drule_tac pi="rev pi" in AXIOMS_eqvt_aux_coname(2)) apply(simp add: pt_set_bij1[OF pt_coname_inst, OF at_coname_inst]) done lemma BINDING_eqvt_name: fixes pi::"name prm" shows "(pi•(BINDINGn B X)) = BINDINGn B (pi•X)" and "(pi•(BINDINGc B Y)) = BINDINGc B (pi•Y)" apply(auto simp add: BINDINGn_def BINDINGc_def perm_set_eq) apply(rule_tac x="pi•xb" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(auto)[1] apply(drule_tac x="(rev pi)•a" in spec) apply(drule_tac x="(rev pi)•P" in spec) apply(drule mp) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp) apply(drule_tac ?pi1.0="pi" in SNa_eqvt(1)) apply(perm_simp add: nsubst_eqvt) apply(rule_tac x="(rev pi•xa):(rev pi•M)" in exI) apply(perm_simp) apply(rule_tac x="rev pi•xa" in exI) apply(rule_tac x="rev pi•M" in exI) apply(simp) apply(auto)[1] apply(drule_tac x="pi•a" in spec) apply(drule_tac x="pi•P" in spec) apply(drule mp) apply(force) apply(drule_tac ?pi1.0="rev pi" in SNa_eqvt(1)) apply(perm_simp add: nsubst_eqvt) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(auto)[1] apply(drule_tac x="(rev pi)•x" in spec) apply(drule_tac x="(rev pi)•P" in spec) apply(drule mp) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp) apply(drule_tac ?pi1.0="pi" in SNa_eqvt(1)) apply(perm_simp add: csubst_eqvt) apply(rule_tac x="<(rev pi•a)>:(rev pi•M)" in exI) apply(perm_simp) apply(rule_tac x="rev pi•a" in exI) apply(rule_tac x="rev pi•M" in exI) apply(simp) apply(auto)[1] apply(drule_tac x="pi•x" in spec) apply(drule_tac x="pi•P" in spec) apply(drule mp) apply(force) apply(drule_tac ?pi1.0="rev pi" in SNa_eqvt(1)) apply(perm_simp add: csubst_eqvt) done lemma BINDING_eqvt_coname: fixes pi::"coname prm" shows "(pi•(BINDINGn B X)) = BINDINGn B (pi•X)" and "(pi•(BINDINGc B Y)) = BINDINGc B (pi•Y)" apply(auto simp add: BINDINGn_def BINDINGc_def perm_set_eq) apply(rule_tac x="pi•xb" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(auto)[1] apply(drule_tac x="(rev pi)•a" in spec) apply(drule_tac x="(rev pi)•P" in spec) apply(drule mp) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp) apply(drule_tac ?pi2.0="pi" in SNa_eqvt(2)) apply(perm_simp add: nsubst_eqvt) apply(rule_tac x="(rev pi•xa):(rev pi•M)" in exI) apply(perm_simp) apply(rule_tac x="rev pi•xa" in exI) apply(rule_tac x="rev pi•M" in exI) apply(simp) apply(auto)[1] apply(drule_tac x="pi•a" in spec) apply(drule_tac x="pi•P" in spec) apply(drule mp) apply(force) apply(drule_tac ?pi2.0="rev pi" in SNa_eqvt(2)) apply(perm_simp add: nsubst_eqvt) apply(rule_tac x="pi•a" in exI) apply(rule_tac x="pi•M" in exI) apply(simp) apply(auto)[1] apply(drule_tac x="(rev pi)•x" in spec) apply(drule_tac x="(rev pi)•P" in spec) apply(drule mp) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp) apply(drule_tac ?pi2.0="pi" in SNa_eqvt(2)) apply(perm_simp add: csubst_eqvt) apply(rule_tac x="<(rev pi•a)>:(rev pi•M)" in exI) apply(perm_simp) apply(rule_tac x="rev pi•a" in exI) apply(rule_tac x="rev pi•M" in exI) apply(simp) apply(auto)[1] apply(drule_tac x="pi•x" in spec) apply(drule_tac x="pi•P" in spec) apply(drule mp) apply(force) apply(drule_tac ?pi2.0="rev pi" in SNa_eqvt(2)) apply(perm_simp add: csubst_eqvt) done lemma CAND_eqvt_name: fixes pi::"name prm" shows "(pi•(\<parallel>(B)\<parallel>)) = (\<parallel>(B)\<parallel>)" and "(pi•(\<parallel><B>\<parallel>)) = (\<parallel><B>\<parallel>)" proof (nominal_induct B rule: ty.strong_induct) case (PR X) { case 1 show ?case apply - apply(simp add: lfp_eqvt) apply(simp add: perm_fun_def [where 'a="ntrm => bool"]) apply(simp add: union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name) apply(perm_simp) done next case 2 show ?case apply - apply(simp only: NEGc_simps) apply(simp add: union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name) apply(simp add: lfp_eqvt) apply(simp add: comp_def) apply(simp add: perm_fun_def [where 'a="ntrm => bool"]) apply(simp add: union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name) apply(perm_simp) done } next case (NOT B) have ih1: "pi•(\<parallel>(B)\<parallel>) = (\<parallel>(B)\<parallel>)" by fact have ih2: "pi•(\<parallel><B>\<parallel>) = (\<parallel><B>\<parallel>)" by fact have g: "pi•(\<parallel>(NOT B)\<parallel>) = (\<parallel>(NOT B)\<parallel>)" apply - apply(simp only: lfp_eqvt) apply(simp only: comp_def) apply(simp only: perm_fun_def [where 'a="ntrm => bool"]) apply(simp only: NEGc.simps NEGn.simps) apply(simp only: union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name NOTRIGHT_eqvt_name NOTLEFT_eqvt_name) apply(perm_simp add: ih1 ih2) done { case 1 show ?case by (rule g) next case 2 show ?case by (simp only: NEGc_simps union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name NOTRIGHT_eqvt_name ih1 ih2 g) } next case (AND A B) have ih1: "pi•(\<parallel>(A)\<parallel>) = (\<parallel>(A)\<parallel>)" by fact have ih2: "pi•(\<parallel><A>\<parallel>) = (\<parallel><A>\<parallel>)" by fact have ih3: "pi•(\<parallel>(B)\<parallel>) = (\<parallel>(B)\<parallel>)" by fact have ih4: "pi•(\<parallel><B>\<parallel>) = (\<parallel><B>\<parallel>)" by fact have g: "pi•(\<parallel>(A AND B)\<parallel>) = (\<parallel>(A AND B)\<parallel>)" apply - apply(simp only: lfp_eqvt) apply(simp only: comp_def) apply(simp only: perm_fun_def [where 'a="ntrm => bool"]) apply(simp only: NEGc.simps NEGn.simps) apply(simp only: union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name ANDRIGHT_eqvt_name ANDLEFT2_eqvt_name ANDLEFT1_eqvt_name) apply(perm_simp add: ih1 ih2 ih3 ih4) done { case 1 show ?case by (rule g) next case 2 show ?case by (simp only: NEGc_simps union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name ANDRIGHT_eqvt_name ANDLEFT1_eqvt_name ANDLEFT2_eqvt_name ih1 ih2 ih3 ih4 g) } next case (OR A B) have ih1: "pi•(\<parallel>(A)\<parallel>) = (\<parallel>(A)\<parallel>)" by fact have ih2: "pi•(\<parallel><A>\<parallel>) = (\<parallel><A>\<parallel>)" by fact have ih3: "pi•(\<parallel>(B)\<parallel>) = (\<parallel>(B)\<parallel>)" by fact have ih4: "pi•(\<parallel><B>\<parallel>) = (\<parallel><B>\<parallel>)" by fact have g: "pi•(\<parallel>(A OR B)\<parallel>) = (\<parallel>(A OR B)\<parallel>)" apply - apply(simp only: lfp_eqvt) apply(simp only: comp_def) apply(simp only: perm_fun_def [where 'a="ntrm => bool"]) apply(simp only: NEGc.simps NEGn.simps) apply(simp only: union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name ORRIGHT1_eqvt_name ORRIGHT2_eqvt_name ORLEFT_eqvt_name) apply(perm_simp add: ih1 ih2 ih3 ih4) done { case 1 show ?case by (rule g) next case 2 show ?case by (simp only: NEGc_simps union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name ORRIGHT1_eqvt_name ORRIGHT2_eqvt_name ORLEFT_eqvt_name ih1 ih2 ih3 ih4 g) } next case (IMP A B) have ih1: "pi•(\<parallel>(A)\<parallel>) = (\<parallel>(A)\<parallel>)" by fact have ih2: "pi•(\<parallel><A>\<parallel>) = (\<parallel><A>\<parallel>)" by fact have ih3: "pi•(\<parallel>(B)\<parallel>) = (\<parallel>(B)\<parallel>)" by fact have ih4: "pi•(\<parallel><B>\<parallel>) = (\<parallel><B>\<parallel>)" by fact have g: "pi•(\<parallel>(A IMP B)\<parallel>) = (\<parallel>(A IMP B)\<parallel>)" apply - apply(simp only: lfp_eqvt) apply(simp only: comp_def) apply(simp only: perm_fun_def [where 'a="ntrm => bool"]) apply(simp only: NEGc.simps NEGn.simps) apply(simp only: union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name IMPRIGHT_eqvt_name IMPLEFT_eqvt_name) apply(perm_simp add: ih1 ih2 ih3 ih4) done { case 1 show ?case by (rule g) next case 2 show ?case by (simp only: NEGc_simps union_eqvt AXIOMS_eqvt_name BINDING_eqvt_name IMPRIGHT_eqvt_name IMPLEFT_eqvt_name ih1 ih2 ih3 ih4 g) } qed lemma CAND_eqvt_coname: fixes pi::"coname prm" shows "(pi•(\<parallel>(B)\<parallel>)) = (\<parallel>(B)\<parallel>)" and "(pi•(\<parallel><B>\<parallel>)) = (\<parallel><B>\<parallel>)" proof (nominal_induct B rule: ty.strong_induct) case (PR X) { case 1 show ?case apply - apply(simp add: lfp_eqvt) apply(simp add: perm_fun_def [where 'a="ntrm => bool"]) apply(simp add: union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname) apply(perm_simp) done next case 2 show ?case apply - apply(simp only: NEGc_simps) apply(simp add: union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname) apply(simp add: lfp_eqvt) apply(simp add: comp_def) apply(simp add: perm_fun_def [where 'a="ntrm => bool"]) apply(simp add: union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname) apply(perm_simp) done } next case (NOT B) have ih1: "pi•(\<parallel>(B)\<parallel>) = (\<parallel>(B)\<parallel>)" by fact have ih2: "pi•(\<parallel><B>\<parallel>) = (\<parallel><B>\<parallel>)" by fact have g: "pi•(\<parallel>(NOT B)\<parallel>) = (\<parallel>(NOT B)\<parallel>)" apply - apply(simp only: lfp_eqvt) apply(simp only: comp_def) apply(simp only: perm_fun_def [where 'a="ntrm => bool"]) apply(simp only: NEGc.simps NEGn.simps) apply(simp only: union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname NOTRIGHT_eqvt_coname NOTLEFT_eqvt_coname) apply(perm_simp add: ih1 ih2) done { case 1 show ?case by (rule g) next case 2 show ?case by (simp only: NEGc_simps union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname NOTRIGHT_eqvt_coname ih1 ih2 g) } next case (AND A B) have ih1: "pi•(\<parallel>(A)\<parallel>) = (\<parallel>(A)\<parallel>)" by fact have ih2: "pi•(\<parallel><A>\<parallel>) = (\<parallel><A>\<parallel>)" by fact have ih3: "pi•(\<parallel>(B)\<parallel>) = (\<parallel>(B)\<parallel>)" by fact have ih4: "pi•(\<parallel><B>\<parallel>) = (\<parallel><B>\<parallel>)" by fact have g: "pi•(\<parallel>(A AND B)\<parallel>) = (\<parallel>(A AND B)\<parallel>)" apply - apply(simp only: lfp_eqvt) apply(simp only: comp_def) apply(simp only: perm_fun_def [where 'a="ntrm => bool"]) apply(simp only: NEGc.simps NEGn.simps) apply(simp only: union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname ANDRIGHT_eqvt_coname ANDLEFT2_eqvt_coname ANDLEFT1_eqvt_coname) apply(perm_simp add: ih1 ih2 ih3 ih4) done { case 1 show ?case by (rule g) next case 2 show ?case by (simp only: NEGc_simps union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname ANDRIGHT_eqvt_coname ANDLEFT1_eqvt_coname ANDLEFT2_eqvt_coname ih1 ih2 ih3 ih4 g) } next case (OR A B) have ih1: "pi•(\<parallel>(A)\<parallel>) = (\<parallel>(A)\<parallel>)" by fact have ih2: "pi•(\<parallel><A>\<parallel>) = (\<parallel><A>\<parallel>)" by fact have ih3: "pi•(\<parallel>(B)\<parallel>) = (\<parallel>(B)\<parallel>)" by fact have ih4: "pi•(\<parallel><B>\<parallel>) = (\<parallel><B>\<parallel>)" by fact have g: "pi•(\<parallel>(A OR B)\<parallel>) = (\<parallel>(A OR B)\<parallel>)" apply - apply(simp only: lfp_eqvt) apply(simp only: comp_def) apply(simp only: perm_fun_def [where 'a="ntrm => bool"]) apply(simp only: NEGc.simps NEGn.simps) apply(simp only: union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname ORRIGHT1_eqvt_coname ORRIGHT2_eqvt_coname ORLEFT_eqvt_coname) apply(perm_simp add: ih1 ih2 ih3 ih4) done { case 1 show ?case by (rule g) next case 2 show ?case by (simp only: NEGc_simps union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname ORRIGHT1_eqvt_coname ORRIGHT2_eqvt_coname ORLEFT_eqvt_coname ih1 ih2 ih3 ih4 g) } next case (IMP A B) have ih1: "pi•(\<parallel>(A)\<parallel>) = (\<parallel>(A)\<parallel>)" by fact have ih2: "pi•(\<parallel><A>\<parallel>) = (\<parallel><A>\<parallel>)" by fact have ih3: "pi•(\<parallel>(B)\<parallel>) = (\<parallel>(B)\<parallel>)" by fact have ih4: "pi•(\<parallel><B>\<parallel>) = (\<parallel><B>\<parallel>)" by fact have g: "pi•(\<parallel>(A IMP B)\<parallel>) = (\<parallel>(A IMP B)\<parallel>)" apply - apply(simp only: lfp_eqvt) apply(simp only: comp_def) apply(simp only: perm_fun_def [where 'a="ntrm => bool"]) apply(simp only: NEGc.simps NEGn.simps) apply(simp only: union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname IMPRIGHT_eqvt_coname IMPLEFT_eqvt_coname) apply(perm_simp add: ih1 ih2 ih3 ih4) done { case 1 show ?case by (rule g) next case 2 show ?case by (simp only: NEGc_simps union_eqvt AXIOMS_eqvt_coname BINDING_eqvt_coname IMPRIGHT_eqvt_coname IMPLEFT_eqvt_coname ih1 ih2 ih3 ih4 g) } qed text {* Elimination rules for the set-operators *} lemma BINDINGc_elim: assumes a: "<a>:M ∈ BINDINGc B (\<parallel>(B)\<parallel>)" shows "∀x P. ((x):P)∈(\<parallel>(B)\<parallel>) --> SNa (M{a:=(x).P})" using a apply(auto simp add: BINDINGc_def) apply(auto simp add: ctrm.inject alpha) apply(drule_tac x="[(a,aa)]•x" in spec) apply(drule_tac x="[(a,aa)]•P" in spec) apply(drule mp) apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname) apply(drule_tac ?pi2.0="[(a,aa)]" in SNa_eqvt(2)) apply(perm_simp add: csubst_eqvt) done lemma BINDINGn_elim: assumes a: "(x):M ∈ BINDINGn B (\<parallel><B>\<parallel>)" shows "∀c P. (<c>:P)∈(\<parallel><B>\<parallel>) --> SNa (M{x:=<c>.P})" using a apply(auto simp add: BINDINGn_def) apply(auto simp add: ntrm.inject alpha) apply(drule_tac x="[(x,xa)]•c" in spec) apply(drule_tac x="[(x,xa)]•P" in spec) apply(drule mp) apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name) apply(drule_tac ?pi1.0="[(x,xa)]" in SNa_eqvt(1)) apply(perm_simp add: nsubst_eqvt) done lemma NOTRIGHT_elim: assumes a: "<a>:M ∈ NOTRIGHT (NOT B) (\<parallel>(B)\<parallel>)" obtains x' M' where "M = NotR (x').M' a" and "fic (NotR (x').M' a) a" and "(x'):M' ∈ (\<parallel>(B)\<parallel>)" using a apply(auto simp add: ctrm.inject alpha abs_fresh calc_atm) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="[(a,aa)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,aa)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) done lemma NOTLEFT_elim: assumes a: "(x):M ∈ NOTLEFT (NOT B) (\<parallel><B>\<parallel>)" obtains a' M' where "M = NotL <a'>.M' x" and "fin (NotL <a'>.M' x) x" and "<a'>:M' ∈ (\<parallel><B>\<parallel>)" using a apply(auto simp add: ntrm.inject alpha abs_fresh calc_atm) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="[(x,xa)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,xa)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) done lemma ANDRIGHT_elim: assumes a: "<a>:M ∈ ANDRIGHT (B AND C) (\<parallel><B>\<parallel>) (\<parallel><C>\<parallel>)" obtains d' M' e' N' where "M = AndR <d'>.M' <e'>.N' a" and "fic (AndR <d'>.M' <e'>.N' a) a" and "<d'>:M' ∈ (\<parallel><B>\<parallel>)" and "<e'>:N' ∈ (\<parallel><C>\<parallel>)" using a apply(auto simp add: ctrm.inject alpha abs_fresh calc_atm fresh_atm) apply(drule_tac x="c" in meta_spec) apply(drule_tac x="[(a,c)]•M" in meta_spec) apply(drule_tac x="c" in meta_spec) apply(drule_tac x="[(a,c)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,c)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(a,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule meta_mp) apply(drule_tac pi="[(a,c)]" and x="<a>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(case_tac "a=b") apply(simp) apply(drule_tac x="c" in meta_spec) apply(drule_tac x="[(b,c)]•M" in meta_spec) apply(drule_tac x="c" in meta_spec) apply(drule_tac x="[(b,c)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(b,c)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(b,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule meta_mp) apply(drule_tac pi="[(b,c)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(simp) apply(case_tac "c=b") apply(simp) apply(drule_tac x="b" in meta_spec) apply(drule_tac x="[(a,b)]•M" in meta_spec) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="[(a,b)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(simp) apply(drule_tac x="c" in meta_spec) apply(drule_tac x="[(a,c)]•M" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(drule_tac x="[(a,c)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,c)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(a,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule meta_mp) apply(drule_tac pi="[(a,c)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(case_tac "a=aa") apply(simp) apply(drule_tac x="c" in meta_spec) apply(drule_tac x="[(aa,c)]•M" in meta_spec) apply(drule_tac x="c" in meta_spec) apply(drule_tac x="[(aa,c)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(aa,c)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(aa,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule meta_mp) apply(drule_tac pi="[(aa,c)]" and x="<aa>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(simp) apply(case_tac "c=aa") apply(simp) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="[(a,aa)]•M" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="[(a,aa)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,aa)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule meta_mp) apply(drule_tac pi="[(a,aa)]" and x="<a>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(simp) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="[(a,c)]•M" in meta_spec) apply(drule_tac x="c" in meta_spec) apply(drule_tac x="[(a,c)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,c)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(a,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule meta_mp) apply(drule_tac pi="[(a,c)]" and x="<a>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(case_tac "a=aa") apply(simp) apply(case_tac "aa=b") apply(simp) apply(drule_tac x="c" in meta_spec) apply(drule_tac x="[(b,c)]•M" in meta_spec) apply(drule_tac x="c" in meta_spec) apply(drule_tac x="[(b,c)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(b,c)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(b,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule meta_mp) apply(drule_tac pi="[(b,c)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(simp) apply(case_tac "c=b") apply(simp) apply(drule_tac x="b" in meta_spec) apply(drule_tac x="[(aa,b)]•M" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="[(aa,b)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(aa,b)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(aa,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule meta_mp) apply(drule_tac pi="[(aa,b)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(simp) apply(drule_tac x="c" in meta_spec) apply(drule_tac x="[(aa,c)]•M" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(drule_tac x="[(aa,c)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(aa,c)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(aa,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule meta_mp) apply(drule_tac pi="[(aa,c)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(simp) apply(case_tac "c=aa") apply(simp) apply(case_tac "a=b") apply(simp) apply(drule_tac x="b" in meta_spec) apply(drule_tac x="[(b,aa)]•M" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="[(b,aa)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(b,aa)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(b,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule meta_mp) apply(drule_tac pi="[(b,aa)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(simp) apply(case_tac "aa=b") apply(simp) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="[(a,b)]•M" in meta_spec) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="[(a,b)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(simp) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="[(a,aa)]•M" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(drule_tac x="[(a,aa)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,aa)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule meta_mp) apply(drule_tac pi="[(a,aa)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(simp) apply(case_tac "a=b") apply(simp) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="[(b,c)]•M" in meta_spec) apply(drule_tac x="c" in meta_spec) apply(drule_tac x="[(b,c)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(b,c)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(b,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule meta_mp) apply(drule_tac pi="[(b,c)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(simp) apply(case_tac "c=b") apply(simp) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="[(a,b)]•M" in meta_spec) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="[(a,b)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(simp) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="[(a,c)]•M" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(drule_tac x="[(a,c)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,c)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(a,c)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule meta_mp) apply(drule_tac pi="[(a,c)]" and x="<b>:N" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) done lemma ANDLEFT1_elim: assumes a: "(x):M ∈ ANDLEFT1 (B AND C) (\<parallel>(B)\<parallel>)" obtains x' M' where "M = AndL1 (x').M' x" and "fin (AndL1 (x').M' x) x" and "(x'):M' ∈ (\<parallel>(B)\<parallel>)" using a apply(auto simp add: ntrm.inject alpha abs_fresh calc_atm) apply(drule_tac x="y" in meta_spec) apply(drule_tac x="[(x,y)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(case_tac "x=xa") apply(simp) apply(drule_tac x="y" in meta_spec) apply(drule_tac x="[(xa,y)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(xa,y)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(xa,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(case_tac "y=xa") apply(simp) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="[(x,xa)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,xa)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="[(x,y)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) done lemma ANDLEFT2_elim: assumes a: "(x):M ∈ ANDLEFT2 (B AND C) (\<parallel>(C)\<parallel>)" obtains x' M' where "M = AndL2 (x').M' x" and "fin (AndL2 (x').M' x) x" and "(x'):M' ∈ (\<parallel>(C)\<parallel>)" using a apply(auto simp add: ntrm.inject alpha abs_fresh calc_atm) apply(drule_tac x="y" in meta_spec) apply(drule_tac x="[(x,y)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(case_tac "x=xa") apply(simp) apply(drule_tac x="y" in meta_spec) apply(drule_tac x="[(xa,y)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(xa,y)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(xa,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(case_tac "y=xa") apply(simp) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="[(x,xa)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,xa)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="[(x,y)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) done lemma ORRIGHT1_elim: assumes a: "<a>:M ∈ ORRIGHT1 (B OR C) (\<parallel><B>\<parallel>)" obtains a' M' where "M = OrR1 <a'>.M' a" and "fic (OrR1 <a'>.M' a) a" and "<a'>:M' ∈ (\<parallel><B>\<parallel>)" using a apply(auto simp add: ctrm.inject alpha abs_fresh calc_atm) apply(drule_tac x="b" in meta_spec) apply(drule_tac x="[(a,b)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(case_tac "a=aa") apply(simp) apply(drule_tac x="b" in meta_spec) apply(drule_tac x="[(aa,b)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(aa,b)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(aa,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(simp) apply(case_tac "b=aa") apply(simp) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="[(a,aa)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,aa)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(simp) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="[(a,b)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) done lemma ORRIGHT2_elim: assumes a: "<a>:M ∈ ORRIGHT2 (B OR C) (\<parallel><C>\<parallel>)" obtains a' M' where "M = OrR2 <a'>.M' a" and "fic (OrR2 <a'>.M' a) a" and "<a'>:M' ∈ (\<parallel><C>\<parallel>)" using a apply(auto simp add: ctrm.inject alpha abs_fresh calc_atm) apply(drule_tac x="b" in meta_spec) apply(drule_tac x="[(a,b)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(case_tac "a=aa") apply(simp) apply(drule_tac x="b" in meta_spec) apply(drule_tac x="[(aa,b)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(aa,b)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(aa,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(simp) apply(case_tac "b=aa") apply(simp) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="[(a,aa)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,aa)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) apply(simp) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="[(a,b)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(simp) done lemma ORLEFT_elim: assumes a: "(x):M ∈ ORLEFT (B OR C) (\<parallel>(B)\<parallel>) (\<parallel>(C)\<parallel>)" obtains y' M' z' N' where "M = OrL (y').M' (z').N' x" and "fin (OrL (y').M' (z').N' x) x" and "(y'):M' ∈ (\<parallel>(B)\<parallel>)" and "(z'):N' ∈ (\<parallel>(C)\<parallel>)" using a apply(auto simp add: ntrm.inject alpha abs_fresh calc_atm fresh_atm) apply(drule_tac x="z" in meta_spec) apply(drule_tac x="[(x,z)]•M" in meta_spec) apply(drule_tac x="z" in meta_spec) apply(drule_tac x="[(x,z)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,z)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(x,z)]" and x="(x):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(case_tac "x=y") apply(simp) apply(drule_tac x="z" in meta_spec) apply(drule_tac x="[(y,z)]•M" in meta_spec) apply(drule_tac x="z" in meta_spec) apply(drule_tac x="[(y,z)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(y,z)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(y,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(y,z)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(case_tac "z=y") apply(simp) apply(drule_tac x="y" in meta_spec) apply(drule_tac x="[(x,y)]•M" in meta_spec) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="[(x,y)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(drule_tac x="z" in meta_spec) apply(drule_tac x="[(x,z)]•M" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(drule_tac x="[(x,z)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,z)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(x,z)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(case_tac "x=xa") apply(simp) apply(drule_tac x="z" in meta_spec) apply(drule_tac x="[(xa,z)]•M" in meta_spec) apply(drule_tac x="z" in meta_spec) apply(drule_tac x="[(xa,z)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(xa,z)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(xa,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(xa,z)]" and x="(xa):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(case_tac "z=xa") apply(simp) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="[(x,xa)]•M" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="[(x,xa)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,xa)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(x,xa)]" and x="(x):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="[(x,z)]•M" in meta_spec) apply(drule_tac x="z" in meta_spec) apply(drule_tac x="[(x,z)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,z)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(x,z)]" and x="(x):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(case_tac "x=xa") apply(simp) apply(case_tac "xa=y") apply(simp) apply(drule_tac x="z" in meta_spec) apply(drule_tac x="[(y,z)]•M" in meta_spec) apply(drule_tac x="z" in meta_spec) apply(drule_tac x="[(y,z)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(y,z)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(y,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(y,z)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(case_tac "z=y") apply(simp) apply(drule_tac x="y" in meta_spec) apply(drule_tac x="[(xa,y)]•M" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="[(xa,y)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(xa,y)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(xa,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(xa,y)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(drule_tac x="z" in meta_spec) apply(drule_tac x="[(xa,z)]•M" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(drule_tac x="[(xa,z)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(xa,z)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(xa,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(xa,z)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(case_tac "z=xa") apply(simp) apply(case_tac "x=y") apply(simp) apply(drule_tac x="y" in meta_spec) apply(drule_tac x="[(y,xa)]•M" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="[(y,xa)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(y,xa)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(y,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(y,xa)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(case_tac "xa=y") apply(simp) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="[(x,y)]•M" in meta_spec) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="[(x,y)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="[(x,xa)]•M" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(drule_tac x="[(x,xa)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,xa)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(x,xa)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(case_tac "x=y") apply(simp) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="[(y,z)]•M" in meta_spec) apply(drule_tac x="z" in meta_spec) apply(drule_tac x="[(y,z)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(y,z)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(y,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(y,z)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(case_tac "z=y") apply(simp) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="[(x,y)]•M" in meta_spec) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="[(x,y)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="[(x,z)]•M" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(drule_tac x="[(x,z)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,z)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,z)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(x,z)]" and x="(y):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) done lemma IMPRIGHT_elim: assumes a: "<a>:M ∈ IMPRIGHT (B IMP C) (\<parallel>(B)\<parallel>) (\<parallel><C>\<parallel>) (\<parallel>(C)\<parallel>) (\<parallel><B>\<parallel>)" obtains x' a' M' where "M = ImpR (x').<a'>.M' a" and "fic (ImpR (x').<a'>.M' a) a" and "∀z P. x'\<sharp>(z,P) ∧ (z):P ∈ \<parallel>(C)\<parallel> --> (x'):(M'{a':=(z).P}) ∈ \<parallel>(B)\<parallel>" and "∀c Q. a'\<sharp>(c,Q) ∧ <c>:Q ∈ \<parallel><B>\<parallel> --> <a'>:(M'{x':=<c>.Q}) ∈ \<parallel><C>\<parallel>" using a apply(auto simp add: ctrm.inject alpha abs_fresh calc_atm) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(drule_tac x="[(a,b)]•M" in meta_spec) apply(simp) apply(drule_tac pi="[(a,b)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(auto)[1] apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule_tac x="z" in spec) apply(drule_tac x="[(a,b)]•P" in spec) apply(simp add: fresh_prod fresh_left calc_atm) apply(drule_tac pi="[(a,b)]" and x="(x):M{a:=(z).([(a,b)]•P)}" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(perm_simp add: calc_atm csubst_eqvt CAND_eqvt_coname) apply(drule meta_mp) apply(auto)[1] apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname) apply(rotate_tac 2) apply(drule_tac x="[(a,b)]•c" in spec) apply(drule_tac x="[(a,b)]•Q" in spec) apply(simp add: fresh_prod fresh_left) apply(drule mp) apply(simp add: calc_atm) apply(drule_tac pi="[(a,b)]" and x="<a>:M{x:=<([(a,b)]•c)>.([(a,b)]•Q)}" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(perm_simp add: nsubst_eqvt CAND_eqvt_coname) apply(simp add: calc_atm) apply(simp) apply(case_tac "a=aa") apply(simp) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(drule_tac x="[(aa,b)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(aa,b)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(auto)[1] apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule_tac x="z" in spec) apply(drule_tac x="[(a,b)]•P" in spec) apply(simp add: fresh_prod fresh_left calc_atm) apply(drule_tac pi="[(a,b)]" and x="(x):M{a:=(z).([(a,b)]•P)}" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(perm_simp add: calc_atm csubst_eqvt CAND_eqvt_coname) apply(drule meta_mp) apply(auto)[1] apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname) apply(drule_tac x="[(a,b)]•c" in spec) apply(drule_tac x="[(a,b)]•Q" in spec) apply(simp) apply(simp add: fresh_prod fresh_left) apply(drule mp) apply(simp add: calc_atm) apply(drule_tac pi="[(a,b)]" and x="<a>:M{x:=<([(a,b)]•c)>.([(a,b)]•Q)}" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(perm_simp add: nsubst_eqvt CAND_eqvt_coname) apply(simp add: calc_atm) apply(simp) apply(simp) apply(case_tac "b=aa") apply(simp) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="[(a,aa)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,aa)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(auto)[1] apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule_tac x="z" in spec) apply(drule_tac x="[(a,aa)]•P" in spec) apply(simp add: fresh_prod fresh_left calc_atm) apply(drule_tac pi="[(a,aa)]" and x="(x):M{aa:=(z).([(a,aa)]•P)}" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(perm_simp add: calc_atm csubst_eqvt CAND_eqvt_coname) apply(drule meta_mp) apply(auto)[1] apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname) apply(drule_tac x="[(a,aa)]•c" in spec) apply(drule_tac x="[(a,aa)]•Q" in spec) apply(simp) apply(simp add: fresh_prod fresh_left) apply(drule mp) apply(simp add: calc_atm) apply(drule_tac pi="[(a,aa)]" and x="<aa>:M{x:=<([(a,aa)]•c)>.([(a,aa)]•Q)}" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(perm_simp add: nsubst_eqvt CAND_eqvt_coname) apply(simp add: calc_atm) apply(simp) apply(simp) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="[(a,b)]•M" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(a,b)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(drule meta_mp) apply(auto)[1] apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm CAND_eqvt_coname) apply(drule_tac x="z" in spec) apply(drule_tac x="[(a,b)]•P" in spec) apply(simp add: fresh_prod fresh_left calc_atm) apply(drule_tac pi="[(a,b)]" and x="(x):M{aa:=(z).([(a,b)]•P)}" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(perm_simp add: calc_atm csubst_eqvt CAND_eqvt_coname) apply(drule meta_mp) apply(auto)[1] apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname) apply(drule_tac x="[(a,b)]•c" in spec) apply(drule_tac x="[(a,b)]•Q" in spec) apply(simp add: fresh_prod fresh_left) apply(drule mp) apply(simp add: calc_atm) apply(drule_tac pi="[(a,b)]" and x="<aa>:M{x:=<([(a,b)]•c)>.([(a,b)]•Q)}" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(perm_simp add: nsubst_eqvt CAND_eqvt_coname) apply(simp add: calc_atm) apply(simp) done lemma IMPLEFT_elim: assumes a: "(x):M ∈ IMPLEFT (B IMP C) (\<parallel><B>\<parallel>) (\<parallel>(C)\<parallel>)" obtains x' a' M' N' where "M = ImpL <a'>.M' (x').N' x" and "fin (ImpL <a'>.M' (x').N' x) x" and "<a'>:M' ∈ \<parallel><B>\<parallel>" and "(x'):N' ∈ \<parallel>(C)\<parallel>" using a apply(auto simp add: ntrm.inject alpha abs_fresh calc_atm) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="[(x,y)]•M" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(drule_tac x="[(x,y)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" and x="(x):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(perm_simp add: calc_atm CAND_eqvt_name) apply(simp) apply(case_tac "x=xa") apply(simp) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="[(xa,y)]•M" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(drule_tac x="[(xa,y)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(xa,y)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(xa,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(xa,y)]" and x="(xa):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(case_tac "y=xa") apply(simp) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="[(x,xa)]•M" in meta_spec) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="[(x,xa)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,xa)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,xa)]" and x="<a>:M" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(x,xa)]" and x="(xa):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) apply(simp) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="[(x,y)]•M" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="[(x,y)]•N" in meta_spec) apply(simp) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(drule meta_mp) apply(drule_tac pi="[(x,y)]" and x="(xa):N" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm CAND_eqvt_name) apply(simp) done lemma CANDs_alpha: shows "<a>:M ∈ (\<parallel><B>\<parallel>) ==> [a].M = [b].N ==> <b>:N ∈ (\<parallel><B>\<parallel>)" and "(x):M ∈ (\<parallel>(B)\<parallel>) ==> [x].M = [y].N ==> (y):N ∈ (\<parallel>(B)\<parallel>)" apply(auto simp add: alpha) apply(drule_tac pi="[(a,b)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(perm_simp add: CAND_eqvt_coname calc_atm) apply(drule_tac pi="[(x,y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(perm_simp add: CAND_eqvt_name calc_atm) done lemma CAND_NotR_elim: assumes a: "<a>:NotR (x).M a ∈ (\<parallel><B>\<parallel>)" "<a>:NotR (x).M a ∉ BINDINGc B (\<parallel>(B)\<parallel>)" shows "∃B'. B = NOT B' ∧ (x):M ∈ (\<parallel>(B')\<parallel>)" using a apply(nominal_induct B rule: ty.strong_induct) apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha) apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha) done lemma CAND_NotL_elim_aux: assumes a: "(x):NotL <a>.M x ∈ NEGn B (\<parallel><B>\<parallel>)" "(x):NotL <a>.M x ∉ BINDINGn B (\<parallel><B>\<parallel>)" shows "∃B'. B = NOT B' ∧ <a>:M ∈ (\<parallel><B'>\<parallel>)" using a apply(nominal_induct B rule: ty.strong_induct) apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha) apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha) done lemmas CAND_NotL_elim = CAND_NotL_elim_aux[OF NEG_elim(2)] lemma CAND_AndR_elim: assumes a: "<a>:AndR <b>.M <c>.N a ∈ (\<parallel><B>\<parallel>)" "<a>:AndR <b>.M <c>.N a ∉ BINDINGc B (\<parallel>(B)\<parallel>)" shows "∃B1 B2. B = B1 AND B2 ∧ <b>:M ∈ (\<parallel><B1>\<parallel>) ∧ <c>:N ∈ (\<parallel><B2>\<parallel>)" using a apply(nominal_induct B rule: ty.strong_induct) apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha) apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) apply(drule_tac pi="[(a,ca)]" and x="<a>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname calc_atm) apply(auto intro: CANDs_alpha)[1] apply(drule_tac pi="[(a,ca)]" and x="<a>:Na" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname calc_atm) apply(auto intro: CANDs_alpha)[1] apply(drule_tac pi="[(a,ca)]" and x="<a>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname calc_atm) apply(auto intro: CANDs_alpha)[1] apply(case_tac "a=ba") apply(simp) apply(drule_tac pi="[(ba,ca)]" and x="<ba>:Na" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(case_tac "ca=ba") apply(simp) apply(drule_tac pi="[(a,ba)]" and x="<ba>:Na" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(drule_tac pi="[(a,ca)]" and x="<ba>:Na" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname calc_atm) apply(auto intro: CANDs_alpha)[1] apply(case_tac "a=aa") apply(simp) apply(drule_tac pi="[(aa,ca)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(case_tac "ca=aa") apply(simp) apply(drule_tac pi="[(a,aa)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(drule_tac pi="[(a,ca)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname calc_atm) apply(auto intro: CANDs_alpha)[1] apply(drule_tac pi="[(a,ca)]" and x="<a>:Na" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname calc_atm) apply(auto intro: CANDs_alpha)[1] apply(case_tac "a=aa") apply(simp) apply(drule_tac pi="[(aa,ca)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(case_tac "ca=aa") apply(simp) apply(drule_tac pi="[(a,aa)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(drule_tac pi="[(a,ca)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname calc_atm) apply(auto intro: CANDs_alpha)[1] apply(case_tac "a=ba") apply(simp) apply(drule_tac pi="[(ba,ca)]" and x="<ba>:Na" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(case_tac "ca=ba") apply(simp) apply(drule_tac pi="[(a,ba)]" and x="<ba>:Na" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(drule_tac pi="[(a,ca)]" and x="<ba>:Na" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_coname calc_atm) apply(auto intro: CANDs_alpha)[1] done lemma CAND_OrR1_elim: assumes a: "<a>:OrR1 <b>.M a ∈ (\<parallel><B>\<parallel>)" "<a>:OrR1 <b>.M a ∉ BINDINGc B (\<parallel>(B)\<parallel>)" shows "∃B1 B2. B = B1 OR B2 ∧ <b>:M ∈ (\<parallel><B1>\<parallel>)" using a apply(nominal_induct B rule: ty.strong_induct) apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha) apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) apply(drule_tac pi="[(a,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha) apply(case_tac "a=aa") apply(simp) apply(drule_tac pi="[(aa,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha) apply(case_tac "ba=aa") apply(simp) apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha) apply(drule_tac pi="[(a,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha) done lemma CAND_OrR2_elim: assumes a: "<a>:OrR2 <b>.M a ∈ (\<parallel><B>\<parallel>)" "<a>:OrR2 <b>.M a ∉ BINDINGc B (\<parallel>(B)\<parallel>)" shows "∃B1 B2. B = B1 OR B2 ∧ <b>:M ∈ (\<parallel><B2>\<parallel>)" using a apply(nominal_induct B rule: ty.strong_induct) apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha) apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) apply(drule_tac pi="[(a,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha) apply(case_tac "a=aa") apply(simp) apply(drule_tac pi="[(aa,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha) apply(case_tac "ba=aa") apply(simp) apply(drule_tac pi="[(a,aa)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha) apply(drule_tac pi="[(a,ba)]" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(auto simp add: CAND_eqvt_coname calc_atm intro: CANDs_alpha) done lemma CAND_OrL_elim_aux: assumes a: "(x):(OrL (y).M (z).N x) ∈ NEGn B (\<parallel><B>\<parallel>)" "(x):(OrL (y).M (z).N x) ∉ BINDINGn B (\<parallel><B>\<parallel>)" shows "∃B1 B2. B = B1 OR B2 ∧ (y):M ∈ (\<parallel>(B1)\<parallel>) ∧ (z):N ∈ (\<parallel>(B2)\<parallel>)" using a apply(nominal_induct B rule: ty.strong_induct) apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha) apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) apply(drule_tac pi="[(x,za)]" and x="(x):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(drule_tac pi="[(x,za)]" and x="(x):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(drule_tac pi="[(x,za)]" and x="(x):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(case_tac "x=ya") apply(simp) apply(drule_tac pi="[(ya,za)]" and x="(ya):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(case_tac "za=ya") apply(simp) apply(drule_tac pi="[(x,ya)]" and x="(ya):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(drule_tac pi="[(x,za)]" and x="(ya):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(case_tac "x=xa") apply(simp) apply(drule_tac pi="[(xa,za)]" and x="(xa):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(case_tac "za=xa") apply(simp) apply(drule_tac pi="[(x,xa)]" and x="(xa):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(drule_tac pi="[(x,za)]" and x="(xa):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(drule_tac pi="[(x,za)]" and x="(x):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(case_tac "x=xa") apply(simp) apply(drule_tac pi="[(xa,za)]" and x="(xa):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(case_tac "za=xa") apply(simp) apply(drule_tac pi="[(x,xa)]" and x="(xa):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(drule_tac pi="[(x,za)]" and x="(xa):Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(case_tac "x=ya") apply(simp) apply(drule_tac pi="[(ya,za)]" and x="(ya):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(case_tac "za=ya") apply(simp) apply(drule_tac pi="[(x,ya)]" and x="(ya):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(drule_tac pi="[(x,za)]" and x="(ya):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] done lemmas CAND_OrL_elim = CAND_OrL_elim_aux[OF NEG_elim(2)] lemma CAND_AndL1_elim_aux: assumes a: "(x):(AndL1 (y).M x) ∈ NEGn B (\<parallel><B>\<parallel>)" "(x):(AndL1 (y).M x) ∉ BINDINGn B (\<parallel><B>\<parallel>)" shows "∃B1 B2. B = B1 AND B2 ∧ (y):M ∈ (\<parallel>(B1)\<parallel>)" using a apply(nominal_induct B rule: ty.strong_induct) apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha) apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) apply(drule_tac pi="[(x,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha) apply(case_tac "x=xa") apply(simp) apply(drule_tac pi="[(xa,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha) apply(case_tac "ya=xa") apply(simp) apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha) apply(drule_tac pi="[(x,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha) done lemmas CAND_AndL1_elim = CAND_AndL1_elim_aux[OF NEG_elim(2)] lemma CAND_AndL2_elim_aux: assumes a: "(x):(AndL2 (y).M x) ∈ NEGn B (\<parallel><B>\<parallel>)" "(x):(AndL2 (y).M x) ∉ BINDINGn B (\<parallel><B>\<parallel>)" shows "∃B1 B2. B = B1 AND B2 ∧ (y):M ∈ (\<parallel>(B2)\<parallel>)" using a apply(nominal_induct B rule: ty.strong_induct) apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha) apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) apply(drule_tac pi="[(x,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha) apply(case_tac "x=xa") apply(simp) apply(drule_tac pi="[(xa,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha) apply(case_tac "ya=xa") apply(simp) apply(drule_tac pi="[(x,xa)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha) apply(drule_tac pi="[(x,ya)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(auto simp add: CAND_eqvt_name calc_atm intro: CANDs_alpha) done lemmas CAND_AndL2_elim = CAND_AndL2_elim_aux[OF NEG_elim(2)] lemma CAND_ImpL_elim_aux: assumes a: "(x):(ImpL <a>.M (z).N x) ∈ NEGn B (\<parallel><B>\<parallel>)" "(x):(ImpL <a>.M (z).N x) ∉ BINDINGn B (\<parallel><B>\<parallel>)" shows "∃B1 B2. B = B1 IMP B2 ∧ <a>:M ∈ (\<parallel><B1>\<parallel>) ∧ (z):N ∈ (\<parallel>(B2)\<parallel>)" using a apply(nominal_induct B rule: ty.strong_induct) apply(simp_all add: ty.inject AXIOMSn_def ntrm.inject alpha) apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm) apply(drule_tac pi="[(x,y)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(drule_tac pi="[(x,y)]" and x="(x):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(drule_tac pi="[(x,y)]" and x="<aa>:Ma" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(case_tac "x=xa") apply(simp) apply(drule_tac pi="[(xa,y)]" and x="(xa):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(case_tac "y=xa") apply(simp) apply(drule_tac pi="[(x,xa)]" and x="(xa):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] apply(simp) apply(drule_tac pi="[(x,y)]" and x="(xa):Nb" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name calc_atm) apply(auto intro: CANDs_alpha)[1] done lemmas CAND_ImpL_elim = CAND_ImpL_elim_aux[OF NEG_elim(2)] lemma CAND_ImpR_elim: assumes a: "<a>:ImpR (x).<b>.M a ∈ (\<parallel><B>\<parallel>)" "<a>:ImpR (x).<b>.M a ∉ BINDINGc B (\<parallel>(B)\<parallel>)" shows "∃B1 B2. B = B1 IMP B2 ∧ (∀z P. x\<sharp>(z,P) ∧ (z):P ∈ \<parallel>(B2)\<parallel> --> (x):(M{b:=(z).P}) ∈ \<parallel>(B1)\<parallel>) ∧ (∀c Q. b\<sharp>(c,Q) ∧ <c>:Q ∈ \<parallel><B1>\<parallel> --> <b>:(M{x:=<c>.Q}) ∈ \<parallel><B2>\<parallel>)" using a apply(nominal_induct B rule: ty.strong_induct) apply(simp_all add: ty.inject AXIOMSc_def ctrm.inject alpha) apply(auto intro: CANDs_alpha simp add: trm.inject calc_atm abs_fresh fresh_atm fresh_prod fresh_bij) apply(generate_fresh "name") apply(generate_fresh "coname") apply(drule_tac a="ca" and z="c" in alpha_name_coname) apply(simp) apply(simp) apply(simp) apply(drule_tac x="[(xa,c)]•[(aa,ca)]•[(b,ca)]•[(x,c)]•z" in spec) apply(drule_tac x="[(xa,c)]•[(aa,ca)]•[(b,ca)]•[(x,c)]•P" in spec) apply(drule mp) apply(rule conjI) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(rule conjI) apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(aa,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(aa,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(generate_fresh "name") apply(generate_fresh "coname") apply(drule_tac a="cb" and z="ca" in alpha_name_coname) apply(simp) apply(simp) apply(simp) apply(drule_tac x="[(xa,ca)]•[(aa,cb)]•[(b,cb)]•[(x,ca)]•c" in spec) apply(drule_tac x="[(xa,ca)]•[(aa,cb)]•[(b,cb)]•[(x,ca)]•Q" in spec) apply(drule mp) apply(rule conjI) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(rule conjI) apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(aa,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(aa,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(generate_fresh "name") apply(generate_fresh "coname") apply(drule_tac a="ca" and z="c" in alpha_name_coname) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(auto)[1] apply(simp) apply(drule_tac x="[(a,ba)]•[(xa,c)]•[(ba,ca)]•[(b,ca)]•[(x,c)]•z" in spec) apply(drule_tac x="[(a,ba)]•[(xa,c)]•[(ba,ca)]•[(b,ca)]•[(x,c)]•P" in spec) apply(drule mp) apply(rule conjI) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(rule conjI) apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(ba,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(a,ba)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(a,ba)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(ba,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(generate_fresh "name") apply(generate_fresh "coname") apply(drule_tac a="cb" and z="ca" in alpha_name_coname) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(auto)[1] apply(simp) apply(drule_tac x="[(a,ba)]•[(xa,ca)]•[(ba,cb)]•[(b,cb)]•[(x,ca)]•c" in spec) apply(drule_tac x="[(a,ba)]•[(xa,ca)]•[(ba,cb)]•[(b,cb)]•[(x,ca)]•Q" in spec) apply(drule mp) apply(rule conjI) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(rule conjI) apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(ba,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(a,ba)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(a,ba)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(ba,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(case_tac "a=aa") apply(simp) apply(generate_fresh "name") apply(generate_fresh "coname") apply(drule_tac a="ca" and z="c" in alpha_name_coname) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(auto)[1] apply(simp) apply(drule_tac x="[(aa,ba)]•[(xa,c)]•[(ba,ca)]•[(b,ca)]•[(x,c)]•z" in spec) apply(drule_tac x="[(aa,ba)]•[(xa,c)]•[(ba,ca)]•[(b,ca)]•[(x,c)]•P" in spec) apply(drule mp) apply(rule conjI) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(rule conjI) apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(ba,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(aa,ba)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(aa,ba)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(ba,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(simp) apply(case_tac "ba=aa") apply(simp) apply(generate_fresh "name") apply(generate_fresh "coname") apply(drule_tac a="ca" and z="c" in alpha_name_coname) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(auto)[1] apply(simp) apply(drule_tac x="[(a,aa)]•[(xa,c)]•[(a,ca)]•[(b,ca)]•[(x,c)]•z" in spec) apply(drule_tac x="[(a,aa)]•[(xa,c)]•[(a,ca)]•[(b,ca)]•[(x,c)]•P" in spec) apply(drule mp) apply(rule conjI) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(rule conjI) apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(a,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(a,aa)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(a,aa)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(a,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(simp) apply(generate_fresh "name") apply(generate_fresh "coname") apply(drule_tac a="ca" and z="c" in alpha_name_coname) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(auto)[1] apply(simp) apply(drule_tac x="[(a,ba)]•[(xa,c)]•[(aa,ca)]•[(b,ca)]•[(x,c)]•z" in spec) apply(drule_tac x="[(a,ba)]•[(xa,c)]•[(aa,ca)]•[(b,ca)]•[(x,c)]•P" in spec) apply(drule mp) apply(rule conjI) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(rule conjI) apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(aa,ca)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(a,ba)]" and X="\<parallel>(ty2)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(a,ba)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(xa,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(aa,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(b,ca)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(x,c)]" and X="\<parallel>(ty1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(case_tac "a=aa") apply(simp) apply(generate_fresh "name") apply(generate_fresh "coname") apply(drule_tac a="cb" and z="ca" in alpha_name_coname) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(auto)[1] apply(simp) apply(drule_tac x="[(aa,ba)]•[(xa,ca)]•[(ba,cb)]•[(b,cb)]•[(x,ca)]•c" in spec) apply(drule_tac x="[(aa,ba)]•[(xa,ca)]•[(ba,cb)]•[(b,cb)]•[(x,ca)]•Q" in spec) apply(drule mp) apply(rule conjI) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(rule conjI) apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(ba,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(aa,ba)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(aa,ba)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(ba,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(simp) apply(case_tac "ba=aa") apply(simp) apply(generate_fresh "name") apply(generate_fresh "coname") apply(drule_tac a="cb" and z="ca" in alpha_name_coname) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(auto)[1] apply(simp) apply(drule_tac x="[(a,aa)]•[(xa,ca)]•[(a,cb)]•[(b,cb)]•[(x,ca)]•c" in spec) apply(drule_tac x="[(a,aa)]•[(xa,ca)]•[(a,cb)]•[(b,cb)]•[(x,ca)]•Q" in spec) apply(drule mp) apply(rule conjI) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(rule conjI) apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(a,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(a,aa)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(a,aa)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(a,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(simp) apply(generate_fresh "name") apply(generate_fresh "coname") apply(drule_tac a="cb" and z="ca" in alpha_name_coname) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(auto)[1] apply(simp) apply(drule_tac x="[(a,ba)]•[(xa,ca)]•[(aa,cb)]•[(b,cb)]•[(x,ca)]•c" in spec) apply(drule_tac x="[(a,ba)]•[(xa,ca)]•[(aa,cb)]•[(b,cb)]•[(x,ca)]•Q" in spec) apply(drule mp) apply(rule conjI) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] apply(rule conjI) apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(aa,cb)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(a,ba)]" and X="\<parallel><ty1>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(a,ba)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(xa,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(aa,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(drule_tac pi="[(b,cb)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: CAND_eqvt_name CAND_eqvt_coname) apply(drule_tac pi="[(x,ca)]" and X="\<parallel><ty2>\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(perm_simp add: CAND_eqvt_name CAND_eqvt_coname csubst_eqvt nsubst_eqvt) apply(auto simp add: calc_atm fresh_prod fresh_atm)[1] done text {* Main lemma 1 *} lemma AXIOMS_imply_SNa: shows "<a>:M ∈ AXIOMSc B ==> SNa M" and "(x):M ∈ AXIOMSn B ==> SNa M" apply - apply(auto simp add: AXIOMSn_def AXIOMSc_def ntrm.inject ctrm.inject alpha) apply(rule Ax_in_SNa)+ done lemma BINDING_imply_SNa: shows "<a>:M ∈ BINDINGc B (\<parallel>(B)\<parallel>) ==> SNa M" and "(x):M ∈ BINDINGn B (\<parallel><B>\<parallel>) ==> SNa M" apply - apply(auto simp add: BINDINGn_def BINDINGc_def ntrm.inject ctrm.inject alpha) apply(drule_tac x="x" in spec) apply(drule_tac x="Ax x a" in spec) apply(drule mp) apply(rule Ax_in_CANDs) apply(drule a_star_preserves_SNa) apply(rule subst_with_ax2) apply(simp add: crename_id) apply(drule_tac x="x" in spec) apply(drule_tac x="Ax x aa" in spec) apply(drule mp) apply(rule Ax_in_CANDs) apply(drule a_star_preserves_SNa) apply(rule subst_with_ax2) apply(simp add: crename_id SNa_eqvt) apply(drule_tac x="a" in spec) apply(drule_tac x="Ax x a" in spec) apply(drule mp) apply(rule Ax_in_CANDs) apply(drule a_star_preserves_SNa) apply(rule subst_with_ax1) apply(simp add: nrename_id) apply(drule_tac x="a" in spec) apply(drule_tac x="Ax xa a" in spec) apply(drule mp) apply(rule Ax_in_CANDs) apply(drule a_star_preserves_SNa) apply(rule subst_with_ax1) apply(simp add: nrename_id SNa_eqvt) done lemma CANDs_imply_SNa: shows "<a>:M ∈ \<parallel><B>\<parallel> ==> SNa M" and "(x):M ∈ \<parallel>(B)\<parallel> ==> SNa M" proof(induct B arbitrary: a x M rule: ty.induct) case (PR X) { case 1 have "<a>:M ∈ \<parallel><PR X>\<parallel>" by fact then have "<a>:M ∈ NEGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp then have "<a>:M ∈ AXIOMSc (PR X) ∪ BINDINGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp moreover { assume "<a>:M ∈ AXIOMSc (PR X)" then have "SNa M" by (simp add: AXIOMS_imply_SNa) } moreover { assume "<a>:M ∈ BINDINGc (PR X) (\<parallel>(PR X)\<parallel>)" then have "SNa M" by (simp add: BINDING_imply_SNa) } ultimately show "SNa M" by blast next case 2 have "(x):M ∈ (\<parallel>(PR X)\<parallel>)" by fact then have "(x):M ∈ NEGn (PR X) (\<parallel><PR X>\<parallel>)" using NEG_simp by blast then have "(x):M ∈ AXIOMSn (PR X) ∪ BINDINGn (PR X) (\<parallel><PR X>\<parallel>)" by simp moreover { assume "(x):M ∈ AXIOMSn (PR X)" then have "SNa M" by (simp add: AXIOMS_imply_SNa) } moreover { assume "(x):M ∈ BINDINGn (PR X) (\<parallel><PR X>\<parallel>)" then have "SNa M" by (simp only: BINDING_imply_SNa) } ultimately show "SNa M" by blast } next case (NOT B) have ih1: "!!a M. <a>:M ∈ \<parallel><B>\<parallel> ==> SNa M" by fact have ih2: "!!x M. (x):M ∈ \<parallel>(B)\<parallel> ==> SNa M" by fact { case 1 have "<a>:M ∈ (\<parallel><NOT B>\<parallel>)" by fact then have "<a>:M ∈ NEGc (NOT B) (\<parallel>(NOT B)\<parallel>)" by simp then have "<a>:M ∈ AXIOMSc (NOT B) ∪ BINDINGc (NOT B) (\<parallel>(NOT B)\<parallel>) ∪ NOTRIGHT (NOT B) (\<parallel>(B)\<parallel>)" by simp moreover { assume "<a>:M ∈ AXIOMSc (NOT B)" then have "SNa M" by (simp add: AXIOMS_imply_SNa) } moreover { assume "<a>:M ∈ BINDINGc (NOT B) (\<parallel>(NOT B)\<parallel>)" then have "SNa M" by (simp only: BINDING_imply_SNa) } moreover { assume "<a>:M ∈ NOTRIGHT (NOT B) (\<parallel>(B)\<parallel>)" then obtain x' M' where eq: "M = NotR (x').M' a" and "(x'):M' ∈ (\<parallel>(B)\<parallel>)" using NOTRIGHT_elim by blast then have "SNa M'" using ih2 by blast then have "SNa M" using eq by (simp add: NotR_in_SNa) } ultimately show "SNa M" by blast next case 2 have "(x):M ∈ (\<parallel>(NOT B)\<parallel>)" by fact then have "(x):M ∈ NEGn (NOT B) (\<parallel><NOT B>\<parallel>)" using NEG_simp by blast then have "(x):M ∈ AXIOMSn (NOT B) ∪ BINDINGn (NOT B) (\<parallel><NOT B>\<parallel>) ∪ NOTLEFT (NOT B) (\<parallel><B>\<parallel>)" by (simp only: NEGn.simps) moreover { assume "(x):M ∈ AXIOMSn (NOT B)" then have "SNa M" by (simp add: AXIOMS_imply_SNa) } moreover { assume "(x):M ∈ BINDINGn (NOT B) (\<parallel><NOT B>\<parallel>)" then have "SNa M" by (simp only: BINDING_imply_SNa) } moreover { assume "(x):M ∈ NOTLEFT (NOT B) (\<parallel><B>\<parallel>)" then obtain a' M' where eq: "M = NotL <a'>.M' x" and "<a'>:M' ∈ (\<parallel><B>\<parallel>)" using NOTLEFT_elim by blast then have "SNa M'" using ih1 by blast then have "SNa M" using eq by (simp add: NotL_in_SNa) } ultimately show "SNa M" by blast } next case (AND A B) have ih1: "!!a M. <a>:M ∈ \<parallel><A>\<parallel> ==> SNa M" by fact have ih2: "!!x M. (x):M ∈ \<parallel>(A)\<parallel> ==> SNa M" by fact have ih3: "!!a M. <a>:M ∈ \<parallel><B>\<parallel> ==> SNa M" by fact have ih4: "!!x M. (x):M ∈ \<parallel>(B)\<parallel> ==> SNa M" by fact { case 1 have "<a>:M ∈ (\<parallel><A AND B>\<parallel>)" by fact then have "<a>:M ∈ NEGc (A AND B) (\<parallel>(A AND B)\<parallel>)" by simp then have "<a>:M ∈ AXIOMSc (A AND B) ∪ BINDINGc (A AND B) (\<parallel>(A AND B)\<parallel>) ∪ ANDRIGHT (A AND B) (\<parallel><A>\<parallel>) (\<parallel><B>\<parallel>)" by simp moreover { assume "<a>:M ∈ AXIOMSc (A AND B)" then have "SNa M" by (simp add: AXIOMS_imply_SNa) } moreover { assume "<a>:M ∈ BINDINGc (A AND B) (\<parallel>(A AND B)\<parallel>)" then have "SNa M" by (simp only: BINDING_imply_SNa) } moreover { assume "<a>:M ∈ ANDRIGHT (A AND B) (\<parallel><A>\<parallel>) (\<parallel><B>\<parallel>)" then obtain a' M' b' N' where eq: "M = AndR <a'>.M' <b'>.N' a" and "<a'>:M' ∈ (\<parallel><A>\<parallel>)" and "<b'>:N' ∈ (\<parallel><B>\<parallel>)" by (erule_tac ANDRIGHT_elim, blast) then have "SNa M'" and "SNa N'" using ih1 ih3 by blast+ then have "SNa M" using eq by (simp add: AndR_in_SNa) } ultimately show "SNa M" by blast next case 2 have "(x):M ∈ (\<parallel>(A AND B)\<parallel>)" by fact then have "(x):M ∈ NEGn (A AND B) (\<parallel><A AND B>\<parallel>)" using NEG_simp by blast then have "(x):M ∈ AXIOMSn (A AND B) ∪ BINDINGn (A AND B) (\<parallel><A AND B>\<parallel>) ∪ ANDLEFT1 (A AND B) (\<parallel>(A)\<parallel>) ∪ ANDLEFT2 (A AND B) (\<parallel>(B)\<parallel>)" by (simp only: NEGn.simps) moreover { assume "(x):M ∈ AXIOMSn (A AND B)" then have "SNa M" by (simp add: AXIOMS_imply_SNa) } moreover { assume "(x):M ∈ BINDINGn (A AND B) (\<parallel><A AND B>\<parallel>)" then have "SNa M" by (simp only: BINDING_imply_SNa) } moreover { assume "(x):M ∈ ANDLEFT1 (A AND B) (\<parallel>(A)\<parallel>)" then obtain x' M' where eq: "M = AndL1 (x').M' x" and "(x'):M' ∈ (\<parallel>(A)\<parallel>)" using ANDLEFT1_elim by blast then have "SNa M'" using ih2 by blast then have "SNa M" using eq by (simp add: AndL1_in_SNa) } moreover { assume "(x):M ∈ ANDLEFT2 (A AND B) (\<parallel>(B)\<parallel>)" then obtain x' M' where eq: "M = AndL2 (x').M' x" and "(x'):M' ∈ (\<parallel>(B)\<parallel>)" using ANDLEFT2_elim by blast then have "SNa M'" using ih4 by blast then have "SNa M" using eq by (simp add: AndL2_in_SNa) } ultimately show "SNa M" by blast } next case (OR A B) have ih1: "!!a M. <a>:M ∈ \<parallel><A>\<parallel> ==> SNa M" by fact have ih2: "!!x M. (x):M ∈ \<parallel>(A)\<parallel> ==> SNa M" by fact have ih3: "!!a M. <a>:M ∈ \<parallel><B>\<parallel> ==> SNa M" by fact have ih4: "!!x M. (x):M ∈ \<parallel>(B)\<parallel> ==> SNa M" by fact { case 1 have "<a>:M ∈ (\<parallel><A OR B>\<parallel>)" by fact then have "<a>:M ∈ NEGc (A OR B) (\<parallel>(A OR B)\<parallel>)" by simp then have "<a>:M ∈ AXIOMSc (A OR B) ∪ BINDINGc (A OR B) (\<parallel>(A OR B)\<parallel>) ∪ ORRIGHT1 (A OR B) (\<parallel><A>\<parallel>) ∪ ORRIGHT2 (A OR B) (\<parallel><B>\<parallel>)" by simp moreover { assume "<a>:M ∈ AXIOMSc (A OR B)" then have "SNa M" by (simp add: AXIOMS_imply_SNa) } moreover { assume "<a>:M ∈ BINDINGc (A OR B) (\<parallel>(A OR B)\<parallel>)" then have "SNa M" by (simp only: BINDING_imply_SNa) } moreover { assume "<a>:M ∈ ORRIGHT1 (A OR B) (\<parallel><A>\<parallel>)" then obtain a' M' where eq: "M = OrR1 <a'>.M' a" and "<a'>:M' ∈ (\<parallel><A>\<parallel>)" by (erule_tac ORRIGHT1_elim, blast) then have "SNa M'" using ih1 by blast then have "SNa M" using eq by (simp add: OrR1_in_SNa) } moreover { assume "<a>:M ∈ ORRIGHT2 (A OR B) (\<parallel><B>\<parallel>)" then obtain a' M' where eq: "M = OrR2 <a'>.M' a" and "<a'>:M' ∈ (\<parallel><B>\<parallel>)" using ORRIGHT2_elim by blast then have "SNa M'" using ih3 by blast then have "SNa M" using eq by (simp add: OrR2_in_SNa) } ultimately show "SNa M" by blast next case 2 have "(x):M ∈ (\<parallel>(A OR B)\<parallel>)" by fact then have "(x):M ∈ NEGn (A OR B) (\<parallel><A OR B>\<parallel>)" using NEG_simp by blast then have "(x):M ∈ AXIOMSn (A OR B) ∪ BINDINGn (A OR B) (\<parallel><A OR B>\<parallel>) ∪ ORLEFT (A OR B) (\<parallel>(A)\<parallel>) (\<parallel>(B)\<parallel>)" by (simp only: NEGn.simps) moreover { assume "(x):M ∈ AXIOMSn (A OR B)" then have "SNa M" by (simp add: AXIOMS_imply_SNa) } moreover { assume "(x):M ∈ BINDINGn (A OR B) (\<parallel><A OR B>\<parallel>)" then have "SNa M" by (simp only: BINDING_imply_SNa) } moreover { assume "(x):M ∈ ORLEFT (A OR B) (\<parallel>(A)\<parallel>) (\<parallel>(B)\<parallel>)" then obtain x' M' y' N' where eq: "M = OrL (x').M' (y').N' x" and "(x'):M' ∈ (\<parallel>(A)\<parallel>)" and "(y'):N' ∈ (\<parallel>(B)\<parallel>)" by (erule_tac ORLEFT_elim, blast) then have "SNa M'" and "SNa N'" using ih2 ih4 by blast+ then have "SNa M" using eq by (simp add: OrL_in_SNa) } ultimately show "SNa M" by blast } next case (IMP A B) have ih1: "!!a M. <a>:M ∈ \<parallel><A>\<parallel> ==> SNa M" by fact have ih2: "!!x M. (x):M ∈ \<parallel>(A)\<parallel> ==> SNa M" by fact have ih3: "!!a M. <a>:M ∈ \<parallel><B>\<parallel> ==> SNa M" by fact have ih4: "!!x M. (x):M ∈ \<parallel>(B)\<parallel> ==> SNa M" by fact { case 1 have "<a>:M ∈ (\<parallel><A IMP B>\<parallel>)" by fact then have "<a>:M ∈ NEGc (A IMP B) (\<parallel>(A IMP B)\<parallel>)" by simp then have "<a>:M ∈ AXIOMSc (A IMP B) ∪ BINDINGc (A IMP B) (\<parallel>(A IMP B)\<parallel>) ∪ IMPRIGHT (A IMP B) (\<parallel>(A)\<parallel>) (\<parallel><B>\<parallel>) (\<parallel>(B)\<parallel>) (\<parallel><A>\<parallel>)" by simp moreover { assume "<a>:M ∈ AXIOMSc (A IMP B)" then have "SNa M" by (simp add: AXIOMS_imply_SNa) } moreover { assume "<a>:M ∈ BINDINGc (A IMP B) (\<parallel>(A IMP B)\<parallel>)" then have "SNa M" by (simp only: BINDING_imply_SNa) } moreover { assume "<a>:M ∈ IMPRIGHT (A IMP B) (\<parallel>(A)\<parallel>) (\<parallel><B>\<parallel>) (\<parallel>(B)\<parallel>) (\<parallel><A>\<parallel>)" then obtain x' a' M' where eq: "M = ImpR (x').<a'>.M' a" and imp: "∀z P. x'\<sharp>(z,P) ∧ (z):P ∈ \<parallel>(B)\<parallel> --> (x'):(M'{a':=(z).P}) ∈ \<parallel>(A)\<parallel>" by (erule_tac IMPRIGHT_elim, blast) obtain z::"name" where fs: "z\<sharp>x'" by (rule_tac exists_fresh, rule fin_supp, blast) have "(z):Ax z a'∈ \<parallel>(B)\<parallel>" by (simp add: Ax_in_CANDs) with imp fs have "(x'):(M'{a':=(z).Ax z a'}) ∈ \<parallel>(A)\<parallel>" by (simp add: fresh_prod fresh_atm) then have "SNa (M'{a':=(z).Ax z a'})" using ih2 by blast moreover have "M'{a':=(z).Ax z a'} -->a* M'[a'\<turnstile>c>a']" by (simp add: subst_with_ax2) ultimately have "SNa (M'[a'\<turnstile>c>a'])" by (simp add: a_star_preserves_SNa) then have "SNa M'" by (simp add: crename_id) then have "SNa M" using eq by (simp add: ImpR_in_SNa) } ultimately show "SNa M" by blast next case 2 have "(x):M ∈ (\<parallel>(A IMP B)\<parallel>)" by fact then have "(x):M ∈ NEGn (A IMP B) (\<parallel><A IMP B>\<parallel>)" using NEG_simp by blast then have "(x):M ∈ AXIOMSn (A IMP B) ∪ BINDINGn (A IMP B) (\<parallel><A IMP B>\<parallel>) ∪ IMPLEFT (A IMP B) (\<parallel><A>\<parallel>) (\<parallel>(B)\<parallel>)" by (simp only: NEGn.simps) moreover { assume "(x):M ∈ AXIOMSn (A IMP B)" then have "SNa M" by (simp add: AXIOMS_imply_SNa) } moreover { assume "(x):M ∈ BINDINGn (A IMP B) (\<parallel><A IMP B>\<parallel>)" then have "SNa M" by (simp only: BINDING_imply_SNa) } moreover { assume "(x):M ∈ IMPLEFT (A IMP B) (\<parallel><A>\<parallel>) (\<parallel>(B)\<parallel>)" then obtain a' M' y' N' where eq: "M = ImpL <a'>.M' (y').N' x" and "<a'>:M' ∈ (\<parallel><A>\<parallel>)" and "(y'):N' ∈ (\<parallel>(B)\<parallel>)" by (erule_tac IMPLEFT_elim, blast) then have "SNa M'" and "SNa N'" using ih1 ih4 by blast+ then have "SNa M" using eq by (simp add: ImpL_in_SNa) } ultimately show "SNa M" by blast } qed text {* Main lemma 2 *} lemma AXIOMS_preserved: shows "<a>:M ∈ AXIOMSc B ==> M -->a* M' ==> <a>:M' ∈ AXIOMSc B" and "(x):M ∈ AXIOMSn B ==> M -->a* M' ==> (x):M' ∈ AXIOMSn B" apply(simp_all add: AXIOMSc_def AXIOMSn_def) apply(auto simp add: ntrm.inject ctrm.inject alpha) apply(drule ax_do_not_a_star_reduce) apply(auto) apply(drule ax_do_not_a_star_reduce) apply(auto) apply(drule ax_do_not_a_star_reduce) apply(auto) apply(drule ax_do_not_a_star_reduce) apply(auto) done lemma BINDING_preserved: shows "<a>:M ∈ BINDINGc B (\<parallel>(B)\<parallel>) ==> M -->a* M' ==> <a>:M' ∈ BINDINGc B (\<parallel>(B)\<parallel>)" and "(x):M ∈ BINDINGn B (\<parallel><B>\<parallel>) ==> M -->a* M' ==> (x):M' ∈ BINDINGn B (\<parallel><B>\<parallel>)" proof - assume red: "M -->a* M'" assume asm: "<a>:M ∈ BINDINGc B (\<parallel>(B)\<parallel>)" { fix x::"name" and P::"trm" from asm have "((x):P) ∈ (\<parallel>(B)\<parallel>) ==> SNa (M{a:=(x).P})" by (simp add: BINDINGc_elim) moreover have "M{a:=(x).P} -->a* M'{a:=(x).P}" using red by (simp add: a_star_subst2) ultimately have "((x):P) ∈ (\<parallel>(B)\<parallel>) ==> SNa (M'{a:=(x).P})" by (simp add: a_star_preserves_SNa) } then show "<a>:M' ∈ BINDINGc B (\<parallel>(B)\<parallel>)" by (auto simp add: BINDINGc_def) next assume red: "M -->a* M'" assume asm: "(x):M ∈ BINDINGn B (\<parallel><B>\<parallel>)" { fix c::"coname" and P::"trm" from asm have "(<c>:P) ∈ (\<parallel><B>\<parallel>) ==> SNa (M{x:=<c>.P})" by (simp add: BINDINGn_elim) moreover have "M{x:=<c>.P} -->a* M'{x:=<c>.P}" using red by (simp add: a_star_subst1) ultimately have "(<c>:P) ∈ (\<parallel><B>\<parallel>) ==> SNa (M'{x:=<c>.P})" by (simp add: a_star_preserves_SNa) } then show "(x):M' ∈ BINDINGn B (\<parallel><B>\<parallel>)" by (auto simp add: BINDINGn_def) qed lemma CANDs_preserved: shows "<a>:M ∈ \<parallel><B>\<parallel> ==> M -->a* M' ==> <a>:M' ∈ \<parallel><B>\<parallel>" and "(x):M ∈ \<parallel>(B)\<parallel> ==> M -->a* M' ==> (x):M' ∈ \<parallel>(B)\<parallel>" proof(nominal_induct B arbitrary: a x M M' rule: ty.strong_induct) case (PR X) { case 1 have asm: "M -->a* M'" by fact have "<a>:M ∈ \<parallel><PR X>\<parallel>" by fact then have "<a>:M ∈ NEGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp then have "<a>:M ∈ AXIOMSc (PR X) ∪ BINDINGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp moreover { assume "<a>:M ∈ AXIOMSc (PR X)" then have "<a>:M' ∈ AXIOMSc (PR X)" using asm by (simp only: AXIOMS_preserved) } moreover { assume "<a>:M ∈ BINDINGc (PR X) (\<parallel>(PR X)\<parallel>)" then have "<a>:M' ∈ BINDINGc (PR X) (\<parallel>(PR X)\<parallel>)" using asm by (simp add: BINDING_preserved) } ultimately have "<a>:M' ∈ AXIOMSc (PR X) ∪ BINDINGc (PR X) (\<parallel>(PR X)\<parallel>)" by blast then have "<a>:M' ∈ NEGc (PR X) (\<parallel>(PR X)\<parallel>)" by simp then show "<a>:M' ∈ (\<parallel><PR X>\<parallel>)" using NEG_simp by blast next case 2 have asm: "M -->a* M'" by fact have "(x):M ∈ \<parallel>(PR X)\<parallel>" by fact then have "(x):M ∈ NEGn (PR X) (\<parallel><PR X>\<parallel>)" using NEG_simp by blast then have "(x):M ∈ AXIOMSn (PR X) ∪ BINDINGn (PR X) (\<parallel><PR X>\<parallel>)" by simp moreover { assume "(x):M ∈ AXIOMSn (PR X)" then have "(x):M' ∈ AXIOMSn (PR X)" using asm by (simp only: AXIOMS_preserved) } moreover { assume "(x):M ∈ BINDINGn (PR X) (\<parallel><PR X>\<parallel>)" then have "(x):M' ∈ BINDINGn (PR X) (\<parallel><PR X>\<parallel>)" using asm by (simp only: BINDING_preserved) } ultimately have "(x):M' ∈ AXIOMSn (PR X) ∪ BINDINGn (PR X) (\<parallel><PR X>\<parallel>)" by blast then have "(x):M' ∈ NEGn (PR X) (\<parallel><PR X>\<parallel>)" by simp then show "(x):M' ∈ (\<parallel>(PR X)\<parallel>)" using NEG_simp by blast } next case (IMP A B) have ih1: "!!a M M'. [|<a>:M ∈ \<parallel><A>\<parallel>; M -->a* M'|] ==> <a>:M' ∈ \<parallel><A>\<parallel>" by fact have ih2: "!!x M M'. [|(x):M ∈ \<parallel>(A)\<parallel>; M -->a* M'|] ==> (x):M' ∈ \<parallel>(A)\<parallel>" by fact have ih3: "!!a M M'. [|<a>:M ∈ \<parallel><B>\<parallel>; M -->a* M'|] ==> <a>:M' ∈ \<parallel><B>\<parallel>" by fact have ih4: "!!x M M'. [|(x):M ∈ \<parallel>(B)\<parallel>; M -->a* M'|] ==> (x):M' ∈ \<parallel>(B)\<parallel>" by fact { case 1 have asm: "M -->a* M'" by fact have "<a>:M ∈ \<parallel><A IMP B>\<parallel>" by fact then have "<a>:M ∈ NEGc (A IMP B) (\<parallel>(A IMP B)\<parallel>)" by simp then have "<a>:M ∈ AXIOMSc (A IMP B) ∪ BINDINGc (A IMP B) (\<parallel>(A IMP B)\<parallel>) ∪ IMPRIGHT (A IMP B) (\<parallel>(A)\<parallel>) (\<parallel><B>\<parallel>) (\<parallel>(B)\<parallel>) (\<parallel><A>\<parallel>)" by simp moreover { assume "<a>:M ∈ AXIOMSc (A IMP B)" then have "<a>:M' ∈ AXIOMSc (A IMP B)" using asm by (simp only: AXIOMS_preserved) } moreover { assume "<a>:M ∈ BINDINGc (A IMP B) (\<parallel>(A IMP B)\<parallel>)" then have "<a>:M' ∈ BINDINGc (A IMP B) (\<parallel>(A IMP B)\<parallel>)" using asm by (simp only: BINDING_preserved) } moreover { assume "<a>:M ∈ IMPRIGHT (A IMP B) (\<parallel>(A)\<parallel>) (\<parallel><B>\<parallel>) (\<parallel>(B)\<parallel>) (\<parallel><A>\<parallel>)" then obtain x' a' N' where eq: "M = ImpR (x').<a'>.N' a" and fic: "fic (ImpR (x').<a'>.N' a) a" and imp1: "∀z P. x'\<sharp>(z,P) ∧ (z):P ∈ \<parallel>(B)\<parallel> --> (x'):(N'{a':=(z).P}) ∈ \<parallel>(A)\<parallel>" and imp2: "∀c Q. a'\<sharp>(c,Q) ∧ <c>:Q ∈ \<parallel><A>\<parallel> --> <a'>:(N'{x':=<c>.Q}) ∈ \<parallel><B>\<parallel>" using IMPRIGHT_elim by blast from eq asm obtain N'' where eq': "M' = ImpR (x').<a'>.N'' a" and red: "N' -->a* N''" using a_star_redu_ImpR_elim by (blast) from imp1 have "∀z P. x'\<sharp>(z,P) ∧ (z):P ∈ \<parallel>(B)\<parallel> --> (x'):(N''{a':=(z).P}) ∈ \<parallel>(A)\<parallel>" using red ih2 apply(auto) apply(drule_tac x="z" in spec) apply(drule_tac x="P" in spec) apply(simp) apply(drule_tac a_star_subst2) apply(blast) done moreover from imp2 have "∀c Q. a'\<sharp>(c,Q) ∧ <c>:Q ∈ \<parallel><A>\<parallel> --> <a'>:(N''{x':=<c>.Q}) ∈ \<parallel><B>\<parallel>" using red ih3 apply(auto) apply(drule_tac x="c" in spec) apply(drule_tac x="Q" in spec) apply(simp) apply(drule_tac a_star_subst1) apply(blast) done moreover from fic have "fic M' a" using eq asm by (simp add: fic_a_star_reduce) ultimately have "<a>:M' ∈ IMPRIGHT (A IMP B) (\<parallel>(A)\<parallel>) (\<parallel><B>\<parallel>) (\<parallel>(B)\<parallel>) (\<parallel><A>\<parallel>)" using eq' by auto } ultimately have "<a>:M' ∈ AXIOMSc (A IMP B) ∪ BINDINGc (A IMP B) (\<parallel>(A IMP B)\<parallel>) ∪ IMPRIGHT (A IMP B) (\<parallel>(A)\<parallel>) (\<parallel><B>\<parallel>) (\<parallel>(B)\<parallel>) (\<parallel><A>\<parallel>)" by blast then have "<a>:M' ∈ NEGc (A IMP B) (\<parallel>(A IMP B)\<parallel>)" by simp then show "<a>:M' ∈ (\<parallel><A IMP B>\<parallel>)" using NEG_simp by blast next case 2 have asm: "M -->a* M'" by fact have "(x):M ∈ \<parallel>(A IMP B)\<parallel>" by fact then have "(x):M ∈ NEGn (A IMP B) (\<parallel><A IMP B>\<parallel>)" using NEG_simp by blast then have "(x):M ∈ AXIOMSn (A IMP B) ∪ BINDINGn (A IMP B) (\<parallel><A IMP B>\<parallel>) ∪ IMPLEFT (A IMP B) (\<parallel><A>\<parallel>) (\<parallel>(B)\<parallel>)" by simp moreover { assume "(x):M ∈ AXIOMSn (A IMP B)" then have "(x):M' ∈ AXIOMSn (A IMP B)" using asm by (simp only: AXIOMS_preserved) } moreover { assume "(x):M ∈ BINDINGn (A IMP B) (\<parallel><A IMP B>\<parallel>)" then have "(x):M' ∈ BINDINGn (A IMP B) (\<parallel><A IMP B>\<parallel>)" using asm by (simp only: BINDING_preserved) } moreover { assume "(x):M ∈ IMPLEFT (A IMP B) (\<parallel><A>\<parallel>) (\<parallel>(B)\<parallel>)" then obtain a' T' y' N' where eq: "M = ImpL <a'>.T' (y').N' x" and fin: "fin (ImpL <a'>.T' (y').N' x) x" and imp1: "<a'>:T' ∈ \<parallel><A>\<parallel>" and imp2: "(y'):N' ∈ \<parallel>(B)\<parallel>" by (erule_tac IMPLEFT_elim, blast) from eq asm obtain T'' N'' where eq': "M' = ImpL <a'>.T'' (y').N'' x" and red1: "T' -->a* T''" and red2: "N' -->a* N''" using a_star_redu_ImpL_elim by blast from fin have "fin M' x" using eq asm by (simp add: fin_a_star_reduce) moreover from imp1 red1 have "<a'>:T'' ∈ \<parallel><A>\<parallel>" using ih1 by simp moreover from imp2 red2 have "(y'):N'' ∈ \<parallel>(B)\<parallel>" using ih4 by simp ultimately have "(x):M' ∈ IMPLEFT (A IMP B) (\<parallel><A>\<parallel>) (\<parallel>(B)\<parallel>)" using eq' by (simp, blast) } ultimately have "(x):M' ∈ AXIOMSn (A IMP B) ∪ BINDINGn (A IMP B) (\<parallel><A IMP B>\<parallel>) ∪ IMPLEFT (A IMP B) (\<parallel><A>\<parallel>) (\<parallel>(B)\<parallel>)" by blast then have "(x):M' ∈ NEGn (A IMP B) (\<parallel><A IMP B>\<parallel>)" by simp then show "(x):M' ∈ (\<parallel>(A IMP B)\<parallel>)" using NEG_simp by blast } next case (AND A B) have ih1: "!!a M M'. [|<a>:M ∈ \<parallel><A>\<parallel>; M -->a* M'|] ==> <a>:M' ∈ \<parallel><A>\<parallel>" by fact have ih2: "!!x M M'. [|(x):M ∈ \<parallel>(A)\<parallel>; M -->a* M'|] ==> (x):M' ∈ \<parallel>(A)\<parallel>" by fact have ih3: "!!a M M'. [|<a>:M ∈ \<parallel><B>\<parallel>; M -->a* M'|] ==> <a>:M' ∈ \<parallel><B>\<parallel>" by fact have ih4: "!!x M M'. [|(x):M ∈ \<parallel>(B)\<parallel>; M -->a* M'|] ==> (x):M' ∈ \<parallel>(B)\<parallel>" by fact { case 1 have asm: "M -->a* M'" by fact have "<a>:M ∈ \<parallel><A AND B>\<parallel>" by fact then have "<a>:M ∈ NEGc (A AND B) (\<parallel>(A AND B)\<parallel>)" by simp then have "<a>:M ∈ AXIOMSc (A AND B) ∪ BINDINGc (A AND B) (\<parallel>(A AND B)\<parallel>) ∪ ANDRIGHT (A AND B) (\<parallel><A>\<parallel>) (\<parallel><B>\<parallel>)" by simp moreover { assume "<a>:M ∈ AXIOMSc (A AND B)" then have "<a>:M' ∈ AXIOMSc (A AND B)" using asm by (simp only: AXIOMS_preserved) } moreover { assume "<a>:M ∈ BINDINGc (A AND B) (\<parallel>(A AND B)\<parallel>)" then have "<a>:M' ∈ BINDINGc (A AND B) (\<parallel>(A AND B)\<parallel>)" using asm by (simp only: BINDING_preserved) } moreover { assume "<a>:M ∈ ANDRIGHT (A AND B) (\<parallel><A>\<parallel>) (\<parallel><B>\<parallel>)" then obtain a' T' b' N' where eq: "M = AndR <a'>.T' <b'>.N' a" and fic: "fic (AndR <a'>.T' <b'>.N' a) a" and imp1: "<a'>:T' ∈ \<parallel><A>\<parallel>" and imp2: "<b'>:N' ∈ \<parallel><B>\<parallel>" using ANDRIGHT_elim by blast from eq asm obtain T'' N'' where eq': "M' = AndR <a'>.T'' <b'>.N'' a" and red1: "T' -->a* T''" and red2: "N' -->a* N''" using a_star_redu_AndR_elim by blast from fic have "fic M' a" using eq asm by (simp add: fic_a_star_reduce) moreover from imp1 red1 have "<a'>:T'' ∈ \<parallel><A>\<parallel>" using ih1 by simp moreover from imp2 red2 have "<b'>:N'' ∈ \<parallel><B>\<parallel>" using ih3 by simp ultimately have "<a>:M' ∈ ANDRIGHT (A AND B) (\<parallel><A>\<parallel>) (\<parallel><B>\<parallel>)" using eq' by (simp, blast) } ultimately have "<a>:M' ∈ AXIOMSc (A AND B) ∪ BINDINGc (A AND B) (\<parallel>(A AND B)\<parallel>) ∪ ANDRIGHT (A AND B) (\<parallel><A>\<parallel>) (\<parallel><B>\<parallel>)" by blast then have "<a>:M' ∈ NEGc (A AND B) (\<parallel>(A AND B)\<parallel>)" by simp then show "<a>:M' ∈ (\<parallel><A AND B>\<parallel>)" using NEG_simp by blast next case 2 have asm: "M -->a* M'" by fact have "(x):M ∈ \<parallel>(A AND B)\<parallel>" by fact then have "(x):M ∈ NEGn (A AND B) (\<parallel><A AND B>\<parallel>)" using NEG_simp by blast then have "(x):M ∈ AXIOMSn (A AND B) ∪ BINDINGn (A AND B) (\<parallel><A AND B>\<parallel>) ∪ ANDLEFT1 (A AND B) (\<parallel>(A)\<parallel>) ∪ ANDLEFT2 (A AND B) (\<parallel>(B)\<parallel>)" by simp moreover { assume "(x):M ∈ AXIOMSn (A AND B)" then have "(x):M' ∈ AXIOMSn (A AND B)" using asm by (simp only: AXIOMS_preserved) } moreover { assume "(x):M ∈ BINDINGn (A AND B) (\<parallel><A AND B>\<parallel>)" then have "(x):M' ∈ BINDINGn (A AND B) (\<parallel><A AND B>\<parallel>)" using asm by (simp only: BINDING_preserved) } moreover { assume "(x):M ∈ ANDLEFT1 (A AND B) (\<parallel>(A)\<parallel>)" then obtain y' N' where eq: "M = AndL1 (y').N' x" and fin: "fin (AndL1 (y').N' x) x" and imp: "(y'):N' ∈ \<parallel>(A)\<parallel>" by (erule_tac ANDLEFT1_elim, blast) from eq asm obtain N'' where eq': "M' = AndL1 (y').N'' x" and red1: "N' -->a* N''" using a_star_redu_AndL1_elim by blast from fin have "fin M' x" using eq asm by (simp add: fin_a_star_reduce) moreover from imp red1 have "(y'):N'' ∈ \<parallel>(A)\<parallel>" using ih2 by simp ultimately have "(x):M' ∈ ANDLEFT1 (A AND B) (\<parallel>(A)\<parallel>)" using eq' by (simp, blast) } moreover { assume "(x):M ∈ ANDLEFT2 (A AND B) (\<parallel>(B)\<parallel>)" then obtain y' N' where eq: "M = AndL2 (y').N' x" and fin: "fin (AndL2 (y').N' x) x" and imp: "(y'):N' ∈ \<parallel>(B)\<parallel>" by (erule_tac ANDLEFT2_elim, blast) from eq asm obtain N'' where eq': "M' = AndL2 (y').N'' x" and red1: "N' -->a* N''" using a_star_redu_AndL2_elim by blast from fin have "fin M' x" using eq asm by (simp add: fin_a_star_reduce) moreover from imp red1 have "(y'):N'' ∈ \<parallel>(B)\<parallel>" using ih4 by simp ultimately have "(x):M' ∈ ANDLEFT2 (A AND B) (\<parallel>(B)\<parallel>)" using eq' by (simp, blast) } ultimately have "(x):M' ∈ AXIOMSn (A AND B) ∪ BINDINGn (A AND B) (\<parallel><A AND B>\<parallel>) ∪ ANDLEFT1 (A AND B) (\<parallel>(A)\<parallel>) ∪ ANDLEFT2 (A AND B) (\<parallel>(B)\<parallel>)" by blast then have "(x):M' ∈ NEGn (A AND B) (\<parallel><A AND B>\<parallel>)" by simp then show "(x):M' ∈ (\<parallel>(A AND B)\<parallel>)" using NEG_simp by blast } next case (OR A B) have ih1: "!!a M M'. [|<a>:M ∈ \<parallel><A>\<parallel>; M -->a* M'|] ==> <a>:M' ∈ \<parallel><A>\<parallel>" by fact have ih2: "!!x M M'. [|(x):M ∈ \<parallel>(A)\<parallel>; M -->a* M'|] ==> (x):M' ∈ \<parallel>(A)\<parallel>" by fact have ih3: "!!a M M'. [|<a>:M ∈ \<parallel><B>\<parallel>; M -->a* M'|] ==> <a>:M' ∈ \<parallel><B>\<parallel>" by fact have ih4: "!!x M M'. [|(x):M ∈ \<parallel>(B)\<parallel>; M -->a* M'|] ==> (x):M' ∈ \<parallel>(B)\<parallel>" by fact { case 1 have asm: "M -->a* M'" by fact have "<a>:M ∈ \<parallel><A OR B>\<parallel>" by fact then have "<a>:M ∈ NEGc (A OR B) (\<parallel>(A OR B)\<parallel>)" by simp then have "<a>:M ∈ AXIOMSc (A OR B) ∪ BINDINGc (A OR B) (\<parallel>(A OR B)\<parallel>) ∪ ORRIGHT1 (A OR B) (\<parallel><A>\<parallel>) ∪ ORRIGHT2 (A OR B) (\<parallel><B>\<parallel>)" by simp moreover { assume "<a>:M ∈ AXIOMSc (A OR B)" then have "<a>:M' ∈ AXIOMSc (A OR B)" using asm by (simp only: AXIOMS_preserved) } moreover { assume "<a>:M ∈ BINDINGc (A OR B) (\<parallel>(A OR B)\<parallel>)" then have "<a>:M' ∈ BINDINGc (A OR B) (\<parallel>(A OR B)\<parallel>)" using asm by (simp only: BINDING_preserved) } moreover { assume "<a>:M ∈ ORRIGHT1 (A OR B) (\<parallel><A>\<parallel>)" then obtain a' N' where eq: "M = OrR1 <a'>.N' a" and fic: "fic (OrR1 <a'>.N' a) a" and imp1: "<a'>:N' ∈ \<parallel><A>\<parallel>" using ORRIGHT1_elim by blast from eq asm obtain N'' where eq': "M' = OrR1 <a'>.N'' a" and red1: "N' -->a* N''" using a_star_redu_OrR1_elim by blast from fic have "fic M' a" using eq asm by (simp add: fic_a_star_reduce) moreover from imp1 red1 have "<a'>:N'' ∈ \<parallel><A>\<parallel>" using ih1 by simp ultimately have "<a>:M' ∈ ORRIGHT1 (A OR B) (\<parallel><A>\<parallel>)" using eq' by (simp, blast) } moreover { assume "<a>:M ∈ ORRIGHT2 (A OR B) (\<parallel><B>\<parallel>)" then obtain a' N' where eq: "M = OrR2 <a'>.N' a" and fic: "fic (OrR2 <a'>.N' a) a" and imp1: "<a'>:N' ∈ \<parallel><B>\<parallel>" using ORRIGHT2_elim by blast from eq asm obtain N'' where eq': "M' = OrR2 <a'>.N'' a" and red1: "N' -->a* N''" using a_star_redu_OrR2_elim by blast from fic have "fic M' a" using eq asm by (simp add: fic_a_star_reduce) moreover from imp1 red1 have "<a'>:N'' ∈ \<parallel><B>\<parallel>" using ih3 by simp ultimately have "<a>:M' ∈ ORRIGHT2 (A OR B) (\<parallel><B>\<parallel>)" using eq' by (simp, blast) } ultimately have "<a>:M' ∈ AXIOMSc (A OR B) ∪ BINDINGc (A OR B) (\<parallel>(A OR B)\<parallel>) ∪ ORRIGHT1 (A OR B) (\<parallel><A>\<parallel>) ∪ ORRIGHT2 (A OR B) (\<parallel><B>\<parallel>)" by blast then have "<a>:M' ∈ NEGc (A OR B) (\<parallel>(A OR B)\<parallel>)" by simp then show "<a>:M' ∈ (\<parallel><A OR B>\<parallel>)" using NEG_simp by blast next case 2 have asm: "M -->a* M'" by fact have "(x):M ∈ \<parallel>(A OR B)\<parallel>" by fact then have "(x):M ∈ NEGn (A OR B) (\<parallel><A OR B>\<parallel>)" using NEG_simp by blast then have "(x):M ∈ AXIOMSn (A OR B) ∪ BINDINGn (A OR B) (\<parallel><A OR B>\<parallel>) ∪ ORLEFT (A OR B) (\<parallel>(A)\<parallel>) (\<parallel>(B)\<parallel>)" by simp moreover { assume "(x):M ∈ AXIOMSn (A OR B)" then have "(x):M' ∈ AXIOMSn (A OR B)" using asm by (simp only: AXIOMS_preserved) } moreover { assume "(x):M ∈ BINDINGn (A OR B) (\<parallel><A OR B>\<parallel>)" then have "(x):M' ∈ BINDINGn (A OR B) (\<parallel><A OR B>\<parallel>)" using asm by (simp only: BINDING_preserved) } moreover { assume "(x):M ∈ ORLEFT (A OR B) (\<parallel>(A)\<parallel>) (\<parallel>(B)\<parallel>)" then obtain y' T' z' N' where eq: "M = OrL (y').T' (z').N' x" and fin: "fin (OrL (y').T' (z').N' x) x" and imp1: "(y'):T' ∈ \<parallel>(A)\<parallel>" and imp2: "(z'):N' ∈ \<parallel>(B)\<parallel>" by (erule_tac ORLEFT_elim, blast) from eq asm obtain T'' N'' where eq': "M' = OrL (y').T'' (z').N'' x" and red1: "T' -->a* T''" and red2: "N' -->a* N''" using a_star_redu_OrL_elim by blast from fin have "fin M' x" using eq asm by (simp add: fin_a_star_reduce) moreover from imp1 red1 have "(y'):T'' ∈ \<parallel>(A)\<parallel>" using ih2 by simp moreover from imp2 red2 have "(z'):N'' ∈ \<parallel>(B)\<parallel>" using ih4 by simp ultimately have "(x):M' ∈ ORLEFT (A OR B) (\<parallel>(A)\<parallel>) (\<parallel>(B)\<parallel>)" using eq' by (simp, blast) } ultimately have "(x):M' ∈ AXIOMSn (A OR B) ∪ BINDINGn (A OR B) (\<parallel><A OR B>\<parallel>) ∪ ORLEFT (A OR B) (\<parallel>(A)\<parallel>) (\<parallel>(B)\<parallel>)" by blast then have "(x):M' ∈ NEGn (A OR B) (\<parallel><A OR B>\<parallel>)" by simp then show "(x):M' ∈ (\<parallel>(A OR B)\<parallel>)" using NEG_simp by blast } next case (NOT A) have ih1: "!!a M M'. [|<a>:M ∈ \<parallel><A>\<parallel>; M -->a* M'|] ==> <a>:M' ∈ \<parallel><A>\<parallel>" by fact have ih2: "!!x M M'. [|(x):M ∈ \<parallel>(A)\<parallel>; M -->a* M'|] ==> (x):M' ∈ \<parallel>(A)\<parallel>" by fact { case 1 have asm: "M -->a* M'" by fact have "<a>:M ∈ \<parallel><NOT A>\<parallel>" by fact then have "<a>:M ∈ NEGc (NOT A) (\<parallel>(NOT A)\<parallel>)" by simp then have "<a>:M ∈ AXIOMSc (NOT A) ∪ BINDINGc (NOT A) (\<parallel>(NOT A)\<parallel>) ∪ NOTRIGHT (NOT A) (\<parallel>(A)\<parallel>)" by simp moreover { assume "<a>:M ∈ AXIOMSc (NOT A)" then have "<a>:M' ∈ AXIOMSc (NOT A)" using asm by (simp only: AXIOMS_preserved) } moreover { assume "<a>:M ∈ BINDINGc (NOT A) (\<parallel>(NOT A)\<parallel>)" then have "<a>:M' ∈ BINDINGc (NOT A) (\<parallel>(NOT A)\<parallel>)" using asm by (simp only: BINDING_preserved) } moreover { assume "<a>:M ∈ NOTRIGHT (NOT A) (\<parallel>(A)\<parallel>)" then obtain y' N' where eq: "M = NotR (y').N' a" and fic: "fic (NotR (y').N' a) a" and imp: "(y'):N' ∈ \<parallel>(A)\<parallel>" using NOTRIGHT_elim by blast from eq asm obtain N'' where eq': "M' = NotR (y').N'' a" and red: "N' -->a* N''" using a_star_redu_NotR_elim by blast from fic have "fic M' a" using eq asm by (simp add: fic_a_star_reduce) moreover from imp red have "(y'):N'' ∈ \<parallel>(A)\<parallel>" using ih2 by simp ultimately have "<a>:M' ∈ NOTRIGHT (NOT A) (\<parallel>(A)\<parallel>)" using eq' by (simp, blast) } ultimately have "<a>:M' ∈ AXIOMSc (NOT A) ∪ BINDINGc (NOT A) (\<parallel>(NOT A)\<parallel>) ∪ NOTRIGHT (NOT A) (\<parallel>(A)\<parallel>)" by blast then have "<a>:M' ∈ NEGc (NOT A) (\<parallel>(NOT A)\<parallel>)" by simp then show "<a>:M' ∈ (\<parallel><NOT A>\<parallel>)" using NEG_simp by blast next case 2 have asm: "M -->a* M'" by fact have "(x):M ∈ \<parallel>(NOT A)\<parallel>" by fact then have "(x):M ∈ NEGn (NOT A) (\<parallel><NOT A>\<parallel>)" using NEG_simp by blast then have "(x):M ∈ AXIOMSn (NOT A) ∪ BINDINGn (NOT A) (\<parallel><NOT A>\<parallel>) ∪ NOTLEFT (NOT A) (\<parallel><A>\<parallel>)" by simp moreover { assume "(x):M ∈ AXIOMSn (NOT A)" then have "(x):M' ∈ AXIOMSn (NOT A)" using asm by (simp only: AXIOMS_preserved) } moreover { assume "(x):M ∈ BINDINGn (NOT A) (\<parallel><NOT A>\<parallel>)" then have "(x):M' ∈ BINDINGn (NOT A) (\<parallel><NOT A>\<parallel>)" using asm by (simp only: BINDING_preserved) } moreover { assume "(x):M ∈ NOTLEFT (NOT A) (\<parallel><A>\<parallel>)" then obtain a' N' where eq: "M = NotL <a'>.N' x" and fin: "fin (NotL <a'>.N' x) x" and imp: "<a'>:N' ∈ \<parallel><A>\<parallel>" by (erule_tac NOTLEFT_elim, blast) from eq asm obtain N'' where eq': "M' = NotL <a'>.N'' x" and red1: "N' -->a* N''" using a_star_redu_NotL_elim by blast from fin have "fin M' x" using eq asm by (simp add: fin_a_star_reduce) moreover from imp red1 have "<a'>:N'' ∈ \<parallel><A>\<parallel>" using ih1 by simp ultimately have "(x):M' ∈ NOTLEFT (NOT A) (\<parallel><A>\<parallel>)" using eq' by (simp, blast) } ultimately have "(x):M' ∈ AXIOMSn (NOT A) ∪ BINDINGn (NOT A) (\<parallel><NOT A>\<parallel>) ∪ NOTLEFT (NOT A) (\<parallel><A>\<parallel>)" by blast then have "(x):M' ∈ NEGn (NOT A) (\<parallel><NOT A>\<parallel>)" by simp then show "(x):M' ∈ (\<parallel>(NOT A)\<parallel>)" using NEG_simp by blast } qed lemma CANDs_preserved_single: shows "<a>:M ∈ \<parallel><B>\<parallel> ==> M -->a M' ==> <a>:M' ∈ \<parallel><B>\<parallel>" and "(x):M ∈ \<parallel>(B)\<parallel> ==> M -->a M' ==> (x):M' ∈ \<parallel>(B)\<parallel>" by (auto simp add: a_starI CANDs_preserved) lemma fic_CANDS: assumes a: "¬fic M a" and b: "<a>:M ∈ \<parallel><B>\<parallel>" shows "<a>:M ∈ AXIOMSc B ∨ <a>:M ∈ BINDINGc B (\<parallel>(B)\<parallel>)" using a b apply(nominal_induct B rule: ty.strong_induct) apply(simp) apply(simp) apply(erule disjE) apply(simp) apply(erule disjE) apply(simp) apply(auto simp add: ctrm.inject)[1] apply(simp add: alpha) apply(erule disjE) apply(simp) apply(auto simp add: calc_atm)[1] apply(drule_tac pi="[(a,aa)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(simp) apply(erule disjE) apply(simp) apply(erule disjE) apply(simp) apply(auto simp add: ctrm.inject)[1] apply(simp add: alpha) apply(erule disjE) apply(simp) apply(erule conjE)+ apply(simp) apply(drule_tac pi="[(a,c)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(simp) apply(erule disjE) apply(simp) apply(erule disjE) apply(simp) apply(auto simp add: ctrm.inject)[1] apply(simp add: alpha) apply(erule disjE) apply(simp) apply(erule conjE)+ apply(simp) apply(drule_tac pi="[(a,b)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(simp add: alpha) apply(erule disjE) apply(simp) apply(erule conjE)+ apply(simp) apply(drule_tac pi="[(a,b)]" in fic.eqvt(2)) apply(simp add: calc_atm) apply(simp) apply(erule disjE) apply(simp) apply(erule disjE) apply(simp) apply(auto simp add: ctrm.inject)[1] apply(simp add: alpha) apply(erule disjE) apply(simp) apply(erule conjE)+ apply(simp) apply(drule_tac pi="[(a,b)]" in fic.eqvt(2)) apply(simp add: calc_atm) done lemma fin_CANDS_aux: assumes a: "¬fin M x" and b: "(x):M ∈ (NEGn B (\<parallel><B>\<parallel>))" shows "(x):M ∈ AXIOMSn B ∨ (x):M ∈ BINDINGn B (\<parallel><B>\<parallel>)" using a b apply(nominal_induct B rule: ty.strong_induct) apply(simp) apply(simp) apply(erule disjE) apply(simp) apply(erule disjE) apply(simp) apply(auto simp add: ntrm.inject)[1] apply(simp add: alpha) apply(erule disjE) apply(simp) apply(auto simp add: calc_atm)[1] apply(drule_tac pi="[(x,xa)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(simp) apply(erule disjE) apply(simp) apply(erule disjE) apply(simp) apply(auto simp add: ntrm.inject)[1] apply(simp add: alpha) apply(erule disjE) apply(simp) apply(erule conjE)+ apply(simp) apply(drule_tac pi="[(x,y)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(simp add: alpha) apply(erule disjE) apply(simp) apply(erule conjE)+ apply(simp) apply(drule_tac pi="[(x,y)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(simp) apply(erule disjE) apply(simp) apply(erule disjE) apply(simp) apply(auto simp add: ntrm.inject)[1] apply(simp add: alpha) apply(erule disjE) apply(simp) apply(erule conjE)+ apply(simp) apply(drule_tac pi="[(x,z)]" in fin.eqvt(1)) apply(simp add: calc_atm) apply(simp) apply(erule disjE) apply(simp) apply(erule disjE) apply(simp) apply(auto simp add: ntrm.inject)[1] apply(simp add: alpha) apply(erule disjE) apply(simp) apply(erule conjE)+ apply(simp) apply(drule_tac pi="[(x,y)]" in fin.eqvt(1)) apply(simp add: calc_atm) done lemma fin_CANDS: assumes a: "¬fin M x" and b: "(x):M ∈ (\<parallel>(B)\<parallel>)" shows "(x):M ∈ AXIOMSn B ∨ (x):M ∈ BINDINGn B (\<parallel><B>\<parallel>)" apply(rule fin_CANDS_aux) apply(rule a) apply(rule NEG_elim) apply(rule b) done lemma BINDING_implies_CAND: shows "<c>:M ∈ BINDINGc B (\<parallel>(B)\<parallel>) ==> <c>:M ∈ (\<parallel><B>\<parallel>)" and "(x):N ∈ BINDINGn B (\<parallel><B>\<parallel>) ==> (x):N ∈ (\<parallel>(B)\<parallel>)" apply - apply(nominal_induct B rule: ty.strong_induct) apply(auto) apply(rule NEG_intro) apply(nominal_induct B rule: ty.strong_induct) apply(auto) done text {* 3rd Main Lemma *} lemma Cut_a_redu_elim: assumes a: "Cut <a>.M (x).N -->a R" shows "(∃M'. R = Cut <a>.M' (x).N ∧ M -->a M') ∨ (∃N'. R = Cut <a>.M (x).N' ∧ N -->a N') ∨ (Cut <a>.M (x).N -->c R) ∨ (Cut <a>.M (x).N -->l R)" using a apply(erule_tac a_redu.cases) apply(simp_all) apply(simp_all add: trm.inject) apply(rule disjI1) apply(auto simp add: alpha)[1] apply(rule_tac x="[(a,aa)]•M'" in exI) apply(perm_simp add: fresh_left calc_atm a_redu.eqvt fresh_a_redu) apply(rule_tac x="[(a,aa)]•M'" in exI) apply(perm_simp add: fresh_left calc_atm a_redu.eqvt fresh_a_redu) apply(rule disjI2) apply(rule disjI1) apply(auto simp add: alpha)[1] apply(rule_tac x="[(x,xa)]•N'" in exI) apply(perm_simp add: fresh_left calc_atm a_redu.eqvt fresh_a_redu) apply(rule_tac x="[(x,xa)]•N'" in exI) apply(perm_simp add: fresh_left calc_atm a_redu.eqvt fresh_a_redu) done lemma Cut_c_redu_elim: assumes a: "Cut <a>.M (x).N -->c R" shows "(R = M{a:=(x).N} ∧ ¬fic M a) ∨ (R = N{x:=<a>.M} ∧ ¬fin N x)" using a apply(erule_tac c_redu.cases) apply(simp_all) apply(simp_all add: trm.inject) apply(rule disjI1) apply(auto simp add: alpha)[1] apply(simp add: subst_rename fresh_atm) apply(simp add: subst_rename fresh_atm) apply(drule_tac pi="[(a,aa)]" in fic.eqvt(2)) apply(perm_simp) apply(simp add: subst_rename fresh_atm fresh_prod) apply(drule_tac pi="[(a,aa)]" in fic.eqvt(2)) apply(perm_simp) apply(rule disjI2) apply(auto simp add: alpha)[1] apply(simp add: subst_rename fresh_atm) apply(drule_tac pi="[(x,xa)]" in fin.eqvt(1)) apply(perm_simp) apply(simp add: subst_rename fresh_atm fresh_prod) apply(simp add: subst_rename fresh_atm fresh_prod) apply(drule_tac pi="[(x,xa)]" in fin.eqvt(1)) apply(perm_simp) done lemma not_fic_crename_aux: assumes a: "fic M c" "c\<sharp>(a,b)" shows "fic (M[a\<turnstile>c>b]) c" using a apply(nominal_induct M avoiding: c a b rule: trm.strong_induct) apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh) done lemma not_fic_crename: assumes a: "¬(fic (M[a\<turnstile>c>b]) c)" "c\<sharp>(a,b)" shows "¬(fic M c)" using a apply(auto dest: not_fic_crename_aux) done lemma not_fin_crename_aux: assumes a: "fin M y" shows "fin (M[a\<turnstile>c>b]) y" using a apply(nominal_induct M avoiding: a b rule: trm.strong_induct) apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh) done lemma not_fin_crename: assumes a: "¬(fin (M[a\<turnstile>c>b]) y)" shows "¬(fin M y)" using a apply(auto dest: not_fin_crename_aux) done lemma crename_fresh_interesting1: fixes c::"coname" assumes a: "c\<sharp>(M[a\<turnstile>c>b])" "c\<sharp>(a,b)" shows "c\<sharp>M" using a apply(nominal_induct M avoiding: c a b rule: trm.strong_induct) apply(auto split: if_splits simp add: abs_fresh) done lemma crename_fresh_interesting2: fixes x::"name" assumes a: "x\<sharp>(M[a\<turnstile>c>b])" shows "x\<sharp>M" using a apply(nominal_induct M avoiding: x a b rule: trm.strong_induct) apply(auto split: if_splits simp add: abs_fresh abs_supp fin_supp fresh_atm) done lemma fic_crename: assumes a: "fic (M[a\<turnstile>c>b]) c" "c\<sharp>(a,b)" shows "fic M c" using a apply(nominal_induct M avoiding: c a b rule: trm.strong_induct) apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh split: if_splits) apply(auto dest: crename_fresh_interesting1 simp add: fresh_prod fresh_atm) done lemma fin_crename: assumes a: "fin (M[a\<turnstile>c>b]) x" shows "fin M x" using a apply(nominal_induct M avoiding: x a b rule: trm.strong_induct) apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh split: if_splits) apply(auto dest: crename_fresh_interesting2 simp add: fresh_prod fresh_atm) done lemma crename_Cut: assumes a: "R[a\<turnstile>c>b] = Cut <c>.M (x).N" "c\<sharp>(a,b,N,R)" "x\<sharp>(M,R)" shows "∃M' N'. R = Cut <c>.M' (x).N' ∧ M'[a\<turnstile>c>b] = M ∧ N'[a\<turnstile>c>b] = N ∧ c\<sharp>N' ∧ x\<sharp>M'" using a apply(nominal_induct R avoiding: a b c x M N rule: trm.strong_induct) apply(auto split: if_splits) apply(simp add: trm.inject) apply(auto simp add: alpha) apply(rule_tac x="[(name,x)]•trm2" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) apply(rule_tac x="[(coname,c)]•trm1" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) apply(auto simp add: fresh_atm)[1] apply(rule_tac x="[(coname,c)]•trm1" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(rule_tac x="[(name,x)]•trm2" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) apply(auto simp add: fresh_atm)[1] apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma crename_NotR: assumes a: "R[a\<turnstile>c>b] = NotR (x).N c" "x\<sharp>R" "c\<sharp>(a,b)" shows "∃N'. (R = NotR (x).N' c) ∧ N'[a\<turnstile>c>b] = N" using a apply(nominal_induct R avoiding: a b c x N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) apply(rule_tac x="[(name,x)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma crename_NotR': assumes a: "R[a\<turnstile>c>b] = NotR (x).N c" "x\<sharp>R" "c\<sharp>a" shows "(∃N'. (R = NotR (x).N' c) ∧ N'[a\<turnstile>c>b] = N) ∨ (∃N'. (R = NotR (x).N' a) ∧ b=c ∧ N'[a\<turnstile>c>b] = N)" using a apply(nominal_induct R avoiding: a b c x N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) apply(rule_tac x="[(name,x)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) apply(rule_tac x="[(name,x)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma crename_NotR_aux: assumes a: "R[a\<turnstile>c>b] = NotR (x).N c" shows "(a=c ∧ a=b) ∨ (a≠c)" using a apply(nominal_induct R avoiding: a b c x N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) done lemma crename_NotL: assumes a: "R[a\<turnstile>c>b] = NotL <c>.N y" "c\<sharp>(R,a,b)" shows "∃N'. (R = NotL <c>.N' y) ∧ N'[a\<turnstile>c>b] = N" using a apply(nominal_induct R avoiding: a b c y N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) apply(rule_tac x="[(coname,c)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) done lemma crename_AndL1: assumes a: "R[a\<turnstile>c>b] = AndL1 (x).N y" "x\<sharp>R" shows "∃N'. (R = AndL1 (x).N' y) ∧ N'[a\<turnstile>c>b] = N" using a apply(nominal_induct R avoiding: a b x y N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) apply(rule_tac x="[(name1,x)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma crename_AndL2: assumes a: "R[a\<turnstile>c>b] = AndL2 (x).N y" "x\<sharp>R" shows "∃N'. (R = AndL2 (x).N' y) ∧ N'[a\<turnstile>c>b] = N" using a apply(nominal_induct R avoiding: a b x y N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) apply(rule_tac x="[(name1,x)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma crename_AndR_aux: assumes a: "R[a\<turnstile>c>b] = AndR <c>.M <d>.N e" shows "(a=e ∧ a=b) ∨ (a≠e)" using a apply(nominal_induct R avoiding: a b c d e M N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) done lemma crename_AndR: assumes a: "R[a\<turnstile>c>b] = AndR <c>.M <d>.N e" "c\<sharp>(a,b,d,e,N,R)" "d\<sharp>(a,b,c,e,M,R)" "e\<sharp>(a,b)" shows "∃M' N'. R = AndR <c>.M' <d>.N' e ∧ M'[a\<turnstile>c>b] = M ∧ N'[a\<turnstile>c>b] = N ∧ c\<sharp>N' ∧ d\<sharp>M'" using a apply(nominal_induct R avoiding: a b c d e M N rule: trm.strong_induct) apply(auto split: if_splits simp add: trm.inject alpha) apply(simp add: fresh_atm fresh_prod) apply(rule_tac x="[(coname2,d)]•trm2" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(rule_tac x="[(coname1,c)]•trm1" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(rule_tac x="[(coname1,c)]•trm1" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(rule_tac x="[(coname2,d)]•trm2" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(rule_tac x="[(coname1,c)]•trm1" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(rule_tac x="[(coname1,c)]•trm1" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(rule_tac x="[(coname2,d)]•trm2" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) apply(drule_tac s="trm2[a\<turnstile>c>b]" in sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) done lemma crename_AndR': assumes a: "R[a\<turnstile>c>b] = AndR <c>.M <d>.N e" "c\<sharp>(a,b,d,e,N,R)" "d\<sharp>(a,b,c,e,M,R)" "e\<sharp>a" shows "(∃M' N'. R = AndR <c>.M' <d>.N' e ∧ M'[a\<turnstile>c>b] = M ∧ N'[a\<turnstile>c>b] = N ∧ c\<sharp>N' ∧ d\<sharp>M') ∨ (∃M' N'. R = AndR <c>.M' <d>.N' a ∧ b=e ∧ M'[a\<turnstile>c>b] = M ∧ N'[a\<turnstile>c>b] = N ∧ c\<sharp>N' ∧ d\<sharp>M')" using a apply(nominal_induct R avoiding: a b c d e M N rule: trm.strong_induct) apply(auto split: if_splits simp add: trm.inject alpha)[1] apply(auto split: if_splits simp add: trm.inject alpha)[1] apply(auto split: if_splits simp add: trm.inject alpha)[1] apply(auto split: if_splits simp add: trm.inject alpha)[1] apply(simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm trm.inject alpha)[1] apply(case_tac "coname3=a") apply(simp) apply(rule_tac x="[(coname1,c)]•trm1" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(rule_tac x="[(coname2,d)]•trm2" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm trm.inject alpha split: if_splits)[1] apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) apply(drule_tac s="trm2[a\<turnstile>c>e]" in sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) apply(simp) apply(rule_tac x="[(coname1,c)]•trm1" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(rule_tac x="[(coname2,d)]•trm2" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm trm.inject alpha split: if_splits)[1] apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) apply(drule_tac s="trm2[a\<turnstile>c>b]" in sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) done lemma crename_OrR1_aux: assumes a: "R[a\<turnstile>c>b] = OrR1 <c>.M e" shows "(a=e ∧ a=b) ∨ (a≠e)" using a apply(nominal_induct R avoiding: a b c e M rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) done lemma crename_OrR1: assumes a: "R[a\<turnstile>c>b] = OrR1 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>(a,b)" shows "∃N'. (R = OrR1 <c>.N' d) ∧ N'[a\<turnstile>c>b] = N" using a apply(nominal_induct R avoiding: a b c d N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) apply(rule_tac x="[(coname1,c)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) done lemma crename_OrR1': assumes a: "R[a\<turnstile>c>b] = OrR1 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>a" shows "(∃N'. (R = OrR1 <c>.N' d) ∧ N'[a\<turnstile>c>b] = N) ∨ (∃N'. (R = OrR1 <c>.N' a) ∧ b=d ∧ N'[a\<turnstile>c>b] = N)" using a apply(nominal_induct R avoiding: a b c d N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) apply(rule_tac x="[(coname1,c)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) apply(rule_tac x="[(coname1,c)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) done lemma crename_OrR2_aux: assumes a: "R[a\<turnstile>c>b] = OrR2 <c>.M e" shows "(a=e ∧ a=b) ∨ (a≠e)" using a apply(nominal_induct R avoiding: a b c e M rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) done lemma crename_OrR2: assumes a: "R[a\<turnstile>c>b] = OrR2 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>(a,b)" shows "∃N'. (R = OrR2 <c>.N' d) ∧ N'[a\<turnstile>c>b] = N" using a apply(nominal_induct R avoiding: a b c d N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) apply(rule_tac x="[(coname1,c)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) done lemma crename_OrR2': assumes a: "R[a\<turnstile>c>b] = OrR2 <c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>a" shows "(∃N'. (R = OrR2 <c>.N' d) ∧ N'[a\<turnstile>c>b] = N) ∨ (∃N'. (R = OrR2 <c>.N' a) ∧ b=d ∧ N'[a\<turnstile>c>b] = N)" using a apply(nominal_induct R avoiding: a b c d N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) apply(rule_tac x="[(coname1,c)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) apply(rule_tac x="[(coname1,c)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) done lemma crename_OrL: assumes a: "R[a\<turnstile>c>b] = OrL (x).M (y).N z" "x\<sharp>(y,z,N,R)" "y\<sharp>(x,z,M,R)" shows "∃M' N'. R = OrL (x).M' (y).N' z ∧ M'[a\<turnstile>c>b] = M ∧ N'[a\<turnstile>c>b] = N ∧ x\<sharp>N' ∧ y\<sharp>M'" using a apply(nominal_induct R avoiding: a b x y z M N rule: trm.strong_induct) apply(auto split: if_splits simp add: trm.inject alpha) apply(rule_tac x="[(name2,y)]•trm2" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(rule_tac x="[(name1,x)]•trm1" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(rule_tac x="[(name1,x)]•trm1" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(rule_tac x="[(name2,y)]•trm2" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) apply(drule_tac s="trm2[a\<turnstile>c>b]" in sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma crename_ImpL: assumes a: "R[a\<turnstile>c>b] = ImpL <c>.M (y).N z" "c\<sharp>(a,b,N,R)" "y\<sharp>(z,M,R)" shows "∃M' N'. R = ImpL <c>.M' (y).N' z ∧ M'[a\<turnstile>c>b] = M ∧ N'[a\<turnstile>c>b] = N ∧ c\<sharp>N' ∧ y\<sharp>M'" using a apply(nominal_induct R avoiding: a b c y z M N rule: trm.strong_induct) apply(auto split: if_splits simp add: trm.inject alpha) apply(rule_tac x="[(name1,y)]•trm2" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(rule_tac x="[(coname,c)]•trm1" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(rule_tac x="[(coname,c)]•trm1" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(rule_tac x="[(name1,y)]•trm2" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) apply(drule_tac s="trm2[a\<turnstile>c>b]" in sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma crename_ImpR_aux: assumes a: "R[a\<turnstile>c>b] = ImpR (x).<c>.M e" shows "(a=e ∧ a=b) ∨ (a≠e)" using a apply(nominal_induct R avoiding: x a b c e M rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) done lemma crename_ImpR: assumes a: "R[a\<turnstile>c>b] = ImpR (x).<c>.N d" "c\<sharp>(R,a,b)" "d\<sharp>(a,b)" "x\<sharp>R" shows "∃N'. (R = ImpR (x).<c>.N' d) ∧ N'[a\<turnstile>c>b] = N" using a apply(nominal_induct R avoiding: a b x c d N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_perm alpha abs_fresh trm.inject) apply(rule_tac x="[(name,x)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(simp add: calc_atm) apply(rule_tac x="[(name,x)]•[(coname1, c)]•trm" in exI) apply(perm_simp) apply(simp add: abs_supp fin_supp abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma crename_ImpR': assumes a: "R[a\<turnstile>c>b] = ImpR (x).<c>.N d" "c\<sharp>(R,a,b)" "x\<sharp>R" "d\<sharp>a" shows "(∃N'. (R = ImpR (x).<c>.N' d) ∧ N'[a\<turnstile>c>b] = N) ∨ (∃N'. (R = ImpR (x).<c>.N' a) ∧ b=d ∧ N'[a\<turnstile>c>b] = N)" using a apply(nominal_induct R avoiding: x a b c d N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject abs_perm calc_atm) apply(rule_tac x="[(name,x)]•[(coname1,c)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod abs_supp fin_supp) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) apply(rule_tac x="[(name,x)]•[(coname1,c)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod abs_supp fin_supp) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma crename_ax2: assumes a: "N[a\<turnstile>c>b] = Ax x c" shows "∃d. N = Ax x d" using a apply(nominal_induct N avoiding: a b rule: trm.strong_induct) apply(auto split: if_splits) apply(simp add: trm.inject) done lemma crename_interesting1: assumes a: "distinct [a,b,c]" shows "M[a\<turnstile>c>c][c\<turnstile>c>b] = M[c\<turnstile>c>b][a\<turnstile>c>b]" using a apply(nominal_induct M avoiding: a c b rule: trm.strong_induct) apply(auto simp add: rename_fresh simp add: trm.inject alpha) apply(blast) apply(rotate_tac 12) apply(drule_tac x="a" in meta_spec) apply(rotate_tac 15) apply(drule_tac x="c" in meta_spec) apply(rotate_tac 15) apply(drule_tac x="b" in meta_spec) apply(blast) apply(blast) apply(blast) done lemma crename_interesting2: assumes a: "a≠c" "a≠d" "a≠b" "c≠d" "b≠c" shows "M[a\<turnstile>c>b][c\<turnstile>c>d] = M[c\<turnstile>c>d][a\<turnstile>c>b]" using a apply(nominal_induct M avoiding: a c b d rule: trm.strong_induct) apply(auto simp add: rename_fresh simp add: trm.inject alpha) done lemma crename_interesting3: shows "M[a\<turnstile>c>c][x\<turnstile>n>y] = M[x\<turnstile>n>y][a\<turnstile>c>c]" apply(nominal_induct M avoiding: a c x y rule: trm.strong_induct) apply(auto simp add: rename_fresh simp add: trm.inject alpha) done lemma crename_credu: assumes a: "(M[a\<turnstile>c>b]) -->c M'" shows "∃M0. M0[a\<turnstile>c>b]=M' ∧ M -->c M0" using a apply(nominal_induct M≡"M[a\<turnstile>c>b]" M' avoiding: M a b rule: c_redu.strong_induct) apply(drule sym) apply(drule crename_Cut) apply(simp) apply(simp) apply(auto) apply(rule_tac x="M'{a:=(x).N'}" in exI) apply(rule conjI) apply(simp add: fresh_atm abs_fresh subst_comm fresh_prod) apply(rule c_redu.intros) apply(auto dest: not_fic_crename)[1] apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(drule sym) apply(drule crename_Cut) apply(simp) apply(simp) apply(auto) apply(rule_tac x="N'{x:=<a>.M'}" in exI) apply(rule conjI) apply(simp add: fresh_atm abs_fresh subst_comm fresh_prod) apply(rule c_redu.intros) apply(auto dest: not_fin_crename)[1] apply(simp add: abs_fresh) apply(simp add: abs_fresh) done lemma crename_lredu: assumes a: "(M[a\<turnstile>c>b]) -->l M'" shows "∃M0. M0[a\<turnstile>c>b]=M' ∧ M -->l M0" using a apply(nominal_induct M≡"M[a\<turnstile>c>b]" M' avoiding: M a b rule: l_redu.strong_induct) apply(drule sym) apply(drule crename_Cut) apply(simp add: fresh_prod fresh_atm) apply(simp) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(case_tac "aa=ba") apply(simp add: crename_id) apply(rule l_redu.intros) apply(simp) apply(simp add: fresh_atm) apply(assumption) apply(frule crename_ax2) apply(auto)[1] apply(case_tac "d=aa") apply(simp add: trm.inject) apply(rule_tac x="M'[a\<turnstile>c>aa]" in exI) apply(rule conjI) apply(rule crename_interesting1) apply(simp) apply(rule l_redu.intros) apply(simp) apply(simp add: fresh_atm) apply(auto dest: fic_crename simp add: fresh_prod fresh_atm)[1] apply(simp add: trm.inject) apply(rule_tac x="M'[a\<turnstile>c>b]" in exI) apply(rule conjI) apply(rule crename_interesting2) apply(simp) apply(simp) apply(simp) apply(simp) apply(simp) apply(rule l_redu.intros) apply(simp) apply(simp add: fresh_atm) apply(auto dest: fic_crename simp add: fresh_prod fresh_atm)[1] apply(drule sym) apply(drule crename_Cut) apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_prod fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(case_tac "aa=b") apply(simp add: crename_id) apply(rule l_redu.intros) apply(simp) apply(simp add: fresh_atm) apply(assumption) apply(frule crename_ax2) apply(auto)[1] apply(case_tac "d=aa") apply(simp add: trm.inject) apply(simp add: trm.inject) apply(rule_tac x="N'[x\<turnstile>n>y]" in exI) apply(rule conjI) apply(rule sym) apply(rule crename_interesting3) apply(rule l_redu.intros) apply(simp) apply(simp add: fresh_atm) apply(auto dest: fin_crename simp add: fresh_prod fresh_atm)[1] (* LNot *) apply(drule sym) apply(drule crename_Cut) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(drule crename_NotR) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(drule crename_NotL) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(rule_tac x="Cut <b>.N'b (x).N'a" in exI) apply(simp add: fresh_atm)[1] apply(rule l_redu.intros) apply(auto simp add: fresh_prod intro: crename_fresh_interesting2)[1] apply(auto simp add: fresh_atm fresh_prod intro: crename_fresh_interesting2)[1] apply(auto simp add: fresh_atm fresh_prod intro: crename_fresh_interesting1)[1] apply(auto simp add: fresh_atm fresh_prod intro: crename_fresh_interesting1)[1] apply(simp add: fresh_atm) apply(simp add: fresh_atm) (* LAnd1 *) apply(auto dest: fin_crename simp add: fresh_prod fresh_atm)[1] apply(drule sym) apply(drule crename_Cut) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto)[1] apply(drule crename_AndR) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(drule crename_AndL1) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(rule_tac x="Cut <a1>.M'a (x).N'a" in exI) apply(simp add: fresh_atm)[1] apply(rule l_redu.intros) apply(auto simp add: fresh_atm abs_fresh fresh_prod intro: crename_fresh_interesting1)[1] apply(auto simp add: abs_fresh fresh_atm fresh_prod intro: crename_fresh_interesting2)[1] apply(auto simp add: fresh_atm fresh_prod intro: crename_fresh_interesting1)[1] apply(auto simp add: fresh_atm fresh_prod intro: crename_fresh_interesting1)[1] apply(simp add: fresh_atm) apply(simp add: fresh_atm) (* LAnd2 *) apply(auto dest: fin_crename simp add: fresh_prod fresh_atm)[1] apply(drule sym) apply(drule crename_Cut) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto)[1] apply(drule crename_AndR) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(drule crename_AndL2) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(rule_tac x="Cut <a2>.N'b (x).N'a" in exI) apply(simp add: fresh_atm)[1] apply(rule l_redu.intros) apply(auto simp add: fresh_atm abs_fresh fresh_prod intro: crename_fresh_interesting1)[1] apply(auto simp add: abs_fresh fresh_atm fresh_prod intro: crename_fresh_interesting2)[1] apply(auto simp add: fresh_atm fresh_prod intro: crename_fresh_interesting1)[1] apply(auto simp add: fresh_atm fresh_prod intro: crename_fresh_interesting1)[1] apply(simp add: fresh_atm) apply(simp add: fresh_atm) (* LOr1 *) apply(auto dest: fin_crename simp add: fresh_prod fresh_atm)[1] apply(drule sym) apply(drule crename_Cut) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto)[1] apply(drule crename_OrL) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(drule crename_OrR1) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(auto) apply(rule_tac x="Cut <a>.N' (x1).M'a" in exI) apply(rule conjI) apply(simp add: abs_fresh fresh_atm)[1] apply(rule l_redu.intros) apply(auto simp add: fresh_atm abs_fresh fresh_prod intro: crename_fresh_interesting1)[1] apply(auto simp add: abs_fresh fresh_atm fresh_prod intro: crename_fresh_interesting2)[1] apply(auto simp add: abs_fresh fresh_atm fresh_prod intro: crename_fresh_interesting1)[1] apply(auto simp add: abs_fresh fresh_atm fresh_prod intro: crename_fresh_interesting1)[1] apply(simp add: fresh_atm) apply(simp add: fresh_atm) (* LOr2 *) apply(auto dest: fin_crename simp add: fresh_prod fresh_atm)[1] apply(drule sym) apply(drule crename_Cut) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto)[1] apply(drule crename_OrL) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(drule crename_OrR2) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(auto) apply(rule_tac x="Cut <a>.N' (x2).N'a" in exI) apply(rule conjI) apply(simp add: abs_fresh fresh_atm)[1] apply(rule l_redu.intros) apply(auto simp add: fresh_atm abs_fresh fresh_prod intro: crename_fresh_interesting1)[1] apply(auto simp add: abs_fresh fresh_atm fresh_prod intro: crename_fresh_interesting2)[1] apply(auto simp add: abs_fresh fresh_atm fresh_prod intro: crename_fresh_interesting1)[1] apply(auto simp add: abs_fresh fresh_atm fresh_prod intro: crename_fresh_interesting1)[1] apply(simp add: fresh_atm) apply(simp add: fresh_atm) (* ImpL *) apply(auto dest: fin_crename simp add: fresh_prod fresh_atm)[1] apply(drule sym) apply(drule crename_Cut) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm abs_supp fin_supp) apply(auto)[1] apply(drule crename_ImpL) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(drule crename_ImpR) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(rule_tac x="Cut <a>.(Cut <c>.M'a (x).N') (y).N'a" in exI) apply(rule conjI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(rule l_redu.intros) apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp fresh_prod intro: crename_fresh_interesting2)[1] apply(auto simp add: abs_fresh fresh_atm abs_supp fin_supp fresh_prod intro: crename_fresh_interesting1)[1] apply(auto simp add: abs_fresh fresh_atm abs_supp fin_supp fresh_prod intro: crename_fresh_interesting2)[1] apply(auto simp add: abs_fresh fresh_atm abs_supp fin_supp fresh_prod intro: crename_fresh_interesting1)[1] apply(auto simp add: abs_fresh fresh_atm abs_supp fin_supp fresh_prod intro: crename_fresh_interesting1)[1] apply(auto simp add: abs_fresh fresh_atm abs_supp fin_supp fresh_prod intro: crename_fresh_interesting1)[1] done lemma crename_aredu: assumes a: "(M[a\<turnstile>c>b]) -->a M'" "a≠b" shows "∃M0. M0[a\<turnstile>c>b]=M' ∧ M -->a M0" using a apply(nominal_induct M≡"M[a\<turnstile>c>b]" M' avoiding: M a b rule: a_redu.strong_induct) apply(simp) apply(drule crename_lredu) apply(blast) apply(simp) apply(drule crename_credu) apply(blast) (* Cut *) apply(drule sym) apply(drule crename_Cut) apply(simp) apply(simp) apply(auto)[1] apply(drule_tac x="M'a" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(auto)[1] apply(rule_tac x="Cut <a>.M0 (x).N'" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(rule conjI) apply(rule trans) apply(rule crename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(drule crename_fresh_interesting2) apply(simp add: fresh_a_redu) apply(simp) apply(auto)[1] apply(drule sym) apply(drule crename_Cut) apply(simp) apply(simp) apply(auto)[1] apply(drule_tac x="N'a" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(auto)[1] apply(rule_tac x="Cut <a>.M' (x).M0" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(rule conjI) apply(rule trans) apply(rule crename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm fresh_prod)[1] apply(drule crename_fresh_interesting1) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_a_redu) apply(simp) apply(simp) apply(auto)[1] (* NotL *) apply(drule sym) apply(drule crename_NotL) apply(simp) apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(auto)[1] apply(rule_tac x="NotL <a>.M0 x" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] (* NotR *) apply(drule sym) apply(frule crename_NotR_aux) apply(erule disjE) apply(auto)[1] apply(drule crename_NotR') apply(simp) apply(simp add: fresh_atm) apply(erule disjE) apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(auto)[1] apply(rule_tac x="NotR (x).M0 a" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="a" in meta_spec) apply(auto)[1] apply(rule_tac x="NotR (x).M0 aa" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] (* AndR *) apply(drule sym) apply(frule crename_AndR_aux) apply(erule disjE) apply(auto)[1] apply(drule crename_AndR') apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_atm) apply(simp add: fresh_atm) apply(erule disjE) apply(auto)[1] apply(drule_tac x="M'a" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="ba" in meta_spec) apply(auto)[1] apply(rule_tac x="AndR <a>.M0 <b>.N' c" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule crename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(drule_tac x="M'a" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="c" in meta_spec) apply(auto)[1] apply(rule_tac x="AndR <a>.M0 <b>.N' aa" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule crename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(drule sym) apply(frule crename_AndR_aux) apply(erule disjE) apply(auto)[1] apply(drule crename_AndR') apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_atm) apply(simp add: fresh_atm) apply(erule disjE) apply(auto)[1] apply(drule_tac x="N'a" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="ba" in meta_spec) apply(auto)[1] apply(rule_tac x="AndR <a>.M' <b>.M0 c" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule crename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm fresh_prod)[1] apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(drule_tac x="N'a" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="c" in meta_spec) apply(auto)[1] apply(rule_tac x="AndR <a>.M' <b>.M0 aa" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule crename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm fresh_prod)[1] apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp) (* AndL1 *) apply(drule sym) apply(drule crename_AndL1) apply(simp) apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(auto)[1] apply(rule_tac x="AndL1 (x).M0 y" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] (* AndL2 *) apply(drule sym) apply(drule crename_AndL2) apply(simp) apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(auto)[1] apply(rule_tac x="AndL2 (x).M0 y" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] (* OrL *) apply(drule sym) apply(drule crename_OrL) apply(simp) apply(auto simp add: fresh_atm fresh_prod)[1] apply(auto simp add: fresh_atm fresh_prod)[1] apply(auto)[1] apply(drule_tac x="M'a" in meta_spec) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(auto)[1] apply(rule_tac x="OrL (x).M0 (y).N' z" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule crename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm fresh_prod)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp) apply(drule sym) apply(drule crename_OrL) apply(simp) apply(auto simp add: fresh_atm fresh_prod)[1] apply(auto simp add: fresh_atm fresh_prod)[1] apply(auto)[1] apply(drule_tac x="N'a" in meta_spec) apply(drule_tac x="a" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(auto)[1] apply(rule_tac x="OrL (x).M' (y).M0 z" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule crename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm fresh_prod)[1] apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp) apply(simp) (* OrR1 *) apply(drule sym) apply(frule crename_OrR1_aux) apply(erule disjE) apply(auto)[1] apply(drule crename_OrR1') apply(simp) apply(simp add: fresh_atm) apply(erule disjE) apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="ba" in meta_spec) apply(auto)[1] apply(rule_tac x="OrR1 <a>.M0 b" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(auto)[1] apply(rule_tac x="OrR1 <a>.M0 aa" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] (* OrR2 *) apply(drule sym) apply(frule crename_OrR2_aux) apply(erule disjE) apply(auto)[1] apply(drule crename_OrR2') apply(simp) apply(simp add: fresh_atm) apply(erule disjE) apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="ba" in meta_spec) apply(auto)[1] apply(rule_tac x="OrR2 <a>.M0 b" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(auto)[1] apply(rule_tac x="OrR2 <a>.M0 aa" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] (* ImpL *) apply(drule sym) apply(drule crename_ImpL) apply(simp) apply(simp) apply(auto)[1] apply(drule_tac x="M'a" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(auto)[1] apply(rule_tac x="ImpL <a>.M0 (x).N' y" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule crename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm fresh_prod)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(drule sym) apply(drule crename_ImpL) apply(simp) apply(simp) apply(auto)[1] apply(drule_tac x="N'a" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(auto)[1] apply(rule_tac x="ImpL <a>.M' (x).M0 y" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule crename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm fresh_prod)[1] apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp) (* ImpR *) apply(drule sym) apply(frule crename_ImpR_aux) apply(erule disjE) apply(auto)[1] apply(drule crename_ImpR') apply(simp) apply(simp add: fresh_atm) apply(simp add: fresh_atm) apply(erule disjE) apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="ba" in meta_spec) apply(auto)[1] apply(rule_tac x="ImpR (x).<a>.M0 b" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="aa" in meta_spec) apply(drule_tac x="b" in meta_spec) apply(auto)[1] apply(rule_tac x="ImpR (x).<a>.M0 aa" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] done lemma SNa_preserved_renaming1: assumes a: "SNa M" shows "SNa (M[a\<turnstile>c>b])" using a apply(induct rule: SNa_induct) apply(case_tac "a=b") apply(simp add: crename_id) apply(rule SNaI) apply(drule crename_aredu) apply(blast)+ done lemma nrename_interesting1: assumes a: "distinct [x,y,z]" shows "M[x\<turnstile>n>z][z\<turnstile>n>y] = M[z\<turnstile>n>y][x\<turnstile>n>y]" using a apply(nominal_induct M avoiding: x y z rule: trm.strong_induct) apply(auto simp add: rename_fresh simp add: trm.inject alpha) apply(blast) apply(blast) apply(rotate_tac 12) apply(drule_tac x="x" in meta_spec) apply(rotate_tac 15) apply(drule_tac x="y" in meta_spec) apply(rotate_tac 15) apply(drule_tac x="z" in meta_spec) apply(blast) apply(rotate_tac 11) apply(drule_tac x="x" in meta_spec) apply(rotate_tac 14) apply(drule_tac x="y" in meta_spec) apply(rotate_tac 14) apply(drule_tac x="z" in meta_spec) apply(blast) done lemma nrename_interesting2: assumes a: "x≠z" "x≠u" "x≠y" "z≠u" "y≠z" shows "M[x\<turnstile>n>y][z\<turnstile>n>u] = M[z\<turnstile>n>u][x\<turnstile>n>y]" using a apply(nominal_induct M avoiding: x y z u rule: trm.strong_induct) apply(auto simp add: rename_fresh simp add: trm.inject alpha) done lemma not_fic_nrename_aux: assumes a: "fic M c" shows "fic (M[x\<turnstile>n>y]) c" using a apply(nominal_induct M avoiding: c x y rule: trm.strong_induct) apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh) done lemma not_fic_nrename: assumes a: "¬(fic (M[x\<turnstile>n>y]) c)" shows "¬(fic M c)" using a apply(auto dest: not_fic_nrename_aux) done lemma fin_nrename: assumes a: "fin M z" "z\<sharp>(x,y)" shows "fin (M[x\<turnstile>n>y]) z" using a apply(nominal_induct M avoiding: x y z rule: trm.strong_induct) apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh split: if_splits) done lemma nrename_fresh_interesting1: fixes z::"name" assumes a: "z\<sharp>(M[x\<turnstile>n>y])" "z\<sharp>(x,y)" shows "z\<sharp>M" using a apply(nominal_induct M avoiding: x y z rule: trm.strong_induct) apply(auto split: if_splits simp add: abs_fresh abs_supp fin_supp) done lemma nrename_fresh_interesting2: fixes c::"coname" assumes a: "c\<sharp>(M[x\<turnstile>n>y])" shows "c\<sharp>M" using a apply(nominal_induct M avoiding: x y c rule: trm.strong_induct) apply(auto split: if_splits simp add: abs_fresh abs_supp fin_supp fresh_atm) done lemma fin_nrename2: assumes a: "fin (M[x\<turnstile>n>y]) z" "z\<sharp>(x,y)" shows "fin M z" using a apply(nominal_induct M avoiding: x y z rule: trm.strong_induct) apply(auto dest!: fin_elims intro!: fin.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh split: if_splits) apply(auto dest: nrename_fresh_interesting1 simp add: fresh_atm fresh_prod) done lemma nrename_Cut: assumes a: "R[x\<turnstile>n>y] = Cut <c>.M (z).N" "c\<sharp>(N,R)" "z\<sharp>(x,y,M,R)" shows "∃M' N'. R = Cut <c>.M' (z).N' ∧ M'[x\<turnstile>n>y] = M ∧ N'[x\<turnstile>n>y] = N ∧ c\<sharp>N' ∧ z\<sharp>M'" using a apply(nominal_induct R avoiding: c y x z M N rule: trm.strong_induct) apply(auto split: if_splits) apply(simp add: trm.inject) apply(auto simp add: alpha fresh_atm) apply(rule_tac x="[(coname,c)]•trm1" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(rule_tac x="[(name,z)]•trm2" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(rule conjI) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) apply(auto simp add: fresh_atm)[1] apply(drule sym) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma nrename_NotR: assumes a: "R[x\<turnstile>n>y] = NotR (z).N c" "z\<sharp>(R,x,y)" shows "∃N'. (R = NotR (z).N' c) ∧ N'[x\<turnstile>n>y] = N" using a apply(nominal_induct R avoiding: x y c z N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) apply(rule_tac x="[(name,z)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma nrename_NotL: assumes a: "R[x\<turnstile>n>y] = NotL <c>.N z" "c\<sharp>R" "z\<sharp>(x,y)" shows "∃N'. (R = NotL <c>.N' z) ∧ N'[x\<turnstile>n>y] = N" using a apply(nominal_induct R avoiding: x y c z N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) apply(rule_tac x="[(coname,c)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) done lemma nrename_NotL': assumes a: "R[x\<turnstile>n>y] = NotL <c>.N u" "c\<sharp>R" "x≠y" shows "(∃N'. (R = NotL <c>.N' u) ∧ N'[x\<turnstile>n>y] = N) ∨ (∃N'. (R = NotL <c>.N' x) ∧ y=u ∧ N'[x\<turnstile>n>y] = N)" using a apply(nominal_induct R avoiding: y u c x N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) apply(rule_tac x="[(coname,c)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) apply(rule_tac x="[(coname,c)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) done lemma nrename_NotL_aux: assumes a: "R[x\<turnstile>n>y] = NotL <c>.N u" shows "(x=u ∧ x=y) ∨ (x≠u)" using a apply(nominal_induct R avoiding: y u c x N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) done lemma nrename_AndL1: assumes a: "R[x\<turnstile>n>y] = AndL1 (z).N u" "z\<sharp>(R,x,y)" "u\<sharp>(x,y)" shows "∃N'. (R = AndL1 (z).N' u) ∧ N'[x\<turnstile>n>y] = N" using a apply(nominal_induct R avoiding: z u x y N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) apply(rule_tac x="[(name1,z)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma nrename_AndL1': assumes a: "R[x\<turnstile>n>y] = AndL1 (v).N u" "v\<sharp>(R,u,x,y)" "x≠y" shows "(∃N'. (R = AndL1 (v).N' u) ∧ N'[x\<turnstile>n>y] = N) ∨ (∃N'. (R = AndL1 (v).N' x) ∧ y=u ∧ N'[x\<turnstile>n>y] = N)" using a apply(nominal_induct R avoiding: y u v x N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) apply(rule_tac x="[(name1,v)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) apply(rule_tac x="[(name1,v)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma nrename_AndL1_aux: assumes a: "R[x\<turnstile>n>y] = AndL1 (v).N u" shows "(x=u ∧ x=y) ∨ (x≠u)" using a apply(nominal_induct R avoiding: y u v x N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) done lemma nrename_AndL2: assumes a: "R[x\<turnstile>n>y] = AndL2 (z).N u" "z\<sharp>(R,x,y)" "u\<sharp>(x,y)" shows "∃N'. (R = AndL2 (z).N' u) ∧ N'[x\<turnstile>n>y] = N" using a apply(nominal_induct R avoiding: z u x y N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) apply(rule_tac x="[(name1,z)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma nrename_AndL2': assumes a: "R[x\<turnstile>n>y] = AndL2 (v).N u" "v\<sharp>(R,u,x,y)" "x≠y" shows "(∃N'. (R = AndL2 (v).N' u) ∧ N'[x\<turnstile>n>y] = N) ∨ (∃N'. (R = AndL2 (v).N' x) ∧ y=u ∧ N'[x\<turnstile>n>y] = N)" using a apply(nominal_induct R avoiding: y u v x N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) apply(rule_tac x="[(name1,v)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) apply(rule_tac x="[(name1,v)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma nrename_AndL2_aux: assumes a: "R[x\<turnstile>n>y] = AndL2 (v).N u" shows "(x=u ∧ x=y) ∨ (x≠u)" using a apply(nominal_induct R avoiding: y u v x N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) done lemma nrename_AndR: assumes a: "R[x\<turnstile>n>y] = AndR <c>.M <d>.N e" "c\<sharp>(d,e,N,R)" "d\<sharp>(c,e,M,R)" shows "∃M' N'. R = AndR <c>.M' <d>.N' e ∧ M'[x\<turnstile>n>y] = M ∧ N'[x\<turnstile>n>y] = N ∧ c\<sharp>N' ∧ d\<sharp>M'" using a apply(nominal_induct R avoiding: x y c d e M N rule: trm.strong_induct) apply(auto split: if_splits simp add: trm.inject alpha) apply(simp add: fresh_atm fresh_prod) apply(rule_tac x="[(coname1,c)]•trm1" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(rule_tac x="[(coname1,c)]•trm1" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(rule_tac x="[(coname2,d)]•trm2" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) apply(drule_tac s="trm2[x\<turnstile>n>y]" in sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) done lemma nrename_OrR1: assumes a: "R[x\<turnstile>n>y] = OrR1 <c>.N d" "c\<sharp>(R,d)" shows "∃N'. (R = OrR1 <c>.N' d) ∧ N'[x\<turnstile>n>y] = N" using a apply(nominal_induct R avoiding: x y c d N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) apply(rule_tac x="[(coname1,c)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) done lemma nrename_OrR2: assumes a: "R[x\<turnstile>n>y] = OrR2 <c>.N d" "c\<sharp>(R,d)" shows "∃N'. (R = OrR2 <c>.N' d) ∧ N'[x\<turnstile>n>y] = N" using a apply(nominal_induct R avoiding: x y c d N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) apply(rule_tac x="[(coname1,c)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) done lemma nrename_OrL: assumes a: "R[u\<turnstile>n>v] = OrL (x).M (y).N z" "x\<sharp>(y,z,u,v,N,R)" "y\<sharp>(x,z,u,v,M,R)" "z\<sharp>(u,v)" shows "∃M' N'. R = OrL (x).M' (y).N' z ∧ M'[u\<turnstile>n>v] = M ∧ N'[u\<turnstile>n>v] = N ∧ x\<sharp>N' ∧ y\<sharp>M'" using a apply(nominal_induct R avoiding: u v x y z M N rule: trm.strong_induct) apply(auto split: if_splits simp add: trm.inject alpha fresh_prod fresh_atm) apply(rule_tac x="[(name1,x)]•trm1" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(rule_tac x="[(name2,y)]•trm2" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) apply(drule_tac s="trm2[u\<turnstile>n>v]" in sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma nrename_OrL': assumes a: "R[x\<turnstile>n>y] = OrL (v).M (w).N u" "v\<sharp>(R,N,u,x,y)" "w\<sharp>(R,M,u,x,y)" "x≠y" shows "(∃M' N'. (R = OrL (v).M' (w).N' u) ∧ M'[x\<turnstile>n>y] = M ∧ N'[x\<turnstile>n>y] = N) ∨ (∃M' N'. (R = OrL (v).M' (w).N' x) ∧ y=u ∧ M'[x\<turnstile>n>y] = M ∧ N'[x\<turnstile>n>y] = N)" using a apply(nominal_induct R avoiding: y x u v w M N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) apply(rule_tac x="[(name1,v)]•trm1" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(rule_tac x="[(name2,w)]•trm2" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(rule conjI) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) apply(drule_tac s="trm2[x\<turnstile>n>u]" in sym) apply(drule_tac pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) apply(rule_tac x="[(name1,v)]•trm1" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(rule_tac x="[(name2,w)]•trm2" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(rule conjI) apply(drule sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) apply(drule_tac s="trm2[x\<turnstile>n>y]" in sym) apply(drule_tac pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma nrename_OrL_aux: assumes a: "R[x\<turnstile>n>y] = OrL (v).M (w).N u" shows "(x=u ∧ x=y) ∨ (x≠u)" using a apply(nominal_induct R avoiding: y x w u v M N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) done lemma nrename_ImpL: assumes a: "R[x\<turnstile>n>y] = ImpL <c>.M (u).N z" "c\<sharp>(N,R)" "u\<sharp>(y,x,z,M,R)" "z\<sharp>(x,y)" shows "∃M' N'. R = ImpL <c>.M' (u).N' z ∧ M'[x\<turnstile>n>y] = M ∧ N'[x\<turnstile>n>y] = N ∧ c\<sharp>N' ∧ u\<sharp>M'" using a apply(nominal_induct R avoiding: u x c y z M N rule: trm.strong_induct) apply(auto split: if_splits simp add: trm.inject alpha fresh_prod fresh_atm) apply(rule_tac x="[(coname,c)]•trm1" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(rule_tac x="[(name1,u)]•trm2" in exI) apply(perm_simp) apply(auto simp add: abs_fresh fresh_left calc_atm fresh_prod fresh_atm)[1] apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) apply(drule_tac s="trm2[x\<turnstile>n>y]" in sym) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm fresh_prod fresh_atm) done lemma nrename_ImpL': assumes a: "R[x\<turnstile>n>y] = ImpL <c>.M (w).N u" "c\<sharp>(R,N)" "w\<sharp>(R,M,u,x,y)" "x≠y" shows "(∃M' N'. (R = ImpL <c>.M' (w).N' u) ∧ M'[x\<turnstile>n>y] = M ∧ N'[x\<turnstile>n>y] = N) ∨ (∃M' N'. (R = ImpL <c>.M' (w).N' x) ∧ y=u ∧ M'[x\<turnstile>n>y] = M ∧ N'[x\<turnstile>n>y] = N)" using a apply(nominal_induct R avoiding: y x u c w M N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_fresh alpha trm.inject) apply(rule_tac x="[(coname,c)]•trm1" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(rule_tac x="[(name1,w)]•trm2" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(rule conjI) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) apply(drule_tac s="trm2[x\<turnstile>n>u]" in sym) apply(drule_tac pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) apply(rule_tac x="[(coname,c)]•trm1" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(rule_tac x="[(name1,w)]•trm2" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(rule conjI) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(simp add: eqvts calc_atm) apply(drule_tac s="trm2[x\<turnstile>n>y]" in sym) apply(drule_tac pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma nrename_ImpL_aux: assumes a: "R[x\<turnstile>n>y] = ImpL <c>.M (w).N u" shows "(x=u ∧ x=y) ∨ (x≠u)" using a apply(nominal_induct R avoiding: y x w u c M N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm alpha abs_fresh trm.inject) done lemma nrename_ImpR: assumes a: "R[u\<turnstile>n>v] = ImpR (x).<c>.N d" "c\<sharp>(R,d)" "x\<sharp>(R,u,v)" shows "∃N'. (R = ImpR (x).<c>.N' d) ∧ N'[u\<turnstile>n>v] = N" using a apply(nominal_induct R avoiding: u v x c d N rule: trm.strong_induct) apply(auto split: if_splits simp add: fresh_prod fresh_atm abs_perm alpha abs_fresh trm.inject) apply(rule_tac x="[(name,x)]•trm" in exI) apply(perm_simp) apply(simp add: abs_fresh fresh_left calc_atm fresh_prod) apply(simp add: calc_atm) apply(rule_tac x="[(name,x)]•[(coname1, c)]•trm" in exI) apply(perm_simp) apply(simp add: abs_supp fin_supp abs_fresh fresh_left calc_atm fresh_prod) apply(drule sym) apply(drule pt_bij1[OF pt_coname_inst,OF at_coname_inst]) apply(drule pt_bij1[OF pt_name_inst,OF at_name_inst]) apply(simp add: eqvts calc_atm) done lemma nrename_credu: assumes a: "(M[x\<turnstile>n>y]) -->c M'" shows "∃M0. M0[x\<turnstile>n>y]=M' ∧ M -->c M0" using a apply(nominal_induct M≡"M[x\<turnstile>n>y]" M' avoiding: M x y rule: c_redu.strong_induct) apply(drule sym) apply(drule nrename_Cut) apply(simp) apply(simp) apply(auto) apply(rule_tac x="M'{a:=(x).N'}" in exI) apply(rule conjI) apply(simp add: fresh_atm abs_fresh subst_comm fresh_prod) apply(rule c_redu.intros) apply(auto dest: not_fic_nrename)[1] apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(drule sym) apply(drule nrename_Cut) apply(simp) apply(simp) apply(auto) apply(rule_tac x="N'{x:=<a>.M'}" in exI) apply(rule conjI) apply(simp add: fresh_atm abs_fresh subst_comm fresh_prod) apply(rule c_redu.intros) apply(auto) apply(drule_tac x="xa" and y="y" in fin_nrename) apply(auto simp add: fresh_prod abs_fresh) done lemma nrename_ax2: assumes a: "N[x\<turnstile>n>y] = Ax z c" shows "∃z. N = Ax z c" using a apply(nominal_induct N avoiding: x y rule: trm.strong_induct) apply(auto split: if_splits) apply(simp add: trm.inject) done lemma fic_nrename: assumes a: "fic (M[x\<turnstile>n>y]) c" shows "fic M c" using a apply(nominal_induct M avoiding: c x y rule: trm.strong_induct) apply(auto dest!: fic_elims intro!: fic.intros simp add: fresh_prod fresh_atm rename_fresh abs_fresh split: if_splits) apply(auto dest: nrename_fresh_interesting2 simp add: fresh_prod fresh_atm) done lemma nrename_lredu: assumes a: "(M[x\<turnstile>n>y]) -->l M'" shows "∃M0. M0[x\<turnstile>n>y]=M' ∧ M -->l M0" using a apply(nominal_induct M≡"M[x\<turnstile>n>y]" M' avoiding: M x y rule: l_redu.strong_induct) apply(drule sym) apply(drule nrename_Cut) apply(simp add: fresh_prod fresh_atm) apply(simp) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(case_tac "xa=y") apply(simp add: nrename_id) apply(rule l_redu.intros) apply(simp) apply(simp add: fresh_atm) apply(assumption) apply(frule nrename_ax2) apply(auto)[1] apply(case_tac "z=xa") apply(simp add: trm.inject) apply(simp) apply(rule_tac x="M'[a\<turnstile>c>b]" in exI) apply(rule conjI) apply(rule crename_interesting3) apply(rule l_redu.intros) apply(simp) apply(simp add: fresh_atm) apply(auto dest: fic_nrename simp add: fresh_prod fresh_atm)[1] apply(drule sym) apply(drule nrename_Cut) apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_prod fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(case_tac "xa=ya") apply(simp add: nrename_id) apply(rule l_redu.intros) apply(simp) apply(simp add: fresh_atm) apply(assumption) apply(frule nrename_ax2) apply(auto)[1] apply(case_tac "z=xa") apply(simp add: trm.inject) apply(rule_tac x="N'[x\<turnstile>n>xa]" in exI) apply(rule conjI) apply(rule nrename_interesting1) apply(auto)[1] apply(rule l_redu.intros) apply(simp) apply(simp add: fresh_atm) apply(auto dest: fin_nrename2 simp add: fresh_prod fresh_atm)[1] apply(simp add: trm.inject) apply(rule_tac x="N'[x\<turnstile>n>y]" in exI) apply(rule conjI) apply(rule nrename_interesting2) apply(simp_all) apply(rule l_redu.intros) apply(simp) apply(simp add: fresh_atm) apply(auto dest: fin_nrename2 simp add: fresh_prod fresh_atm)[1] (* LNot *) apply(drule sym) apply(drule nrename_Cut) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(drule nrename_NotR) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(drule nrename_NotL) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(rule_tac x="Cut <b>.N'b (x).N'a" in exI) apply(simp add: fresh_atm)[1] apply(rule l_redu.intros) apply(auto simp add: fresh_prod fresh_atm intro: nrename_fresh_interesting1)[1] apply(auto simp add: fresh_atm fresh_prod intro: nrename_fresh_interesting1)[1] apply(auto simp add: fresh_atm fresh_prod intro: nrename_fresh_interesting2)[1] apply(auto simp add: fresh_atm fresh_prod intro: nrename_fresh_interesting2)[1] apply(simp add: fresh_atm) apply(simp add: fresh_atm) (* LAnd1 *) apply(auto dest: fin_crename simp add: fresh_prod fresh_atm)[1] apply(drule sym) apply(drule nrename_Cut) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto)[1] apply(drule nrename_AndR) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(drule nrename_AndL1) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(rule_tac x="Cut <a1>.M'a (x).N'b" in exI) apply(simp add: fresh_atm)[1] apply(rule l_redu.intros) apply(auto simp add: fresh_atm abs_fresh fresh_prod intro: nrename_fresh_interesting2)[1] apply(auto simp add: abs_fresh fresh_atm fresh_prod intro: nrename_fresh_interesting1)[1] apply(auto simp add: fresh_atm fresh_prod intro: nrename_fresh_interesting1)[1] apply(auto simp add: fresh_atm fresh_prod intro: nrename_fresh_interesting1)[1] apply(auto simp add: fresh_atm fresh_prod intro: nrename_fresh_interesting1)[1] apply(simp add: fresh_atm) (* LAnd2 *) apply(auto dest: fin_crename simp add: fresh_prod fresh_atm)[1] apply(drule sym) apply(drule nrename_Cut) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto)[1] apply(drule nrename_AndR) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(drule nrename_AndL2) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(rule_tac x="Cut <a2>.N'a (x).N'b" in exI) apply(simp add: fresh_atm)[1] apply(rule l_redu.intros) apply(auto simp add: fresh_atm abs_fresh fresh_prod intro: nrename_fresh_interesting2)[1] apply(auto simp add: abs_fresh fresh_atm fresh_prod intro: nrename_fresh_interesting1)[1] apply(auto simp add: fresh_atm fresh_prod intro: nrename_fresh_interesting1)[1] apply(auto simp add: fresh_atm fresh_prod intro: nrename_fresh_interesting1)[1] apply(auto simp add: fresh_atm fresh_prod intro: nrename_fresh_interesting1)[1] apply(simp add: fresh_atm) (* LOr1 *) apply(auto dest: fin_crename simp add: fresh_prod fresh_atm)[1] apply(drule sym) apply(drule nrename_Cut) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto)[1] apply(drule nrename_OrL) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(drule nrename_OrR1) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(rule_tac x="Cut <a>.N' (x1).M'a" in exI) apply(rule conjI) apply(simp add: abs_fresh fresh_atm)[1] apply(rule l_redu.intros) apply(auto simp add: fresh_atm abs_fresh fresh_prod intro: nrename_fresh_interesting2)[1] apply(auto simp add: abs_fresh fresh_atm fresh_prod intro: nrename_fresh_interesting1)[1] apply(auto simp add: abs_fresh fresh_atm fresh_prod intro: nrename_fresh_interesting1)[1] apply(auto simp add: abs_fresh fresh_atm fresh_prod intro: nrename_fresh_interesting1)[1] apply(simp add: fresh_atm) apply(simp add: fresh_atm) (* LOr2 *) apply(auto dest: fin_crename simp add: fresh_prod fresh_atm)[1] apply(drule sym) apply(drule nrename_Cut) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto)[1] apply(drule nrename_OrL) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(drule nrename_OrR2) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(rule_tac x="Cut <a>.N' (x2).N'a" in exI) apply(rule conjI) apply(simp add: abs_fresh fresh_atm)[1] apply(rule l_redu.intros) apply(auto simp add: fresh_atm abs_fresh fresh_prod intro: nrename_fresh_interesting2)[1] apply(auto simp add: abs_fresh fresh_atm fresh_prod intro: nrename_fresh_interesting1)[1] apply(auto simp add: abs_fresh fresh_atm fresh_prod intro: nrename_fresh_interesting1)[1] apply(auto simp add: abs_fresh fresh_atm fresh_prod intro: nrename_fresh_interesting1)[1] apply(simp add: fresh_atm) apply(simp add: fresh_atm) (* ImpL *) apply(auto dest: fin_crename simp add: fresh_prod fresh_atm)[1] apply(drule sym) apply(drule nrename_Cut) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm abs_supp fin_supp) apply(auto)[1] apply(drule nrename_ImpL) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(drule nrename_ImpR) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(simp add: fresh_prod abs_fresh fresh_atm) apply(auto simp add: abs_fresh fresh_prod fresh_atm)[1] apply(rule_tac x="Cut <a>.(Cut <c>.M'a (x).N') (y).N'a" in exI) apply(rule conjI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(rule l_redu.intros) apply(auto simp add: fresh_atm abs_fresh abs_supp fin_supp fresh_prod intro: nrename_fresh_interesting1)[1] apply(auto simp add: abs_fresh fresh_atm abs_supp fin_supp fresh_prod intro: nrename_fresh_interesting2)[1] apply(auto simp add: abs_fresh fresh_atm abs_supp fin_supp fresh_prod intro: nrename_fresh_interesting1)[1] apply(auto simp add: abs_fresh fresh_atm abs_supp fin_supp fresh_prod intro: nrename_fresh_interesting2)[1] apply(auto simp add: abs_fresh fresh_atm abs_supp fin_supp fresh_prod intro: nrename_fresh_interesting2)[1] apply(auto simp add: abs_fresh fresh_atm abs_supp fin_supp fresh_prod intro: nrename_fresh_interesting2)[1] done lemma nrename_aredu: assumes a: "(M[x\<turnstile>n>y]) -->a M'" "x≠y" shows "∃M0. M0[x\<turnstile>n>y]=M' ∧ M -->a M0" using a apply(nominal_induct M≡"M[x\<turnstile>n>y]" M' avoiding: M x y rule: a_redu.strong_induct) apply(simp) apply(drule nrename_lredu) apply(blast) apply(simp) apply(drule nrename_credu) apply(blast) (* Cut *) apply(drule sym) apply(drule nrename_Cut) apply(simp) apply(simp) apply(auto)[1] apply(drule_tac x="M'a" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(auto)[1] apply(rule_tac x="Cut <a>.M0 (x).N'" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(rule conjI) apply(rule trans) apply(rule nrename.simps) apply(drule nrename_fresh_interesting2) apply(simp add: fresh_a_redu) apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(drule nrename_fresh_interesting1) apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_a_redu) apply(simp) apply(auto)[1] apply(drule sym) apply(drule nrename_Cut) apply(simp) apply(simp) apply(auto)[1] apply(drule_tac x="N'a" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(auto)[1] apply(rule_tac x="Cut <a>.M' (x).M0" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(rule conjI) apply(rule trans) apply(rule nrename.simps) apply(simp add: fresh_a_redu) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm fresh_prod)[1] apply(simp) apply(auto)[1] (* NotL *) apply(drule sym) apply(frule nrename_NotL_aux) apply(erule disjE) apply(auto)[1] apply(drule nrename_NotL') apply(simp) apply(simp add: fresh_atm) apply(erule disjE) apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(auto)[1] apply(rule_tac x="NotL <a>.M0 x" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="x" in meta_spec) apply(auto)[1] apply(rule_tac x="NotL <a>.M0 xa" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] (* NotR *) apply(drule sym) apply(drule nrename_NotR) apply(simp) apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(auto)[1] apply(rule_tac x="NotR (x).M0 a" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] (* AndR *) apply(drule sym) apply(drule nrename_AndR) apply(simp) apply(auto simp add: fresh_atm fresh_prod)[1] apply(auto simp add: fresh_atm fresh_prod)[1] apply(auto)[1] apply(drule_tac x="M'a" in meta_spec) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(auto)[1] apply(rule_tac x="AndR <a>.M0 <b>.N' c" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule nrename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm fresh_prod)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp) apply(drule sym) apply(drule nrename_AndR) apply(simp) apply(auto simp add: fresh_atm fresh_prod)[1] apply(auto simp add: fresh_atm fresh_prod)[1] apply(auto)[1] apply(drule_tac x="N'a" in meta_spec) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(auto)[1] apply(rule_tac x="AndR <a>.M' <b>.M0 c" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule nrename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm fresh_prod)[1] apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp) apply(simp) (* AndL1 *) apply(drule sym) apply(frule nrename_AndL1_aux) apply(erule disjE) apply(auto)[1] apply(drule nrename_AndL1') apply(simp) apply(simp add: fresh_atm) apply(erule disjE) apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="ya" in meta_spec) apply(auto)[1] apply(rule_tac x="AndL1 (x).M0 y" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(auto)[1] apply(rule_tac x="AndL1 (x).M0 xa" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] (* AndL2 *) apply(drule sym) apply(frule nrename_AndL2_aux) apply(erule disjE) apply(auto)[1] apply(drule nrename_AndL2') apply(simp) apply(simp add: fresh_atm) apply(erule disjE) apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="ya" in meta_spec) apply(auto)[1] apply(rule_tac x="AndL2 (x).M0 y" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(auto)[1] apply(rule_tac x="AndL2 (x).M0 xa" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] (* OrL *) apply(drule sym) apply(frule nrename_OrL_aux) apply(erule disjE) apply(auto)[1] apply(drule nrename_OrL') apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_atm) apply(simp add: fresh_atm) apply(erule disjE) apply(auto)[1] apply(drule_tac x="M'a" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="ya" in meta_spec) apply(auto)[1] apply(rule_tac x="OrL (x).M0 (y).N' z" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule nrename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(drule_tac x="M'a" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="z" in meta_spec) apply(auto)[1] apply(rule_tac x="OrL (x).M0 (y).N' xa" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule nrename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(drule sym) apply(frule nrename_OrL_aux) apply(erule disjE) apply(auto)[1] apply(drule nrename_OrL') apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_atm) apply(simp add: fresh_atm) apply(erule disjE) apply(auto)[1] apply(drule_tac x="N'a" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="ya" in meta_spec) apply(auto)[1] apply(rule_tac x="OrL (x).M' (y).M0 z" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule nrename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm fresh_prod)[1] apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(drule_tac x="N'a" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="z" in meta_spec) apply(auto)[1] apply(rule_tac x="OrL (x).M' (y).M0 xa" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule nrename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm fresh_prod)[1] apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp) apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] (* OrR1 *) apply(drule sym) apply(drule nrename_OrR1) apply(simp) apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(auto)[1] apply(rule_tac x="OrR1 <a>.M0 b" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] (* OrR2 *) apply(drule sym) apply(drule nrename_OrR2) apply(simp) apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="x" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(auto)[1] apply(rule_tac x="OrR2 <a>.M0 b" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] (* ImpL *) apply(drule sym) apply(frule nrename_ImpL_aux) apply(erule disjE) apply(auto)[1] apply(drule nrename_ImpL') apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_atm) apply(simp add: fresh_atm) apply(erule disjE) apply(auto)[1] apply(drule_tac x="M'a" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="ya" in meta_spec) apply(auto)[1] apply(rule_tac x="ImpL <a>.M0 (x).N' y" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule nrename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(drule_tac x="M'a" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(auto)[1] apply(rule_tac x="ImpL <a>.M0 (x).N' xa" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule nrename.simps) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(drule sym) apply(frule nrename_ImpL_aux) apply(erule disjE) apply(auto)[1] apply(drule nrename_ImpL') apply(simp add: fresh_prod fresh_atm) apply(simp add: fresh_atm) apply(simp add: fresh_atm) apply(erule disjE) apply(auto)[1] apply(drule_tac x="N'a" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="ya" in meta_spec) apply(auto)[1] apply(rule_tac x="ImpL <a>.M' (x).M0 y" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule nrename.simps) apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(drule_tac x="N'a" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(auto)[1] apply(rule_tac x="ImpL <a>.M' (x).M0 xa" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] apply(rule trans) apply(rule nrename.simps) apply(auto intro: fresh_a_redu)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] apply(simp add: fresh_prod abs_fresh abs_supp fin_supp fresh_atm)[1] (* ImpR *) apply(drule sym) apply(drule nrename_ImpR) apply(simp) apply(simp) apply(auto)[1] apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="xa" in meta_spec) apply(drule_tac x="y" in meta_spec) apply(auto)[1] apply(rule_tac x="ImpR (x).<a>.M0 b" in exI) apply(simp add: abs_fresh abs_supp fin_supp fresh_atm)[1] apply(auto)[1] done lemma SNa_preserved_renaming2: assumes a: "SNa N" shows "SNa (N[x\<turnstile>n>y])" using a apply(induct rule: SNa_induct) apply(case_tac "x=y") apply(simp add: nrename_id) apply(rule SNaI) apply(drule nrename_aredu) apply(blast)+ done text {* helper-stuff to set up the induction *} abbreviation SNa_set :: "trm set" where "SNa_set ≡ {M. SNa M}" abbreviation A_Redu_set :: "(trm×trm) set" where "A_Redu_set ≡ {(N,M)| M N. M -->a N}" lemma SNa_elim: assumes a: "SNa M" shows "(∀M. (∀N. M -->a N --> P N)--> P M) --> P M" using a by (induct rule: SNa.induct) (blast) lemma wf_SNa_restricted: shows "wf (A_Redu_set ∩ (UNIV <*> SNa_set))" apply(unfold wf_def) apply(intro strip) apply(case_tac "SNa x") apply(simp (no_asm_use)) apply(drule_tac P="P" in SNa_elim) apply(erule mp) apply(blast) (* other case *) apply(drule_tac x="x" in spec) apply(erule mp) apply(fast) done constdefs SNa_Redu :: "(trm × trm) set" "SNa_Redu ≡ A_Redu_set ∩ (UNIV <*> SNa_set)" lemma wf_SNa_Redu: shows "wf SNa_Redu" apply(unfold SNa_Redu_def) apply(rule wf_SNa_restricted) done lemma wf_measure_triple: shows "wf ((measure size) <*lex*> SNa_Redu <*lex*> SNa_Redu)" by (auto intro: wf_SNa_Redu) lemma my_wf_induct_triple: assumes a: " wf(r1 <*lex*> r2 <*lex*> r3)" and b: "!!x. [|!!y. ((fst y,fst (snd y),snd (snd y)),(fst x,fst (snd x), snd (snd x))) ∈ (r1 <*lex*> r2 <*lex*> r3) --> P y|] ==> P x" shows "P x" using a apply(induct x rule: wf_induct_rule) apply(rule b) apply(simp) done lemma my_wf_induct_triple': assumes a: " wf(r1 <*lex*> r2 <*lex*> r3)" and b: "!!x1 x2 x3. [|!!y1 y2 y3. ((y1,y2,y3),(x1,x2,x3)) ∈ (r1 <*lex*> r2 <*lex*> r3) --> P (y1,y2,y3)|] ==> P (x1,x2,x3)" shows "P (x1,x2,x3)" apply(rule_tac my_wf_induct_triple[OF a]) apply(case_tac x) apply(simp) apply(case_tac b) apply(simp) apply(rule b) apply(blast) done lemma my_wf_induct_triple'': assumes a: " wf(r1 <*lex*> r2 <*lex*> r3)" and b: "!!x1 x2 x3. [|!!y1 y2 y3. ((y1,y2,y3),(x1,x2,x3)) ∈ (r1 <*lex*> r2 <*lex*> r3) --> P y1 y2 y3|] ==> P x1 x2 x3" shows "P x1 x2 x3" apply(rule_tac my_wf_induct_triple'[where P="λ(x1,x2,x3). P x1 x2 x3", simplified]) apply(rule a) apply(rule b) apply(auto) done lemma excluded_m: assumes a: "<a>:M ∈ (\<parallel><B>\<parallel>)" "(x):N ∈ (\<parallel>(B)\<parallel>)" shows "(<a>:M ∈ BINDINGc B (\<parallel>(B)\<parallel>) ∨ (x):N ∈ BINDINGn B (\<parallel><B>\<parallel>)) ∨¬(<a>:M ∈ BINDINGc B (\<parallel>(B)\<parallel>) ∨ (x):N ∈ BINDINGn B (\<parallel><B>\<parallel>))" by (blast) lemma tricky_subst: assumes a1: "b\<sharp>(c,N)" and a2: "z\<sharp>(x,P)" and a3: "M≠Ax z b" shows "(Cut <c>.N (z).M){b:=(x).P} = Cut <c>.N (z).(M{b:=(x).P})" using a1 a2 a3 apply - apply(generate_fresh "coname") apply(subgoal_tac "Cut <c>.N (z).M = Cut <ca>.([(ca,c)]•N) (z).M") apply(simp) apply(rule trans) apply(rule better_Cut_substc) apply(simp) apply(simp add: abs_fresh) apply(simp) apply(subgoal_tac "b\<sharp>([(ca,c)]•N)") apply(simp add: forget) apply(simp add: trm.inject) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(simp add: trm.inject) apply(rule sym) apply(simp add: alpha fresh_prod fresh_atm) done text {* 3rd lemma *} lemma CUT_SNa_aux: assumes a1: "<a>:M ∈ (\<parallel><B>\<parallel>)" and a2: "SNa M" and a3: "(x):N ∈ (\<parallel>(B)\<parallel>)" and a4: "SNa N" shows "SNa (Cut <a>.M (x).N)" using a1 a2 a3 a4 apply(induct B M N arbitrary: a x rule: my_wf_induct_triple''[OF wf_measure_triple]) apply(rule SNaI) apply(drule Cut_a_redu_elim) apply(erule disjE) (* left-inner reduction *) apply(erule exE) apply(erule conjE)+ apply(simp) apply(drule_tac x="x1" in meta_spec) apply(drule_tac x="M'a" in meta_spec) apply(drule_tac x="x3" in meta_spec) apply(drule conjunct2) apply(drule mp) apply(rule conjI) apply(simp) apply(rule disjI1) apply(simp add: SNa_Redu_def) apply(drule_tac x="a" in spec) apply(drule mp) apply(simp add: CANDs_preserved_single) apply(drule mp) apply(simp add: a_preserves_SNa) apply(drule_tac x="x" in spec) apply(simp) apply(erule disjE) (* right-inner reduction *) apply(erule exE) apply(erule conjE)+ apply(simp) apply(drule_tac x="x1" in meta_spec) apply(drule_tac x="x2" in meta_spec) apply(drule_tac x="N'" in meta_spec) apply(drule conjunct2) apply(drule mp) apply(rule conjI) apply(simp) apply(rule disjI2) apply(simp add: SNa_Redu_def) apply(drule_tac x="a" in spec) apply(drule mp) apply(simp add: CANDs_preserved_single) apply(drule mp) apply(assumption) apply(drule_tac x="x" in spec) apply(drule mp) apply(simp add: CANDs_preserved_single) apply(drule mp) apply(simp add: a_preserves_SNa) apply(assumption) apply(erule disjE) (******** c-reduction *********) apply(drule Cut_c_redu_elim) (* c-left reduction*) apply(erule disjE) apply(erule conjE) apply(frule_tac B="x1" in fic_CANDS) apply(simp) apply(erule disjE) (* in AXIOMSc *) apply(simp add: AXIOMSc_def) apply(erule exE)+ apply(simp add: ctrm.inject) apply(simp add: alpha) apply(erule disjE) apply(simp) apply(rule impI) apply(simp) apply(subgoal_tac "fic (Ax y b) b")(*A*) apply(simp) (*A*) apply(auto)[1] apply(simp) apply(rule impI) apply(simp) apply(subgoal_tac "fic (Ax ([(a,aa)]•y) a) a")(*B*) apply(simp) (*B*) apply(auto)[1] (* in BINDINGc *) apply(simp) apply(drule BINDINGc_elim) apply(simp) (* c-right reduction*) apply(erule conjE) apply(frule_tac B="x1" in fin_CANDS) apply(simp) apply(erule disjE) (* in AXIOMSc *) apply(simp add: AXIOMSn_def) apply(erule exE)+ apply(simp add: ntrm.inject) apply(simp add: alpha) apply(erule disjE) apply(simp) apply(rule impI) apply(simp) apply(subgoal_tac "fin (Ax xa b) xa")(*A*) apply(simp) (*A*) apply(auto)[1] apply(simp) apply(rule impI) apply(simp) apply(subgoal_tac "fin (Ax x ([(x,xa)]•b)) x")(*B*) apply(simp) (*B*) apply(auto)[1] (* in BINDINGc *) apply(simp) apply(drule BINDINGn_elim) apply(simp) (*********** l-reductions ************) apply(drule Cut_l_redu_elim) apply(erule disjE) (* ax1 *) apply(erule exE) apply(simp) apply(simp add: SNa_preserved_renaming1) apply(erule disjE) (* ax2 *) apply(erule exE) apply(simp add: SNa_preserved_renaming2) apply(erule disjE) (* LNot *) apply(erule exE)+ apply(auto)[1] apply(frule_tac excluded_m) apply(assumption) apply(erule disjE) (* one of them in BINDING *) apply(erule disjE) apply(drule fin_elims) apply(drule fic_elims) apply(simp) apply(drule BINDINGc_elim) apply(drule_tac x="x" in spec) apply(drule_tac x="NotL <b>.N' x" in spec) apply(simp) apply(simp add: better_NotR_substc) apply(generate_fresh "coname") apply(subgoal_tac "fresh_fun (λa'. Cut <a'>.NotR (y).M'a a' (x).NotL <b>.N' x) = Cut <c>.NotR (y).M'a c (x).NotL <b>.N' x") apply(simp) apply(subgoal_tac "Cut <c>.NotR (y).M'a c (x).NotL <b>.N' x -->a Cut <b>.N' (y).M'a") apply(simp only: a_preserves_SNa) apply(rule al_redu) apply(rule better_LNot_intro) apply(simp) apply(simp) apply(fresh_fun_simp (no_asm)) apply(simp) (* other case of in BINDING *) apply(drule fin_elims) apply(drule fic_elims) apply(simp) apply(drule BINDINGn_elim) apply(drule_tac x="a" in spec) apply(drule_tac x="NotR (y).M'a a" in spec) apply(simp) apply(simp add: better_NotL_substn) apply(generate_fresh "name") apply(subgoal_tac "fresh_fun (λx'. Cut <a>.NotR (y).M'a a (x').NotL <b>.N' x') = Cut <a>.NotR (y).M'a a (c).NotL <b>.N' c") apply(simp) apply(subgoal_tac "Cut <a>.NotR (y).M'a a (c).NotL <b>.N' c -->a Cut <b>.N' (y).M'a") apply(simp only: a_preserves_SNa) apply(rule al_redu) apply(rule better_LNot_intro) apply(simp) apply(simp) apply(fresh_fun_simp (no_asm)) apply(simp) (* none of them in BINDING *) apply(simp) apply(erule conjE) apply(frule CAND_NotR_elim) apply(assumption) apply(erule exE) apply(frule CAND_NotL_elim) apply(assumption) apply(erule exE) apply(simp only: ty.inject) apply(drule_tac x="B'" in meta_spec) apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="M'a" in meta_spec) apply(erule conjE)+ apply(drule mp) apply(simp) apply(drule_tac x="b" in spec) apply(rotate_tac 13) apply(drule mp) apply(assumption) apply(rotate_tac 13) apply(drule mp) apply(simp add: CANDs_imply_SNa) apply(drule_tac x="y" in spec) apply(rotate_tac 13) apply(drule mp) apply(assumption) apply(rotate_tac 13) apply(drule mp) apply(simp add: CANDs_imply_SNa) apply(assumption) (* LAnd1 case *) apply(erule disjE) apply(erule exE)+ apply(auto)[1] apply(frule_tac excluded_m) apply(assumption) apply(erule disjE) (* one of them in BINDING *) apply(erule disjE) apply(drule fin_elims) apply(drule fic_elims) apply(simp) apply(drule BINDINGc_elim) apply(drule_tac x="x" in spec) apply(drule_tac x="AndL1 (y).N' x" in spec) apply(simp) apply(simp add: better_AndR_substc) apply(generate_fresh "coname") apply(subgoal_tac "fresh_fun (λa'. Cut <a'>.AndR <b>.M1 <c>.M2 a' (x).AndL1 (y).N' x) = Cut <ca>.AndR <b>.M1 <c>.M2 ca (x).AndL1 (y).N' x") apply(simp) apply(subgoal_tac "Cut <ca>.AndR <b>.M1 <c>.M2 ca (x).AndL1 (y).N' x -->a Cut <b>.M1 (y).N'") apply(auto intro: a_preserves_SNa)[1] apply(rule al_redu) apply(rule better_LAnd1_intro) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(simp) apply(fresh_fun_simp (no_asm)) apply(simp) (* other case of in BINDING *) apply(drule fin_elims) apply(drule fic_elims) apply(simp) apply(drule BINDINGn_elim) apply(drule_tac x="a" in spec) apply(drule_tac x="AndR <b>.M1 <c>.M2 a" in spec) apply(simp) apply(simp add: better_AndL1_substn) apply(generate_fresh "name") apply(subgoal_tac "fresh_fun (λz'. Cut <a>.AndR <b>.M1 <c>.M2 a (z').AndL1 (y).N' z') = Cut <a>.AndR <b>.M1 <c>.M2 a (ca).AndL1 (y).N' ca") apply(simp) apply(subgoal_tac "Cut <a>.AndR <b>.M1 <c>.M2 a (ca).AndL1 (y).N' ca -->a Cut <b>.M1 (y).N'") apply(auto intro: a_preserves_SNa)[1] apply(rule al_redu) apply(rule better_LAnd1_intro) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(fresh_fun_simp (no_asm)) apply(simp) (* none of them in BINDING *) apply(simp) apply(erule conjE) apply(frule CAND_AndR_elim) apply(assumption) apply(erule exE) apply(frule CAND_AndL1_elim) apply(assumption) apply(erule exE)+ apply(simp only: ty.inject) apply(drule_tac x="B1" in meta_spec) apply(drule_tac x="M1" in meta_spec) apply(drule_tac x="N'" in meta_spec) apply(erule conjE)+ apply(drule mp) apply(simp) apply(drule_tac x="b" in spec) apply(rotate_tac 14) apply(drule mp) apply(assumption) apply(rotate_tac 14) apply(drule mp) apply(simp add: CANDs_imply_SNa) apply(drule_tac x="y" in spec) apply(rotate_tac 15) apply(drule mp) apply(assumption) apply(rotate_tac 15) apply(drule mp) apply(simp add: CANDs_imply_SNa) apply(assumption) (* LAnd2 case *) apply(erule disjE) apply(erule exE)+ apply(auto)[1] apply(frule_tac excluded_m) apply(assumption) apply(erule disjE) (* one of them in BINDING *) apply(erule disjE) apply(drule fin_elims) apply(drule fic_elims) apply(simp) apply(drule BINDINGc_elim) apply(drule_tac x="x" in spec) apply(drule_tac x="AndL2 (y).N' x" in spec) apply(simp) apply(simp add: better_AndR_substc) apply(generate_fresh "coname") apply(subgoal_tac "fresh_fun (λa'. Cut <a'>.AndR <b>.M1 <c>.M2 a' (x).AndL2 (y).N' x) = Cut <ca>.AndR <b>.M1 <c>.M2 ca (x).AndL2 (y).N' x") apply(simp) apply(subgoal_tac "Cut <ca>.AndR <b>.M1 <c>.M2 ca (x).AndL2 (y).N' x -->a Cut <c>.M2 (y).N'") apply(auto intro: a_preserves_SNa)[1] apply(rule al_redu) apply(rule better_LAnd2_intro) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(simp) apply(fresh_fun_simp (no_asm)) apply(simp) (* other case of in BINDING *) apply(drule fin_elims) apply(drule fic_elims) apply(simp) apply(drule BINDINGn_elim) apply(drule_tac x="a" in spec) apply(drule_tac x="AndR <b>.M1 <c>.M2 a" in spec) apply(simp) apply(simp add: better_AndL2_substn) apply(generate_fresh "name") apply(subgoal_tac "fresh_fun (λz'. Cut <a>.AndR <b>.M1 <c>.M2 a (z').AndL2 (y).N' z') = Cut <a>.AndR <b>.M1 <c>.M2 a (ca).AndL2 (y).N' ca") apply(simp) apply(subgoal_tac "Cut <a>.AndR <b>.M1 <c>.M2 a (ca).AndL2 (y).N' ca -->a Cut <c>.M2 (y).N'") apply(auto intro: a_preserves_SNa)[1] apply(rule al_redu) apply(rule better_LAnd2_intro) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(fresh_fun_simp (no_asm)) apply(simp) (* none of them in BINDING *) apply(simp) apply(erule conjE) apply(frule CAND_AndR_elim) apply(assumption) apply(erule exE) apply(frule CAND_AndL2_elim) apply(assumption) apply(erule exE)+ apply(simp only: ty.inject) apply(drule_tac x="B2" in meta_spec) apply(drule_tac x="M2" in meta_spec) apply(drule_tac x="N'" in meta_spec) apply(erule conjE)+ apply(drule mp) apply(simp) apply(drule_tac x="c" in spec) apply(rotate_tac 14) apply(drule mp) apply(assumption) apply(rotate_tac 14) apply(drule mp) apply(simp add: CANDs_imply_SNa) apply(drule_tac x="y" in spec) apply(rotate_tac 15) apply(drule mp) apply(assumption) apply(rotate_tac 15) apply(drule mp) apply(simp add: CANDs_imply_SNa) apply(assumption) (* LOr1 case *) apply(erule disjE) apply(erule exE)+ apply(auto)[1] apply(frule_tac excluded_m) apply(assumption) apply(erule disjE) (* one of them in BINDING *) apply(erule disjE) apply(drule fin_elims) apply(drule fic_elims) apply(simp) apply(drule BINDINGc_elim) apply(drule_tac x="x" in spec) apply(drule_tac x="OrL (z).M1 (y).M2 x" in spec) apply(simp) apply(simp add: better_OrR1_substc) apply(generate_fresh "coname") apply(subgoal_tac "fresh_fun (λa'. Cut <a'>.OrR1 <b>.N' a' (x).OrL (z).M1 (y).M2 x) = Cut <c>.OrR1 <b>.N' c (x).OrL (z).M1 (y).M2 x") apply(simp) apply(subgoal_tac "Cut <c>.OrR1 <b>.N' c (x).OrL (z).M1 (y).M2 x -->a Cut <b>.N' (z).M1") apply(auto intro: a_preserves_SNa)[1] apply(rule al_redu) apply(rule better_LOr1_intro) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(simp add: abs_fresh) apply(fresh_fun_simp (no_asm)) apply(simp) (* other case of in BINDING *) apply(drule fin_elims) apply(drule fic_elims) apply(simp) apply(drule BINDINGn_elim) apply(drule_tac x="a" in spec) apply(drule_tac x="OrR1 <b>.N' a" in spec) apply(simp) apply(simp add: better_OrL_substn) apply(generate_fresh "name") apply(subgoal_tac "fresh_fun (λz'. Cut <a>.OrR1 <b>.N' a (z').OrL (z).M1 (y).M2 z') = Cut <a>.OrR1 <b>.N' a (c).OrL (z).M1 (y).M2 c") apply(simp) apply(subgoal_tac "Cut <a>.OrR1 <b>.N' a (c).OrL (z).M1 (y).M2 c -->a Cut <b>.N' (z).M1") apply(auto intro: a_preserves_SNa)[1] apply(rule al_redu) apply(rule better_LOr1_intro) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(fresh_fun_simp (no_asm)) apply(simp) (* none of them in BINDING *) apply(simp) apply(erule conjE) apply(frule CAND_OrR1_elim) apply(assumption) apply(erule exE)+ apply(frule CAND_OrL_elim) apply(assumption) apply(erule exE)+ apply(simp only: ty.inject) apply(drule_tac x="B1" in meta_spec) apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="M1" in meta_spec) apply(erule conjE)+ apply(drule mp) apply(simp) apply(drule_tac x="b" in spec) apply(rotate_tac 15) apply(drule mp) apply(assumption) apply(rotate_tac 15) apply(drule mp) apply(simp add: CANDs_imply_SNa) apply(drule_tac x="z" in spec) apply(rotate_tac 15) apply(drule mp) apply(assumption) apply(rotate_tac 15) apply(drule mp) apply(simp add: CANDs_imply_SNa) apply(assumption) (* LOr2 case *) apply(erule disjE) apply(erule exE)+ apply(auto)[1] apply(frule_tac excluded_m) apply(assumption) apply(erule disjE) (* one of them in BINDING *) apply(erule disjE) apply(drule fin_elims) apply(drule fic_elims) apply(simp) apply(drule BINDINGc_elim) apply(drule_tac x="x" in spec) apply(drule_tac x="OrL (z).M1 (y).M2 x" in spec) apply(simp) apply(simp add: better_OrR2_substc) apply(generate_fresh "coname") apply(subgoal_tac "fresh_fun (λa'. Cut <a'>.OrR2 <b>.N' a' (x).OrL (z).M1 (y).M2 x) = Cut <c>.OrR2 <b>.N' c (x).OrL (z).M1 (y).M2 x") apply(simp) apply(subgoal_tac "Cut <c>.OrR2 <b>.N' c (x).OrL (z).M1 (y).M2 x -->a Cut <b>.N' (y).M2") apply(auto intro: a_preserves_SNa)[1] apply(rule al_redu) apply(rule better_LOr2_intro) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(simp add: abs_fresh) apply(fresh_fun_simp (no_asm)) apply(simp) (* other case of in BINDING *) apply(drule fin_elims) apply(drule fic_elims) apply(simp) apply(drule BINDINGn_elim) apply(drule_tac x="a" in spec) apply(drule_tac x="OrR2 <b>.N' a" in spec) apply(simp) apply(simp add: better_OrL_substn) apply(generate_fresh "name") apply(subgoal_tac "fresh_fun (λz'. Cut <a>.OrR2 <b>.N' a (z').OrL (z).M1 (y).M2 z') = Cut <a>.OrR2 <b>.N' a (c).OrL (z).M1 (y).M2 c") apply(simp) apply(subgoal_tac "Cut <a>.OrR2 <b>.N' a (c).OrL (z).M1 (y).M2 c -->a Cut <b>.N' (y).M2") apply(auto intro: a_preserves_SNa)[1] apply(rule al_redu) apply(rule better_LOr2_intro) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(fresh_fun_simp (no_asm)) apply(simp) (* none of them in BINDING *) apply(simp) apply(erule conjE) apply(frule CAND_OrR2_elim) apply(assumption) apply(erule exE)+ apply(frule CAND_OrL_elim) apply(assumption) apply(erule exE)+ apply(simp only: ty.inject) apply(drule_tac x="B2" in meta_spec) apply(drule_tac x="N'" in meta_spec) apply(drule_tac x="M2" in meta_spec) apply(erule conjE)+ apply(drule mp) apply(simp) apply(drule_tac x="b" in spec) apply(rotate_tac 15) apply(drule mp) apply(assumption) apply(rotate_tac 15) apply(drule mp) apply(simp add: CANDs_imply_SNa) apply(drule_tac x="y" in spec) apply(rotate_tac 15) apply(drule mp) apply(assumption) apply(rotate_tac 15) apply(drule mp) apply(simp add: CANDs_imply_SNa) apply(assumption) (* LImp case *) apply(erule exE)+ apply(auto)[1] apply(frule_tac excluded_m) apply(assumption) apply(erule disjE) (* one of them in BINDING *) apply(erule disjE) apply(drule fin_elims) apply(drule fic_elims) apply(simp) apply(drule BINDINGc_elim) apply(drule_tac x="x" in spec) apply(drule_tac x="ImpL <c>.N1 (y).N2 x" in spec) apply(simp) apply(simp add: better_ImpR_substc) apply(generate_fresh "coname") apply(subgoal_tac "fresh_fun (λa'. Cut <a'>.ImpR (z).<b>.M'a a' (x).ImpL <c>.N1 (y).N2 x) = Cut <ca>.ImpR (z).<b>.M'a ca (x).ImpL <c>.N1 (y).N2 x") apply(simp) apply(subgoal_tac "Cut <ca>.ImpR (z).<b>.M'a ca (x).ImpL <c>.N1 (y).N2 x -->a Cut <b>.Cut <c>.N1 (z).M'a (y).N2") apply(auto intro: a_preserves_SNa)[1] apply(rule al_redu) apply(rule better_LImp_intro) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(simp add: abs_fresh) apply(simp) apply(fresh_fun_simp (no_asm)) apply(simp) (* other case of in BINDING *) apply(drule fin_elims) apply(drule fic_elims) apply(simp) apply(drule BINDINGn_elim) apply(drule_tac x="a" in spec) apply(drule_tac x="ImpR (z).<b>.M'a a" in spec) apply(simp) apply(simp add: better_ImpL_substn) apply(generate_fresh "name") apply(subgoal_tac "fresh_fun (λz'. Cut <a>.ImpR (z).<b>.M'a a (z').ImpL <c>.N1 (y).N2 z') = Cut <a>.ImpR (z).<b>.M'a a (ca).ImpL <c>.N1 (y).N2 ca") apply(simp) apply(subgoal_tac "Cut <a>.ImpR (z).<b>.M'a a (ca).ImpL <c>.N1 (y).N2 ca -->a Cut <b>.Cut <c>.N1 (z).M'a (y).N2") apply(auto intro: a_preserves_SNa)[1] apply(rule al_redu) apply(rule better_LImp_intro) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(simp) apply(fresh_fun_simp (no_asm)) apply(simp add: abs_fresh abs_supp fin_supp) apply(simp add: abs_fresh abs_supp fin_supp) apply(simp) (* none of them in BINDING *) apply(erule conjE) apply(frule CAND_ImpL_elim) apply(assumption) apply(erule exE)+ apply(frule CAND_ImpR_elim) (* check here *) apply(assumption) apply(erule exE)+ apply(erule conjE)+ apply(simp only: ty.inject) apply(erule conjE)+ apply(case_tac "M'a=Ax z b") (* case Ma = Ax z b *) apply(rule_tac t="Cut <b>.(Cut <c>.N1 (z).M'a) (y).N2" and s="Cut <b>.(M'a{z:=<c>.N1}) (y).N2" in subst) apply(simp) apply(drule_tac x="c" in spec) apply(drule_tac x="N1" in spec) apply(drule mp) apply(simp) apply(drule_tac x="B2" in meta_spec) apply(drule_tac x="M'a{z:=<c>.N1}" in meta_spec) apply(drule_tac x="N2" in meta_spec) apply(drule conjunct1) apply(drule mp) apply(simp) apply(rotate_tac 17) apply(drule_tac x="b" in spec) apply(drule mp) apply(assumption) apply(drule mp) apply(simp add: CANDs_imply_SNa) apply(rotate_tac 17) apply(drule_tac x="y" in spec) apply(drule mp) apply(assumption) apply(drule mp) apply(simp add: CANDs_imply_SNa) apply(assumption) (* case Ma ≠ Ax z b *) apply(subgoal_tac "<b>:Cut <c>.N1 (z).M'a ∈ \<parallel><B2>\<parallel>") (* lemma *) apply(frule_tac meta_spec) apply(drule_tac x="B2" in meta_spec) apply(drule_tac x="Cut <c>.N1 (z).M'a" in meta_spec) apply(drule_tac x="N2" in meta_spec) apply(erule conjE)+ apply(drule mp) apply(simp) apply(rotate_tac 20) apply(drule_tac x="b" in spec) apply(rotate_tac 20) apply(drule mp) apply(assumption) apply(rotate_tac 20) apply(drule mp) apply(simp add: CANDs_imply_SNa) apply(rotate_tac 20) apply(drule_tac x="y" in spec) apply(rotate_tac 20) apply(drule mp) apply(assumption) apply(rotate_tac 20) apply(drule mp) apply(simp add: CANDs_imply_SNa) apply(assumption) (* lemma *) apply(subgoal_tac "<b>:Cut <c>.N1 (z).M'a ∈ BINDINGc B2 (\<parallel>(B2)\<parallel>)") (* second lemma *) apply(simp add: BINDING_implies_CAND) (* second lemma *) apply(simp (no_asm) add: BINDINGc_def) apply(rule exI)+ apply(rule conjI) apply(rule refl) apply(rule allI)+ apply(rule impI) apply(generate_fresh "name") apply(rule_tac t="Cut <c>.N1 (z).M'a" and s="Cut <c>.N1 (ca).([(ca,z)]•M'a)" in subst) apply(simp add: trm.inject alpha fresh_prod fresh_atm) apply(rule_tac t="(Cut <c>.N1 (ca).([(ca,z)]•M'a)){b:=(xa).P}" and s="Cut <c>.N1 (ca).(([(ca,z)]•M'a){b:=(xa).P})" in subst) apply(rule sym) apply(rule tricky_subst) apply(simp) apply(simp) apply(clarify) apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm) apply(drule_tac x="B1" in meta_spec) apply(drule_tac x="N1" in meta_spec) apply(drule_tac x="([(ca,z)]•M'a){b:=(xa).P}" in meta_spec) apply(drule conjunct1) apply(drule mp) apply(simp) apply(rotate_tac 19) apply(drule_tac x="c" in spec) apply(drule mp) apply(assumption) apply(drule mp) apply(simp add: CANDs_imply_SNa) apply(rotate_tac 19) apply(drule_tac x="ca" in spec) apply(subgoal_tac "(ca):([(ca,z)]•M'a){b:=(xa).P} ∈ \<parallel>(B1)\<parallel>")(*A*) apply(drule mp) apply(assumption) apply(drule mp) apply(simp add: CANDs_imply_SNa) apply(assumption) (*A*) apply(drule_tac x="[(ca,z)]•xa" in spec) apply(drule_tac x="[(ca,z)]•P" in spec) apply(rotate_tac 19) apply(simp add: fresh_prod fresh_left) apply(drule mp) apply(rule conjI) apply(auto simp add: calc_atm)[1] apply(rule conjI) apply(auto simp add: calc_atm)[1] apply(drule_tac pi="[(ca,z)]" and x="(xa):P" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name) apply(drule_tac pi="[(ca,z)]" and X="\<parallel>(B1)\<parallel>" in pt_set_bij2[OF pt_name_inst, OF at_name_inst]) apply(simp add: CAND_eqvt_name csubst_eqvt) apply(perm_simp) apply(simp add: calc_atm) done (* parallel substitution *) lemma CUT_SNa: assumes a1: "<a>:M ∈ (\<parallel><B>\<parallel>)" and a2: "(x):N ∈ (\<parallel>(B)\<parallel>)" shows "SNa (Cut <a>.M (x).N)" using a1 a2 apply - apply(rule CUT_SNa_aux[OF a1]) apply(simp_all add: CANDs_imply_SNa) done fun findn :: "(name×coname×trm) list=>name=>(coname×trm) option" where "findn [] x = None" | "findn ((y,c,P)#ϑn) x = (if y=x then Some (c,P) else findn ϑn x)" lemma findn_eqvt[eqvt]: fixes pi1::"name prm" and pi2::"coname prm" shows "(pi1•findn ϑn x) = findn (pi1•ϑn) (pi1•x)" and "(pi2•findn ϑn x) = findn (pi2•ϑn) (pi2•x)" apply(induct ϑn) apply(auto simp add: perm_bij) done lemma findn_fresh: assumes a: "x\<sharp>ϑn" shows "findn ϑn x = None" using a apply(induct ϑn) apply(auto simp add: fresh_list_cons fresh_atm fresh_prod) done fun findc :: "(coname×name×trm) list=>coname=>(name×trm) option" where "findc [] x = None" | "findc ((c,y,P)#ϑc) a = (if a=c then Some (y,P) else findc ϑc a)" lemma findc_eqvt[eqvt]: fixes pi1::"name prm" and pi2::"coname prm" shows "(pi1•findc ϑc a) = findc (pi1•ϑc) (pi1•a)" and "(pi2•findc ϑc a) = findc (pi2•ϑc) (pi2•a)" apply(induct ϑc) apply(auto simp add: perm_bij) done lemma findc_fresh: assumes a: "a\<sharp>ϑc" shows "findc ϑc a = None" using a apply(induct ϑc) apply(auto simp add: fresh_list_cons fresh_atm fresh_prod) done abbreviation nmaps :: "(name×coname×trm) list => name => (coname×trm) option => bool" ("_ nmaps _ to _" [55,55,55] 55) where "ϑn nmaps x to P ≡ (findn ϑn x) = P" abbreviation cmaps :: "(coname×name×trm) list => coname => (name×trm) option => bool" ("_ cmaps _ to _" [55,55,55] 55) where "ϑc cmaps a to P ≡ (findc ϑc a) = P" lemma nmaps_fresh: shows "ϑn nmaps x to Some (c,P) ==> a\<sharp>ϑn ==> a\<sharp>(c,P)" apply(induct ϑn) apply(auto simp add: fresh_list_cons fresh_prod fresh_atm) apply(case_tac "aa=x") apply(auto) apply(case_tac "aa=x") apply(auto) done lemma cmaps_fresh: shows "ϑc cmaps a to Some (y,P) ==> x\<sharp>ϑc ==> x\<sharp>(y,P)" apply(induct ϑc) apply(auto simp add: fresh_list_cons fresh_prod fresh_atm) apply(case_tac "a=aa") apply(auto) apply(case_tac "a=aa") apply(auto) done lemma nmaps_false: shows "ϑn nmaps x to Some (c,P) ==> x\<sharp>ϑn ==> False" apply(induct ϑn) apply(auto simp add: fresh_list_cons fresh_prod fresh_atm) done lemma cmaps_false: shows "ϑc cmaps c to Some (x,P) ==> c\<sharp>ϑc ==> False" apply(induct ϑc) apply(auto simp add: fresh_list_cons fresh_prod fresh_atm) done fun lookupa :: "name=>coname=>(coname×name×trm) list=>trm" where "lookupa x a [] = Ax x a" | "lookupa x a ((c,y,P)#ϑc) = (if a=c then Cut <a>.Ax x a (y).P else lookupa x a ϑc)" lemma lookupa_eqvt[eqvt]: fixes pi1::"name prm" and pi2::"coname prm" shows "(pi1•(lookupa x a ϑc)) = lookupa (pi1•x) (pi1•a) (pi1•ϑc)" and "(pi2•(lookupa x a ϑc)) = lookupa (pi2•x) (pi2•a) (pi2•ϑc)" apply - apply(induct ϑc) apply(auto simp add: eqvts) apply(induct ϑc) apply(auto simp add: eqvts) done lemma lookupa_fire: assumes a: "ϑc cmaps a to Some (y,P)" shows "(lookupa x a ϑc) = Cut <a>.Ax x a (y).P" using a apply(induct ϑc arbitrary: x a y P) apply(auto) done fun lookupb :: "name=>coname=>(coname×name×trm) list=>coname=>trm=>trm" where "lookupb x a [] c P = Cut <c>.P (x).Ax x a" | "lookupb x a ((d,y,N)#ϑc) c P = (if a=d then Cut <c>.P (y).N else lookupb x a ϑc c P)" lemma lookupb_eqvt[eqvt]: fixes pi1::"name prm" and pi2::"coname prm" shows "(pi1•(lookupb x a ϑc c P)) = lookupb (pi1•x) (pi1•a) (pi1•ϑc) (pi1•c) (pi1•P)" and "(pi2•(lookupb x a ϑc c P)) = lookupb (pi2•x) (pi2•a) (pi2•ϑc) (pi2•c) (pi2•P)" apply - apply(induct ϑc) apply(auto simp add: eqvts) apply(induct ϑc) apply(auto simp add: eqvts) done fun lookup :: "name=>coname=>(name×coname×trm) list=>(coname×name×trm) list=>trm" where "lookup x a [] ϑc = lookupa x a ϑc" | "lookup x a ((y,c,P)#ϑn) ϑc = (if x=y then (lookupb x a ϑc c P) else lookup x a ϑn ϑc)" lemma lookup_eqvt[eqvt]: fixes pi1::"name prm" and pi2::"coname prm" shows "(pi1•(lookup x a ϑn ϑc)) = lookup (pi1•x) (pi1•a) (pi1•ϑn) (pi1•ϑc)" and "(pi2•(lookup x a ϑn ϑc)) = lookup (pi2•x) (pi2•a) (pi2•ϑn) (pi2•ϑc)" apply - apply(induct ϑn) apply(auto simp add: eqvts) apply(induct ϑn) apply(auto simp add: eqvts) done fun lookupc :: "name=>coname=>(name×coname×trm) list=>trm" where "lookupc x a [] = Ax x a" | "lookupc x a ((y,c,P)#ϑn) = (if x=y then P[c\<turnstile>c>a] else lookupc x a ϑn)" lemma lookupc_eqvt[eqvt]: fixes pi1::"name prm" and pi2::"coname prm" shows "(pi1•(lookupc x a ϑn)) = lookupc (pi1•x) (pi1•a) (pi1•ϑn)" and "(pi2•(lookupc x a ϑn)) = lookupc (pi2•x) (pi2•a) (pi2•ϑn)" apply - apply(induct ϑn) apply(auto simp add: eqvts) apply(induct ϑn) apply(auto simp add: eqvts) done fun lookupd :: "name=>coname=>(coname×name×trm) list=>trm" where "lookupd x a [] = Ax x a" | "lookupd x a ((c,y,P)#ϑc) = (if a=c then P[y\<turnstile>n>x] else lookupd x a ϑc)" lemma lookupd_eqvt[eqvt]: fixes pi1::"name prm" and pi2::"coname prm" shows "(pi1•(lookupd x a ϑn)) = lookupd (pi1•x) (pi1•a) (pi1•ϑn)" and "(pi2•(lookupd x a ϑn)) = lookupd (pi2•x) (pi2•a) (pi2•ϑn)" apply - apply(induct ϑn) apply(auto simp add: eqvts) apply(induct ϑn) apply(auto simp add: eqvts) done lemma lookupa_fresh: assumes a: "a\<sharp>ϑc" shows "lookupa y a ϑc = Ax y a" using a apply(induct ϑc) apply(auto simp add: fresh_prod fresh_list_cons fresh_atm) done lemma lookupa_csubst: assumes a: "a\<sharp>ϑc" shows "Cut <a>.Ax y a (x).P = (lookupa y a ϑc){a:=(x).P}" using a by (simp add: lookupa_fresh) lemma lookupa_freshness: fixes a::"coname" and x::"name" shows "a\<sharp>(ϑc,c) ==> a\<sharp>lookupa y c ϑc" and "x\<sharp>(ϑc,y) ==> x\<sharp>lookupa y c ϑc" apply(induct ϑc) apply(auto simp add: fresh_prod fresh_list_cons abs_fresh fresh_atm) done lemma lookupa_unicity: assumes a: "lookupa x a ϑc= Ax y b" "b\<sharp>ϑc" "y\<sharp>ϑc" shows "x=y ∧ a=b" using a apply(induct ϑc) apply(auto simp add: trm.inject fresh_list_cons fresh_prod fresh_atm) apply(case_tac "a=aa") apply(auto) apply(case_tac "a=aa") apply(auto) done lemma lookupb_csubst: assumes a: "a\<sharp>(ϑc,c,N)" shows "Cut <c>.N (x).P = (lookupb y a ϑc c N){a:=(x).P}" using a apply(induct ϑc) apply(auto simp add: fresh_list_cons fresh_atm fresh_prod) apply(rule sym) apply(generate_fresh "name") apply(generate_fresh "coname") apply(subgoal_tac "Cut <c>.N (y).Ax y a = Cut <caa>.([(caa,c)]•N) (ca).Ax ca a") apply(simp) apply(rule trans) apply(rule better_Cut_substc) apply(simp) apply(simp add: abs_fresh) apply(simp) apply(subgoal_tac "a\<sharp>([(caa,c)]•N)") apply(simp add: forget) apply(simp add: trm.inject) apply(simp add: fresh_left calc_atm fresh_prod fresh_atm) apply(simp add: trm.inject) apply(rule conjI) apply(rule sym) apply(simp add: alpha fresh_prod fresh_atm) apply(simp add: alpha calc_atm fresh_prod fresh_atm) done lemma lookupb_freshness: fixes a::"coname" and x::"name" shows "a\<sharp>(ϑc,c,b,P) ==> a\<sharp>lookupb y c ϑc b P" and "x\<sharp>(ϑc,y,P) ==> x\<sharp>lookupb y c ϑc b P" apply(induct ϑc) apply(auto simp add: fresh_prod fresh_list_cons abs_fresh fresh_atm) done lemma lookupb_unicity: assumes a: "lookupb x a ϑc c P = Ax y b" "b\<sharp>(ϑc,c,P)" "y\<sharp>ϑc" shows "x=y ∧ a=b" using a apply(induct ϑc) apply(auto simp add: fresh_list_cons fresh_prod fresh_atm) apply(case_tac "a=aa") apply(auto) apply(case_tac "a=aa") apply(auto) done lemma lookupb_lookupa: assumes a: "x\<sharp>ϑc" shows "lookupb x c ϑc a P = (lookupa x c ϑc){x:=<a>.P}" using a apply(induct ϑc) apply(auto simp add: fresh_list_cons fresh_prod) apply(generate_fresh "coname") apply(generate_fresh "name") apply(subgoal_tac "Cut <c>.Ax x c (aa).b = Cut <ca>.Ax x ca (caa).([(caa,aa)]•b)") apply(simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp) apply(simp) apply(subgoal_tac "x\<sharp>([(caa,aa)]•b)") apply(simp add: forget) apply(simp add: trm.inject) apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] apply(simp add: trm.inject) apply(rule conjI) apply(simp add: alpha calc_atm fresh_atm fresh_prod) apply(rule sym) apply(simp add: alpha calc_atm fresh_atm fresh_prod) done lemma lookup_csubst: assumes a: "a\<sharp>(ϑn,ϑc)" shows "lookup y c ϑn ((a,x,P)#ϑc) = (lookup y c ϑn ϑc){a:=(x).P}" using a apply(induct ϑn) apply(auto simp add: fresh_prod fresh_list_cons) apply(simp add: lookupa_csubst) apply(simp add: lookupa_freshness forget fresh_atm fresh_prod) apply(rule lookupb_csubst) apply(simp) apply(auto simp add: lookupb_freshness forget fresh_atm fresh_prod) done lemma lookup_fresh: assumes a: "x\<sharp>(ϑn,ϑc)" shows "lookup x c ϑn ϑc = lookupa x c ϑc" using a apply(induct ϑn) apply(auto simp add: fresh_prod fresh_list_cons fresh_atm) done lemma lookup_unicity: assumes a: "lookup x a ϑn ϑc= Ax y b" "b\<sharp>(ϑc,ϑn)" "y\<sharp>(ϑc,ϑn)" shows "x=y ∧ a=b" using a apply(induct ϑn) apply(auto simp add: trm.inject fresh_list_cons fresh_prod fresh_atm) apply(drule lookupa_unicity) apply(simp)+ apply(drule lookupa_unicity) apply(simp)+ apply(case_tac "x=aa") apply(auto) apply(drule lookupb_unicity) apply(simp add: fresh_atm) apply(simp) apply(simp) apply(case_tac "x=aa") apply(auto) apply(drule lookupb_unicity) apply(simp add: fresh_atm) apply(simp) apply(simp) done lemma lookup_freshness: fixes a::"coname" and x::"name" shows "a\<sharp>(c,ϑc,ϑn) ==> a\<sharp>lookup y c ϑn ϑc" and "x\<sharp>(y,ϑc,ϑn) ==> x\<sharp>lookup y c ϑn ϑc" apply(induct ϑn) apply(auto simp add: fresh_prod fresh_list_cons abs_fresh fresh_atm) apply(simp add: fresh_atm fresh_prod lookupa_freshness) apply(simp add: fresh_atm fresh_prod lookupa_freshness) apply(simp add: fresh_atm fresh_prod lookupb_freshness) apply(simp add: fresh_atm fresh_prod lookupb_freshness) done lemma lookupc_freshness: fixes a::"coname" and x::"name" shows "a\<sharp>(ϑc,c) ==> a\<sharp>lookupc y c ϑc" and "x\<sharp>(ϑc,y) ==> x\<sharp>lookupc y c ϑc" apply(induct ϑc) apply(auto simp add: fresh_prod fresh_list_cons abs_fresh fresh_atm) apply(rule rename_fresh) apply(simp add: fresh_atm) apply(rule rename_fresh) apply(simp add: fresh_atm) done lemma lookupc_fresh: assumes a: "y\<sharp>ϑn" shows "lookupc y a ϑn = Ax y a" using a apply(induct ϑn) apply(auto simp add: fresh_prod fresh_list_cons fresh_atm) done lemma lookupc_nmaps: assumes a: "ϑn nmaps x to Some (c,P)" shows "lookupc x a ϑn = P[c\<turnstile>c>a]" using a apply(induct ϑn) apply(auto) done lemma lookupc_unicity: assumes a: "lookupc y a ϑn = Ax x b" "x\<sharp>ϑn" shows "y=x" using a apply(induct ϑn) apply(auto simp add: trm.inject fresh_list_cons fresh_prod) apply(case_tac "y=aa") apply(auto) apply(subgoal_tac "x\<sharp>(ba[aa\<turnstile>c>a])") apply(simp add: fresh_atm) apply(rule rename_fresh) apply(simp) done lemma lookupd_fresh: assumes a: "a\<sharp>ϑc" shows "lookupd y a ϑc = Ax y a" using a apply(induct ϑc) apply(auto simp add: fresh_prod fresh_list_cons fresh_atm) done lemma lookupd_unicity: assumes a: "lookupd y a ϑc = Ax y b" "b\<sharp>ϑc" shows "a=b" using a apply(induct ϑc) apply(auto simp add: trm.inject fresh_list_cons fresh_prod) apply(case_tac "a=aa") apply(auto) apply(subgoal_tac "b\<sharp>(ba[aa\<turnstile>n>y])") apply(simp add: fresh_atm) apply(rule rename_fresh) apply(simp) done lemma lookupd_freshness: fixes a::"coname" and x::"name" shows "a\<sharp>(ϑc,c) ==> a\<sharp>lookupd y c ϑc" and "x\<sharp>(ϑc,y) ==> x\<sharp>lookupd y c ϑc" apply(induct ϑc) apply(auto simp add: fresh_prod fresh_list_cons abs_fresh fresh_atm) apply(rule rename_fresh) apply(simp add: fresh_atm) apply(rule rename_fresh) apply(simp add: fresh_atm) done lemma lookupd_cmaps: assumes a: "ϑc cmaps a to Some (x,P)" shows "lookupd y a ϑc = P[x\<turnstile>n>y]" using a apply(induct ϑc) apply(auto) done consts stn :: "trm=>(name×coname×trm) list=>trm" stc :: "trm=>(coname×name×trm) list=>trm" nominal_primrec (freshness_context: "ϑn::(name×coname×trm)") "stn (Ax x a) ϑn = lookupc x a ϑn" "[|a\<sharp>(N,ϑn);x\<sharp>(M,ϑn)|] ==> stn (Cut <a>.M (x).N) ϑn = (Cut <a>.M (x).N)" "x\<sharp>ϑn ==> stn (NotR (x).M a) ϑn = (NotR (x).M a)" "a\<sharp>ϑn ==>stn (NotL <a>.M x) ϑn = (NotL <a>.M x)" "[|a\<sharp>(N,d,b,ϑn);b\<sharp>(M,d,a,ϑn)|] ==> stn (AndR <a>.M <b>.N d) ϑn = (AndR <a>.M <b>.N d)" "x\<sharp>(z,ϑn) ==> stn (AndL1 (x).M z) ϑn = (AndL1 (x).M z)" "x\<sharp>(z,ϑn) ==> stn (AndL2 (x).M z) ϑn = (AndL2 (x).M z)" "a\<sharp>(b,ϑn) ==> stn (OrR1 <a>.M b) ϑn = (OrR1 <a>.M b)" "a\<sharp>(b,ϑn) ==> stn (OrR2 <a>.M b) ϑn = (OrR2 <a>.M b)" "[|x\<sharp>(N,z,u,ϑn);u\<sharp>(M,z,x,ϑn)|] ==> stn (OrL (x).M (u).N z) ϑn = (OrL (x).M (u).N z)" "[|a\<sharp>(b,ϑn);x\<sharp>ϑn|] ==> stn (ImpR (x).<a>.M b) ϑn = (ImpR (x).<a>.M b)" "[|a\<sharp>(N,ϑn);x\<sharp>(M,z,ϑn)|] ==> stn (ImpL <a>.M (x).N z) ϑn = (ImpL <a>.M (x).N z)" apply(finite_guess)+ apply(rule TrueI)+ apply(simp add: abs_fresh abs_supp fin_supp)+ apply(fresh_guess)+ done nominal_primrec (freshness_context: "ϑc::(coname×name×trm)") "stc (Ax x a) ϑc = lookupd x a ϑc" "[|a\<sharp>(N,ϑc);x\<sharp>(M,ϑc)|] ==> stc (Cut <a>.M (x).N) ϑc = (Cut <a>.M (x).N)" "x\<sharp>ϑc ==> stc (NotR (x).M a) ϑc = (NotR (x).M a)" "a\<sharp>ϑc ==> stc (NotL <a>.M x) ϑc = (NotL <a>.M x)" "[|a\<sharp>(N,d,b,ϑc);b\<sharp>(M,d,a,ϑc)|] ==> stc (AndR <a>.M <b>.N d) ϑc = (AndR <a>.M <b>.N d)" "x\<sharp>(z,ϑc) ==> stc (AndL1 (x).M z) ϑc = (AndL1 (x).M z)" "x\<sharp>(z,ϑc) ==> stc (AndL2 (x).M z) ϑc = (AndL2 (x).M z)" "a\<sharp>(b,ϑc) ==> stc (OrR1 <a>.M b) ϑc = (OrR1 <a>.M b)" "a\<sharp>(b,ϑc) ==> stc (OrR2 <a>.M b) ϑc = (OrR2 <a>.M b)" "[|x\<sharp>(N,z,u,ϑc);u\<sharp>(M,z,x,ϑc)|] ==> stc (OrL (x).M (u).N z) ϑc = (OrL (x).M (u).N z)" "[|a\<sharp>(b,ϑc);x\<sharp>ϑc|] ==> stc (ImpR (x).<a>.M b) ϑc = (ImpR (x).<a>.M b)" "[|a\<sharp>(N,ϑc);x\<sharp>(M,z,ϑc)|] ==> stc (ImpL <a>.M (x).N z) ϑc = (ImpL <a>.M (x).N z)" apply(finite_guess)+ apply(rule TrueI)+ apply(simp add: abs_fresh abs_supp fin_supp)+ apply(fresh_guess)+ done lemma stn_eqvt[eqvt]: fixes pi1::"name prm" and pi2::"coname prm" shows "(pi1•(stn M ϑn)) = stn (pi1•M) (pi1•ϑn)" and "(pi2•(stn M ϑn)) = stn (pi2•M) (pi2•ϑn)" apply - apply(nominal_induct M avoiding: ϑn rule: trm.strong_induct) apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm) apply(nominal_induct M avoiding: ϑn rule: trm.strong_induct) apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm) done lemma stc_eqvt[eqvt]: fixes pi1::"name prm" and pi2::"coname prm" shows "(pi1•(stc M ϑc)) = stc (pi1•M) (pi1•ϑc)" and "(pi2•(stc M ϑc)) = stc (pi2•M) (pi2•ϑc)" apply - apply(nominal_induct M avoiding: ϑc rule: trm.strong_induct) apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm) apply(nominal_induct M avoiding: ϑc rule: trm.strong_induct) apply(auto simp add: eqvts fresh_bij fresh_prod eq_bij fresh_atm) done lemma stn_fresh: fixes a::"coname" and x::"name" shows "a\<sharp>(ϑn,M) ==> a\<sharp>stn M ϑn" and "x\<sharp>(ϑn,M) ==> x\<sharp>stn M ϑn" apply(nominal_induct M avoiding: ϑn a x rule: trm.strong_induct) apply(auto simp add: abs_fresh fresh_prod fresh_atm) apply(rule lookupc_freshness) apply(simp add: fresh_atm) apply(rule lookupc_freshness) apply(simp add: fresh_atm) done lemma stc_fresh: fixes a::"coname" and x::"name" shows "a\<sharp>(ϑc,M) ==> a\<sharp>stc M ϑc" and "x\<sharp>(ϑc,M) ==> x\<sharp>stc M ϑc" apply(nominal_induct M avoiding: ϑc a x rule: trm.strong_induct) apply(auto simp add: abs_fresh fresh_prod fresh_atm) apply(rule lookupd_freshness) apply(simp add: fresh_atm) apply(rule lookupd_freshness) apply(simp add: fresh_atm) done lemma option_case_eqvt1[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" and B::"(name×trm) option" and r::"trm" shows "(pi1•(case B of Some (x,P) => s x P | None => r)) = (case (pi1•B) of Some (x,P) => (pi1•s) x P | None => (pi1•r))" and "(pi2•(case B of Some (x,P) => s x P| None => r)) = (case (pi2•B) of Some (x,P) => (pi2•s) x P | None => (pi2•r))" apply(cases "B") apply(auto) apply(perm_simp) apply(cases "B") apply(auto) apply(perm_simp) done lemma option_case_eqvt2[eqvt_force]: fixes pi1::"name prm" and pi2::"coname prm" and B::"(coname×trm) option" and r::"trm" shows "(pi1•(case B of Some (x,P) => s x P | None => r)) = (case (pi1•B) of Some (x,P) => (pi1•s) x P | None => (pi1•r))" and "(pi2•(case B of Some (x,P) => s x P| None => r)) = (case (pi2•B) of Some (x,P) => (pi2•s) x P | None => (pi2•r))" apply(cases "B") apply(auto) apply(perm_simp) apply(cases "B") apply(auto) apply(perm_simp) done consts psubst :: "(name×coname×trm) list=>(coname×name×trm) list=>trm=>trm" ("_,_<_>" [100,100,100] 100) nominal_primrec (freshness_context: "(ϑn::(name×coname×trm) list,ϑc::(coname×name×trm) list)") "ϑn,ϑc<Ax x a> = lookup x a ϑn ϑc" "[|a\<sharp>(N,ϑn,ϑc);x\<sharp>(M,ϑn,ϑc)|] ==> ϑn,ϑc<Cut <a>.M (x).N> = Cut <a>.(if ∃x. M=Ax x a then stn M ϑn else ϑn,ϑc<M>) (x).(if ∃a. N=Ax x a then stc N ϑc else ϑn,ϑc<N>)" "x\<sharp>(ϑn,ϑc) ==> ϑn,ϑc<NotR (x).M a> = (case (findc ϑc a) of Some (u,P) => fresh_fun (λa'. Cut <a'>.NotR (x).(ϑn,ϑc<M>) a' (u).P) | None => NotR (x).(ϑn,ϑc<M>) a)" "a\<sharp>(ϑn,ϑc) ==> ϑn,ϑc<NotL <a>.M x> = (case (findn ϑn x) of Some (c,P) => fresh_fun (λx'. Cut <c>.P (x').(NotL <a>.(ϑn,ϑc<M>) x')) | None => NotL <a>.(ϑn,ϑc<M>) x)" "[|a\<sharp>(N,c,ϑn,ϑc);b\<sharp>(M,c,ϑn,ϑc);b≠a|] ==> (ϑn,ϑc<AndR <a>.M <b>.N c>) = (case (findc ϑc c) of Some (x,P) => fresh_fun (λa'. Cut <a'>.(AndR <a>.(ϑn,ϑc<M>) <b>.(ϑn,ϑc<N>) a') (x).P) | None => AndR <a>.(ϑn,ϑc<M>) <b>.(ϑn,ϑc<N>) c)" "x\<sharp>(z,ϑn,ϑc) ==> (ϑn,ϑc<AndL1 (x).M z>) = (case (findn ϑn z) of Some (c,P) => fresh_fun (λz'. Cut <c>.P (z').AndL1 (x).(ϑn,ϑc<M>) z') | None => AndL1 (x).(ϑn,ϑc<M>) z)" "x\<sharp>(z,ϑn,ϑc) ==> (ϑn,ϑc<AndL2 (x).M z>) = (case (findn ϑn z) of Some (c,P) => fresh_fun (λz'. Cut <c>.P (z').AndL2 (x).(ϑn,ϑc<M>) z') | None => AndL2 (x).(ϑn,ϑc<M>) z)" "[|x\<sharp>(N,z,ϑn,ϑc);u\<sharp>(M,z,ϑn,ϑc);x≠u|] ==> (ϑn,ϑc<OrL (x).M (u).N z>) = (case (findn ϑn z) of Some (c,P) => fresh_fun (λz'. Cut <c>.P (z').OrL (x).(ϑn,ϑc<M>) (u).(ϑn,ϑc<N>) z') | None => OrL (x).(ϑn,ϑc<M>) (u).(ϑn,ϑc<N>) z)" "a\<sharp>(b,ϑn,ϑc) ==> (ϑn,ϑc<OrR1 <a>.M b>) = (case (findc ϑc b) of Some (x,P) => fresh_fun (λa'. Cut <a'>.OrR1 <a>.(ϑn,ϑc<M>) a' (x).P) | None => OrR1 <a>.(ϑn,ϑc<M>) b)" "a\<sharp>(b,ϑn,ϑc) ==> (ϑn,ϑc<OrR2 <a>.M b>) = (case (findc ϑc b) of Some (x,P) => fresh_fun (λa'. Cut <a'>.OrR2 <a>.(ϑn,ϑc<M>) a' (x).P) | None => OrR2 <a>.(ϑn,ϑc<M>) b)" "[|a\<sharp>(b,ϑn,ϑc); x\<sharp>(ϑn,ϑc)|] ==> (ϑn,ϑc<ImpR (x).<a>.M b>) = (case (findc ϑc b) of Some (z,P) => fresh_fun (λa'. Cut <a'>.ImpR (x).<a>.(ϑn,ϑc<M>) a' (z).P) | None => ImpR (x).<a>.(ϑn,ϑc<M>) b)" "[|a\<sharp>(N,ϑn,ϑc); x\<sharp>(z,M,ϑn,ϑc)|] ==> (ϑn,ϑc<ImpL <a>.M (x).N z>) = (case (findn ϑn z) of Some (c,P) => fresh_fun (λz'. Cut <c>.P (z').ImpL <a>.(ϑn,ϑc<M>) (x).(ϑn,ϑc<N>) z') | None => ImpL <a>.(ϑn,ϑc<M>) (x).(ϑn,ϑc<N>) z)" apply(finite_guess)+ apply(rule TrueI)+ apply(simp add: abs_fresh stc_fresh) apply(simp add: abs_fresh stn_fresh) apply(case_tac "findc ϑc x3") apply(simp add: abs_fresh) apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp (no_asm)) apply(drule cmaps_fresh) apply(auto simp add: fresh_prod)[1] apply(simp add: abs_fresh fresh_prod fresh_atm) apply(case_tac "findn ϑn x3") apply(simp add: abs_fresh) apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp (no_asm)) apply(drule nmaps_fresh) apply(auto simp add: fresh_prod)[1] apply(simp add: abs_fresh fresh_prod fresh_atm) apply(case_tac "findc ϑc x5") apply(simp add: abs_fresh) apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp (no_asm)) apply(drule cmaps_fresh) apply(auto simp add: fresh_prod)[1] apply(simp add: abs_fresh fresh_prod fresh_atm) apply(case_tac "findc ϑc x5") apply(simp add: abs_fresh) apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp (no_asm)) apply(drule_tac x="x3" in cmaps_fresh) apply(auto simp add: fresh_prod)[1] apply(simp add: abs_fresh fresh_prod fresh_atm) apply(case_tac "findn ϑn x3") apply(simp add: abs_fresh) apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp (no_asm)) apply(drule nmaps_fresh) apply(auto simp add: fresh_prod)[1] apply(simp add: abs_fresh fresh_prod fresh_atm) apply(case_tac "findn ϑn x3") apply(simp add: abs_fresh) apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp (no_asm)) apply(drule nmaps_fresh) apply(auto simp add: fresh_prod)[1] apply(simp add: abs_fresh fresh_prod fresh_atm) apply(case_tac "findc ϑc x3") apply(simp add: abs_fresh) apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp (no_asm)) apply(drule cmaps_fresh) apply(auto simp add: fresh_prod)[1] apply(simp add: abs_fresh fresh_prod fresh_atm) apply(case_tac "findc ϑc x3") apply(simp add: abs_fresh) apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp (no_asm)) apply(drule cmaps_fresh) apply(auto simp add: fresh_prod)[1] apply(simp add: abs_fresh fresh_prod fresh_atm) apply(case_tac "findn ϑn x5") apply(simp add: abs_fresh) apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp (no_asm)) apply(drule nmaps_fresh) apply(auto simp add: fresh_prod)[1] apply(simp add: abs_fresh fresh_prod fresh_atm) apply(case_tac "findn ϑn x5") apply(simp add: abs_fresh) apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp (no_asm)) apply(drule_tac a="x3" in nmaps_fresh) apply(auto simp add: fresh_prod)[1] apply(simp add: abs_fresh fresh_prod fresh_atm) apply(case_tac "findc ϑc x4") apply(simp add: abs_fresh abs_supp fin_supp) apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp (no_asm)) apply(drule cmaps_fresh) apply(auto simp add: fresh_prod)[1] apply(simp add: abs_fresh fresh_prod fresh_atm abs_supp fin_supp) apply(case_tac "findc ϑc x4") apply(simp add: abs_fresh abs_supp fin_supp) apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp (no_asm)) apply(drule_tac x="x2" in cmaps_fresh) apply(auto simp add: fresh_prod)[1] apply(simp add: abs_fresh fresh_prod fresh_atm abs_supp fin_supp) apply(case_tac "findn ϑn x5") apply(simp add: abs_fresh) apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp (no_asm)) apply(drule nmaps_fresh) apply(auto simp add: fresh_prod)[1] apply(simp add: abs_fresh fresh_prod fresh_atm) apply(case_tac "findn ϑn x5") apply(simp add: abs_fresh) apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp (no_asm)) apply(drule_tac a="x3" in nmaps_fresh) apply(auto simp add: fresh_prod)[1] apply(simp add: abs_fresh fresh_prod fresh_atm) apply(fresh_guess)+ done lemma case_cong: assumes a: "B1=B2" "x1=x2" "y1=y2" shows "(case B1 of None => x1 | Some (x,P) => y1 x P) = (case B2 of None => x2 | Some (x,P) => y2 x P)" using a apply(auto) done lemma find_maps: shows "ϑc cmaps a to (findc ϑc a)" and "ϑn nmaps x to (findn ϑn x)" apply(auto) done lemma psubst_eqvt[eqvt]: fixes pi1::"name prm" and pi2::"coname prm" shows "pi1•(ϑn,ϑc<M>) = (pi1•ϑn),(pi1•ϑc)<(pi1•M)>" and "pi2•(ϑn,ϑc<M>) = (pi2•ϑn),(pi2•ϑc)<(pi2•M)>" apply(nominal_induct M avoiding: ϑn ϑc rule: trm.strong_induct) apply(auto simp add: eq_bij fresh_bij eqvts perm_pi_simp) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) apply(rule case_cong) apply(rule find_maps) apply(simp) apply(perm_simp add: eqvts) done lemma ax_psubst: assumes a: "ϑn,ϑc<M> = Ax x a" and b: "a\<sharp>(ϑn,ϑc)" "x\<sharp>(ϑn,ϑc)" shows "M = Ax x a" using a b apply(nominal_induct M avoiding: ϑn ϑc rule: trm.strong_induct) apply(auto) apply(drule lookup_unicity) apply(simp)+ apply(case_tac "findc ϑc coname") apply(simp) apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp) apply(case_tac "findn ϑn name") apply(simp) apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(simp) apply(case_tac "findc ϑc coname3") apply(simp) apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp) apply(case_tac "findn ϑn name2") apply(simp) apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(simp) apply(case_tac "findn ϑn name2") apply(simp) apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(simp) apply(case_tac "findc ϑc coname2") apply(simp) apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp) apply(case_tac "findc ϑc coname2") apply(simp) apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp) apply(case_tac "findn ϑn name3") apply(simp) apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(simp) apply(case_tac "findc ϑc coname2") apply(simp) apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp) apply(case_tac "findn ϑn name2") apply(simp) apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(simp) done lemma better_Cut_substc1: assumes a: "a\<sharp>(P,b)" "b\<sharp>N" shows "(Cut <a>.M (x).N){b:=(y).P} = Cut <a>.(M{b:=(y).P}) (x).N" using a apply - apply(generate_fresh "coname") apply(generate_fresh "name") apply(subgoal_tac "Cut <a>.M (x).N = Cut <c>.([(c,a)]•M) (ca).([(ca,x)]•N)") apply(simp) apply(rule trans) apply(rule better_Cut_substc) apply(simp) apply(simp add: abs_fresh) apply(auto)[1] apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm fresh_atm) apply(subgoal_tac"b\<sharp>([(ca,x)]•N)") apply(simp add: forget) apply(simp add: trm.inject) apply(simp add: alpha eqvts calc_atm fresh_prod fresh_atm subst_fresh)[1] apply(perm_simp) apply(simp add: fresh_left calc_atm) apply(simp add: trm.inject) apply(rule conjI) apply(rule sym) apply(simp add: alpha eqvts calc_atm fresh_prod fresh_atm subst_fresh)[1] apply(rule sym) apply(simp add: alpha eqvts calc_atm fresh_prod fresh_atm subst_fresh)[1] done lemma better_Cut_substc2: assumes a: "x\<sharp>(y,P)" "b\<sharp>(a,M)" "N≠Ax x b" shows "(Cut <a>.M (x).N){b:=(y).P} = Cut <a>.M (x).(N{b:=(y).P})" using a apply - apply(generate_fresh "coname") apply(generate_fresh "name") apply(subgoal_tac "Cut <a>.M (x).N = Cut <c>.([(c,a)]•M) (ca).([(ca,x)]•N)") apply(simp) apply(rule trans) apply(rule better_Cut_substc) apply(simp) apply(simp add: abs_fresh) apply(auto)[1] apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst]) apply(simp add: calc_atm fresh_atm fresh_prod) apply(subgoal_tac"b\<sharp>([(c,a)]•M)") apply(simp add: forget) apply(simp add: trm.inject) apply(simp add: alpha eqvts calc_atm fresh_prod fresh_atm subst_fresh)[1] apply(perm_simp) apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] apply(simp add: trm.inject) apply(rule conjI) apply(rule sym) apply(simp add: alpha eqvts calc_atm fresh_prod fresh_atm subst_fresh)[1] apply(rule sym) apply(simp add: alpha eqvts calc_atm fresh_prod fresh_atm subst_fresh)[1] done lemma better_Cut_substn1: assumes a: "y\<sharp>(x,N)" "a\<sharp>(b,P)" "M≠Ax y a" shows "(Cut <a>.M (x).N){y:=<b>.P} = Cut <a>.(M{y:=<b>.P}) (x).N" using a apply - apply(generate_fresh "coname") apply(generate_fresh "name") apply(subgoal_tac "Cut <a>.M (x).N = Cut <c>.([(c,a)]•M) (ca).([(ca,x)]•N)") apply(simp) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(auto)[1] apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm fresh_atm fresh_prod) apply(subgoal_tac"y\<sharp>([(ca,x)]•N)") apply(simp add: forget) apply(simp add: trm.inject) apply(simp add: alpha eqvts calc_atm fresh_prod fresh_atm subst_fresh)[1] apply(perm_simp) apply(auto simp add: fresh_left calc_atm fresh_prod fresh_atm)[1] apply(simp add: trm.inject) apply(rule conjI) apply(rule sym) apply(simp add: alpha eqvts calc_atm fresh_prod fresh_atm subst_fresh)[1] apply(rule sym) apply(simp add: alpha eqvts calc_atm fresh_prod fresh_atm subst_fresh)[1] done lemma better_Cut_substn2: assumes a: "x\<sharp>(P,y)" "y\<sharp>M" shows "(Cut <a>.M (x).N){y:=<b>.P} = Cut <a>.M (x).(N{y:=<b>.P})" using a apply - apply(generate_fresh "coname") apply(generate_fresh "name") apply(subgoal_tac "Cut <a>.M (x).N = Cut <c>.([(c,a)]•M) (ca).([(ca,x)]•N)") apply(simp) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(auto)[1] apply(drule pt_bij1[OF pt_coname_inst, OF at_coname_inst]) apply(simp add: calc_atm fresh_atm) apply(subgoal_tac"y\<sharp>([(c,a)]•M)") apply(simp add: forget) apply(simp add: trm.inject) apply(simp add: alpha eqvts calc_atm fresh_prod fresh_atm subst_fresh)[1] apply(perm_simp) apply(simp add: fresh_left calc_atm) apply(simp add: trm.inject) apply(rule conjI) apply(rule sym) apply(simp add: alpha eqvts calc_atm fresh_prod fresh_atm subst_fresh)[1] apply(rule sym) apply(simp add: alpha eqvts calc_atm fresh_prod fresh_atm subst_fresh)[1] done lemma psubst_fresh_name: fixes x::"name" assumes a: "x\<sharp>ϑn" "x\<sharp>ϑc" "x\<sharp>M" shows "x\<sharp>ϑn,ϑc<M>" using a apply(nominal_induct M avoiding: x ϑn ϑc rule: trm.strong_induct) apply(simp add: lookup_freshness) apply(auto simp add: abs_fresh)[1] apply(simp add: lookupc_freshness) apply(simp add: lookupc_freshness) apply(simp add: lookupc_freshness) apply(simp add: lookupd_freshness) apply(simp add: lookupd_freshness) apply(simp add: lookupc_freshness) apply(simp) apply(case_tac "findc ϑc coname") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm cmaps_fresh) apply(simp) apply(case_tac "findn ϑn name") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm nmaps_fresh) apply(simp) apply(case_tac "findc ϑc coname3") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm cmaps_fresh) apply(simp) apply(case_tac "findn ϑn name2") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm nmaps_fresh) apply(simp) apply(case_tac "findn ϑn name2") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm nmaps_fresh) apply(simp) apply(case_tac "findc ϑc coname2") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm cmaps_fresh) apply(simp) apply(case_tac "findc ϑc coname2") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm cmaps_fresh) apply(simp) apply(case_tac "findn ϑn name3") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm nmaps_fresh) apply(simp) apply(case_tac "findc ϑc coname2") apply(auto simp add: abs_fresh abs_supp fin_supp)[1] apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp add: abs_fresh abs_supp fin_supp fresh_prod fresh_atm cmaps_fresh) apply(simp) apply(case_tac "findn ϑn name2") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm nmaps_fresh) done lemma psubst_fresh_coname: fixes a::"coname" assumes a: "a\<sharp>ϑn" "a\<sharp>ϑc" "a\<sharp>M" shows "a\<sharp>ϑn,ϑc<M>" using a apply(nominal_induct M avoiding: a ϑn ϑc rule: trm.strong_induct) apply(simp add: lookup_freshness) apply(auto simp add: abs_fresh)[1] apply(simp add: lookupd_freshness) apply(simp add: lookupd_freshness) apply(simp add: lookupc_freshness) apply(simp add: lookupd_freshness) apply(simp add: lookupc_freshness) apply(simp add: lookupd_freshness) apply(simp) apply(case_tac "findc ϑc coname") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm cmaps_fresh) apply(simp) apply(case_tac "findn ϑn name") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm nmaps_fresh) apply(simp) apply(case_tac "findc ϑc coname3") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm cmaps_fresh) apply(simp) apply(case_tac "findn ϑn name2") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm nmaps_fresh) apply(simp) apply(case_tac "findn ϑn name2") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm nmaps_fresh) apply(simp) apply(case_tac "findc ϑc coname2") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm cmaps_fresh) apply(simp) apply(case_tac "findc ϑc coname2") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm cmaps_fresh) apply(simp) apply(case_tac "findn ϑn name3") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm nmaps_fresh) apply(simp) apply(case_tac "findc ϑc coname2") apply(auto simp add: abs_fresh abs_supp fin_supp)[1] apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(simp add: abs_fresh abs_supp fin_supp fresh_prod fresh_atm cmaps_fresh) apply(simp) apply(case_tac "findn ϑn name2") apply(auto simp add: abs_fresh)[1] apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(simp add: abs_fresh fresh_prod fresh_atm nmaps_fresh) done lemma psubst_csubst: assumes a: "a\<sharp>(ϑn,ϑc)" shows "ϑn,((a,x,P)#ϑc)<M> = ((ϑn,ϑc<M>){a:=(x).P})" using a apply(nominal_induct M avoiding: a x ϑn ϑc P rule: trm.strong_induct) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(simp add: lookup_csubst) apply(simp add: fresh_list_cons fresh_prod) apply(auto)[1] apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp) apply(simp add: abs_fresh fresh_atm) apply(simp add: lookupd_fresh) apply(subgoal_tac "a\<sharp>lookupc xa coname ϑn") apply(simp add: forget) apply(simp add: trm.inject) apply(rule sym) apply(simp add: alpha nrename_swap fresh_atm) apply(rule lookupc_freshness) apply(simp add: fresh_atm) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp) apply(simp add: abs_fresh fresh_atm) apply(simp) apply(rule conjI) apply(rule impI) apply(simp add: lookupd_unicity) apply(rule impI) apply(subgoal_tac "a\<sharp>lookupc xa coname ϑn") apply(subgoal_tac "a\<sharp>lookupd name aa ϑc") apply(simp add: forget) apply(rule lookupd_freshness) apply(simp add: fresh_atm) apply(rule lookupc_freshness) apply(simp add: fresh_atm) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp) apply(simp add: abs_fresh fresh_atm) apply(simp) apply(rule conjI) apply(rule impI) apply(drule ax_psubst) apply(simp) apply(simp) apply(blast) apply(rule impI) apply(subgoal_tac "a\<sharp>lookupc xa coname ϑn") apply(simp add: forget) apply(rule lookupc_freshness) apply(simp add: fresh_atm) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp) apply(simp add: abs_fresh fresh_atm) apply(simp) apply(rule conjI) apply(rule impI) apply(simp add: trm.inject) apply(rule sym) apply(simp add: alpha) apply(simp add: alpha nrename_swap fresh_atm) apply(simp add: lookupd_fresh) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp) apply(simp add: abs_fresh fresh_atm) apply(simp) apply(rule conjI) apply(rule impI) apply(simp add: lookupd_unicity) apply(rule impI) apply(subgoal_tac "a\<sharp>lookupd name aa ϑc") apply(simp add: forget) apply(rule lookupd_freshness) apply(simp add: fresh_atm) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc) apply(simp) apply(simp add: abs_fresh fresh_atm) apply(simp) apply(rule impI) apply(drule ax_psubst) apply(simp) apply(simp) apply(blast) (* NotR *) apply(simp) apply(case_tac "findc ϑc coname") apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(drule cmaps_false) apply(assumption) apply(simp) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc1) apply(simp) apply(simp add: cmaps_fresh) apply(auto simp add: fresh_prod fresh_atm)[1] (* NotL *) apply(simp) apply(case_tac "findn ϑn name") apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(drule_tac a="a" in nmaps_fresh) apply(assumption) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc2) apply(simp) apply(simp) apply(simp) apply(simp) (* AndR *) apply(simp) apply(case_tac "findc ϑc coname3") apply(simp) apply(auto simp add: psubst_fresh_coname fresh_list_cons fresh_prod fresh_atm)[1] apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(drule cmaps_false) apply(assumption) apply(simp) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc1) apply(simp) apply(simp add: cmaps_fresh) apply(auto simp add: psubst_fresh_coname fresh_prod fresh_atm)[1] (* AndL1 *) apply(simp) apply(case_tac "findn ϑn name2") apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(drule_tac a="a" in nmaps_fresh) apply(assumption) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc2) apply(simp) apply(simp) apply(simp) apply(auto simp add: psubst_fresh_coname fresh_prod fresh_atm)[1] (* AndL2 *) apply(simp) apply(case_tac "findn ϑn name2") apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(drule_tac a="a" in nmaps_fresh) apply(assumption) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc2) apply(simp) apply(simp) apply(simp) apply(auto simp add: psubst_fresh_coname fresh_prod fresh_atm)[1] (* OrR1 *) apply(simp) apply(case_tac "findc ϑc coname2") apply(simp) apply(auto simp add: psubst_fresh_coname fresh_list_cons fresh_prod fresh_atm)[1] apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(drule cmaps_false) apply(assumption) apply(simp) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc1) apply(simp) apply(simp add: cmaps_fresh) apply(auto simp add: psubst_fresh_coname fresh_prod fresh_atm)[1] (* OrR2 *) apply(simp) apply(case_tac "findc ϑc coname2") apply(simp) apply(auto simp add: psubst_fresh_coname fresh_list_cons fresh_prod fresh_atm)[1] apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(drule cmaps_false) apply(assumption) apply(simp) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc1) apply(simp) apply(simp add: cmaps_fresh) apply(auto simp add: psubst_fresh_coname fresh_prod fresh_atm)[1] (* OrL *) apply(simp) apply(case_tac "findn ϑn name3") apply(simp) apply(auto simp add: fresh_list_cons psubst_fresh_name fresh_atm fresh_prod)[1] apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(drule_tac a="a" in nmaps_fresh) apply(assumption) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc2) apply(simp) apply(simp) apply(simp) apply(auto simp add: psubst_fresh_name fresh_prod fresh_atm)[1] (* ImpR *) apply(simp) apply(case_tac "findc ϑc coname2") apply(simp) apply(auto simp add: psubst_fresh_coname fresh_list_cons fresh_prod fresh_atm)[1] apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(drule cmaps_false) apply(assumption) apply(simp) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc1) apply(simp) apply(simp add: cmaps_fresh) apply(auto simp add: psubst_fresh_coname fresh_prod fresh_atm)[1] (* ImpL *) apply(simp) apply(case_tac "findn ϑn name2") apply(simp) apply(auto simp add: fresh_list_cons psubst_fresh_coname psubst_fresh_name fresh_atm fresh_prod)[1] apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(simp add: abs_fresh subst_fresh) apply(drule_tac a="a" in nmaps_fresh) apply(assumption) apply(rule sym) apply(rule trans) apply(rule better_Cut_substc2) apply(simp) apply(simp) apply(simp) apply(auto simp add: psubst_fresh_coname psubst_fresh_name fresh_prod fresh_atm)[1] done lemma psubst_nsubst: assumes a: "x\<sharp>(ϑn,ϑc)" shows "((x,a,P)#ϑn),ϑc<M> = ((ϑn,ϑc<M>){x:=<a>.P})" using a apply(nominal_induct M avoiding: a x ϑn ϑc P rule: trm.strong_induct) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(simp add: lookup_fresh) apply(rule lookupb_lookupa) apply(simp) apply(rule sym) apply(rule forget) apply(rule lookup_freshness) apply(simp add: fresh_atm) apply(auto simp add: lookupc_freshness fresh_list_cons fresh_prod)[1] apply(simp add: lookupc_fresh) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp add: abs_fresh fresh_atm) apply(simp add: lookupd_fresh) apply(subgoal_tac "x\<sharp>lookupd name aa ϑc") apply(simp add: forget) apply(simp add: trm.inject) apply(rule sym) apply(simp add: alpha crename_swap fresh_atm) apply(rule lookupd_freshness) apply(simp add: fresh_atm) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp add: abs_fresh fresh_atm) apply(simp) apply(rule conjI) apply(rule impI) apply(simp add: lookupc_unicity) apply(rule impI) apply(subgoal_tac "x\<sharp>lookupc xa coname ϑn") apply(subgoal_tac "x\<sharp>lookupd name aa ϑc") apply(simp add: forget) apply(rule lookupd_freshness) apply(simp add: fresh_atm) apply(rule lookupc_freshness) apply(simp add: fresh_atm) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp add: abs_fresh fresh_atm) apply(simp) apply(rule conjI) apply(rule impI) apply(simp add: trm.inject) apply(rule sym) apply(simp add: alpha crename_swap fresh_atm) apply(rule impI) apply(simp add: lookupc_fresh) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp add: abs_fresh fresh_atm) apply(simp) apply(rule conjI) apply(rule impI) apply(simp add: lookupc_unicity) apply(rule impI) apply(subgoal_tac "x\<sharp>lookupc xa coname ϑn") apply(simp add: forget) apply(rule lookupc_freshness) apply(simp add: fresh_prod fresh_atm) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp add: abs_fresh fresh_atm) apply(simp) apply(rule conjI) apply(rule impI) apply(drule ax_psubst) apply(simp) apply(simp) apply(simp) apply(blast) apply(rule impI) apply(subgoal_tac "x\<sharp>lookupd name aa ϑc") apply(simp add: forget) apply(rule lookupd_freshness) apply(simp add: fresh_atm) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn) apply(simp add: abs_fresh) apply(simp add: abs_fresh fresh_atm) apply(simp) apply(rule impI) apply(drule ax_psubst) apply(simp) apply(simp) apply(blast) (* NotR *) apply(simp) apply(case_tac "findc ϑc coname") apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(simp) apply(auto simp add: fresh_list_cons 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_substn1) apply(simp add: cmaps_fresh) apply(simp) apply(simp) apply(simp) (* NotL *) apply(simp) apply(case_tac "findn ϑn name") apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(drule nmaps_false) apply(simp) apply(simp) apply(generate_fresh "name") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn2) apply(simp) apply(simp add: nmaps_fresh) apply(simp add: fresh_prod fresh_atm) (* AndR *) apply(simp) apply(case_tac "findc ϑc coname3") apply(simp) apply(auto simp add: psubst_fresh_coname fresh_list_cons fresh_prod fresh_atm)[1] apply(simp) apply(auto simp add: fresh_list_cons 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_substn1) apply(simp add: cmaps_fresh) apply(simp) apply(simp) apply(auto simp add: psubst_fresh_coname fresh_prod fresh_atm)[1] (* AndL1 *) apply(simp) apply(case_tac "findn ϑn name2") apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(drule nmaps_false) apply(simp) apply(simp) apply(generate_fresh "name") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn2) apply(simp) apply(simp add: nmaps_fresh) apply(auto simp add: psubst_fresh_coname fresh_prod fresh_atm)[1] (* AndL2 *) apply(simp) apply(case_tac "findn ϑn name2") apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(drule nmaps_false) apply(simp) apply(simp) apply(generate_fresh "name") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn2) apply(simp) apply(simp add: nmaps_fresh) apply(auto simp add: psubst_fresh_coname fresh_prod fresh_atm)[1] (* OrR1 *) apply(simp) apply(case_tac "findc ϑc coname2") apply(simp) apply(auto simp add: psubst_fresh_coname fresh_list_cons fresh_prod fresh_atm)[1] apply(simp) apply(auto simp add: fresh_list_cons 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_substn1) apply(simp add: cmaps_fresh) apply(simp) apply(simp) apply(auto simp add: psubst_fresh_coname fresh_prod fresh_atm)[1] (* OrR2 *) apply(simp) apply(case_tac "findc ϑc coname2") apply(simp) apply(auto simp add: psubst_fresh_coname fresh_list_cons fresh_prod fresh_atm)[1] apply(simp) apply(auto simp add: fresh_list_cons 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_substn1) apply(simp add: cmaps_fresh) apply(simp) apply(simp) apply(auto simp add: psubst_fresh_coname fresh_prod fresh_atm)[1] (* OrL *) apply(simp) apply(case_tac "findn ϑn name3") apply(simp) apply(auto simp add: fresh_list_cons psubst_fresh_name fresh_atm fresh_prod)[1] apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(drule nmaps_false) apply(simp) apply(simp) apply(generate_fresh "name") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn2) apply(simp) apply(simp add: nmaps_fresh) apply(auto simp add: psubst_fresh_name fresh_prod fresh_atm)[1] (* ImpR *) apply(simp) apply(case_tac "findc ϑc coname2") apply(simp) apply(auto simp add: psubst_fresh_coname fresh_list_cons fresh_prod fresh_atm)[1] apply(simp) apply(auto simp add: fresh_list_cons 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_substn1) apply(simp add: cmaps_fresh) apply(simp) apply(simp) apply(auto simp add: psubst_fresh_coname fresh_prod fresh_atm)[1] (* ImpL *) apply(simp) apply(case_tac "findn ϑn name2") apply(simp) apply(auto simp add: fresh_list_cons psubst_fresh_coname psubst_fresh_name fresh_atm fresh_prod)[1] apply(simp) apply(auto simp add: fresh_list_cons fresh_prod)[1] apply(drule nmaps_false) apply(simp) apply(simp) apply(generate_fresh "name") apply(fresh_fun_simp) apply(fresh_fun_simp) apply(rule sym) apply(rule trans) apply(rule better_Cut_substn2) apply(simp) apply(simp add: nmaps_fresh) apply(auto simp add: psubst_fresh_coname psubst_fresh_name fresh_prod fresh_atm)[1] done definition ncloses :: "(name×coname×trm) list=>(name×ty) list => bool" ("_ ncloses _" [55,55] 55) where "ϑn ncloses Γ ≡ ∀x B. ((x,B) ∈ set Γ --> (∃c P. ϑn nmaps x to Some (c,P) ∧ <c>:P ∈ (\<parallel><B>\<parallel>)))" definition ccloses :: "(coname×name×trm) list=>(coname×ty) list => bool" ("_ ccloses _" [55,55] 55) where "ϑc ccloses Δ ≡ ∀a B. ((a,B) ∈ set Δ --> (∃x P. ϑc cmaps a to Some (x,P) ∧ (x):P ∈ (\<parallel>(B)\<parallel>)))" lemma ncloses_elim: assumes a: "(x,B) ∈ set Γ" and b: "ϑn ncloses Γ" shows "∃c P. ϑn nmaps x to Some (c,P) ∧ <c>:P ∈ (\<parallel><B>\<parallel>)" using a b by (auto simp add: ncloses_def) lemma ccloses_elim: assumes a: "(a,B) ∈ set Δ" and b: "ϑc ccloses Δ" shows "∃x P. ϑc cmaps a to Some (x,P) ∧ (x):P ∈ (\<parallel>(B)\<parallel>)" using a b by (auto simp add: ccloses_def) lemma ncloses_subset: assumes a: "ϑn ncloses Γ" and b: "set Γ' ⊆ set Γ" shows "ϑn ncloses Γ'" using a b by (auto simp add: ncloses_def) lemma ccloses_subset: assumes a: "ϑc ccloses Δ" and b: "set Δ' ⊆ set Δ" shows "ϑc ccloses Δ'" using a b by (auto simp add: ccloses_def) lemma validc_fresh: fixes a::"coname" and Δ::"(coname×ty) list" assumes a: "a\<sharp>Δ" shows "¬(∃B. (a,B)∈set Δ)" using a apply(induct Δ) apply(auto simp add: fresh_list_cons fresh_prod fresh_atm) done lemma validn_fresh: fixes x::"name" and Γ::"(name×ty) list" assumes a: "x\<sharp>Γ" shows "¬(∃B. (x,B)∈set Γ)" using a apply(induct Γ) apply(auto simp add: fresh_list_cons fresh_prod fresh_atm) done lemma ccloses_extend: assumes a: "ϑc ccloses Δ" "a\<sharp>Δ" "a\<sharp>ϑc" "(x):P∈\<parallel>(B)\<parallel>" shows "(a,x,P)#ϑc ccloses (a,B)#Δ" using a apply(simp add: ccloses_def) apply(drule validc_fresh) apply(auto) done lemma ncloses_extend: assumes a: "ϑn ncloses Γ" "x\<sharp>Γ" "x\<sharp>ϑn" "<a>:P∈\<parallel><B>\<parallel>" shows "(x,a,P)#ϑn ncloses (x,B)#Γ" using a apply(simp add: ncloses_def) apply(drule validn_fresh) apply(auto) done text {* typing relation *} inductive typing :: "ctxtn => trm => ctxtc => bool" ("_ \<turnstile> _ \<turnstile> _" [100,100,100] 100) where TAx: "[|validn Γ;validc Δ; (x,B)∈set Γ; (a,B)∈set Δ|] ==> Γ \<turnstile> Ax x a \<turnstile> Δ" | TNotR: "[|x\<sharp>Γ; ((x,B)#Γ) \<turnstile> M \<turnstile> Δ; set Δ' = {(a,NOT B)}∪set Δ; validc Δ'|] ==> Γ \<turnstile> NotR (x).M a \<turnstile> Δ'" | TNotL: "[|a\<sharp>Δ; Γ \<turnstile> M \<turnstile> ((a,B)#Δ); set Γ' = {(x,NOT B)} ∪ set Γ; validn Γ'|] ==> Γ' \<turnstile> NotL <a>.M x \<turnstile> Δ" | TAndL1: "[|x\<sharp>(Γ,y); ((x,B1)#Γ) \<turnstile> M \<turnstile> Δ; set Γ' = {(y,B1 AND B2)} ∪ set Γ; validn Γ'|] ==> Γ' \<turnstile> AndL1 (x).M y \<turnstile> Δ" | TAndL2: "[|x\<sharp>(Γ,y); ((x,B2)#Γ) \<turnstile> M \<turnstile> Δ; set Γ' = {(y,B1 AND B2)} ∪ set Γ; validn Γ'|] ==> Γ' \<turnstile> AndL2 (x).M y \<turnstile> Δ" | TAndR: "[|a\<sharp>(Δ,N,c); b\<sharp>(Δ,M,c); a≠b; Γ \<turnstile> M \<turnstile> ((a,B)#Δ); Γ \<turnstile> N \<turnstile> ((b,C)#Δ); set Δ' = {(c,B AND C)}∪set Δ; validc Δ'|] ==> Γ \<turnstile> AndR <a>.M <b>.N c \<turnstile> Δ'" | TOrL: "[|x\<sharp>(Γ,N,z); y\<sharp>(Γ,M,z); x≠y; ((x,B)#Γ) \<turnstile> M \<turnstile> Δ; ((y,C)#Γ) \<turnstile> N \<turnstile> Δ; set Γ' = {(z,B OR C)} ∪ set Γ; validn Γ'|] ==> Γ' \<turnstile> OrL (x).M (y).N z \<turnstile> Δ" | TOrR1: "[|a\<sharp>(Δ,b); Γ \<turnstile> M \<turnstile> ((a,B1)#Δ); set Δ' = {(b,B1 OR B2)}∪set Δ; validc Δ'|] ==> Γ \<turnstile> OrR1 <a>.M b \<turnstile> Δ'" | TOrR2: "[|a\<sharp>(Δ,b); Γ \<turnstile> M \<turnstile> ((a,B2)#Δ); set Δ' = {(b,B1 OR B2)}∪set Δ; validc Δ'|] ==> Γ \<turnstile> OrR2 <a>.M b \<turnstile> Δ'" | TImpL: "[|a\<sharp>(Δ,N); x\<sharp>(Γ,M,y); Γ \<turnstile> M \<turnstile> ((a,B)#Δ); ((x,C)#Γ) \<turnstile> N \<turnstile> Δ; set Γ' = {(y,B IMP C)} ∪ set Γ; validn Γ'|] ==> Γ' \<turnstile> ImpL <a>.M (x).N y \<turnstile> Δ" | TImpR: "[|a\<sharp>(Δ,b); x\<sharp>Γ; ((x,B)#Γ) \<turnstile> M \<turnstile> ((a,C)#Δ); set Δ' = {(b,B IMP C)}∪set Δ; validc Δ'|] ==> Γ \<turnstile> ImpR (x).<a>.M b \<turnstile> Δ'" | TCut: "[|a\<sharp>(Δ,N); x\<sharp>(Γ,M); Γ \<turnstile> M \<turnstile> ((a,B)#Δ); ((x,B)#Γ) \<turnstile> N \<turnstile> Δ|] ==> Γ \<turnstile> Cut <a>.M (x).N \<turnstile> Δ" equivariance typing lemma fresh_set_member: fixes x::"name" and a::"coname" shows "x\<sharp>L ==> e∈set L ==> x\<sharp>e" and "a\<sharp>L ==> e∈set L ==> a\<sharp>e" by (induct L) (auto simp add: fresh_list_cons) lemma fresh_subset: fixes x::"name" and a::"coname" shows "x\<sharp>L ==> set L' ⊆ set L ==> x\<sharp>L'" and "a\<sharp>L ==> set L' ⊆ set L ==> a\<sharp>L'" apply(induct L' arbitrary: L) apply(auto simp add: fresh_list_cons fresh_list_nil intro: fresh_set_member) done lemma fresh_subset_ext: fixes x::"name" and a::"coname" shows "x\<sharp>L ==> x\<sharp>e ==> set L' ⊆ set (e#L) ==> x\<sharp>L'" and "a\<sharp>L ==> a\<sharp>e ==> set L' ⊆ set (e#L) ==> a\<sharp>L'" apply(induct L' arbitrary: L) apply(auto simp add: fresh_list_cons fresh_list_nil intro: fresh_set_member) done lemma fresh_under_insert: fixes x::"name" and a::"coname" and Γ::"ctxtn" and Δ::"ctxtc" shows "x\<sharp>Γ ==> x≠y ==> set Γ' = insert (y,B) (set Γ) ==> x\<sharp>Γ'" and "a\<sharp>Δ ==> a≠c ==> set Δ' = insert (c,B) (set Δ) ==> a\<sharp>Δ'" apply(rule fresh_subset_ext(1)) apply(auto simp add: fresh_prod fresh_atm fresh_ty) apply(rule fresh_subset_ext(2)) apply(auto simp add: fresh_prod fresh_atm fresh_ty) done nominal_inductive typing apply (simp_all add: abs_fresh fresh_atm fresh_list_cons fresh_prod fresh_ty fresh_ctxt fresh_list_append abs_supp fin_supp) apply(auto intro: fresh_under_insert) done lemma validn_elim: assumes a: "validn ((x,B)#Γ)" shows "validn Γ ∧ x\<sharp>Γ" using a apply(erule_tac validn.cases) apply(auto) done lemma validc_elim: assumes a: "validc ((a,B)#Δ)" shows "validc Δ ∧ a\<sharp>Δ" using a apply(erule_tac validc.cases) apply(auto) done lemma context_fresh: fixes x::"name" and a::"coname" shows "x\<sharp>Γ ==> ¬(∃B. (x,B)∈set Γ)" and "a\<sharp>Δ ==> ¬(∃B. (a,B)∈set Δ)" apply - apply(induct Γ) apply(auto simp add: fresh_list_cons fresh_prod fresh_atm) apply(induct Δ) apply(auto simp add: fresh_list_cons fresh_prod fresh_atm) done lemma typing_implies_valid: assumes a: "Γ \<turnstile> M \<turnstile> Δ" shows "validn Γ ∧ validc Δ" using a apply(nominal_induct rule: typing.strong_induct) apply(auto dest: validn_elim validc_elim) done lemma ty_perm: fixes pi1::"name prm" and pi2::"coname prm" and B::"ty" shows "pi1•B=B" and "pi2•B=B" apply(nominal_induct B rule: ty.strong_induct) apply(auto simp add: perm_string) done lemma ctxt_perm: fixes pi1::"name prm" and pi2::"coname prm" and Γ::"ctxtn" and Δ::"ctxtc" shows "pi2•Γ=Γ" and "pi1•Δ=Δ" apply - apply(induct Γ) apply(auto simp add: calc_atm ty_perm) apply(induct Δ) apply(auto simp add: calc_atm ty_perm) done lemma typing_Ax_elim1: assumes a: "Γ \<turnstile> Ax x a \<turnstile> ((a,B)#Δ)" shows "(x,B)∈set Γ" using a apply(erule_tac typing.cases) apply(simp_all add: trm.inject) apply(auto) apply(auto dest: validc_elim context_fresh) done lemma typing_Ax_elim2: assumes a: "((x,B)#Γ) \<turnstile> Ax x a \<turnstile> Δ" shows "(a,B)∈set Δ" using a apply(erule_tac typing.cases) apply(simp_all add: trm.inject) apply(auto dest!: validn_elim context_fresh) done lemma psubst_Ax_aux: assumes a: "ϑc cmaps a to Some (y,N)" shows "lookupb x a ϑc c P = Cut <c>.P (y).N" using a apply(induct ϑc) apply(auto) done lemma psubst_Ax: assumes a: "ϑn nmaps x to Some (c,P)" and b: "ϑc cmaps a to Some (y,N)" shows "ϑn,ϑc<Ax x a> = Cut <c>.P (y).N" using a b apply(induct ϑn) apply(auto simp add: psubst_Ax_aux) done lemma psubst_Cut: assumes a: "∀x. M≠Ax x c" and b: "∀a. N≠Ax x a" and c: "c\<sharp>(ϑn,ϑc,N)" "x\<sharp>(ϑn,ϑc,M)" shows "ϑn,ϑc<Cut <c>.M (x).N> = Cut <c>.(ϑn,ϑc<M>) (x).(ϑn,ϑc<N>)" using a b c apply(simp) done lemma all_CAND: assumes a: "Γ \<turnstile> M \<turnstile> Δ" and b: "ϑn ncloses Γ" and c: "ϑc ccloses Δ" shows "SNa (ϑn,ϑc<M>)" using a b c proof(nominal_induct avoiding: ϑn ϑc rule: typing.strong_induct) case (TAx Γ Δ x B a ϑn ϑc) then show ?case apply - apply(drule ncloses_elim) apply(assumption) apply(drule ccloses_elim) apply(assumption) apply(erule exE)+ apply(erule conjE)+ apply(rule_tac s="Cut <c>.P (xa).Pa" and t="ϑn,ϑc<Ax x a>" in subst) apply(rule sym) apply(simp only: psubst_Ax) apply(simp add: CUT_SNa) done next case (TNotR x Γ B M Δ Δ' a ϑn ϑc) then show ?case apply(simp) apply(subgoal_tac "(a,NOT B) ∈ set Δ'") apply(drule ccloses_elim) apply(assumption) apply(erule exE)+ apply(simp) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(rule_tac B="NOT B" in CUT_SNa) apply(simp) apply(rule disjI2) apply(rule disjI2) apply(rule_tac x="c" in exI) apply(rule_tac x="x" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp) apply(rule conjI) apply(rule fic.intros) apply(rule psubst_fresh_coname) apply(simp) apply(simp) apply(simp) apply(rule BINDING_implies_CAND) apply(unfold BINDINGn_def) apply(simp) apply(rule_tac x="x" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp) apply(rule allI)+ apply(rule impI) apply(simp add: psubst_nsubst[symmetric]) apply(drule_tac x="(x,aa,Pa)#ϑn" in meta_spec) apply(drule_tac x="ϑc" in meta_spec) apply(drule meta_mp) apply(rule ncloses_extend) apply(assumption) apply(assumption) apply(assumption) apply(assumption) apply(drule meta_mp) apply(rule ccloses_subset) apply(assumption) apply(blast) apply(assumption) apply(simp) apply(blast) done next case (TNotL a Δ Γ M B Γ' x ϑn ϑc) then show ?case apply(simp) apply(subgoal_tac "(x,NOT B) ∈ set Γ'") apply(drule ncloses_elim) apply(assumption) apply(erule exE)+ apply(simp del: NEGc.simps) apply(generate_fresh "name") apply(fresh_fun_simp) apply(rule_tac B="NOT B" in CUT_SNa) apply(simp) apply(rule NEG_intro) apply(simp (no_asm)) apply(rule disjI2) apply(rule disjI2) apply(rule_tac x="a" in exI) apply(rule_tac x="ca" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp del: NEGc.simps) apply(rule conjI) apply(rule fin.intros) apply(rule psubst_fresh_name) apply(simp) apply(simp) apply(simp) apply(rule BINDING_implies_CAND) apply(unfold BINDINGc_def) apply(simp (no_asm)) apply(rule_tac x="a" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp (no_asm)) apply(rule allI)+ apply(rule impI) apply(simp del: NEGc.simps add: psubst_csubst[symmetric]) apply(drule_tac x="ϑn" in meta_spec) apply(drule_tac x="(a,xa,Pa)#ϑc" in meta_spec) apply(drule meta_mp) apply(rule ncloses_subset) apply(assumption) apply(blast) apply(drule meta_mp) apply(rule ccloses_extend) apply(assumption) apply(assumption) apply(assumption) apply(assumption) apply(assumption) apply(blast) done next case (TAndL1 x Γ y B1 M Δ Γ' B2 ϑn ϑc) then show ?case apply(simp) apply(subgoal_tac "(y,B1 AND B2) ∈ set Γ'") apply(drule ncloses_elim) apply(assumption) apply(erule exE)+ apply(simp del: NEGc.simps) apply(generate_fresh "name") apply(fresh_fun_simp) apply(rule_tac B="B1 AND B2" in CUT_SNa) apply(simp) apply(rule NEG_intro) apply(simp (no_asm)) apply(rule disjI2) apply(rule disjI2) apply(rule disjI1) apply(rule_tac x="x" in exI) apply(rule_tac x="ca" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp del: NEGc.simps) apply(rule conjI) apply(rule fin.intros) apply(simp del: NEGc.simps add: abs_fresh fresh_prod fresh_atm) apply(rule psubst_fresh_name) apply(simp) apply(simp) apply(simp) apply(rule BINDING_implies_CAND) apply(unfold BINDINGn_def) apply(simp (no_asm)) apply(rule_tac x="x" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp (no_asm)) apply(rule allI)+ apply(rule impI) apply(simp del: NEGc.simps add: psubst_nsubst[symmetric]) apply(drule_tac x="(x,a,Pa)#ϑn" in meta_spec) apply(drule_tac x="ϑc" in meta_spec) apply(drule meta_mp) apply(rule ncloses_extend) apply(rule ncloses_subset) apply(assumption) apply(blast) apply(simp) apply(simp) apply(simp) apply(drule meta_mp) apply(assumption) apply(assumption) apply(blast) done next case (TAndL2 x Γ y B2 M Δ Γ' B1 ϑn ϑc) then show ?case apply(simp) apply(subgoal_tac "(y,B1 AND B2) ∈ set Γ'") apply(drule ncloses_elim) apply(assumption) apply(erule exE)+ apply(simp del: NEGc.simps) apply(generate_fresh "name") apply(fresh_fun_simp) apply(rule_tac B="B1 AND B2" in CUT_SNa) apply(simp) apply(rule NEG_intro) apply(simp (no_asm)) apply(rule disjI2) apply(rule disjI2) apply(rule disjI2) apply(rule_tac x="x" in exI) apply(rule_tac x="ca" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp del: NEGc.simps) apply(rule conjI) apply(rule fin.intros) apply(simp del: NEGc.simps add: abs_fresh fresh_prod fresh_atm) apply(rule psubst_fresh_name) apply(simp) apply(simp) apply(simp) apply(rule BINDING_implies_CAND) apply(unfold BINDINGn_def) apply(simp (no_asm)) apply(rule_tac x="x" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp (no_asm)) apply(rule allI)+ apply(rule impI) apply(simp del: NEGc.simps add: psubst_nsubst[symmetric]) apply(drule_tac x="(x,a,Pa)#ϑn" in meta_spec) apply(drule_tac x="ϑc" in meta_spec) apply(drule meta_mp) apply(rule ncloses_extend) apply(rule ncloses_subset) apply(assumption) apply(blast) apply(simp) apply(simp) apply(simp) apply(drule meta_mp) apply(assumption) apply(assumption) apply(blast) done next case (TAndR a Δ N c b M Γ B C Δ' ϑn ϑc) then show ?case apply(simp) apply(subgoal_tac "(c,B AND C) ∈ set Δ'") apply(drule ccloses_elim) apply(assumption) apply(erule exE)+ apply(simp) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(rule_tac B="B AND C" in CUT_SNa) apply(simp) apply(rule disjI2) apply(rule disjI2) apply(rule_tac x="ca" in exI) apply(rule_tac x="a" in exI) apply(rule_tac x="b" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(rule_tac x="ϑn,ϑc<N>" in exI) apply(simp) apply(rule conjI) apply(rule fic.intros) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(rule psubst_fresh_coname) apply(simp) apply(simp) apply(simp) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(rule psubst_fresh_coname) apply(simp) apply(simp) apply(simp) apply(rule conjI) apply(rule BINDING_implies_CAND) apply(unfold BINDINGc_def) apply(simp) apply(rule_tac x="a" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp) apply(rule allI)+ apply(rule impI) apply(simp add: psubst_csubst[symmetric]) apply(drule_tac x="ϑn" in meta_spec) apply(drule_tac x="(a,xa,Pa)#ϑc" in meta_spec) apply(drule meta_mp) apply(assumption) apply(drule meta_mp) apply(rule ccloses_extend) apply(rule ccloses_subset) apply(assumption) apply(blast) apply(simp) apply(simp) apply(assumption) apply(assumption) apply(rule BINDING_implies_CAND) apply(unfold BINDINGc_def) apply(simp) apply(rule_tac x="b" in exI) apply(rule_tac x="ϑn,ϑc<N>" in exI) apply(simp) apply(rule allI)+ apply(rule impI) apply(simp add: psubst_csubst[symmetric]) apply(rotate_tac 14) apply(drule_tac x="ϑn" in meta_spec) apply(drule_tac x="(b,xa,Pa)#ϑc" in meta_spec) apply(drule meta_mp) apply(assumption) apply(drule meta_mp) apply(rule ccloses_extend) apply(rule ccloses_subset) apply(assumption) apply(blast) apply(simp) apply(simp) apply(assumption) apply(assumption) apply(simp) apply(blast) done next case (TOrL x Γ N z y M B Δ C Γ' ϑn ϑc) then show ?case apply(simp) apply(subgoal_tac "(z,B OR C) ∈ set Γ'") apply(drule ncloses_elim) apply(assumption) apply(erule exE)+ apply(simp del: NEGc.simps) apply(generate_fresh "name") apply(fresh_fun_simp) apply(rule_tac B="B OR C" in CUT_SNa) apply(simp) apply(rule NEG_intro) apply(simp (no_asm)) apply(rule disjI2) apply(rule disjI2) apply(rule_tac x="x" in exI) apply(rule_tac x="y" in exI) apply(rule_tac x="ca" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(rule_tac x="ϑn,ϑc<N>" in exI) apply(simp del: NEGc.simps) apply(rule conjI) apply(rule fin.intros) apply(simp del: NEGc.simps add: abs_fresh fresh_prod fresh_atm) apply(rule psubst_fresh_name) apply(simp) apply(simp) apply(simp) apply(simp del: NEGc.simps add: abs_fresh fresh_prod fresh_atm) apply(rule psubst_fresh_name) apply(simp) apply(simp) apply(simp) apply(rule conjI) apply(rule BINDING_implies_CAND) apply(unfold BINDINGn_def) apply(simp del: NEGc.simps) apply(rule_tac x="x" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp del: NEGc.simps) apply(rule allI)+ apply(rule impI) apply(simp del: NEGc.simps add: psubst_nsubst[symmetric]) apply(drule_tac x="(x,a,Pa)#ϑn" in meta_spec) apply(drule_tac x="ϑc" in meta_spec) apply(drule meta_mp) apply(rule ncloses_extend) apply(rule ncloses_subset) apply(assumption) apply(blast) apply(simp) apply(simp) apply(assumption) apply(drule meta_mp) apply(assumption) apply(assumption) apply(rule BINDING_implies_CAND) apply(unfold BINDINGn_def) apply(simp del: NEGc.simps) apply(rule_tac x="y" in exI) apply(rule_tac x="ϑn,ϑc<N>" in exI) apply(simp del: NEGc.simps) apply(rule allI)+ apply(rule impI) apply(simp del: NEGc.simps add: psubst_nsubst[symmetric]) apply(rotate_tac 14) apply(drule_tac x="(y,a,Pa)#ϑn" in meta_spec) apply(drule_tac x="ϑc" in meta_spec) apply(drule meta_mp) apply(rule ncloses_extend) apply(rule ncloses_subset) apply(assumption) apply(blast) apply(simp) apply(simp) apply(assumption) apply(drule meta_mp) apply(assumption) apply(assumption) apply(blast) done next case (TOrR1 a Δ b Γ M B1 Δ' B2 ϑn ϑc) then show ?case apply(simp) apply(subgoal_tac "(b,B1 OR B2) ∈ set Δ'") apply(drule ccloses_elim) apply(assumption) apply(erule exE)+ apply(simp del: NEGc.simps) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(rule_tac B="B1 OR B2" in CUT_SNa) apply(simp) apply(rule disjI2) apply(rule disjI2) apply(rule disjI1) apply(rule_tac x="a" in exI) apply(rule_tac x="c" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp) apply(rule conjI) apply(rule fic.intros) apply(simp del: NEGc.simps add: abs_fresh fresh_prod fresh_atm) apply(rule psubst_fresh_coname) apply(simp) apply(simp) apply(simp) apply(rule BINDING_implies_CAND) apply(unfold BINDINGc_def) apply(simp (no_asm)) apply(rule_tac x="a" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp (no_asm)) apply(rule allI)+ apply(rule impI) apply(simp del: NEGc.simps add: psubst_csubst[symmetric]) apply(drule_tac x="ϑn" in meta_spec) apply(drule_tac x="(a,xa,Pa)#ϑc" in meta_spec) apply(drule meta_mp) apply(assumption) apply(drule meta_mp) apply(rule ccloses_extend) apply(rule ccloses_subset) apply(assumption) apply(blast) apply(simp) apply(simp) apply(simp) apply(assumption) apply(simp) apply(blast) done next case (TOrR2 a Δ b Γ M B2 Δ' B1 ϑn ϑc) then show ?case apply(simp) apply(subgoal_tac "(b,B1 OR B2) ∈ set Δ'") apply(drule ccloses_elim) apply(assumption) apply(erule exE)+ apply(simp del: NEGc.simps) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(rule_tac B="B1 OR B2" in CUT_SNa) apply(simp) apply(rule disjI2) apply(rule disjI2) apply(rule disjI2) apply(rule_tac x="a" in exI) apply(rule_tac x="c" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp) apply(rule conjI) apply(rule fic.intros) apply(simp del: NEGc.simps add: abs_fresh fresh_prod fresh_atm) apply(rule psubst_fresh_coname) apply(simp) apply(simp) apply(simp) apply(rule BINDING_implies_CAND) apply(unfold BINDINGc_def) apply(simp (no_asm)) apply(rule_tac x="a" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp (no_asm)) apply(rule allI)+ apply(rule impI) apply(simp del: NEGc.simps add: psubst_csubst[symmetric]) apply(drule_tac x="ϑn" in meta_spec) apply(drule_tac x="(a,xa,Pa)#ϑc" in meta_spec) apply(drule meta_mp) apply(assumption) apply(drule meta_mp) apply(rule ccloses_extend) apply(rule ccloses_subset) apply(assumption) apply(blast) apply(simp) apply(simp) apply(simp) apply(assumption) apply(simp) apply(blast) done next case (TImpL a Δ N x Γ M y B C Γ' ϑn ϑc) then show ?case apply(simp) apply(subgoal_tac "(y,B IMP C) ∈ set Γ'") apply(drule ncloses_elim) apply(assumption) apply(erule exE)+ apply(simp del: NEGc.simps) apply(generate_fresh "name") apply(fresh_fun_simp) apply(rule_tac B="B IMP C" in CUT_SNa) apply(simp) apply(rule NEG_intro) apply(simp (no_asm)) apply(rule disjI2) apply(rule disjI2) apply(rule_tac x="x" in exI) apply(rule_tac x="a" in exI) apply(rule_tac x="ca" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(rule_tac x="ϑn,ϑc<N>" in exI) apply(simp del: NEGc.simps) apply(rule conjI) apply(rule fin.intros) apply(rule psubst_fresh_name) apply(simp) apply(simp) apply(simp) apply(simp del: NEGc.simps add: abs_fresh fresh_prod fresh_atm) apply(rule psubst_fresh_name) apply(simp) apply(simp) apply(simp) apply(rule conjI) apply(rule BINDING_implies_CAND) apply(unfold BINDINGc_def) apply(simp del: NEGc.simps) apply(rule_tac x="a" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp del: NEGc.simps) apply(rule allI)+ apply(rule impI) apply(simp del: NEGc.simps add: psubst_csubst[symmetric]) apply(drule_tac x="ϑn" in meta_spec) apply(drule_tac x="(a,xa,Pa)#ϑc" in meta_spec) apply(drule meta_mp) apply(rule ncloses_subset) apply(assumption) apply(blast) apply(drule meta_mp) apply(rule ccloses_extend) apply(assumption) apply(simp) apply(simp) apply(assumption) apply(assumption) apply(rule BINDING_implies_CAND) apply(unfold BINDINGn_def) apply(simp del: NEGc.simps) apply(rule_tac x="x" in exI) apply(rule_tac x="ϑn,ϑc<N>" in exI) apply(simp del: NEGc.simps) apply(rule allI)+ apply(rule impI) apply(simp del: NEGc.simps add: psubst_nsubst[symmetric]) apply(rotate_tac 12) apply(drule_tac x="(x,aa,Pa)#ϑn" in meta_spec) apply(drule_tac x="ϑc" in meta_spec) apply(drule meta_mp) apply(rule ncloses_extend) apply(rule ncloses_subset) apply(assumption) apply(blast) apply(simp) apply(simp) apply(assumption) apply(drule meta_mp) apply(assumption) apply(assumption) apply(blast) done next case (TImpR a Δ b x Γ B M C Δ' ϑn ϑc) then show ?case apply(simp) apply(subgoal_tac "(b,B IMP C) ∈ set Δ'") apply(drule ccloses_elim) apply(assumption) apply(erule exE)+ apply(simp) apply(generate_fresh "coname") apply(fresh_fun_simp) apply(rule_tac B="B IMP C" in CUT_SNa) apply(simp) apply(rule disjI2) apply(rule disjI2) apply(rule_tac x="x" in exI) apply(rule_tac x="a" in exI) apply(rule_tac x="c" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp) apply(rule conjI) apply(rule fic.intros) apply(simp add: abs_fresh fresh_prod fresh_atm) apply(rule psubst_fresh_coname) apply(simp) apply(simp) apply(simp) apply(rule conjI) apply(rule allI)+ apply(rule impI) apply(simp add: psubst_csubst[symmetric]) apply(rule BINDING_implies_CAND) apply(unfold BINDINGn_def) apply(simp) apply(rule_tac x="x" in exI) apply(rule_tac x="ϑn,((a,z,Pa)#ϑc)<M>" in exI) apply(simp) apply(rule allI)+ apply(rule impI) apply(rule_tac t="ϑn,((a,z,Pa)#ϑc)<M>{x:=<aa>.Pb}" and s="((x,aa,Pb)#ϑn),((a,z,Pa)#ϑc)<M>" in subst) apply(rule psubst_nsubst) apply(simp add: fresh_prod fresh_atm fresh_list_cons) apply(drule_tac x="(x,aa,Pb)#ϑn" in meta_spec) apply(drule_tac x="(a,z,Pa)#ϑc" in meta_spec) apply(drule meta_mp) apply(rule ncloses_extend) apply(assumption) apply(simp) apply(simp) apply(simp) apply(drule meta_mp) apply(rule ccloses_extend) apply(rule ccloses_subset) apply(assumption) apply(blast) apply(auto intro: fresh_subset simp del: NEGc.simps)[1] apply(simp) apply(simp) apply(assumption) apply(rule allI)+ apply(rule impI) apply(simp add: psubst_nsubst[symmetric]) apply(rule BINDING_implies_CAND) apply(unfold BINDINGc_def) apply(simp) apply(rule_tac x="a" in exI) apply(rule_tac x="((x,ca,Q)#ϑn),ϑc<M>" in exI) apply(simp) apply(rule allI)+ apply(rule impI) apply(rule_tac t="((x,ca,Q)#ϑn),ϑc<M>{a:=(xaa).Pa}" and s="((x,ca,Q)#ϑn),((a,xaa,Pa)#ϑc)<M>" in subst) apply(rule psubst_csubst) apply(simp add: fresh_prod fresh_atm fresh_list_cons) apply(drule_tac x="(x,ca,Q)#ϑn" in meta_spec) apply(drule_tac x="(a,xaa,Pa)#ϑc" in meta_spec) apply(drule meta_mp) apply(rule ncloses_extend) apply(assumption) apply(simp) apply(simp) apply(simp) apply(drule meta_mp) apply(rule ccloses_extend) apply(rule ccloses_subset) apply(assumption) apply(blast) apply(auto intro: fresh_subset simp del: NEGc.simps)[1] apply(simp) apply(simp) apply(assumption) apply(simp) apply(blast) done next case (TCut a Δ N x Γ M B ϑn ϑc) then show ?case apply - apply(case_tac "∀y. M≠Ax y a") apply(case_tac "∀c. N≠Ax x c") apply(simp) apply(rule_tac B="B" in CUT_SNa) apply(rule BINDING_implies_CAND) apply(unfold BINDINGc_def) apply(simp) apply(rule_tac x="a" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp) apply(rule allI) apply(rule allI) apply(rule impI) apply(simp add: psubst_csubst[symmetric]) (*?*) apply(drule_tac x="ϑn" in meta_spec) apply(drule_tac x="(a,xa,P)#ϑc" in meta_spec) apply(drule meta_mp) apply(assumption) apply(drule meta_mp) apply(rule ccloses_extend) apply(assumption) apply(assumption) apply(assumption) apply(assumption) apply(assumption) apply(rule BINDING_implies_CAND) apply(unfold BINDINGn_def) apply(simp) apply(rule_tac x="x" in exI) apply(rule_tac x="ϑn,ϑc<N>" in exI) apply(simp) apply(rule allI) apply(rule allI) apply(rule impI) apply(simp add: psubst_nsubst[symmetric]) (*?*) apply(rotate_tac 11) apply(drule_tac x="(x,aa,P)#ϑn" in meta_spec) apply(drule_tac x="ϑc" in meta_spec) apply(drule meta_mp) apply(rule ncloses_extend) apply(assumption) apply(assumption) apply(assumption) apply(assumption) apply(drule_tac meta_mp) apply(assumption) apply(assumption) (* cases at least one axiom *) apply(simp (no_asm_use)) apply(erule exE) apply(simp del: psubst.simps) apply(drule typing_Ax_elim2) apply(auto simp add: trm.inject)[1] apply(rule_tac B="B" in CUT_SNa) (* left term *) apply(rule BINDING_implies_CAND) apply(unfold BINDINGc_def) apply(simp) apply(rule_tac x="a" in exI) apply(rule_tac x="ϑn,ϑc<M>" in exI) apply(simp) apply(rule allI)+ apply(rule impI) apply(drule_tac x="ϑn" in meta_spec) apply(drule_tac x="(a,xa,P)#ϑc" in meta_spec) apply(drule meta_mp) apply(assumption) apply(drule meta_mp) apply(rule ccloses_extend) apply(assumption) apply(assumption) apply(assumption) apply(assumption) apply(simp add: psubst_csubst[symmetric]) (*?*) (* right term -axiom *) apply(drule ccloses_elim) apply(assumption) apply(erule exE)+ apply(erule conjE) apply(frule_tac y="x" in lookupd_cmaps) apply(drule cmaps_fresh) apply(assumption) apply(simp) apply(subgoal_tac "(x):P[xa\<turnstile>n>x] = (xa):P") apply(simp) apply(simp add: ntrm.inject) apply(simp add: alpha fresh_prod fresh_atm) apply(rule sym) apply(rule nrename_swap) apply(simp) (* M is axiom *) apply(simp) apply(auto)[1] (* both are axioms *) apply(rule_tac B="B" in CUT_SNa) apply(drule typing_Ax_elim1) apply(drule ncloses_elim) apply(assumption) apply(erule exE)+ apply(erule conjE) apply(frule_tac a="a" in lookupc_nmaps) apply(drule_tac a="a" in nmaps_fresh) apply(assumption) apply(simp) apply(subgoal_tac "<a>:P[c\<turnstile>c>a] = <c>:P") apply(simp) apply(simp add: ctrm.inject) apply(simp add: alpha fresh_prod fresh_atm) apply(rule sym) apply(rule crename_swap) apply(simp) apply(drule typing_Ax_elim2) apply(drule ccloses_elim) apply(assumption) apply(erule exE)+ apply(erule conjE) apply(frule_tac y="x" in lookupd_cmaps) apply(drule cmaps_fresh) apply(assumption) apply(simp) apply(subgoal_tac "(x):P[xa\<turnstile>n>x] = (xa):P") apply(simp) apply(simp add: ntrm.inject) apply(simp add: alpha fresh_prod fresh_atm) apply(rule sym) apply(rule nrename_swap) apply(simp) (* N is not axioms *) apply(rule_tac B="B" in CUT_SNa) (* left term *) apply(drule typing_Ax_elim1) apply(drule ncloses_elim) apply(assumption) apply(erule exE)+ apply(erule conjE) apply(frule_tac a="a" in lookupc_nmaps) apply(drule_tac a="a" in nmaps_fresh) apply(assumption) apply(simp) apply(subgoal_tac "<a>:P[c\<turnstile>c>a] = <c>:P") apply(simp) apply(simp add: ctrm.inject) apply(simp add: alpha fresh_prod fresh_atm) apply(rule sym) apply(rule crename_swap) apply(simp) apply(rule BINDING_implies_CAND) apply(unfold BINDINGn_def) apply(simp) apply(rule_tac x="x" in exI) apply(rule_tac x="ϑn,ϑc<N>" in exI) apply(simp) apply(rule allI) apply(rule allI) apply(rule impI) apply(simp add: psubst_nsubst[symmetric]) (*?*) apply(rotate_tac 10) apply(drule_tac x="(x,aa,P)#ϑn" in meta_spec) apply(drule_tac x="ϑc" in meta_spec) apply(drule meta_mp) apply(rule ncloses_extend) apply(assumption) apply(assumption) apply(assumption) apply(assumption) apply(drule_tac meta_mp) apply(assumption) apply(assumption) done qed consts "idn" :: "(name×ty) list=>coname=>(name×coname×trm) list" primrec "idn [] a = []" "idn (p#Γ) a = ((fst p),a,Ax (fst p) a)#(idn Γ a)" consts "idc" :: "(coname×ty) list=>name=>(coname×name×trm) list" primrec "idc [] x = []" "idc (p#Δ) x = ((fst p),x,Ax x (fst p))#(idc Δ x)" lemma idn_eqvt[eqvt]: fixes pi1::"name prm" and pi2::"coname prm" shows "(pi1•(idn Γ a)) = idn (pi1•Γ) (pi1•a)" and "(pi2•(idn Γ a)) = idn (pi2•Γ) (pi2•a)" apply(induct Γ) apply(auto) done lemma idc_eqvt[eqvt]: fixes pi1::"name prm" and pi2::"coname prm" shows "(pi1•(idc Δ x)) = idc (pi1•Δ) (pi1•x)" and "(pi2•(idc Δ x)) = idc (pi2•Δ) (pi2•x)" apply(induct Δ) apply(auto) done lemma ccloses_id: shows "(idc Δ x) ccloses Δ" apply(induct Δ) apply(auto simp add: ccloses_def) apply(rule Ax_in_CANDs) apply(rule Ax_in_CANDs) done lemma ncloses_id: shows "(idn Γ a) ncloses Γ" apply(induct Γ) apply(auto simp add: ncloses_def) apply(rule Ax_in_CANDs) apply(rule Ax_in_CANDs) done lemma fresh_idn: fixes x::"name" and a::"coname" shows "x\<sharp>Γ ==> x\<sharp>idn Γ a" and "a\<sharp>(Γ,b) ==> a\<sharp>idn Γ b" apply(induct Γ) apply(auto simp add: fresh_list_cons fresh_list_nil fresh_atm fresh_prod) done lemma fresh_idc: fixes x::"name" and a::"coname" shows "x\<sharp>(Δ,y) ==> x\<sharp>idc Δ y" and "a\<sharp>Δ ==> a\<sharp>idc Δ y" apply(induct Δ) apply(auto simp add: fresh_list_cons fresh_list_nil fresh_atm fresh_prod) done lemma idc_cmaps: assumes a: "idc Δ y cmaps b to Some (x,M)" shows "M=Ax x b" using a apply(induct Δ) apply(auto) apply(case_tac "b=a") apply(auto) done lemma idn_nmaps: assumes a: "idn Γ a nmaps x to Some (b,M)" shows "M=Ax x b" using a apply(induct Γ) apply(auto) apply(case_tac "aa=x") apply(auto) done lemma lookup1: assumes a: "x\<sharp>(idn Γ b)" shows "lookup x a (idn Γ b) ϑc = lookupa x a ϑc" using a apply(induct Γ) apply(auto simp add: fresh_list_cons fresh_prod fresh_atm) done lemma lookup2: assumes a: "¬(x\<sharp>(idn Γ b))" shows "lookup x a (idn Γ b) ϑc = lookupb x a ϑc b (Ax x b)" using a apply(induct Γ) apply(auto simp add: fresh_list_cons fresh_prod fresh_atm fresh_list_nil) done lemma lookup3: assumes a: "a\<sharp>(idc Δ y)" shows "lookupa x a (idc Δ y) = Ax x a" using a apply(induct Δ) apply(auto simp add: fresh_list_cons fresh_prod fresh_atm) done lemma lookup4: assumes a: "¬(a\<sharp>(idc Δ y))" shows "lookupa x a (idc Δ y) = Cut <a>.(Ax x a) (y).Ax y a" using a apply(induct Δ) apply(auto simp add: fresh_list_cons fresh_prod fresh_atm fresh_list_nil) done lemma lookup5: assumes a: "a\<sharp>(idc Δ y)" shows "lookupb x a (idc Δ y) c P = Cut <c>.P (x).Ax x a" using a apply(induct Δ) apply(auto simp add: fresh_list_cons fresh_prod fresh_atm fresh_list_nil) done lemma lookup6: assumes a: "¬(a\<sharp>(idc Δ y))" shows "lookupb x a (idc Δ y) c P = Cut <c>.P (y).Ax y a" using a apply(induct Δ) apply(auto simp add: fresh_list_cons fresh_prod fresh_atm fresh_list_nil) done lemma lookup7: shows "lookupc x a (idn Γ b) = Ax x a" apply(induct Γ) apply(auto simp add: fresh_list_cons fresh_prod fresh_atm fresh_list_nil) done lemma lookup8: shows "lookupd x a (idc Δ y) = Ax x a" apply(induct Δ) apply(auto simp add: fresh_list_cons fresh_prod fresh_atm fresh_list_nil) done lemma id_redu: shows "(idn Γ x),(idc Δ a)<M> -->a* M" apply(nominal_induct M avoiding: Γ Δ x a rule: trm.strong_induct) apply(auto) (* Ax *) apply(case_tac "name\<sharp>(idn Γ x)") apply(simp add: lookup1) apply(case_tac "coname\<sharp>(idc Δ a)") apply(simp add: lookup3) apply(simp add: lookup4) apply(rule a_star_trans) apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxR_intro) apply(rule fic.intros) apply(simp) apply(simp add: lookup2) apply(case_tac "coname\<sharp>(idc Δ a)") apply(simp add: lookup5) apply(rule a_star_trans) apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxR_intro) apply(rule fic.intros) apply(simp) apply(simp add: lookup6) apply(rule a_star_trans) apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxR_intro) apply(rule fic.intros) apply(simp) (* Cut *) apply(auto simp add: fresh_idn fresh_idc psubst_fresh_name psubst_fresh_coname fresh_atm fresh_prod )[1] apply(simp add: lookup7 lookup8) apply(simp add: lookup7 lookup8) apply(simp add: a_star_Cut) apply(simp add: lookup7 lookup8) apply(simp add: a_star_Cut) apply(simp add: a_star_Cut) (* NotR *) apply(simp add: fresh_idn fresh_idc) apply(case_tac "findc (idc Δ a) coname") apply(simp) apply(simp add: a_star_NotR) apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(drule idc_cmaps) apply(simp) apply(subgoal_tac "c\<sharp>idn Γ x,idc Δ a<trm>") apply(rule a_star_trans) apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxR_intro) apply(rule fic.intros) apply(assumption) apply(simp add: crename_fresh) apply(simp add: a_star_NotR) apply(rule psubst_fresh_coname) apply(rule fresh_idn) apply(simp) apply(rule fresh_idc) apply(simp) apply(simp) (* NotL *) apply(simp add: fresh_idn fresh_idc) apply(case_tac "findn (idn Γ x) name") apply(simp) apply(simp add: a_star_NotL) apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(drule idn_nmaps) apply(simp) apply(subgoal_tac "c\<sharp>idn Γ x,idc Δ a<trm>") apply(rule a_star_trans) apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxL_intro) apply(rule fin.intros) apply(assumption) apply(simp add: nrename_fresh) apply(simp add: a_star_NotL) apply(rule psubst_fresh_name) apply(rule fresh_idn) apply(simp) apply(rule fresh_idc) apply(simp) apply(simp) (* AndR *) apply(simp add: fresh_idn fresh_idc) apply(case_tac "findc (idc Δ a) coname3") apply(simp) apply(simp add: a_star_AndR) apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(drule idc_cmaps) apply(simp) apply(subgoal_tac "c\<sharp>idn Γ x,idc Δ a<trm1>") apply(subgoal_tac "c\<sharp>idn Γ x,idc Δ a<trm2>") apply(rule a_star_trans) apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxR_intro) apply(rule fic.intros) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(auto simp add: fresh_idn fresh_idc psubst_fresh_name crename_fresh fresh_atm fresh_prod )[1] apply(rule aux3) apply(rule crename.simps) apply(auto simp add: fresh_prod fresh_atm)[1] apply(rule psubst_fresh_coname) apply(rule fresh_idn) apply(simp add: fresh_prod fresh_atm) apply(rule fresh_idc) apply(simp) apply(simp) apply(auto simp add: fresh_prod fresh_atm)[1] apply(rule psubst_fresh_coname) apply(rule fresh_idn) apply(simp add: fresh_prod fresh_atm) apply(rule fresh_idc) apply(simp) apply(simp) apply(simp) apply(simp) apply(simp add: crename_fresh) apply(simp add: a_star_AndR) apply(rule psubst_fresh_coname) apply(rule fresh_idn) apply(simp) apply(rule fresh_idc) apply(simp) apply(simp) apply(rule psubst_fresh_coname) apply(rule fresh_idn) apply(simp) apply(rule fresh_idc) apply(simp) apply(simp) (* AndL1 *) apply(simp add: fresh_idn fresh_idc) apply(case_tac "findn (idn Γ x) name2") apply(simp) apply(simp add: a_star_AndL1) apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(drule idn_nmaps) apply(simp) apply(subgoal_tac "c\<sharp>idn Γ x,idc Δ a<trm>") apply(rule a_star_trans) apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxL_intro) apply(rule fin.intros) apply(simp add: abs_fresh) apply(rule aux3) apply(rule nrename.simps) apply(auto simp add: fresh_prod fresh_atm)[1] apply(simp) apply(simp add: nrename_fresh) apply(simp add: a_star_AndL1) apply(rule psubst_fresh_name) apply(rule fresh_idn) apply(simp) apply(rule fresh_idc) apply(simp) apply(simp) (* AndL2 *) apply(simp add: fresh_idn fresh_idc) apply(case_tac "findn (idn Γ x) name2") apply(simp) apply(simp add: a_star_AndL2) apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(drule idn_nmaps) apply(simp) apply(subgoal_tac "c\<sharp>idn Γ x,idc Δ a<trm>") apply(rule a_star_trans) apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxL_intro) apply(rule fin.intros) apply(simp add: abs_fresh) apply(rule aux3) apply(rule nrename.simps) apply(auto simp add: fresh_prod fresh_atm)[1] apply(simp) apply(simp add: nrename_fresh) apply(simp add: a_star_AndL2) apply(rule psubst_fresh_name) apply(rule fresh_idn) apply(simp) apply(rule fresh_idc) apply(simp) apply(simp) (* OrR1 *) apply(simp add: fresh_idn fresh_idc) apply(case_tac "findc (idc Δ a) coname2") apply(simp) apply(simp add: a_star_OrR1) apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(drule idc_cmaps) apply(simp) apply(subgoal_tac "c\<sharp>idn Γ x,idc Δ a<trm>") apply(rule a_star_trans) apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxR_intro) apply(rule fic.intros) apply(simp add: abs_fresh) apply(rule aux3) apply(rule crename.simps) apply(auto simp add: fresh_prod fresh_atm)[1] apply(simp) apply(simp add: crename_fresh) apply(simp add: a_star_OrR1) apply(rule psubst_fresh_coname) apply(rule fresh_idn) apply(simp) apply(rule fresh_idc) apply(simp) apply(simp) (* OrR2 *) apply(simp add: fresh_idn fresh_idc) apply(case_tac "findc (idc Δ a) coname2") apply(simp) apply(simp add: a_star_OrR2) apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(drule idc_cmaps) apply(simp) apply(subgoal_tac "c\<sharp>idn Γ x,idc Δ a<trm>") apply(rule a_star_trans) apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxR_intro) apply(rule fic.intros) apply(simp add: abs_fresh) apply(rule aux3) apply(rule crename.simps) apply(auto simp add: fresh_prod fresh_atm)[1] apply(simp) apply(simp add: crename_fresh) apply(simp add: a_star_OrR2) apply(rule psubst_fresh_coname) apply(rule fresh_idn) apply(simp) apply(rule fresh_idc) apply(simp) apply(simp) (* OrL *) apply(simp add: fresh_idn fresh_idc) apply(case_tac "findn (idn Γ x) name3") apply(simp) apply(simp add: a_star_OrL) apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(drule idn_nmaps) apply(simp) apply(subgoal_tac "c\<sharp>idn Γ x,idc Δ a<trm1>") apply(subgoal_tac "c\<sharp>idn Γ x,idc Δ a<trm2>") apply(rule a_star_trans) apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxL_intro) apply(rule fin.intros) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(rule aux3) apply(rule nrename.simps) apply(auto simp add: fresh_prod fresh_atm)[1] apply(rule psubst_fresh_name) apply(rule fresh_idn) apply(simp) apply(rule fresh_idc) apply(simp add: fresh_prod fresh_atm) apply(simp) apply(auto simp add: fresh_prod fresh_atm)[1] apply(rule psubst_fresh_name) apply(rule fresh_idn) apply(simp) apply(rule fresh_idc) apply(simp add: fresh_prod fresh_atm) apply(simp) apply(simp) apply(simp) apply(simp add: nrename_fresh) apply(simp add: a_star_OrL) apply(rule psubst_fresh_name) apply(rule fresh_idn) apply(simp) apply(rule fresh_idc) apply(simp) apply(simp) apply(rule psubst_fresh_name) apply(rule fresh_idn) apply(simp) apply(rule fresh_idc) apply(simp) apply(simp) (* ImpR *) apply(simp add: fresh_idn fresh_idc) apply(case_tac "findc (idc Δ a) coname2") apply(simp) apply(simp add: a_star_ImpR) apply(auto)[1] apply(generate_fresh "coname") apply(fresh_fun_simp) apply(drule idc_cmaps) apply(simp) apply(subgoal_tac "c\<sharp>idn Γ x,idc Δ a<trm>") apply(rule a_star_trans) apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxR_intro) apply(rule fic.intros) apply(simp add: abs_fresh) apply(rule aux3) apply(rule crename.simps) apply(auto simp add: fresh_prod fresh_atm)[1] apply(simp) apply(simp add: crename_fresh) apply(simp add: a_star_ImpR) apply(rule psubst_fresh_coname) apply(rule fresh_idn) apply(simp) apply(rule fresh_idc) apply(simp) apply(simp) (* ImpL *) apply(simp add: fresh_idn fresh_idc) apply(case_tac "findn (idn Γ x) name2") apply(simp) apply(simp add: a_star_ImpL) apply(auto)[1] apply(generate_fresh "name") apply(fresh_fun_simp) apply(drule idn_nmaps) apply(simp) apply(subgoal_tac "c\<sharp>idn Γ x,idc Δ a<trm1>") apply(subgoal_tac "c\<sharp>idn Γ x,idc Δ a<trm2>") apply(rule a_star_trans) apply(rule a_starI) apply(rule al_redu) apply(rule better_LAxL_intro) apply(rule fin.intros) apply(simp add: abs_fresh) apply(simp add: abs_fresh) apply(rule aux3) apply(rule nrename.simps) apply(auto simp add: fresh_prod fresh_atm)[1] apply(rule psubst_fresh_coname) apply(rule fresh_idn) apply(simp add: fresh_atm) apply(rule fresh_idc) apply(simp add: fresh_prod fresh_atm) apply(simp) apply(auto simp add: fresh_prod fresh_atm)[1] apply(rule psubst_fresh_name) apply(rule fresh_idn) apply(simp) apply(rule fresh_idc) apply(simp add: fresh_prod fresh_atm) apply(simp) apply(simp) apply(simp add: nrename_fresh) apply(simp add: a_star_ImpL) apply(rule psubst_fresh_name) apply(rule fresh_idn) apply(simp) apply(rule fresh_idc) apply(simp) apply(simp) apply(rule psubst_fresh_name) apply(rule fresh_idn) apply(simp) apply(rule fresh_idc) apply(simp) apply(simp) done theorem ALL_SNa: assumes a: "Γ \<turnstile> M \<turnstile> Δ" shows "SNa M" proof - fix x have "(idc Δ x) ccloses Δ" by (simp add: ccloses_id) moreover fix a have "(idn Γ a) ncloses Γ" by (simp add: ncloses_id) ultimately have "SNa ((idn Γ a),(idc Δ x)<M>)" using a by (simp add: all_CAND) moreover have "((idn Γ a),(idc Δ x)<M>) -->a* M" by (simp add: id_redu) ultimately show "SNa M" by (simp add: a_star_preserves_SNa) qed end
lemma ty_cases:
(∃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)
lemma fresh_ty(1):
a \<sharp> T
and fresh_ty(2):
x \<sharp> T
lemma eq_bij:
(pi • x = pi • y) = (x = y)
(pi • x = pi • y) = (x = y)
lemma crename_name_eqvt:
pi • M[d\<turnstile>c>e] = (pi • M)[(pi • d)\<turnstile>c>(pi • e)]
lemma crename_coname_eqvt:
pi • M[d\<turnstile>c>e] = (pi • M)[(pi • d)\<turnstile>c>(pi • e)]
lemma nrename_name_eqvt:
pi • M[x\<turnstile>n>y] = (pi • M)[(pi • x)\<turnstile>n>(pi • y)]
lemma nrename_coname_eqvt:
pi • M[x\<turnstile>n>y] = (pi • M)[(pi • x)\<turnstile>n>(pi • y)]
lemma rename_eqvts:
pi • M[d\<turnstile>c>e] = (pi • M)[(pi • d)\<turnstile>c>(pi • e)]
pi • M[d\<turnstile>c>e] = (pi • M)[(pi • d)\<turnstile>c>(pi • e)]
pi • M[x\<turnstile>n>y] = (pi • M)[(pi • x)\<turnstile>n>(pi • y)]
pi • M[x\<turnstile>n>y] = (pi • M)[(pi • x)\<turnstile>n>(pi • y)]
lemma nrename_fresh:
x \<sharp> M ==> M[x\<turnstile>n>y] = M
lemma crename_fresh:
a \<sharp> M ==> M[a\<turnstile>c>b] = M
lemma nrename_nfresh:
x \<sharp> y ==> x \<sharp> M[x\<turnstile>n>y]
lemma crename_nfresh:
x \<sharp> M ==> x \<sharp> M[a\<turnstile>c>b]
lemma crename_cfresh:
a \<sharp> b ==> a \<sharp> M[a\<turnstile>c>b]
lemma nrename_cfresh:
c \<sharp> M ==> c \<sharp> M[x\<turnstile>n>y]
lemma nrename_nfresh':
x \<sharp> (M, z, y) ==> x \<sharp> M[z\<turnstile>n>y]
lemma crename_cfresh':
a \<sharp> (M, b, c) ==> a \<sharp> M[b\<turnstile>c>c]
lemma nrename_rename:
x' \<sharp> M ==> ([(x', x)] • M)[x'\<turnstile>n>y] = M[x\<turnstile>n>y]
lemma crename_rename:
a' \<sharp> M ==> ([(a', a)] • M)[a'\<turnstile>c>b] = M[a\<turnstile>c>b]
lemma rename_fresh:
x \<sharp> M ==> M[x\<turnstile>n>y] = M
a \<sharp> M ==> M[a\<turnstile>c>b] = M
x \<sharp> y ==> x \<sharp> M[x\<turnstile>n>y]
x \<sharp> M ==> x \<sharp> M[a\<turnstile>c>b]
a \<sharp> b ==> a \<sharp> M[a\<turnstile>c>b]
c \<sharp> M ==> c \<sharp> M[x\<turnstile>n>y]
x \<sharp> (M, z, y) ==> x \<sharp> M[z\<turnstile>n>y]
a \<sharp> (M, b, c) ==> a \<sharp> M[b\<turnstile>c>c]
x' \<sharp> M ==> ([(x', x)] • M)[x'\<turnstile>n>y] = M[x\<turnstile>n>y]
a' \<sharp> M ==> ([(a', a)] • M)[a'\<turnstile>c>b] = M[a\<turnstile>c>b]
lemma better_nrename_Cut:
x \<sharp> (u, v)
==> Cut <a>.M x.N[u\<turnstile>n>v] =
Cut <a>.M[u\<turnstile>n>v] x.N[u\<turnstile>n>v]
lemma better_crename_Cut:
a \<sharp> (b, c)
==> Cut <a>.M x.N[b\<turnstile>c>c] =
Cut <a>.M[b\<turnstile>c>c] x.N[b\<turnstile>c>c]
lemma crename_id:
M[a\<turnstile>c>a] = M
lemma nrename_id:
M[x\<turnstile>n>x] = M
lemma nrename_swap:
x \<sharp> M ==> [(x, y)] • M = M[y\<turnstile>n>x]
lemma crename_swap:
a \<sharp> M ==> [(a, b)] • M = M[b\<turnstile>c>a]
lemma crename_ax:
[| M[a\<turnstile>c>b] = Ax x c; c ≠ a; c ≠ b |] ==> M = Ax x c
lemma nrename_ax:
[| M[x\<turnstile>n>y] = Ax z a; z ≠ x; z ≠ y |] ==> M = Ax z a
lemma fresh_perm_coname:
[| c \<sharp> pi; c \<sharp> M |] ==> c \<sharp> pi • M
lemma fresh_perm_name:
[| x \<sharp> pi; x \<sharp> M |] ==> x \<sharp> pi • M
lemma fresh_fun_simp_NotL:
[| x' \<sharp> P; x' \<sharp> M |]
==> fresh_fun (λx'. Cut <c>.P x'.NotL <a>.M x') = Cut <c>.P x'.NotL <a>.M x'
lemma fresh_fun_NotL(1):
pi1.0 • fresh_fun (λx'. Cut <c>.P x'.NotL <a>.M x') =
fresh_fun (pi1.0 • (λx'. Cut <c>.P x'.NotL <a>.M x'))
and fresh_fun_NotL(2):
pi2.0 • fresh_fun (λx'. Cut <c>.P x'.NotL <a>.M x') =
fresh_fun (pi2.0 • (λx'. Cut <c>.P x'.NotL <a>.M x'))
lemma fresh_fun_simp_AndL1:
[| z' \<sharp> P; z' \<sharp> M; z' \<sharp> x |]
==> fresh_fun (λz'. Cut <c>.P z'.AndL1 x.M z') = Cut <c>.P z'.AndL1 x.M z'
lemma fresh_fun_AndL1(1):
pi1.0 • fresh_fun (λz'. Cut <c>.P z'.AndL1 x.M z') =
fresh_fun (pi1.0 • (λz'. Cut <c>.P z'.AndL1 x.M z'))
and fresh_fun_AndL1(2):
pi2.0 • fresh_fun (λz'. Cut <c>.P z'.AndL1 x.M z') =
fresh_fun (pi2.0 • (λz'. Cut <c>.P z'.AndL1 x.M z'))
lemma fresh_fun_simp_AndL2:
[| z' \<sharp> P; z' \<sharp> M; z' \<sharp> x |]
==> fresh_fun (λz'. Cut <c>.P z'.AndL2 x.M z') = Cut <c>.P z'.AndL2 x.M z'
lemma fresh_fun_AndL2(1):
pi1.0 • fresh_fun (λz'. Cut <c>.P z'.AndL2 x.M z') =
fresh_fun (pi1.0 • (λz'. Cut <c>.P z'.AndL2 x.M z'))
and fresh_fun_AndL2(2):
pi2.0 • fresh_fun (λz'. Cut <c>.P z'.AndL2 x.M z') =
fresh_fun (pi2.0 • (λz'. Cut <c>.P z'.AndL2 x.M z'))
lemma fresh_fun_simp_OrL:
[| z' \<sharp> P; z' \<sharp> M; z' \<sharp> N; z' \<sharp> u; z' \<sharp> x |]
==> fresh_fun (λz'. Cut <c>.P z'.OrL x.M u.N z') = Cut <c>.P z'.OrL x.M u.N z'
lemma fresh_fun_OrL(1):
pi1.0 • fresh_fun (λz'. Cut <c>.P z'.OrL x.M u.N z') =
fresh_fun (pi1.0 • (λz'. Cut <c>.P z'.OrL x.M u.N z'))
and fresh_fun_OrL(2):
pi2.0 • fresh_fun (λz'. Cut <c>.P z'.OrL x.M u.N z') =
fresh_fun (pi2.0 • (λz'. Cut <c>.P z'.OrL x.M u.N z'))
lemma fresh_fun_simp_ImpL:
[| z' \<sharp> P; z' \<sharp> M; z' \<sharp> N; z' \<sharp> x |]
==> fresh_fun (λz'. Cut <c>.P z'.ImpL <a>.M x.N z') =
Cut <c>.P z'.ImpL <a>.M x.N z'
lemma fresh_fun_ImpL(1):
pi1.0 • fresh_fun (λz'. Cut <c>.P z'.ImpL <a>.M x.N z') =
fresh_fun (pi1.0 • (λz'. Cut <c>.P z'.ImpL <a>.M x.N z'))
and fresh_fun_ImpL(2):
pi2.0 • fresh_fun (λz'. Cut <c>.P z'.ImpL <a>.M x.N z') =
fresh_fun (pi2.0 • (λz'. Cut <c>.P z'.ImpL <a>.M x.N z'))
lemma fresh_fun_simp_NotR:
[| a' \<sharp> P; a' \<sharp> M |]
==> fresh_fun (λa'. Cut <a'>.NotR y.M a' x.P) = Cut <a'>.NotR y.M a' x.P
lemma fresh_fun_NotR(1):
pi1.0 • fresh_fun (λa'. Cut <a'>.NotR y.M a' x.P) =
fresh_fun (pi1.0 • (λa'. Cut <a'>.NotR y.M a' x.P))
and fresh_fun_NotR(2):
pi2.0 • fresh_fun (λa'. Cut <a'>.NotR y.M a' x.P) =
fresh_fun (pi2.0 • (λa'. Cut <a'>.NotR y.M a' x.P))
lemma fresh_fun_simp_AndR:
[| a' \<sharp> P; a' \<sharp> M; a' \<sharp> N; a' \<sharp> b; a' \<sharp> c |]
==> fresh_fun (λa'. Cut <a'>.AndR <b>.M <c>.N a' x.P) =
Cut <a'>.AndR <b>.M <c>.N a' x.P
lemma fresh_fun_AndR(1):
pi1.0 • fresh_fun (λa'. Cut <a'>.AndR <b>.M <c>.N a' x.P) =
fresh_fun (pi1.0 • (λa'. Cut <a'>.AndR <b>.M <c>.N a' x.P))
and fresh_fun_AndR(2):
pi2.0 • fresh_fun (λa'. Cut <a'>.AndR <b>.M <c>.N a' x.P) =
fresh_fun (pi2.0 • (λa'. Cut <a'>.AndR <b>.M <c>.N a' x.P))
lemma fresh_fun_simp_OrR1:
[| a' \<sharp> P; a' \<sharp> M; a' \<sharp> b |]
==> fresh_fun (λa'. Cut <a'>.OrR1 <b>.M a' x.P) = Cut <a'>.OrR1 <b>.M a' x.P
lemma fresh_fun_OrR1(1):
pi1.0 • fresh_fun (λa'. Cut <a'>.OrR1 <b>.M a' x.P) =
fresh_fun (pi1.0 • (λa'. Cut <a'>.OrR1 <b>.M a' x.P))
and fresh_fun_OrR1(2):
pi2.0 • fresh_fun (λa'. Cut <a'>.OrR1 <b>.M a' x.P) =
fresh_fun (pi2.0 • (λa'. Cut <a'>.OrR1 <b>.M a' x.P))
lemma fresh_fun_simp_OrR2:
[| a' \<sharp> P; a' \<sharp> M; a' \<sharp> b |]
==> fresh_fun (λa'. Cut <a'>.OrR2 <b>.M a' x.P) = Cut <a'>.OrR2 <b>.M a' x.P
lemma fresh_fun_OrR2(1):
pi1.0 • fresh_fun (λa'. Cut <a'>.OrR2 <b>.M a' x.P) =
fresh_fun (pi1.0 • (λa'. Cut <a'>.OrR2 <b>.M a' x.P))
and fresh_fun_OrR2(2):
pi2.0 • fresh_fun (λa'. Cut <a'>.OrR2 <b>.M a' x.P) =
fresh_fun (pi2.0 • (λa'. Cut <a'>.OrR2 <b>.M a' x.P))
lemma fresh_fun_simp_ImpR:
[| a' \<sharp> P; a' \<sharp> M; a' \<sharp> b |]
==> fresh_fun (λa'. Cut <a'>.ImpR y.<b>.M a' x.P) = Cut <a'>.ImpR y.<b>.M a' x.P
lemma fresh_fun_ImpR(1):
pi1.0 • fresh_fun (λa'. Cut <a'>.ImpR y.<b>.M a' x.P) =
fresh_fun (pi1.0 • (λa'. Cut <a'>.ImpR y.<b>.M a' x.P))
and fresh_fun_ImpR(2):
pi2.0 • fresh_fun (λa'. Cut <a'>.ImpR y.<b>.M a' x.P) =
fresh_fun (pi2.0 • (λa'. Cut <a'>.ImpR y.<b>.M a' x.P))
lemma csubst_eqvt(1):
pi1.0 • M{c:=x.N} = (pi1.0 • M){(pi1.0 • c):=(pi1.0 • x).(pi1.0 • N)}
and csubst_eqvt(2):
pi2.0 • M{c:=x.N} = (pi2.0 • M){(pi2.0 • c):=(pi2.0 • x).(pi2.0 • N)}
lemma nsubst_eqvt(1):
pi1.0 • M{x:=<c>.N} = (pi1.0 • M){(pi1.0 • x):=<(pi1.0 • c)>.(pi1.0 • N)}
and nsubst_eqvt(2):
pi2.0 • M{x:=<c>.N} = (pi2.0 • M){(pi2.0 • x):=<(pi2.0 • c)>.(pi2.0 • N)}
lemma supp_subst1:
supp (M{y:=<c>.P}) ⊆ supp M - {y} ∪ supp P
lemma supp_subst2:
supp (M{y:=<c>.P}) ⊆ supp M ∪ (supp P - {c})
lemma supp_subst3:
supp (M{c:=x.P}) ⊆ supp M - {c} ∪ supp P
lemma supp_subst4:
supp (M{c:=x.P}) ⊆ supp M ∪ (supp P - {x})
lemma supp_subst5:
supp M - {y} ⊆ supp (M{y:=<c>.P})
lemma supp_subst6:
supp M ⊆ supp (M{y:=<c>.P})
lemma supp_subst7:
supp M - {c} ⊆ supp (M{c:=x.P})
lemma supp_subst8:
supp M ⊆ supp (M{c:=x.P})
lemma subst_supp:
supp (M{y:=<c>.P}) ⊆ supp M - {y} ∪ supp P
supp (M{y:=<c>.P}) ⊆ supp M ∪ (supp P - {c})
supp (M{c:=x.P}) ⊆ supp M - {c} ∪ supp P
supp (M{c:=x.P}) ⊆ supp M ∪ (supp P - {x})
supp M - {y} ⊆ supp (M{y:=<c>.P})
supp M ⊆ supp (M{y:=<c>.P})
supp M - {c} ⊆ supp (M{c:=x.P})
supp M ⊆ supp (M{c:=x.P})
lemma subst_fresh(1):
x \<sharp> P ==> x \<sharp> M{x:=<c>.P}
and subst_fresh(2):
b \<sharp> P ==> b \<sharp> M{b:=y.P}
and subst_fresh(3):
x \<sharp> (M, P) ==> x \<sharp> M{y:=<c>.P}
and subst_fresh(4):
x \<sharp> M ==> x \<sharp> M{c:=x.P}
and subst_fresh(5):
x \<sharp> (M, P) ==> x \<sharp> M{c:=y.P}
and subst_fresh(6):
b \<sharp> (M, P) ==> b \<sharp> M{c:=y.P}
and subst_fresh(7):
b \<sharp> M ==> b \<sharp> M{y:=<b>.P}
and subst_fresh(8):
b \<sharp> (M, P) ==> b \<sharp> M{y:=<c>.P}
lemma forget(1):
x \<sharp> M ==> M{x:=<c>.P} = M
and forget(2):
c \<sharp> M ==> M{c:=x.P} = M
lemma substc_rename1:
c \<sharp> (M, a) ==> M{a:=x.N} = ([(c, a)] • M){c:=x.N}
lemma substc_rename2:
y \<sharp> (N, x) ==> M{a:=x.N} = M{a:=y.([(y, x)] • N)}
lemma substn_rename3:
y \<sharp> (M, x) ==> M{x:=<a>.N} = ([(y, x)] • M){y:=<a>.N}
lemma substn_rename4:
c \<sharp> (N, a) ==> M{x:=<a>.N} = M{x:=<c>.([(c, a)] • N)}
lemma subst_rename5:
[| c' \<sharp> (c, N); x' \<sharp> (x, M) |]
==> M{x:=<c>.N} = ([(x', x)] • M){x':=<c'>.([(c', c)] • N)}
lemma subst_rename6:
[| c' \<sharp> (c, M); x' \<sharp> (x, N) |]
==> M{c:=x.N} = ([(c', c)] • M){c':=x'.([(x', x)] • N)}
lemma subst_rename:
c \<sharp> (M, a) ==> M{a:=x.N} = ([(c, a)] • M){c:=x.N}
y \<sharp> (N, x) ==> M{a:=x.N} = M{a:=y.([(y, x)] • N)}
y \<sharp> (M, x) ==> M{x:=<a>.N} = ([(y, x)] • M){y:=<a>.N}
c \<sharp> (N, a) ==> M{x:=<a>.N} = M{x:=<c>.([(c, a)] • N)}
[| c' \<sharp> (c, N); x' \<sharp> (x, M) |]
==> M{x:=<c>.N} = ([(x', x)] • M){x':=<c'>.([(c', c)] • N)}
[| c' \<sharp> (c, M); x' \<sharp> (x, N) |]
==> M{c:=x.N} = ([(c', c)] • M){c':=x'.([(x', x)] • N)}
lemma better_Cut_substn:
[| a \<sharp> [c].P; x \<sharp> (y, P) |]
==> Cut <a>.M x.N{y:=<c>.P} =
(if M = Ax y a then Cut <c>.P x.N{y:=<c>.P}
else Cut <a>.M{y:=<c>.P} x.N{y:=<c>.P})
lemma better_Cut_substc:
[| a \<sharp> (c, P); x \<sharp> [y].P |]
==> Cut <a>.M x.N{c:=y.P} =
(if N = Ax x c then Cut <a>.M{c:=y.P} y.P
else Cut <a>.M{c:=y.P} x.N{c:=y.P})
lemma better_Cut_substn':
[| a \<sharp> [c].P; y \<sharp> (N, x); M ≠ Ax y a |]
==> Cut <a>.M x.N{y:=<c>.P} = Cut <a>.M{y:=<c>.P} x.N
lemma better_NotR_substc:
d \<sharp> M ==> NotR x.M d{d:=z.P} = fresh_fun (λa'. Cut <a'>.NotR x.M a' z.P)
lemma better_NotL_substn:
y \<sharp> M
==> NotL <a>.M y{y:=<c>.P} = fresh_fun (λx'. Cut <c>.P x'.NotL <a>.M x')
lemma better_AndL1_substn:
y \<sharp> [x].M
==> AndL1 x.M y{y:=<c>.P} = fresh_fun (λz'. Cut <c>.P z'.AndL1 x.M z')
lemma better_AndL2_substn:
y \<sharp> [x].M
==> AndL2 x.M y{y:=<c>.P} = fresh_fun (λz'. Cut <c>.P z'.AndL2 x.M z')
lemma better_AndR_substc:
c \<sharp> ([a].M, [b].N)
==> AndR <a>.M <b>.N c{c:=z.P} =
fresh_fun (λa'. Cut <a'>.AndR <a>.M <b>.N a' z.P)
lemma better_OrL_substn:
x \<sharp> ([y].M, [z].N)
==> OrL y.M z.N x{x:=<c>.P} = fresh_fun (λz'. Cut <c>.P z'.OrL y.M z.N z')
lemma better_OrR1_substc:
d \<sharp> [a].M
==> OrR1 <a>.M d{d:=z.P} = fresh_fun (λa'. Cut <a'>.OrR1 <a>.M a' z.P)
lemma better_OrR2_substc:
d \<sharp> [a].M
==> OrR2 <a>.M d{d:=z.P} = fresh_fun (λa'. Cut <a'>.OrR2 <a>.M a' z.P)
lemma better_ImpR_substc:
d \<sharp> [a].M
==> ImpR x.<a>.M d{d:=z.P} = fresh_fun (λa'. Cut <a'>.ImpR x.<a>.M a' z.P)
lemma better_ImpL_substn:
y \<sharp> (M, [x].N)
==> ImpL <a>.M x.N y{y:=<c>.P} = fresh_fun (λz'. Cut <c>.P z'.ImpL <a>.M x.N z')
lemma freshn_after_substc:
x \<sharp> M{c:=y.P} ==> x \<sharp> M
lemma freshn_after_substn:
[| x \<sharp> M{y:=<c>.P}; x ≠ y |] ==> x \<sharp> M
lemma freshc_after_substc:
[| a \<sharp> M{c:=y.P}; a ≠ c |] ==> a \<sharp> M
lemma freshc_after_substn:
a \<sharp> M{y:=<c>.P} ==> a \<sharp> M
lemma substn_crename_comm:
[| c ≠ a; c ≠ b |]
==> M{x:=<c>.P}[a\<turnstile>c>b] =
M[a\<turnstile>c>b]{x:=<c>.P[a\<turnstile>c>b]}
lemma substc_crename_comm:
[| c ≠ a; c ≠ b |]
==> M{c:=x.P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{c:=x.P[a\<turnstile>c>b]}
lemma substn_nrename_comm:
[| x ≠ y; x ≠ z |]
==> M{x:=<c>.P}[y\<turnstile>n>z] =
M[y\<turnstile>n>z]{x:=<c>.P[y\<turnstile>n>z]}
lemma substc_nrename_comm:
[| x ≠ y; x ≠ z |]
==> M{c:=x.P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{c:=x.P[y\<turnstile>n>z]}
lemma substn_crename_comm':
[| a ≠ c; a \<sharp> P |]
==> M{x:=<c>.P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{x:=<c>.P}
lemma substc_crename_comm':
[| c ≠ a; c ≠ b; a \<sharp> P |]
==> M{c:=x.P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{c:=x.P}
lemma substn_nrename_comm':
[| x ≠ y; x ≠ z; y \<sharp> P |]
==> M{x:=<c>.P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{x:=<c>.P}
lemma substc_nrename_comm':
[| x ≠ y; y \<sharp> P |]
==> M{c:=x.P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{c:=x.P}
lemma subst_comm:
[| c ≠ a; c ≠ b |]
==> M{x:=<c>.P}[a\<turnstile>c>b] =
M[a\<turnstile>c>b]{x:=<c>.P[a\<turnstile>c>b]}
[| c ≠ a; c ≠ b |]
==> M{c:=x.P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{c:=x.P[a\<turnstile>c>b]}
[| x ≠ y; x ≠ z |]
==> M{x:=<c>.P}[y\<turnstile>n>z] =
M[y\<turnstile>n>z]{x:=<c>.P[y\<turnstile>n>z]}
[| x ≠ y; x ≠ z |]
==> M{c:=x.P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{c:=x.P[y\<turnstile>n>z]}
lemma subst_comm':
[| a ≠ c; a \<sharp> P |]
==> M{x:=<c>.P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{x:=<c>.P}
[| c ≠ a; c ≠ b; a \<sharp> P |]
==> M{c:=x.P}[a\<turnstile>c>b] = M[a\<turnstile>c>b]{c:=x.P}
[| x ≠ y; x ≠ z; y \<sharp> P |]
==> M{x:=<c>.P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{x:=<c>.P}
[| x ≠ y; y \<sharp> P |]
==> M{c:=x.P}[y\<turnstile>n>z] = M[y\<turnstile>n>z]{c:=x.P}
lemma fresh_ctxt(1):
a \<sharp> Γ
and fresh_ctxt(2):
x \<sharp> Δ
lemma fin_Ax_elim:
fin (Ax x a) y ==> x = y
lemma fin_NotL_elim:
fin (NotL <a>.M x) y ==> x = y ∧ x \<sharp> M
lemma fin_AndL1_elim:
fin (AndL1 x.M y) z ==> z = y ∧ z \<sharp> [x].M
lemma fin_AndL2_elim:
fin (AndL2 x.M y) z ==> z = y ∧ z \<sharp> [x].M
lemma fin_OrL_elim:
fin (OrL x.M y.N u) z ==> z = u ∧ z \<sharp> [x].M ∧ z \<sharp> [y].N
lemma fin_ImpL_elim:
fin (ImpL <a>.M x.N z) y ==> z = y ∧ z \<sharp> M ∧ z \<sharp> [x].N
lemma fin_rest_elims(1):
fin (Cut <a>.M x.N) y ==> False
and fin_rest_elims(2):
fin (NotR x.M c) y ==> False
and fin_rest_elims(3):
fin (AndR <a>.M <b>.N c) y ==> False
and fin_rest_elims(4):
fin (OrR1 <a>.M b) y ==> False
and fin_rest_elims(5):
fin (OrR2 <a>.M b) y ==> False
and fin_rest_elims(6):
fin (ImpR x.<a>.M b) y ==> False
lemma fin_elims:
fin (Ax x a) y ==> x = y
fin (NotL <a>.M x) y ==> x = y ∧ x \<sharp> M
fin (AndL1 x.M y) z ==> z = y ∧ z \<sharp> [x].M
fin (AndL2 x.M y) z ==> z = y ∧ z \<sharp> [x].M
fin (OrL x.M y.N u) z ==> z = u ∧ z \<sharp> [x].M ∧ z \<sharp> [y].N
fin (ImpL <a>.M x.N z) y ==> z = y ∧ z \<sharp> M ∧ z \<sharp> [x].N
fin (Cut <a>.M x.N) y ==> False
fin (NotR x.M c) y ==> False
fin (AndR <a>.M <b>.N c) y ==> False
fin (OrR1 <a>.M b) y ==> False
fin (OrR2 <a>.M b) y ==> False
fin (ImpR x.<a>.M b) y ==> False
lemma fin_rename:
fin M x ==> fin ([(x', x)] • M) x'
lemma not_fin_subst1:
¬ fin M x ==> ¬ fin (M{c:=y.P}) x
lemma not_fin_subst2:
¬ fin M x ==> ¬ fin (M{y:=<c>.P}) x
lemma fin_subst1:
[| fin M x; x ≠ y; x \<sharp> P |] ==> fin (M{y:=<c>.P}) x
lemma fin_subst2:
[| fin M y; x ≠ y; y \<sharp> P; M ≠ Ax y c |] ==> fin (M{c:=x.P}) y
lemma fin_substn_nrename:
[| fin M x; x ≠ y; x \<sharp> P |]
==> M[x\<turnstile>n>y]{y:=<c>.P} = Cut <c>.P x.M{y:=<c>.P}
lemma fic_Ax_elim:
fic (Ax x a) b ==> a = b
lemma fic_NotR_elim:
fic (NotR x.M a) b ==> a = b ∧ b \<sharp> M
lemma fic_OrR1_elim:
fic (OrR1 <a>.M b) c ==> b = c ∧ c \<sharp> [a].M
lemma fic_OrR2_elim:
fic (OrR2 <a>.M b) c ==> b = c ∧ c \<sharp> [a].M
lemma fic_AndR_elim:
fic (AndR <a>.M <b>.N c) d ==> c = d ∧ d \<sharp> [a].M ∧ d \<sharp> [b].N
lemma fic_ImpR_elim:
fic (ImpR x.<a>.M b) c ==> b = c ∧ b \<sharp> [a].M
lemma fic_rest_elims(1):
fic (Cut <a>.M x.N) d ==> False
and fic_rest_elims(2):
fic (NotL <a>.M x) d ==> False
and fic_rest_elims(3):
fic (OrL x.M y.N z) d ==> False
and fic_rest_elims(4):
fic (AndL1 x.M y) d ==> False
and fic_rest_elims(5):
fic (AndL2 x.M y) d ==> False
and fic_rest_elims(6):
fic (ImpL <a>.M x.N y) d ==> False
lemma fic_elims:
fic (Ax x a) b ==> a = b
fic (NotR x.M a) b ==> a = b ∧ b \<sharp> M
fic (OrR1 <a>.M b) c ==> b = c ∧ c \<sharp> [a].M
fic (OrR2 <a>.M b) c ==> b = c ∧ c \<sharp> [a].M
fic (AndR <a>.M <b>.N c) d ==> c = d ∧ d \<sharp> [a].M ∧ d \<sharp> [b].N
fic (ImpR x.<a>.M b) c ==> b = c ∧ b \<sharp> [a].M
fic (Cut <a>.M x.N) d ==> False
fic (NotL <a>.M x) d ==> False
fic (OrL x.M y.N z) d ==> False
fic (AndL1 x.M y) d ==> False
fic (AndL2 x.M y) d ==> False
fic (ImpL <a>.M x.N y) d ==> False
lemma fic_rename:
fic M a ==> fic ([(a', a)] • M) a'
lemma not_fic_subst1:
¬ fic M a ==> ¬ fic (M{y:=<c>.P}) a
lemma not_fic_subst2:
¬ fic M a ==> ¬ fic (M{c:=y.P}) a
lemma fic_subst1:
[| fic M a; a ≠ b; a \<sharp> P |] ==> fic (M{b:=x.P}) a
lemma fic_subst2:
[| fic M a; c ≠ a; a \<sharp> P; M ≠ Ax x a |] ==> fic (M{x:=<c>.P}) a
lemma fic_substc_crename:
[| fic M a; a ≠ b; a \<sharp> P |]
==> M[a\<turnstile>c>b]{b:=y.P} = Cut <a>.M{b:=y.P} y.P
lemma l_redu_eqvt'(1):
(pi1.0 • M) -->l (pi1.0 • M') ==> M -->l M'
and l_redu_eqvt'(2):
(pi2.0 • M) -->l (pi2.0 • M') ==> M -->l M'
lemma fresh_l_redu(1):
[| M -->l M'; x \<sharp> M |] ==> x \<sharp> M'
and fresh_l_redu(2):
[| M -->l M'; a \<sharp> M |] ==> a \<sharp> M'
lemma better_LAxR_intro:
fic M a ==> Cut <a>.M x.Ax x b -->l M[a\<turnstile>c>b]
lemma better_LAxL_intro:
fin M x ==> Cut <a>.Ax y a x.M -->l M[x\<turnstile>n>y]
lemma better_LNot_intro:
[| y \<sharp> N; a \<sharp> M |]
==> Cut <a>.NotR x.M a y.NotL <b>.N y -->l Cut <b>.N x.M
lemma better_LAnd1_intro:
[| a \<sharp> ([b1.0].M1.0, [b2.0].M2.0); y \<sharp> [x].N |]
==> Cut <a>.AndR <b1.0>.M1.0 <b2.0>.M2.0 a y.AndL1 x.N y -->l Cut <b1.0>.M1.0 x.N
lemma better_LAnd2_intro:
[| a \<sharp> ([b1.0].M1.0, [b2.0].M2.0); y \<sharp> [x].N |]
==> Cut <a>.AndR <b1.0>.M1.0 <b2.0>.M2.0 a y.AndL2 x.N y -->l Cut <b2.0>.M2.0 x.N
lemma better_LOr1_intro:
[| y \<sharp> ([x1.0].N1.0, [x2.0].N2.0); b \<sharp> [a].M |]
==> Cut <b>.OrR1 <a>.M b y.OrL x1.0.N1.0 x2.0.N2.0 y -->l Cut <a>.M x1.0.N1.0
lemma better_LOr2_intro:
[| y \<sharp> ([x1.0].N1.0, [x2.0].N2.0); b \<sharp> [a].M |]
==> Cut <b>.OrR2 <a>.M b y.OrL x1.0.N1.0 x2.0.N2.0 y -->l Cut <a>.M x2.0.N2.0
lemma better_LImp_intro:
[| z \<sharp> (N, [y].P); b \<sharp> [a].M; a \<sharp> N |]
==> Cut <b>.ImpR x.<a>.M b z.ImpL <c>.N y.P z -->l Cut <a>.Cut <c>.N x.M y.P
lemma alpha_coname:
[| [a].M = [b].N; c \<sharp> (a, b, M, N) |] ==> M = [(a, c)] • [(b, c)] • N
lemma alpha_name:
[| [x].M = [y].N; z \<sharp> (x, y, M, N) |] ==> M = [(x, z)] • [(y, z)] • N
lemma alpha_name_coname:
[| [x].[b].M = [y].[c].N; z \<sharp> (x, y, M, N); a \<sharp> (b, c, M, N) |]
==> M = [(x, z)] • [(b, a)] • [(c, a)] • [(y, z)] • N
lemma Cut_l_redu_elim:
Cut <a>.M x.N -->l R
==> (∃b. R = M[a\<turnstile>c>b]) ∨
(∃y. R = N[x\<turnstile>n>y]) ∨
(∃y M' b N'.
M = NotR y.M' a ∧
N = NotL <b>.N' x ∧ R = Cut <b>.N' y.M' ∧ fic M a ∧ fin N x) ∨
(∃b M1 c M2 y N'.
M = AndR <b>.M1 <c>.M2 a ∧
N = AndL1 y.N' x ∧ R = Cut <b>.M1 y.N' ∧ fic M a ∧ fin N x) ∨
(∃b M1 c M2 y N'.
M = AndR <b>.M1 <c>.M2 a ∧
N = AndL2 y.N' x ∧ R = Cut <c>.M2 y.N' ∧ fic M a ∧ fin N x) ∨
(∃b N' z M1 y M2.
M = OrR1 <b>.N' a ∧
N = OrL z.M1 y.M2 x ∧ R = Cut <b>.N' z.M1 ∧ fic M a ∧ fin N x) ∨
(∃b N' z M1 y M2.
M = OrR2 <b>.N' a ∧
N = OrL z.M1 y.M2 x ∧ R = Cut <b>.N' y.M2 ∧ fic M a ∧ fin N x) ∨
(∃z b M' c N1 y N2.
M = ImpR z.<b>.M' a ∧
N = ImpL <c>.N1 y.N2 x ∧
R = Cut <b>.Cut <c>.N1 z.M' y.N2 ∧
b \<sharp> (c, N1) ∧ fic M a ∧ fin N x)
lemma better_left:
¬ fic M a ==> Cut <a>.M x.N -->c M{a:=x.N}
lemma better_right:
¬ fin N x ==> Cut <a>.M x.N -->c N{x:=<a>.M}
lemma fresh_c_redu(1):
[| M -->c M'; x \<sharp> M |] ==> x \<sharp> M'
and fresh_c_redu(2):
[| M -->c M'; c \<sharp> M |] ==> c \<sharp> M'
lemma fresh_a_redu(1):
[| M -->a M'; x \<sharp> M |] ==> x \<sharp> M'
and fresh_a_redu(2):
[| M -->a M'; c \<sharp> M |] ==> c \<sharp> M'
lemma better_CutL_intro:
M -->a M' ==> Cut <a>.M x.N -->a Cut <a>.M' x.N
lemma better_CutR_intro:
N -->a N' ==> Cut <a>.M x.N -->a Cut <a>.M x.N'
lemma better_AndRL_intro:
M -->a M' ==> AndR <a>.M <b>.N c -->a AndR <a>.M' <b>.N c
lemma better_AndRR_intro:
N -->a N' ==> AndR <a>.M <b>.N c -->a AndR <a>.M <b>.N' c
lemma better_AndL1_intro:
M -->a M' ==> AndL1 x.M y -->a AndL1 x.M' y
lemma better_AndL2_intro:
M -->a M' ==> AndL2 x.M y -->a AndL2 x.M' y
lemma better_OrLL_intro:
M -->a M' ==> OrL x.M y.N z -->a OrL x.M' y.N z
lemma better_OrLR_intro:
N -->a N' ==> OrL x.M y.N z -->a OrL x.M y.N' z
lemma better_OrR1_intro:
M -->a M' ==> OrR1 <a>.M b -->a OrR1 <a>.M' b
lemma better_OrR2_intro:
M -->a M' ==> OrR2 <a>.M b -->a OrR2 <a>.M' b
lemma better_ImpLL_intro:
M -->a M' ==> ImpL <a>.M x.N y -->a ImpL <a>.M' x.N y
lemma better_ImpLR_intro:
N -->a N' ==> ImpL <a>.M x.N y -->a ImpL <a>.M x.N' y
lemma better_ImpR_intro:
M -->a M' ==> ImpR x.<a>.M b -->a ImpR x.<a>.M' b
lemma ax_do_not_l_reduce:
Ax x a -->l M ==> False
lemma ax_do_not_c_reduce:
Ax x a -->c M ==> False
lemma ax_do_not_a_reduce:
Ax x a -->a M ==> False
lemma a_redu_NotL_elim:
NotL <a>.M x -->a R ==> ∃M'. R = NotL <a>.M' x ∧ M -->a M'
lemma a_redu_NotR_elim:
NotR x.M a -->a R ==> ∃M'. R = NotR x.M' a ∧ M -->a M'
lemma a_redu_AndR_elim:
AndR <a>.M <b>.N c -->a R
==> (∃M'. R = AndR <a>.M' <b>.N c ∧ M -->a M') ∨
(∃N'. R = AndR <a>.M <b>.N' c ∧ N -->a N')
lemma a_redu_AndL1_elim:
AndL1 x.M y -->a R ==> ∃M'. R = AndL1 x.M' y ∧ M -->a M'
lemma a_redu_AndL2_elim:
AndL2 x.M y -->a R ==> ∃M'. R = AndL2 x.M' y ∧ M -->a M'
lemma a_redu_OrL_elim:
OrL x.M y.N z -->a R
==> (∃M'. R = OrL x.M' y.N z ∧ M -->a M') ∨
(∃N'. R = OrL x.M y.N' z ∧ N -->a N')
lemma a_redu_OrR1_elim:
OrR1 <a>.M b -->a R ==> ∃M'. R = OrR1 <a>.M' b ∧ M -->a M'
lemma a_redu_OrR2_elim:
OrR2 <a>.M b -->a R ==> ∃M'. R = OrR2 <a>.M' b ∧ M -->a M'
lemma a_redu_ImpL_elim:
ImpL <a>.M y.N z -->a R
==> (∃M'. R = ImpL <a>.M' y.N z ∧ M -->a M') ∨
(∃N'. R = ImpL <a>.M y.N' z ∧ N -->a N')
lemma a_redu_ImpR_elim:
ImpR x.<a>.M b -->a R ==> ∃M'. R = ImpR x.<a>.M' b ∧ M -->a M'
lemma a_starI:
M -->a M' ==> M -->a* M'
lemma a_starE:
M -->a* M' ==> M = M' ∨ (∃N. M -->a N ∧ N -->a* M')
lemma a_star_refl:
M -->a* M
lemma a_star_trans:
[| M1.0 -->a* M2.0; M2.0 -->a* M3.0 |] ==> M1.0 -->a* M3.0
lemma ax_do_not_a_star_reduce:
Ax x a -->a* M ==> M = Ax x a
lemma a_star_CutL:
M -->a* M' ==> Cut <a>.M x.N -->a* Cut <a>.M' x.N
lemma a_star_CutR:
N -->a* N' ==> Cut <a>.M x.N -->a* Cut <a>.M x.N'
lemma a_star_Cut:
[| M -->a* M'; N -->a* N' |] ==> Cut <a>.M x.N -->a* Cut <a>.M' x.N'
lemma a_star_NotR:
M -->a* M' ==> NotR x.M a -->a* NotR x.M' a
lemma a_star_NotL:
M -->a* M' ==> NotL <a>.M x -->a* NotL <a>.M' x
lemma a_star_AndRL:
M -->a* M' ==> AndR <a>.M <b>.N c -->a* AndR <a>.M' <b>.N c
lemma a_star_AndRR:
N -->a* N' ==> AndR <a>.M <b>.N c -->a* AndR <a>.M <b>.N' c
lemma a_star_AndR:
[| M -->a* M'; N -->a* N' |] ==> AndR <a>.M <b>.N c -->a* AndR <a>.M' <b>.N' c
lemma a_star_AndL1:
M -->a* M' ==> AndL1 x.M y -->a* AndL1 x.M' y
lemma a_star_AndL2:
M -->a* M' ==> AndL2 x.M y -->a* AndL2 x.M' y
lemma a_star_OrLL:
M -->a* M' ==> OrL x.M y.N z -->a* OrL x.M' y.N z
lemma a_star_OrLR:
N -->a* N' ==> OrL x.M y.N z -->a* OrL x.M y.N' z
lemma a_star_OrL:
[| M -->a* M'; N -->a* N' |] ==> OrL x.M y.N z -->a* OrL x.M' y.N' z
lemma a_star_OrR1:
M -->a* M' ==> OrR1 <a>.M b -->a* OrR1 <a>.M' b
lemma a_star_OrR2:
M -->a* M' ==> OrR2 <a>.M b -->a* OrR2 <a>.M' b
lemma a_star_ImpLL:
M -->a* M' ==> ImpL <a>.M y.N z -->a* ImpL <a>.M' y.N z
lemma a_star_ImpLR:
N -->a* N' ==> ImpL <a>.M y.N z -->a* ImpL <a>.M y.N' z
lemma a_star_ImpL:
[| M -->a* M'; N -->a* N' |] ==> ImpL <a>.M y.N z -->a* ImpL <a>.M' y.N' z
lemma a_star_ImpR:
M -->a* M' ==> ImpR x.<a>.M b -->a* ImpR x.<a>.M' b
lemma a_star_congs:
[| M -->a* M'; N -->a* N' |] ==> Cut <a>.M x.N -->a* Cut <a>.M' x.N'
M -->a* M' ==> NotR x.M a -->a* NotR x.M' a
M -->a* M' ==> NotL <a>.M x -->a* NotL <a>.M' x
[| M -->a* M'; N -->a* N' |] ==> AndR <a>.M <b>.N c -->a* AndR <a>.M' <b>.N' c
M -->a* M' ==> AndL1 x.M y -->a* AndL1 x.M' y
M -->a* M' ==> AndL2 x.M y -->a* AndL2 x.M' y
[| M -->a* M'; N -->a* N' |] ==> OrL x.M y.N z -->a* OrL x.M' y.N' z
M -->a* M' ==> OrR1 <a>.M b -->a* OrR1 <a>.M' b
M -->a* M' ==> OrR2 <a>.M b -->a* OrR2 <a>.M' b
[| M -->a* M'; N -->a* N' |] ==> ImpL <a>.M y.N z -->a* ImpL <a>.M' y.N' z
M -->a* M' ==> ImpR x.<a>.M b -->a* ImpR x.<a>.M' b
lemma a_star_redu_NotL_elim:
NotL <a>.M x -->a* R ==> ∃M'. R = NotL <a>.M' x ∧ M -->a* M'
lemma a_star_redu_NotR_elim:
NotR x.M a -->a* R ==> ∃M'. R = NotR x.M' a ∧ M -->a* M'
lemma a_star_redu_AndR_elim:
AndR <a>.M <b>.N c -->a* R
==> ∃M' N'. R = AndR <a>.M' <b>.N' c ∧ M -->a* M' ∧ N -->a* N'
lemma a_star_redu_AndL1_elim:
AndL1 x.M y -->a* R ==> ∃M'. R = AndL1 x.M' y ∧ M -->a* M'
lemma a_star_redu_AndL2_elim:
AndL2 x.M y -->a* R ==> ∃M'. R = AndL2 x.M' y ∧ M -->a* M'
lemma a_star_redu_OrL_elim:
OrL x.M y.N z -->a* R ==> ∃M' N'. R = OrL x.M' y.N' z ∧ M -->a* M' ∧ N -->a* N'
lemma a_star_redu_OrR1_elim:
OrR1 <a>.M y -->a* R ==> ∃M'. R = OrR1 <a>.M' y ∧ M -->a* M'
lemma a_star_redu_OrR2_elim:
OrR2 <a>.M y -->a* R ==> ∃M'. R = OrR2 <a>.M' y ∧ M -->a* M'
lemma a_star_redu_ImpR_elim:
ImpR x.<a>.M y -->a* R ==> ∃M'. R = ImpR x.<a>.M' y ∧ M -->a* M'
lemma a_star_redu_ImpL_elim:
ImpL <a>.M y.N z -->a* R
==> ∃M' N'. R = ImpL <a>.M' y.N' z ∧ M -->a* M' ∧ N -->a* N'
lemma subst_not_fin1:
¬ fin (M{x:=<c>.P}) x
lemma subst_not_fin2:
¬ fin M y ==> ¬ fin (M{c:=x.P}) y
lemma subst_not_fic1:
¬ fic (M{a:=x.P}) a
lemma subst_not_fic2:
¬ fic M a ==> ¬ fic (M{x:=<b>.P}) a
lemma fin_l_reduce:
[| fin M x; M -->l M' |] ==> fin M' x
lemma fin_c_reduce:
[| fin M x; M -->c M' |] ==> fin M' x
lemma fin_a_reduce:
[| fin M x; M -->a M' |] ==> fin M' x
lemma fin_a_star_reduce:
[| fin M x; M -->a* M' |] ==> fin M' x
lemma fic_l_reduce:
[| fic M x; M -->l M' |] ==> fic M' x
lemma fic_c_reduce:
[| fic M x; M -->c M' |] ==> fic M' x
lemma fic_a_reduce:
[| fic M x; M -->a M' |] ==> fic M' x
lemma fic_a_star_reduce:
[| fic M x; M -->a* M' |] ==> fic M' x
lemma subst_with_ax1:
M{x:=<a>.Ax y a} -->a* M[x\<turnstile>n>y]
lemma subst_with_ax2:
M{b:=x.Ax x a} -->a* M[b\<turnstile>c>a]
lemma not_Ax1:
¬ b \<sharp> M ==> M{b:=y.Q} ≠ Ax x a
lemma not_Ax2:
¬ x \<sharp> M ==> M{x:=<b>.Q} ≠ Ax y a
lemma interesting_subst1:
[| x ≠ y; x \<sharp> P; y \<sharp> P |]
==> N{y:=<c>.P}{x:=<c>.P} = N{x:=<c>.Ax y c}{y:=<c>.P}
lemma interesting_subst1':
[| x ≠ y; x \<sharp> P; y \<sharp> P |]
==> N{y:=<c>.P}{x:=<c>.P} = N{x:=<a>.Ax y a}{y:=<c>.P}
lemma interesting_subst2:
[| a ≠ b; a \<sharp> P; b \<sharp> P |]
==> N{a:=y.P}{b:=y.P} = N{b:=y.Ax y a}{a:=y.P}
lemma interesting_subst2':
[| a ≠ b; a \<sharp> P; b \<sharp> P |]
==> N{a:=y.P}{b:=y.P} = N{b:=z.Ax z a}{a:=y.P}
lemma subst_subst1:
[| a \<sharp> (Q, b); x \<sharp> (y, P, Q); b \<sharp> Q; y \<sharp> P |]
==> M{x:=<a>.P}{b:=y.Q} = M{b:=y.Q}{x:=<a>.P{b:=y.Q}}
lemma subst_subst2:
[| a \<sharp> (b, P, N); x \<sharp> (y, P, M); b \<sharp> (M, N);
y \<sharp> P |]
==> M{a:=x.N}{y:=<b>.P} = M{y:=<b>.P}{a:=x.N{y:=<b>.P}}
lemma subst_subst3:
[| a \<sharp> (P, N, c); c \<sharp> (M, N); x \<sharp> (y, P, M);
y \<sharp> (P, x); M ≠ Ax y a |]
==> N{x:=<a>.M}{y:=<c>.P} = N{y:=<c>.P}{x:=<a>.M{y:=<c>.P}}
lemma subst_subst4:
[| x \<sharp> (P, N, y); y \<sharp> (M, N); a \<sharp> (c, P, M);
c \<sharp> (P, a); M ≠ Ax x c |]
==> N{a:=x.M}{c:=y.P} = N{c:=y.P}{a:=x.M{c:=y.P}}
lemma fin_not_Cut:
fin M x ==> ¬ (∃a M' x N'. M = Cut <a>.M' x.N')
lemma fresh_not_fin:
x \<sharp> M ==> ¬ fin M x
lemma fresh_not_fic:
a \<sharp> M ==> ¬ fic M a
lemma c_redu_subst1:
[| M -->c M'; c \<sharp> M; y \<sharp> P |] ==> M{y:=<c>.P} -->c M'{y:=<c>.P}
lemma c_redu_subst2:
[| M -->c M'; c \<sharp> P; y \<sharp> M |] ==> M{c:=y.P} -->c M'{c:=y.P}
lemma c_redu_subst1':
M -->c M' ==> M{y:=<c>.P} -->c M'{y:=<c>.P}
lemma c_redu_subst2':
M -->c M' ==> M{c:=y.P} -->c M'{c:=y.P}
lemma aux1:
[| M = M'; M' -->l M'' |] ==> M -->l M''
lemma aux2:
[| M -->l M'; M' = M'' |] ==> M -->l M''
lemma aux3:
[| M = M'; M' -->a* M'' |] ==> M -->a* M''
lemma aux4:
M = M' ==> M -->a* M'
lemma l_redu_subst1:
M -->l M' ==> M{y:=<c>.P} -->a* M'{y:=<c>.P}
lemma l_redu_subst2:
M -->l M' ==> M{c:=y.P} -->a* M'{c:=y.P}
lemma a_redu_subst1:
M -->a M' ==> M{y:=<c>.P} -->a* M'{y:=<c>.P}
lemma a_redu_subst2:
M -->a M' ==> M{c:=y.P} -->a* M'{c:=y.P}
lemma a_star_subst1:
M -->a* M' ==> M{y:=<c>.P} -->a* M'{y:=<c>.P}
lemma a_star_subst2:
M -->a* M' ==> M{c:=y.P} -->a* M'{c:=y.P}
lemma SNa_induct:
[| SNa M; !!M'. [| SNa M'; ∀M''. M' -->a M'' --> P M'' |] ==> P M' |] ==> P M
lemma double_SNa_aux:
[| SNa a; SNa b;
!!x z. [| !!y. x -->a y ==> SNa y; !!y. x -->a y ==> P y z;
!!u. z -->a u ==> SNa u; !!u. z -->a u ==> P x u |]
==> P x z |]
==> P a b
lemma double_SNa:
[| SNa a; SNa b;
∀x z. (∀y. x -->a y --> P y z) ∧ (∀u. z -->a u --> P x u) --> P x z |]
==> P a b
lemma a_preserves_SNa:
[| SNa M; M -->a M' |] ==> SNa M'
lemma a_star_preserves_SNa:
[| SNa M; M -->a* M' |] ==> SNa M'
lemma Ax_in_SNa:
SNa (Ax x a)
lemma NotL_in_SNa:
SNa M ==> SNa (NotL <a>.M x)
lemma NotR_in_SNa:
SNa M ==> SNa (NotR x.M a)
lemma AndL1_in_SNa:
SNa M ==> SNa (AndL1 x.M y)
lemma AndL2_in_SNa:
SNa M ==> SNa (AndL2 x.M y)
lemma OrR1_in_SNa:
SNa M ==> SNa (OrR1 <a>.M b)
lemma OrR2_in_SNa:
SNa M ==> SNa (OrR2 <a>.M b)
lemma ImpR_in_SNa:
SNa M ==> SNa (ImpR x.<a>.M b)
lemma AndR_in_SNa:
[| SNa M; SNa N |] ==> SNa (AndR <a>.M <b>.N c)
lemma OrL_in_SNa:
[| SNa M; SNa N |] ==> SNa (OrL x.M y.N z)
lemma ImpL_in_SNa:
[| SNa M; SNa N |] ==> SNa (ImpL <a>.M y.N z)
lemma SNa_eqvt(1):
SNa M ==> SNa (pi1.0 • M)
and SNa_eqvt(2):
SNa M ==> SNa (pi2.0 • M)
lemma BINDINGn_decreasing:
X ⊆ Y ==> BINDINGn B Y ⊆ BINDINGn B X
lemma BINDINGc_decreasing:
X ⊆ Y ==> BINDINGc B Y ⊆ BINDINGc B X
lemma NOTRIGHT_eqvt_name:
pi • NOTRIGHT (NOT B) X = NOTRIGHT (NOT B) (pi • X)
lemma NOTRIGHT_eqvt_coname:
pi • NOTRIGHT (NOT B) X = NOTRIGHT (NOT B) (pi • X)
lemma NOTLEFT_eqvt_name:
pi • NOTLEFT (NOT B) X = NOTLEFT (NOT B) (pi • X)
lemma NOTLEFT_eqvt_coname:
pi • NOTLEFT (NOT B) X = NOTLEFT (NOT B) (pi • X)
lemma ANDRIGHT_eqvt_name:
pi • ANDRIGHT (A AND B) X Y = ANDRIGHT (A AND B) (pi • X) (pi • Y)
lemma ANDRIGHT_eqvt_coname:
pi • ANDRIGHT (A AND B) X Y = ANDRIGHT (A AND B) (pi • X) (pi • Y)
lemma ANDLEFT1_eqvt_name:
pi • ANDLEFT1 (A AND B) X = ANDLEFT1 (A AND B) (pi • X)
lemma ANDLEFT1_eqvt_coname:
pi • ANDLEFT1 (A AND B) X = ANDLEFT1 (A AND B) (pi • X)
lemma ANDLEFT2_eqvt_name:
pi • ANDLEFT2 (A AND B) X = ANDLEFT2 (A AND B) (pi • X)
lemma ANDLEFT2_eqvt_coname:
pi • ANDLEFT2 (A AND B) X = ANDLEFT2 (A AND B) (pi • X)
lemma ORLEFT_eqvt_name:
pi • ORLEFT (A OR B) X Y = ORLEFT (A OR B) (pi • X) (pi • Y)
lemma ORLEFT_eqvt_coname:
pi • ORLEFT (A OR B) X Y = ORLEFT (A OR B) (pi • X) (pi • Y)
lemma ORRIGHT1_eqvt_name:
pi • ORRIGHT1 (A OR B) X = ORRIGHT1 (A OR B) (pi • X)
lemma ORRIGHT1_eqvt_coname:
pi • ORRIGHT1 (A OR B) X = ORRIGHT1 (A OR B) (pi • X)
lemma ORRIGHT2_eqvt_name:
pi • ORRIGHT2 (A OR B) X = ORRIGHT2 (A OR B) (pi • X)
lemma ORRIGHT2_eqvt_coname:
pi • ORRIGHT2 (A OR B) X = ORRIGHT2 (A OR B) (pi • X)
lemma IMPRIGHT_eqvt_name:
pi • IMPRIGHT (A IMP B) X Y Z U =
IMPRIGHT (A IMP B) (pi • X) (pi • Y) (pi • Z) (pi • U)
lemma IMPRIGHT_eqvt_coname:
pi • IMPRIGHT (A IMP B) X Y Z U =
IMPRIGHT (A IMP B) (pi • X) (pi • Y) (pi • Z) (pi • U)
lemma IMPLEFT_eqvt_name:
pi • IMPLEFT (A IMP B) X Y = IMPLEFT (A IMP B) (pi • X) (pi • Y)
lemma IMPLEFT_eqvt_coname:
pi • IMPLEFT (A IMP B) X Y = IMPLEFT (A IMP B) (pi • X) (pi • Y)
lemma sum_cases:
(∃y. x = Inl y) ∨ (∃y. x = Inr y)
lemma test1:
(x ∈ X ∪ Y) = (x ∈ X ∨ x ∈ Y)
lemma test2:
(x ∈ X ∩ Y) = (x ∈ X ∧ x ∈ Y)
lemma big_inter_eqvt(1):
pi1.0 • Inter X = Inter (pi1.0 • X)
and big_inter_eqvt(2):
pi2.0 • Inter Y = Inter (pi2.0 • Y)
lemma lfp_eqvt(1):
pi1.0 • lfp f = lfp (pi1.0 • f)
and lfp_eqvt(2):
pi2.0 • lfp g = lfp (pi2.0 • g)
lemma NEGn_decreasing:
X ⊆ Y ==> NEGn B Y ⊆ NEGn B X
lemma NEGc_decreasing:
X ⊆ Y ==> NEGc B Y ⊆ NEGc B X
lemma mono_NEGn_NEGc(1):
mono (NEGn B o NEGc B)
and mono_NEGn_NEGc(2):
mono (NEGc B o NEGn B)
lemma NEG_simp(1):
\<parallel><B>\<parallel> = \<parallel><B>\<parallel>
and NEG_simp(2):
\<parallel>(B)\<parallel> = NEGn B (\<parallel><B>\<parallel>)
lemma NEG_elim(1):
M ∈ \<parallel><B>\<parallel> ==> M ∈ \<parallel><B>\<parallel>
and NEG_elim(2):
N ∈ \<parallel>(B)\<parallel> ==> N ∈ NEGn B (\<parallel><B>\<parallel>)
lemma NEG_intro(1):
M ∈ \<parallel><B>\<parallel> ==> M ∈ \<parallel><B>\<parallel>
and NEG_intro(2):
N ∈ NEGn B (\<parallel><B>\<parallel>) ==> N ∈ \<parallel>(B)\<parallel>
lemma NEGc_simps(1):
\<parallel><PR A>\<parallel> =
AXIOMSc (PR A) ∪ BINDINGc (PR A) (\<parallel>(PR A)\<parallel>)
and NEGc_simps(2):
\<parallel><NOT C>\<parallel> =
AXIOMSc (NOT C) ∪ BINDINGc (NOT C) (\<parallel>(NOT C)\<parallel>) ∪
NOTRIGHT (NOT C) (\<parallel>(C)\<parallel>)
and NEGc_simps(3):
\<parallel><C AND D>\<parallel> =
AXIOMSc (C AND D) ∪ BINDINGc (C AND D) (\<parallel>(C AND D)\<parallel>) ∪
ANDRIGHT (C AND D) (\<parallel><C>\<parallel>) (\<parallel><D>\<parallel>)
and NEGc_simps(4):
\<parallel><C OR D>\<parallel> =
AXIOMSc (C OR D) ∪ BINDINGc (C OR D) (\<parallel>(C OR D)\<parallel>) ∪
ORRIGHT1 (C OR D) (\<parallel><C>\<parallel>) ∪
ORRIGHT2 (C OR D) (\<parallel><D>\<parallel>)
and NEGc_simps(5):
\<parallel><C IMP D>\<parallel> =
AXIOMSc (C IMP D) ∪ BINDINGc (C IMP D) (\<parallel>(C IMP D)\<parallel>) ∪
IMPRIGHT (C IMP D) (\<parallel>(C)\<parallel>) (\<parallel><D>\<parallel>)
(\<parallel>(D)\<parallel>) (\<parallel><C>\<parallel>)
lemma AXIOMS_in_CANDs(1):
AXIOMSn B ⊆ \<parallel>(B)\<parallel>
and AXIOMS_in_CANDs(2):
AXIOMSc B ⊆ \<parallel><B>\<parallel>
lemma Ax_in_CANDs(1):
y:Ax x a ∈ \<parallel>(B)\<parallel>
and Ax_in_CANDs(2):
<b>:Ax x a ∈ \<parallel><B>\<parallel>
lemma AXIOMS_eqvt_aux_name(1):
M ∈ AXIOMSn B ==> pi • M ∈ AXIOMSn B
and AXIOMS_eqvt_aux_name(2):
N ∈ AXIOMSc B ==> pi • N ∈ AXIOMSc B
lemma AXIOMS_eqvt_aux_coname(1):
M ∈ AXIOMSn B ==> pi • M ∈ AXIOMSn B
and AXIOMS_eqvt_aux_coname(2):
N ∈ AXIOMSc B ==> pi • N ∈ AXIOMSc B
lemma AXIOMS_eqvt_name(1):
pi • AXIOMSn B = AXIOMSn B
and AXIOMS_eqvt_name(2):
pi • AXIOMSc B = AXIOMSc B
lemma AXIOMS_eqvt_coname(1):
pi • AXIOMSn B = AXIOMSn B
and AXIOMS_eqvt_coname(2):
pi • AXIOMSc B = AXIOMSc B
lemma BINDING_eqvt_name(1):
pi • BINDINGn B X = BINDINGn B (pi • X)
and BINDING_eqvt_name(2):
pi • BINDINGc B Y = BINDINGc B (pi • Y)
lemma BINDING_eqvt_coname(1):
pi • BINDINGn B X = BINDINGn B (pi • X)
and BINDING_eqvt_coname(2):
pi • BINDINGc B Y = BINDINGc B (pi • Y)
lemma CAND_eqvt_name(1):
pi • (\<parallel>(B)\<parallel>) = \<parallel>(B)\<parallel>
and CAND_eqvt_name(2):
pi • (\<parallel><B>\<parallel>) = \<parallel><B>\<parallel>
lemma CAND_eqvt_coname(1):
pi • (\<parallel>(B)\<parallel>) = \<parallel>(B)\<parallel>
and CAND_eqvt_coname(2):
pi • (\<parallel><B>\<parallel>) = \<parallel><B>\<parallel>
lemma BINDINGc_elim:
<a>:M ∈ BINDINGc B (\<parallel>(B)\<parallel>)
==> ∀x P. x:P ∈ \<parallel>(B)\<parallel> --> SNa (M{a:=x.P})
lemma BINDINGn_elim:
x:M ∈ BINDINGn B (\<parallel><B>\<parallel>)
==> ∀c P. <c>:P ∈ \<parallel><B>\<parallel> --> SNa (M{x:=<c>.P})
lemma NOTRIGHT_elim:
[| <a>:M ∈ NOTRIGHT (NOT B) (\<parallel>(B)\<parallel>);
!!x' M'.
[| M = NotR x'.M' a; fic (NotR x'.M' a) a;
x':M' ∈ \<parallel>(B)\<parallel> |]
==> thesis |]
==> thesis
lemma NOTLEFT_elim:
[| x:M ∈ NOTLEFT (NOT B) (\<parallel><B>\<parallel>);
!!a' M'.
[| M = NotL <a'>.M' x; fin (NotL <a'>.M' x) x;
<a'>:M' ∈ \<parallel><B>\<parallel> |]
==> thesis |]
==> thesis
lemma ANDRIGHT_elim:
[| <a>:M
∈ ANDRIGHT (B AND C) (\<parallel><B>\<parallel>) (\<parallel><C>\<parallel>);
!!d' M' e' N'.
[| M = AndR <d'>.M' <e'>.N' a; fic (AndR <d'>.M' <e'>.N' a) a;
<d'>:M' ∈ \<parallel><B>\<parallel>;
<e'>:N' ∈ \<parallel><C>\<parallel> |]
==> thesis |]
==> thesis
lemma ANDLEFT1_elim:
[| x:M ∈ ANDLEFT1 (B AND C) (\<parallel>(B)\<parallel>);
!!x' M'.
[| M = AndL1 x'.M' x; fin (AndL1 x'.M' x) x;
x':M' ∈ \<parallel>(B)\<parallel> |]
==> thesis |]
==> thesis
lemma ANDLEFT2_elim:
[| x:M ∈ ANDLEFT2 (B AND C) (\<parallel>(C)\<parallel>);
!!x' M'.
[| M = AndL2 x'.M' x; fin (AndL2 x'.M' x) x;
x':M' ∈ \<parallel>(C)\<parallel> |]
==> thesis |]
==> thesis
lemma ORRIGHT1_elim:
[| <a>:M ∈ ORRIGHT1 (B OR C) (\<parallel><B>\<parallel>);
!!a' M'.
[| M = OrR1 <a'>.M' a; fic (OrR1 <a'>.M' a) a;
<a'>:M' ∈ \<parallel><B>\<parallel> |]
==> thesis |]
==> thesis
lemma ORRIGHT2_elim:
[| <a>:M ∈ ORRIGHT2 (B OR C) (\<parallel><C>\<parallel>);
!!a' M'.
[| M = OrR2 <a'>.M' a; fic (OrR2 <a'>.M' a) a;
<a'>:M' ∈ \<parallel><C>\<parallel> |]
==> thesis |]
==> thesis
lemma ORLEFT_elim:
[| x:M ∈ ORLEFT (B OR C) (\<parallel>(B)\<parallel>)
(\<parallel>(C)\<parallel>);
!!y' M' z' N'.
[| M = OrL y'.M' z'.N' x; fin (OrL y'.M' z'.N' x) x;
y':M' ∈ \<parallel>(B)\<parallel>; z':N' ∈ \<parallel>(C)\<parallel> |]
==> thesis |]
==> thesis
lemma IMPRIGHT_elim:
[| <a>:M
∈ IMPRIGHT (B IMP C) (\<parallel>(B)\<parallel>) (\<parallel><C>\<parallel>)
(\<parallel>(C)\<parallel>) (\<parallel><B>\<parallel>);
!!x' a' M'.
[| M = ImpR x'.<a'>.M' a; fic (ImpR x'.<a'>.M' a) a;
∀z P. x' \<sharp> (z, P) ∧ z:P ∈ \<parallel>(C)\<parallel> -->
x':M'{a':=z.P} ∈ \<parallel>(B)\<parallel>;
∀c Q. a' \<sharp> (c, Q) ∧ <c>:Q ∈ \<parallel><B>\<parallel> -->
<a'>:M'{x':=<c>.Q} ∈ \<parallel><C>\<parallel> |]
==> thesis |]
==> thesis
lemma IMPLEFT_elim:
[| x:M ∈ IMPLEFT (B IMP C) (\<parallel><B>\<parallel>)
(\<parallel>(C)\<parallel>);
!!x' a' M' N'.
[| M = ImpL <a'>.M' x'.N' x; fin (ImpL <a'>.M' x'.N' x) x;
<a'>:M' ∈ \<parallel><B>\<parallel>;
x':N' ∈ \<parallel>(C)\<parallel> |]
==> thesis |]
==> thesis
lemma CANDs_alpha(1):
[| <a>:M ∈ \<parallel><B>\<parallel>; [a].M = [b].N |]
==> <b>:N ∈ \<parallel><B>\<parallel>
and CANDs_alpha(2):
[| x:M ∈ \<parallel>(B)\<parallel>; [x].M = [y].N |]
==> y:N ∈ \<parallel>(B)\<parallel>
lemma CAND_NotR_elim:
[| <a>:NotR x.M a ∈ \<parallel><B>\<parallel>;
<a>:NotR x.M a ∉ BINDINGc B (\<parallel>(B)\<parallel>) |]
==> ∃B'. B = NOT B' ∧ x:M ∈ \<parallel>(B')\<parallel>
lemma CAND_NotL_elim_aux:
[| x:NotL <a>.M x ∈ NEGn B (\<parallel><B>\<parallel>);
x:NotL <a>.M x ∉ BINDINGn B (\<parallel><B>\<parallel>) |]
==> ∃B'. B = NOT B' ∧ <a>:M ∈ \<parallel><B'>\<parallel>
lemma CAND_NotL_elim:
[| x:NotL <a>.M x ∈ \<parallel>(B)\<parallel>;
x:NotL <a>.M x ∉ BINDINGn B (\<parallel><B>\<parallel>) |]
==> ∃B'. B = NOT B' ∧ <a>:M ∈ \<parallel><B'>\<parallel>
lemma CAND_AndR_elim:
[| <a>:AndR <b>.M <c>.N a ∈ \<parallel><B>\<parallel>;
<a>:AndR <b>.M <c>.N a ∉ BINDINGc B (\<parallel>(B)\<parallel>) |]
==> ∃B1 B2.
B = B1 AND B2 ∧
<b>:M ∈ \<parallel><B1>\<parallel> ∧ <c>:N ∈ \<parallel><B2>\<parallel>
lemma CAND_OrR1_elim:
[| <a>:OrR1 <b>.M a ∈ \<parallel><B>\<parallel>;
<a>:OrR1 <b>.M a ∉ BINDINGc B (\<parallel>(B)\<parallel>) |]
==> ∃B1 B2. B = B1 OR B2 ∧ <b>:M ∈ \<parallel><B1>\<parallel>
lemma CAND_OrR2_elim:
[| <a>:OrR2 <b>.M a ∈ \<parallel><B>\<parallel>;
<a>:OrR2 <b>.M a ∉ BINDINGc B (\<parallel>(B)\<parallel>) |]
==> ∃B1 B2. B = B1 OR B2 ∧ <b>:M ∈ \<parallel><B2>\<parallel>
lemma CAND_OrL_elim_aux:
[| x:OrL y.M z.N x ∈ NEGn B (\<parallel><B>\<parallel>);
x:OrL y.M z.N x ∉ BINDINGn B (\<parallel><B>\<parallel>) |]
==> ∃B1 B2.
B = B1 OR B2 ∧
y:M ∈ \<parallel>(B1)\<parallel> ∧ z:N ∈ \<parallel>(B2)\<parallel>
lemma CAND_OrL_elim:
[| x:OrL y.M z.N x ∈ \<parallel>(B)\<parallel>;
x:OrL y.M z.N x ∉ BINDINGn B (\<parallel><B>\<parallel>) |]
==> ∃B1 B2.
B = B1 OR B2 ∧
y:M ∈ \<parallel>(B1)\<parallel> ∧ z:N ∈ \<parallel>(B2)\<parallel>
lemma CAND_AndL1_elim_aux:
[| x:AndL1 y.M x ∈ NEGn B (\<parallel><B>\<parallel>);
x:AndL1 y.M x ∉ BINDINGn B (\<parallel><B>\<parallel>) |]
==> ∃B1 B2. B = B1 AND B2 ∧ y:M ∈ \<parallel>(B1)\<parallel>
lemma CAND_AndL1_elim:
[| x:AndL1 y.M x ∈ \<parallel>(B)\<parallel>;
x:AndL1 y.M x ∉ BINDINGn B (\<parallel><B>\<parallel>) |]
==> ∃B1 B2. B = B1 AND B2 ∧ y:M ∈ \<parallel>(B1)\<parallel>
lemma CAND_AndL2_elim_aux:
[| x:AndL2 y.M x ∈ NEGn B (\<parallel><B>\<parallel>);
x:AndL2 y.M x ∉ BINDINGn B (\<parallel><B>\<parallel>) |]
==> ∃B1 B2. B = B1 AND B2 ∧ y:M ∈ \<parallel>(B2)\<parallel>
lemma CAND_AndL2_elim:
[| x:AndL2 y.M x ∈ \<parallel>(B)\<parallel>;
x:AndL2 y.M x ∉ BINDINGn B (\<parallel><B>\<parallel>) |]
==> ∃B1 B2. B = B1 AND B2 ∧ y:M ∈ \<parallel>(B2)\<parallel>
lemma CAND_ImpL_elim_aux:
[| x:ImpL <a>.M z.N x ∈ NEGn B (\<parallel><B>\<parallel>);
x:ImpL <a>.M z.N x ∉ BINDINGn B (\<parallel><B>\<parallel>) |]
==> ∃B1 B2.
B = B1 IMP B2 ∧
<a>:M ∈ \<parallel><B1>\<parallel> ∧ z:N ∈ \<parallel>(B2)\<parallel>
lemma CAND_ImpL_elim:
[| x:ImpL <a>.M z.N x ∈ \<parallel>(B)\<parallel>;
x:ImpL <a>.M z.N x ∉ BINDINGn B (\<parallel><B>\<parallel>) |]
==> ∃B1 B2.
B = B1 IMP B2 ∧
<a>:M ∈ \<parallel><B1>\<parallel> ∧ z:N ∈ \<parallel>(B2)\<parallel>
lemma CAND_ImpR_elim:
[| <a>:ImpR x.<b>.M a ∈ \<parallel><B>\<parallel>;
<a>:ImpR x.<b>.M a ∉ BINDINGc B (\<parallel>(B)\<parallel>) |]
==> ∃B1 B2.
B = B1 IMP B2 ∧
(∀z P. x \<sharp> (z, P) ∧ z:P ∈ \<parallel>(B2)\<parallel> -->
x:M{b:=z.P} ∈ \<parallel>(B1)\<parallel>) ∧
(∀c Q. b \<sharp> (c, Q) ∧ <c>:Q ∈ \<parallel><B1>\<parallel> -->
<b>:M{x:=<c>.Q} ∈ \<parallel><B2>\<parallel>)
lemma AXIOMS_imply_SNa(1):
<a>:M ∈ AXIOMSc B ==> SNa M
and AXIOMS_imply_SNa(2):
x:M ∈ AXIOMSn B ==> SNa M
lemma BINDING_imply_SNa(1):
<a>:M ∈ BINDINGc B (\<parallel>(B)\<parallel>) ==> SNa M
and BINDING_imply_SNa(2):
x:M ∈ BINDINGn B (\<parallel><B>\<parallel>) ==> SNa M
lemma CANDs_imply_SNa(1):
<a>:M ∈ \<parallel><B>\<parallel> ==> SNa M
and CANDs_imply_SNa(2):
x:M ∈ \<parallel>(B)\<parallel> ==> SNa M
lemma AXIOMS_preserved(1):
[| <a>:M ∈ AXIOMSc B; M -->a* M' |] ==> <a>:M' ∈ AXIOMSc B
and AXIOMS_preserved(2):
[| x:M ∈ AXIOMSn B; M -->a* M' |] ==> x:M' ∈ AXIOMSn B
lemma BINDING_preserved(1):
[| <a>:M ∈ BINDINGc B (\<parallel>(B)\<parallel>); M -->a* M' |]
==> <a>:M' ∈ BINDINGc B (\<parallel>(B)\<parallel>)
and BINDING_preserved(2):
[| x:M ∈ BINDINGn B (\<parallel><B>\<parallel>); M -->a* M' |]
==> x:M' ∈ BINDINGn B (\<parallel><B>\<parallel>)
lemma CANDs_preserved(1):
[| <a>:M ∈ \<parallel><B>\<parallel>; M -->a* M' |]
==> <a>:M' ∈ \<parallel><B>\<parallel>
and CANDs_preserved(2):
[| x:M ∈ \<parallel>(B)\<parallel>; M -->a* M' |]
==> x:M' ∈ \<parallel>(B)\<parallel>
lemma CANDs_preserved_single(1):
[| <a>:M ∈ \<parallel><B>\<parallel>; M -->a M' |]
==> <a>:M' ∈ \<parallel><B>\<parallel>
and CANDs_preserved_single(2):
[| x:M ∈ \<parallel>(B)\<parallel>; M -->a M' |]
==> x:M' ∈ \<parallel>(B)\<parallel>
lemma fic_CANDS:
[| ¬ fic M a; <a>:M ∈ \<parallel><B>\<parallel> |]
==> <a>:M ∈ AXIOMSc B ∨ <a>:M ∈ BINDINGc B (\<parallel>(B)\<parallel>)
lemma fin_CANDS_aux:
[| ¬ fin M x; x:M ∈ NEGn B (\<parallel><B>\<parallel>) |]
==> x:M ∈ AXIOMSn B ∨ x:M ∈ BINDINGn B (\<parallel><B>\<parallel>)
lemma fin_CANDS:
[| ¬ fin M x; x:M ∈ \<parallel>(B)\<parallel> |]
==> x:M ∈ AXIOMSn B ∨ x:M ∈ BINDINGn B (\<parallel><B>\<parallel>)
lemma BINDING_implies_CAND(1):
<c>:M ∈ BINDINGc B (\<parallel>(B)\<parallel>)
==> <c>:M ∈ \<parallel><B>\<parallel>
and BINDING_implies_CAND(2):
x:N ∈ BINDINGn B (\<parallel><B>\<parallel>) ==> x:N ∈ \<parallel>(B)\<parallel>
lemma Cut_a_redu_elim:
Cut <a>.M x.N -->a R
==> (∃M'. R = Cut <a>.M' x.N ∧ M -->a M') ∨
(∃N'. R = Cut <a>.M x.N' ∧ N -->a N') ∨
Cut <a>.M x.N -->c R ∨ Cut <a>.M x.N -->l R
lemma Cut_c_redu_elim:
Cut <a>.M x.N -->c R ==> R = M{a:=x.N} ∧ ¬ fic M a ∨ R = N{x:=<a>.M} ∧ ¬ fin N x
lemma not_fic_crename_aux:
[| fic M c; c \<sharp> (a, b) |] ==> fic (M[a\<turnstile>c>b]) c
lemma not_fic_crename:
[| ¬ fic (M[a\<turnstile>c>b]) c; c \<sharp> (a, b) |] ==> ¬ fic M c
lemma not_fin_crename_aux:
fin M y ==> fin (M[a\<turnstile>c>b]) y
lemma not_fin_crename:
¬ fin (M[a\<turnstile>c>b]) y ==> ¬ fin M y
lemma crename_fresh_interesting1:
[| c \<sharp> M[a\<turnstile>c>b]; c \<sharp> (a, b) |] ==> c \<sharp> M
lemma crename_fresh_interesting2:
x \<sharp> M[a\<turnstile>c>b] ==> x \<sharp> M
lemma fic_crename:
[| fic (M[a\<turnstile>c>b]) c; c \<sharp> (a, b) |] ==> fic M c
lemma fin_crename:
fin (M[a\<turnstile>c>b]) x ==> fin M x
lemma crename_Cut:
[| R[a\<turnstile>c>b] = Cut <c>.M x.N; c \<sharp> (a, b, N, R);
x \<sharp> (M, R) |]
==> ∃M' N'.
R = Cut <c>.M' x.N' ∧
M'[a\<turnstile>c>b] = M ∧
N'[a\<turnstile>c>b] = N ∧ c \<sharp> N' ∧ x \<sharp> M'
lemma crename_NotR:
[| R[a\<turnstile>c>b] = NotR x.N c; x \<sharp> R; c \<sharp> (a, b) |]
==> ∃N'. R = NotR x.N' c ∧ N'[a\<turnstile>c>b] = N
lemma crename_NotR':
[| R[a\<turnstile>c>b] = NotR x.N c; x \<sharp> R; c \<sharp> a |]
==> (∃N'. R = NotR x.N' c ∧ N'[a\<turnstile>c>b] = N) ∨
(∃N'. R = NotR x.N' a ∧ b = c ∧ N'[a\<turnstile>c>b] = N)
lemma crename_NotR_aux:
R[a\<turnstile>c>b] = NotR x.N c ==> a = c ∧ a = b ∨ a ≠ c
lemma crename_NotL:
[| R[a\<turnstile>c>b] = NotL <c>.N y; c \<sharp> (R, a, b) |]
==> ∃N'. R = NotL <c>.N' y ∧ N'[a\<turnstile>c>b] = N
lemma crename_AndL1:
[| R[a\<turnstile>c>b] = AndL1 x.N y; x \<sharp> R |]
==> ∃N'. R = AndL1 x.N' y ∧ N'[a\<turnstile>c>b] = N
lemma crename_AndL2:
[| R[a\<turnstile>c>b] = AndL2 x.N y; x \<sharp> R |]
==> ∃N'. R = AndL2 x.N' y ∧ N'[a\<turnstile>c>b] = N
lemma crename_AndR_aux:
R[a\<turnstile>c>b] = AndR <c>.M <d>.N e ==> a = e ∧ a = b ∨ a ≠ e
lemma crename_AndR:
[| R[a\<turnstile>c>b] = AndR <c>.M <d>.N e; c \<sharp> (a, b, d, e, N, R);
d \<sharp> (a, b, c, e, M, R); e \<sharp> (a, b) |]
==> ∃M' N'.
R = AndR <c>.M' <d>.N' e ∧
M'[a\<turnstile>c>b] = M ∧
N'[a\<turnstile>c>b] = N ∧ c \<sharp> N' ∧ d \<sharp> M'
lemma crename_AndR':
[| R[a\<turnstile>c>b] = AndR <c>.M <d>.N e; c \<sharp> (a, b, d, e, N, R);
d \<sharp> (a, b, c, e, M, R); e \<sharp> a |]
==> (∃M' N'.
R = AndR <c>.M' <d>.N' e ∧
M'[a\<turnstile>c>b] = M ∧
N'[a\<turnstile>c>b] = N ∧ c \<sharp> N' ∧ d \<sharp> M') ∨
(∃M' N'.
R = AndR <c>.M' <d>.N' a ∧
b = e ∧
M'[a\<turnstile>c>b] = M ∧
N'[a\<turnstile>c>b] = N ∧ c \<sharp> N' ∧ d \<sharp> M')
lemma crename_OrR1_aux:
R[a\<turnstile>c>b] = OrR1 <c>.M e ==> a = e ∧ a = b ∨ a ≠ e
lemma crename_OrR1:
[| R[a\<turnstile>c>b] = OrR1 <c>.N d; c \<sharp> (R, a, b);
d \<sharp> (a, b) |]
==> ∃N'. R = OrR1 <c>.N' d ∧ N'[a\<turnstile>c>b] = N
lemma crename_OrR1':
[| R[a\<turnstile>c>b] = OrR1 <c>.N d; c \<sharp> (R, a, b); d \<sharp> a |]
==> (∃N'. R = OrR1 <c>.N' d ∧ N'[a\<turnstile>c>b] = N) ∨
(∃N'. R = OrR1 <c>.N' a ∧ b = d ∧ N'[a\<turnstile>c>b] = N)
lemma crename_OrR2_aux:
R[a\<turnstile>c>b] = OrR2 <c>.M e ==> a = e ∧ a = b ∨ a ≠ e
lemma crename_OrR2:
[| R[a\<turnstile>c>b] = OrR2 <c>.N d; c \<sharp> (R, a, b);
d \<sharp> (a, b) |]
==> ∃N'. R = OrR2 <c>.N' d ∧ N'[a\<turnstile>c>b] = N
lemma crename_OrR2':
[| R[a\<turnstile>c>b] = OrR2 <c>.N d; c \<sharp> (R, a, b); d \<sharp> a |]
==> (∃N'. R = OrR2 <c>.N' d ∧ N'[a\<turnstile>c>b] = N) ∨
(∃N'. R = OrR2 <c>.N' a ∧ b = d ∧ N'[a\<turnstile>c>b] = N)
lemma crename_OrL:
[| R[a\<turnstile>c>b] = OrL x.M y.N z; x \<sharp> (y, z, N, R);
y \<sharp> (x, z, M, R) |]
==> ∃M' N'.
R = OrL x.M' y.N' z ∧
M'[a\<turnstile>c>b] = M ∧
N'[a\<turnstile>c>b] = N ∧ x \<sharp> N' ∧ y \<sharp> M'
lemma crename_ImpL:
[| R[a\<turnstile>c>b] = ImpL <c>.M y.N z; c \<sharp> (a, b, N, R);
y \<sharp> (z, M, R) |]
==> ∃M' N'.
R = ImpL <c>.M' y.N' z ∧
M'[a\<turnstile>c>b] = M ∧
N'[a\<turnstile>c>b] = N ∧ c \<sharp> N' ∧ y \<sharp> M'
lemma crename_ImpR_aux:
R[a\<turnstile>c>b] = ImpR x.<c>.M e ==> a = e ∧ a = b ∨ a ≠ e
lemma crename_ImpR:
[| R[a\<turnstile>c>b] = ImpR x.<c>.N d; c \<sharp> (R, a, b);
d \<sharp> (a, b); x \<sharp> R |]
==> ∃N'. R = ImpR x.<c>.N' d ∧ N'[a\<turnstile>c>b] = N
lemma crename_ImpR':
[| R[a\<turnstile>c>b] = ImpR x.<c>.N d; c \<sharp> (R, a, b); x \<sharp> R;
d \<sharp> a |]
==> (∃N'. R = ImpR x.<c>.N' d ∧ N'[a\<turnstile>c>b] = N) ∨
(∃N'. R = ImpR x.<c>.N' a ∧ b = d ∧ N'[a\<turnstile>c>b] = N)
lemma crename_ax2:
N[a\<turnstile>c>b] = Ax x c ==> ∃d. N = Ax x d
lemma crename_interesting1:
distinct [a, b, c]
==> M[a\<turnstile>c>c][c\<turnstile>c>b] =
M[c\<turnstile>c>b][a\<turnstile>c>b]
lemma crename_interesting2:
[| a ≠ c; a ≠ d; a ≠ b; c ≠ d; b ≠ c |]
==> M[a\<turnstile>c>b][c\<turnstile>c>d] =
M[c\<turnstile>c>d][a\<turnstile>c>b]
lemma crename_interesting3:
M[a\<turnstile>c>c][x\<turnstile>n>y] = M[x\<turnstile>n>y][a\<turnstile>c>c]
lemma crename_credu:
M[a\<turnstile>c>b] -->c M' ==> ∃M0. M0[a\<turnstile>c>b] = M' ∧ M -->c M0
lemma crename_lredu:
M[a\<turnstile>c>b] -->l M' ==> ∃M0. M0[a\<turnstile>c>b] = M' ∧ M -->l M0
lemma crename_aredu:
[| M[a\<turnstile>c>b] -->a M'; a ≠ b |]
==> ∃M0. M0[a\<turnstile>c>b] = M' ∧ M -->a M0
lemma SNa_preserved_renaming1:
SNa M ==> SNa (M[a\<turnstile>c>b])
lemma nrename_interesting1:
distinct [x, y, z]
==> M[x\<turnstile>n>z][z\<turnstile>n>y] =
M[z\<turnstile>n>y][x\<turnstile>n>y]
lemma nrename_interesting2:
[| x ≠ z; x ≠ u; x ≠ y; z ≠ u; y ≠ z |]
==> M[x\<turnstile>n>y][z\<turnstile>n>u] =
M[z\<turnstile>n>u][x\<turnstile>n>y]
lemma not_fic_nrename_aux:
fic M c ==> fic (M[x\<turnstile>n>y]) c
lemma not_fic_nrename:
¬ fic (M[x\<turnstile>n>y]) c ==> ¬ fic M c
lemma fin_nrename:
[| fin M z; z \<sharp> (x, y) |] ==> fin (M[x\<turnstile>n>y]) z
lemma nrename_fresh_interesting1:
[| z \<sharp> M[x\<turnstile>n>y]; z \<sharp> (x, y) |] ==> z \<sharp> M
lemma nrename_fresh_interesting2:
c \<sharp> M[x\<turnstile>n>y] ==> c \<sharp> M
lemma fin_nrename2:
[| fin (M[x\<turnstile>n>y]) z; z \<sharp> (x, y) |] ==> fin M z
lemma nrename_Cut:
[| R[x\<turnstile>n>y] = Cut <c>.M z.N; c \<sharp> (N, R);
z \<sharp> (x, y, M, R) |]
==> ∃M' N'.
R = Cut <c>.M' z.N' ∧
M'[x\<turnstile>n>y] = M ∧
N'[x\<turnstile>n>y] = N ∧ c \<sharp> N' ∧ z \<sharp> M'
lemma nrename_NotR:
[| R[x\<turnstile>n>y] = NotR z.N c; z \<sharp> (R, x, y) |]
==> ∃N'. R = NotR z.N' c ∧ N'[x\<turnstile>n>y] = N
lemma nrename_NotL:
[| R[x\<turnstile>n>y] = NotL <c>.N z; c \<sharp> R; z \<sharp> (x, y) |]
==> ∃N'. R = NotL <c>.N' z ∧ N'[x\<turnstile>n>y] = N
lemma nrename_NotL':
[| R[x\<turnstile>n>y] = NotL <c>.N u; c \<sharp> R; x ≠ y |]
==> (∃N'. R = NotL <c>.N' u ∧ N'[x\<turnstile>n>y] = N) ∨
(∃N'. R = NotL <c>.N' x ∧ y = u ∧ N'[x\<turnstile>n>y] = N)
lemma nrename_NotL_aux:
R[x\<turnstile>n>y] = NotL <c>.N u ==> x = u ∧ x = y ∨ x ≠ u
lemma nrename_AndL1:
[| R[x\<turnstile>n>y] = AndL1 z.N u; z \<sharp> (R, x, y); u \<sharp> (x, y) |]
==> ∃N'. R = AndL1 z.N' u ∧ N'[x\<turnstile>n>y] = N
lemma nrename_AndL1':
[| R[x\<turnstile>n>y] = AndL1 v.N u; v \<sharp> (R, u, x, y); x ≠ y |]
==> (∃N'. R = AndL1 v.N' u ∧ N'[x\<turnstile>n>y] = N) ∨
(∃N'. R = AndL1 v.N' x ∧ y = u ∧ N'[x\<turnstile>n>y] = N)
lemma nrename_AndL1_aux:
R[x\<turnstile>n>y] = AndL1 v.N u ==> x = u ∧ x = y ∨ x ≠ u
lemma nrename_AndL2:
[| R[x\<turnstile>n>y] = AndL2 z.N u; z \<sharp> (R, x, y); u \<sharp> (x, y) |]
==> ∃N'. R = AndL2 z.N' u ∧ N'[x\<turnstile>n>y] = N
lemma nrename_AndL2':
[| R[x\<turnstile>n>y] = AndL2 v.N u; v \<sharp> (R, u, x, y); x ≠ y |]
==> (∃N'. R = AndL2 v.N' u ∧ N'[x\<turnstile>n>y] = N) ∨
(∃N'. R = AndL2 v.N' x ∧ y = u ∧ N'[x\<turnstile>n>y] = N)
lemma nrename_AndL2_aux:
R[x\<turnstile>n>y] = AndL2 v.N u ==> x = u ∧ x = y ∨ x ≠ u
lemma nrename_AndR:
[| R[x\<turnstile>n>y] = AndR <c>.M <d>.N e; c \<sharp> (d, e, N, R);
d \<sharp> (c, e, M, R) |]
==> ∃M' N'.
R = AndR <c>.M' <d>.N' e ∧
M'[x\<turnstile>n>y] = M ∧
N'[x\<turnstile>n>y] = N ∧ c \<sharp> N' ∧ d \<sharp> M'
lemma nrename_OrR1:
[| R[x\<turnstile>n>y] = OrR1 <c>.N d; c \<sharp> (R, d) |]
==> ∃N'. R = OrR1 <c>.N' d ∧ N'[x\<turnstile>n>y] = N
lemma nrename_OrR2:
[| R[x\<turnstile>n>y] = OrR2 <c>.N d; c \<sharp> (R, d) |]
==> ∃N'. R = OrR2 <c>.N' d ∧ N'[x\<turnstile>n>y] = N
lemma nrename_OrL:
[| R[u\<turnstile>n>v] = OrL x.M y.N z; x \<sharp> (y, z, u, v, N, R);
y \<sharp> (x, z, u, v, M, R); z \<sharp> (u, v) |]
==> ∃M' N'.
R = OrL x.M' y.N' z ∧
M'[u\<turnstile>n>v] = M ∧
N'[u\<turnstile>n>v] = N ∧ x \<sharp> N' ∧ y \<sharp> M'
lemma nrename_OrL':
[| R[x\<turnstile>n>y] = OrL v.M w.N u; v \<sharp> (R, N, u, x, y);
w \<sharp> (R, M, u, x, y); x ≠ y |]
==> (∃M' N'.
R = OrL v.M' w.N' u ∧
M'[x\<turnstile>n>y] = M ∧ N'[x\<turnstile>n>y] = N) ∨
(∃M' N'.
R = OrL v.M' w.N' x ∧
y = u ∧ M'[x\<turnstile>n>y] = M ∧ N'[x\<turnstile>n>y] = N)
lemma nrename_OrL_aux:
R[x\<turnstile>n>y] = OrL v.M w.N u ==> x = u ∧ x = y ∨ x ≠ u
lemma nrename_ImpL:
[| R[x\<turnstile>n>y] = ImpL <c>.M u.N z; c \<sharp> (N, R);
u \<sharp> (y, x, z, M, R); z \<sharp> (x, y) |]
==> ∃M' N'.
R = ImpL <c>.M' u.N' z ∧
M'[x\<turnstile>n>y] = M ∧
N'[x\<turnstile>n>y] = N ∧ c \<sharp> N' ∧ u \<sharp> M'
lemma nrename_ImpL':
[| R[x\<turnstile>n>y] = ImpL <c>.M w.N u; c \<sharp> (R, N);
w \<sharp> (R, M, u, x, y); x ≠ y |]
==> (∃M' N'.
R = ImpL <c>.M' w.N' u ∧
M'[x\<turnstile>n>y] = M ∧ N'[x\<turnstile>n>y] = N) ∨
(∃M' N'.
R = ImpL <c>.M' w.N' x ∧
y = u ∧ M'[x\<turnstile>n>y] = M ∧ N'[x\<turnstile>n>y] = N)
lemma nrename_ImpL_aux:
R[x\<turnstile>n>y] = ImpL <c>.M w.N u ==> x = u ∧ x = y ∨ x ≠ u
lemma nrename_ImpR:
[| R[u\<turnstile>n>v] = ImpR x.<c>.N d; c \<sharp> (R, d);
x \<sharp> (R, u, v) |]
==> ∃N'. R = ImpR x.<c>.N' d ∧ N'[u\<turnstile>n>v] = N
lemma nrename_credu:
M[x\<turnstile>n>y] -->c M' ==> ∃M0. M0[x\<turnstile>n>y] = M' ∧ M -->c M0
lemma nrename_ax2:
N[x\<turnstile>n>y] = Ax z c ==> ∃z. N = Ax z c
lemma fic_nrename:
fic (M[x\<turnstile>n>y]) c ==> fic M c
lemma nrename_lredu:
M[x\<turnstile>n>y] -->l M' ==> ∃M0. M0[x\<turnstile>n>y] = M' ∧ M -->l M0
lemma nrename_aredu:
[| M[x\<turnstile>n>y] -->a M'; x ≠ y |]
==> ∃M0. M0[x\<turnstile>n>y] = M' ∧ M -->a M0
lemma SNa_preserved_renaming2:
SNa N ==> SNa (N[x\<turnstile>n>y])
lemma SNa_elim:
SNa M ==> (∀M. (∀N. M -->a N --> P N) --> P M) --> P M
lemma wf_SNa_restricted:
wf (A_Redu_set ∩ UNIV × SNa_set)
lemma wf_SNa_Redu:
wf SNa_Redu
lemma wf_measure_triple:
wf (measure size <*lex*> SNa_Redu <*lex*> SNa_Redu)
lemma my_wf_induct_triple:
[| wf (r1.0 <*lex*> r2.0 <*lex*> r3.0);
!!x. (!!y. ((fst y, fst (snd y), snd (snd y)), fst x, fst (snd x),
snd (snd x))
∈ r1.0 <*lex*> r2.0 <*lex*> r3.0 -->
P y)
==> P x |]
==> P x
lemma my_wf_induct_triple':
[| wf (r1.0 <*lex*> r2.0 <*lex*> r3.0);
!!x1 x2 x3.
(!!y1 y2 y3.
((y1, y2, y3), x1, x2, x3) ∈ r1.0 <*lex*> r2.0 <*lex*> r3.0 -->
P (y1, y2, y3))
==> P (x1, x2, x3) |]
==> P (x1.0, x2.0, x3.0)
lemma my_wf_induct_triple'':
[| wf (r1.0 <*lex*> r2.0 <*lex*> r3.0);
!!x1 x2 x3.
(!!y1 y2 y3.
((y1, y2, y3), x1, x2, x3) ∈ r1.0 <*lex*> r2.0 <*lex*> r3.0 -->
P y1 y2 y3)
==> P x1 x2 x3 |]
==> P x1.0 x2.0 x3.0
lemma excluded_m:
[| <a>:M ∈ \<parallel><B>\<parallel>; x:N ∈ \<parallel>(B)\<parallel> |]
==> (<a>:M ∈ BINDINGc B (\<parallel>(B)\<parallel>) ∨
x:N ∈ BINDINGn B (\<parallel><B>\<parallel>)) ∨
¬ (<a>:M ∈ BINDINGc B (\<parallel>(B)\<parallel>) ∨
x:N ∈ BINDINGn B (\<parallel><B>\<parallel>))
lemma tricky_subst:
[| b \<sharp> (c, N); z \<sharp> (x, P); M ≠ Ax z b |]
==> Cut <c>.N z.M{b:=x.P} = Cut <c>.N z.M{b:=x.P}
lemma CUT_SNa_aux:
[| <a>:M ∈ \<parallel><B>\<parallel>; SNa M; x:N ∈ \<parallel>(B)\<parallel>;
SNa N |]
==> SNa (Cut <a>.M x.N)
lemma CUT_SNa:
[| <a>:M ∈ \<parallel><B>\<parallel>; x:N ∈ \<parallel>(B)\<parallel> |]
==> SNa (Cut <a>.M x.N)
lemma findn_eqvt(1):
pi1.0 • findn ϑn x = findn (pi1.0 • ϑn) (pi1.0 • x)
and findn_eqvt(2):
pi2.0 • findn ϑn x = findn (pi2.0 • ϑn) (pi2.0 • x)
lemma findn_fresh:
x \<sharp> ϑn ==> findn ϑn x = None
lemma findc_eqvt(1):
pi1.0 • findc ϑc a = findc (pi1.0 • ϑc) (pi1.0 • a)
and findc_eqvt(2):
pi2.0 • findc ϑc a = findc (pi2.0 • ϑc) (pi2.0 • a)
lemma findc_fresh:
a \<sharp> ϑc ==> findc ϑc a = None
lemma nmaps_fresh:
[| ϑn nmaps x to Some (c, P); a \<sharp> ϑn |] ==> a \<sharp> (c, P)
lemma cmaps_fresh:
[| ϑc cmaps a to Some (y, P); x \<sharp> ϑc |] ==> x \<sharp> (y, P)
lemma nmaps_false:
[| ϑn nmaps x to Some (c, P); x \<sharp> ϑn |] ==> False
lemma cmaps_false:
[| ϑc cmaps c to Some (x, P); c \<sharp> ϑc |] ==> False
lemma lookupa_eqvt(1):
pi1.0 • lookupa x a ϑc = lookupa (pi1.0 • x) (pi1.0 • a) (pi1.0 • ϑc)
and lookupa_eqvt(2):
pi2.0 • lookupa x a ϑc = lookupa (pi2.0 • x) (pi2.0 • a) (pi2.0 • ϑc)
lemma lookupa_fire:
ϑc cmaps a to Some (y, P) ==> lookupa x a ϑc = Cut <a>.Ax x a y.P
lemma lookupb_eqvt(1):
pi1.0 • lookupb x a ϑc c P =
lookupb (pi1.0 • x) (pi1.0 • a) (pi1.0 • ϑc) (pi1.0 • c) (pi1.0 • P)
and lookupb_eqvt(2):
pi2.0 • lookupb x a ϑc c P =
lookupb (pi2.0 • x) (pi2.0 • a) (pi2.0 • ϑc) (pi2.0 • c) (pi2.0 • P)
lemma lookup_eqvt(1):
pi1.0 • lookup x a ϑn ϑc =
lookup (pi1.0 • x) (pi1.0 • a) (pi1.0 • ϑn) (pi1.0 • ϑc)
and lookup_eqvt(2):
pi2.0 • lookup x a ϑn ϑc =
lookup (pi2.0 • x) (pi2.0 • a) (pi2.0 • ϑn) (pi2.0 • ϑc)
lemma lookupc_eqvt(1):
pi1.0 • lookupc x a ϑn = lookupc (pi1.0 • x) (pi1.0 • a) (pi1.0 • ϑn)
and lookupc_eqvt(2):
pi2.0 • lookupc x a ϑn = lookupc (pi2.0 • x) (pi2.0 • a) (pi2.0 • ϑn)
lemma lookupd_eqvt(1):
pi1.0 • lookupd x a ϑn = lookupd (pi1.0 • x) (pi1.0 • a) (pi1.0 • ϑn)
and lookupd_eqvt(2):
pi2.0 • lookupd x a ϑn = lookupd (pi2.0 • x) (pi2.0 • a) (pi2.0 • ϑn)
lemma lookupa_fresh:
a \<sharp> ϑc ==> lookupa y a ϑc = Ax y a
lemma lookupa_csubst:
a \<sharp> ϑc ==> Cut <a>.Ax y a x.P = lookupa y a ϑc{a:=x.P}
lemma lookupa_freshness(1):
a \<sharp> (ϑc, c) ==> a \<sharp> lookupa y c ϑc
and lookupa_freshness(2):
x \<sharp> (ϑc, y) ==> x \<sharp> lookupa y c ϑc
lemma lookupa_unicity:
[| lookupa x a ϑc = Ax y b; b \<sharp> ϑc; y \<sharp> ϑc |] ==> x = y ∧ a = b
lemma lookupb_csubst:
a \<sharp> (ϑc, c, N) ==> Cut <c>.N x.P = lookupb y a ϑc c N{a:=x.P}
lemma lookupb_freshness(1):
a \<sharp> (ϑc, c, b, P) ==> a \<sharp> lookupb y c ϑc b P
and lookupb_freshness(2):
x \<sharp> (ϑc, y, P) ==> x \<sharp> lookupb y c ϑc b P
lemma lookupb_unicity:
[| lookupb x a ϑc c P = Ax y b; b \<sharp> (ϑc, c, P); y \<sharp> ϑc |]
==> x = y ∧ a = b
lemma lookupb_lookupa:
x \<sharp> ϑc ==> lookupb x c ϑc a P = lookupa x c ϑc{x:=<a>.P}
lemma lookup_csubst:
a \<sharp> (ϑn, ϑc)
==> lookup y c ϑn ((a, x, P) # ϑc) = lookup y c ϑn ϑc{a:=x.P}
lemma lookup_fresh:
x \<sharp> (ϑn, ϑc) ==> lookup x c ϑn ϑc = lookupa x c ϑc
lemma lookup_unicity:
[| lookup x a ϑn ϑc = Ax y b; b \<sharp> (ϑc, ϑn); y \<sharp> (ϑc, ϑn) |]
==> x = y ∧ a = b
lemma lookup_freshness(1):
a \<sharp> (c, ϑc, ϑn) ==> a \<sharp> lookup y c ϑn ϑc
and lookup_freshness(2):
x \<sharp> (y, ϑc, ϑn) ==> x \<sharp> lookup y c ϑn ϑc
lemma lookupc_freshness(1):
a \<sharp> (ϑc, c) ==> a \<sharp> lookupc y c ϑc
and lookupc_freshness(2):
x \<sharp> (ϑc, y) ==> x \<sharp> lookupc y c ϑc
lemma lookupc_fresh:
y \<sharp> ϑn ==> lookupc y a ϑn = Ax y a
lemma lookupc_nmaps:
ϑn nmaps x to Some (c, P) ==> lookupc x a ϑn = P[c\<turnstile>c>a]
lemma lookupc_unicity:
[| lookupc y a ϑn = Ax x b; x \<sharp> ϑn |] ==> y = x
lemma lookupd_fresh:
a \<sharp> ϑc ==> lookupd y a ϑc = Ax y a
lemma lookupd_unicity:
[| lookupd y a ϑc = Ax y b; b \<sharp> ϑc |] ==> a = b
lemma lookupd_freshness(1):
a \<sharp> (ϑc, c) ==> a \<sharp> lookupd y c ϑc
and lookupd_freshness(2):
x \<sharp> (ϑc, y) ==> x \<sharp> lookupd y c ϑc
lemma lookupd_cmaps:
ϑc cmaps a to Some (x, P) ==> lookupd y a ϑc = P[x\<turnstile>n>y]
lemma stn_eqvt(1):
pi1.0 • stn M ϑn = stn (pi1.0 • M) (pi1.0 • ϑn)
and stn_eqvt(2):
pi2.0 • stn M ϑn = stn (pi2.0 • M) (pi2.0 • ϑn)
lemma stc_eqvt(1):
pi1.0 • stc M ϑc = stc (pi1.0 • M) (pi1.0 • ϑc)
and stc_eqvt(2):
pi2.0 • stc M ϑc = stc (pi2.0 • M) (pi2.0 • ϑc)
lemma stn_fresh(1):
a \<sharp> (ϑn, M) ==> a \<sharp> stn M ϑn
and stn_fresh(2):
x \<sharp> (ϑn, M) ==> x \<sharp> stn M ϑn
lemma stc_fresh(1):
a \<sharp> (ϑc, M) ==> a \<sharp> stc M ϑc
and stc_fresh(2):
x \<sharp> (ϑc, M) ==> x \<sharp> stc M ϑc
lemma option_case_eqvt1(1):
pi1.0 • (case B of None => r | Some (x, P) => s x P) =
(case pi1.0 • B of None => pi1.0 • r | Some (x, P) => (pi1.0 • s) x P)
and option_case_eqvt1(2):
pi2.0 • (case B of None => r | Some (x, P) => s x P) =
(case pi2.0 • B of None => pi2.0 • r | Some (x, P) => (pi2.0 • s) x P)
lemma option_case_eqvt2(1):
pi1.0 • (case B of None => r | Some (x, P) => s x P) =
(case pi1.0 • B of None => pi1.0 • r | Some (x, P) => (pi1.0 • s) x P)
and option_case_eqvt2(2):
pi2.0 • (case B of None => r | Some (x, P) => s x P) =
(case pi2.0 • B of None => pi2.0 • r | Some (x, P) => (pi2.0 • s) x P)
lemma case_cong:
[| B1.0 = B2.0; x1.0 = x2.0; y1.0 = y2.0 |]
==> (case B1.0 of None => x1.0 | Some (x, P) => y1.0 x P) =
(case B2.0 of None => x2.0 | Some (x, P) => y2.0 x P)
lemma find_maps(1):
ϑc cmaps a to findc ϑc a
and find_maps(2):
ϑn nmaps x to findn ϑn x
lemma psubst_eqvt(1):
pi1.0 • ϑn,ϑc<M> = (pi1.0 • ϑn),(pi1.0 • ϑc)<(pi1.0 • M)>
and psubst_eqvt(2):
pi2.0 • ϑn,ϑc<M> = (pi2.0 • ϑn),(pi2.0 • ϑc)<(pi2.0 • M)>
lemma ax_psubst:
[| ϑn,ϑc<M> = Ax x a; a \<sharp> (ϑn, ϑc); x \<sharp> (ϑn, ϑc) |] ==> M = Ax x a
lemma better_Cut_substc1:
[| a \<sharp> (P, b); b \<sharp> N |]
==> Cut <a>.M x.N{b:=y.P} = Cut <a>.M{b:=y.P} x.N
lemma better_Cut_substc2:
[| x \<sharp> (y, P); b \<sharp> (a, M); N ≠ Ax x b |]
==> Cut <a>.M x.N{b:=y.P} = Cut <a>.M x.N{b:=y.P}
lemma better_Cut_substn1:
[| y \<sharp> (x, N); a \<sharp> (b, P); M ≠ Ax y a |]
==> Cut <a>.M x.N{y:=<b>.P} = Cut <a>.M{y:=<b>.P} x.N
lemma better_Cut_substn2:
[| x \<sharp> (P, y); y \<sharp> M |]
==> Cut <a>.M x.N{y:=<b>.P} = Cut <a>.M x.N{y:=<b>.P}
lemma psubst_fresh_name:
[| x \<sharp> ϑn; x \<sharp> ϑc; x \<sharp> M |] ==> x \<sharp> ϑn,ϑc<M>
lemma psubst_fresh_coname:
[| a \<sharp> ϑn; a \<sharp> ϑc; a \<sharp> M |] ==> a \<sharp> ϑn,ϑc<M>
lemma psubst_csubst:
a \<sharp> (ϑn, ϑc) ==> ϑn,((a, x, P) # ϑc)<M> = ϑn,ϑc<M>{a:=x.P}
lemma psubst_nsubst:
x \<sharp> (ϑn, ϑc) ==> ((x, a, P) # ϑn),ϑc<M> = ϑn,ϑc<M>{x:=<a>.P}
lemma ncloses_elim:
[| (x, B) ∈ set Γ; ϑn ncloses Γ |]
==> ∃c P. ϑn nmaps x to Some (c, P) ∧ <c>:P ∈ \<parallel><B>\<parallel>
lemma ccloses_elim:
[| (a, B) ∈ set Δ; ϑc ccloses Δ |]
==> ∃x P. ϑc cmaps a to Some (x, P) ∧ x:P ∈ \<parallel>(B)\<parallel>
lemma ncloses_subset:
[| ϑn ncloses Γ; set Γ' ⊆ set Γ |] ==> ϑn ncloses Γ'
lemma ccloses_subset:
[| ϑc ccloses Δ; set Δ' ⊆ set Δ |] ==> ϑc ccloses Δ'
lemma validc_fresh:
a \<sharp> Δ ==> ¬ (∃B. (a, B) ∈ set Δ)
lemma validn_fresh:
x \<sharp> Γ ==> ¬ (∃B. (x, B) ∈ set Γ)
lemma ccloses_extend:
[| ϑc ccloses Δ; a \<sharp> Δ; a \<sharp> ϑc; x:P ∈ \<parallel>(B)\<parallel> |]
==> (a, x, P) # ϑc ccloses (a, B) # Δ
lemma ncloses_extend:
[| ϑn ncloses Γ; x \<sharp> Γ; x \<sharp> ϑn;
<a>:P ∈ \<parallel><B>\<parallel> |]
==> (x, a, P) # ϑn ncloses (x, B) # Γ
lemma fresh_set_member(1):
[| x \<sharp> L; e ∈ set L |] ==> x \<sharp> e
and fresh_set_member(2):
[| a \<sharp> L; e ∈ set L |] ==> a \<sharp> e
lemma fresh_subset(1):
[| x \<sharp> L; set L' ⊆ set L |] ==> x \<sharp> L'
and fresh_subset(2):
[| a \<sharp> L; set L' ⊆ set L |] ==> a \<sharp> L'
lemma fresh_subset_ext(1):
[| x \<sharp> L; x \<sharp> e; set L' ⊆ set (e # L) |] ==> x \<sharp> L'
and fresh_subset_ext(2):
[| a \<sharp> L; a \<sharp> e; set L' ⊆ set (e # L) |] ==> a \<sharp> L'
lemma fresh_under_insert(1):
[| x \<sharp> Γ; x ≠ y; set Γ' = insert (y, B) (set Γ) |] ==> x \<sharp> Γ'
and fresh_under_insert(2):
[| a \<sharp> Δ; a ≠ c; set Δ' = insert (c, B) (set Δ) |] ==> a \<sharp> Δ'
lemma validn_elim:
validn ((x, B) # Γ) ==> validn Γ ∧ x \<sharp> Γ
lemma validc_elim:
validc ((a, B) # Δ) ==> validc Δ ∧ a \<sharp> Δ
lemma context_fresh(1):
x \<sharp> Γ ==> ¬ (∃B. (x, B) ∈ set Γ)
and context_fresh(2):
a \<sharp> Δ ==> ¬ (∃B. (a, B) ∈ set Δ)
lemma typing_implies_valid:
Γ \<turnstile> M \<turnstile> Δ ==> validn Γ ∧ validc Δ
lemma ty_perm(1):
pi1.0 • B = B
and ty_perm(2):
pi2.0 • B = B
lemma ctxt_perm(1):
pi2.0 • Γ = Γ
and ctxt_perm(2):
pi1.0 • Δ = Δ
lemma typing_Ax_elim1:
Γ \<turnstile> Ax x a \<turnstile> ((a, B) # Δ) ==> (x, B) ∈ set Γ
lemma typing_Ax_elim2:
((x, B) # Γ) \<turnstile> Ax x a \<turnstile> Δ ==> (a, B) ∈ set Δ
lemma psubst_Ax_aux:
ϑc cmaps a to Some (y, N) ==> lookupb x a ϑc c P = Cut <c>.P y.N
lemma psubst_Ax:
[| ϑn nmaps x to Some (c, P); ϑc cmaps a to Some (y, N) |]
==> ϑn,ϑc<Ax x a> = Cut <c>.P y.N
lemma psubst_Cut:
[| ∀x. M ≠ Ax x c; ∀a. N ≠ Ax x a; c \<sharp> (ϑn, ϑc, N);
x \<sharp> (ϑn, ϑc, M) |]
==> ϑn,ϑc<Cut <c>.M x.N> = Cut <c>.ϑn,ϑc<M> x.ϑn,ϑc<N>
lemma all_CAND:
[| Γ \<turnstile> M \<turnstile> Δ; ϑn ncloses Γ; ϑc ccloses Δ |]
==> SNa (ϑn,ϑc<M>)
lemma idn_eqvt(1):
pi1.0 • idn Γ a = idn (pi1.0 • Γ) (pi1.0 • a)
and idn_eqvt(2):
pi2.0 • idn Γ a = idn (pi2.0 • Γ) (pi2.0 • a)
lemma idc_eqvt(1):
pi1.0 • idc Δ x = idc (pi1.0 • Δ) (pi1.0 • x)
and idc_eqvt(2):
pi2.0 • idc Δ x = idc (pi2.0 • Δ) (pi2.0 • x)
lemma ccloses_id:
idc Δ x ccloses Δ
lemma ncloses_id:
idn Γ a ncloses Γ
lemma fresh_idn(1):
x \<sharp> Γ ==> x \<sharp> idn Γ a
and fresh_idn(2):
a \<sharp> (Γ, b) ==> a \<sharp> idn Γ b
lemma fresh_idc(1):
x \<sharp> (Δ, y) ==> x \<sharp> idc Δ y
and fresh_idc(2):
a \<sharp> Δ ==> a \<sharp> idc Δ y
lemma idc_cmaps:
idc Δ y cmaps b to Some (x, M) ==> M = Ax x b
lemma idn_nmaps:
idn Γ a nmaps x to Some (b, M) ==> M = Ax x b
lemma lookup1:
x \<sharp> idn Γ b ==> lookup x a (idn Γ b) ϑc = lookupa x a ϑc
lemma lookup2:
¬ x \<sharp> idn Γ b ==> lookup x a (idn Γ b) ϑc = lookupb x a ϑc b (Ax x b)
lemma lookup3:
a \<sharp> idc Δ y ==> lookupa x a (idc Δ y) = Ax x a
lemma lookup4:
¬ a \<sharp> idc Δ y ==> lookupa x a (idc Δ y) = Cut <a>.Ax x a y.Ax y a
lemma lookup5:
a \<sharp> idc Δ y ==> lookupb x a (idc Δ y) c P = Cut <c>.P x.Ax x a
lemma lookup6:
¬ a \<sharp> idc Δ y ==> lookupb x a (idc Δ y) c P = Cut <c>.P y.Ax y a
lemma lookup7:
lookupc x a (idn Γ b) = Ax x a
lemma lookup8:
lookupd x a (idc Δ y) = Ax x a
lemma id_redu:
idn Γ x,idc Δ a<M> -->a* M
theorem ALL_SNa:
Γ \<turnstile> M \<turnstile> Δ ==> SNa M