# HG changeset patch # User paulson # Date 1721076503 -3600 # Node ID f1872ef41766e0f1440fdf2d7a7e1ba2ad1268c1 # Parent 38c63d4027c489a484608900dfd1af03b41679c2 Revised mixfix and streamlined proofs diff -r 38c63d4027c4 -r f1872ef41766 src/HOL/Nominal/Examples/Class1.thy --- a/src/HOL/Nominal/Examples/Class1.thy Fri Jul 12 14:18:56 2024 +0200 +++ b/src/HOL/Nominal/Examples/Class1.thy Mon Jul 15 21:48:23 2024 +0100 @@ -50,17 +50,17 @@ 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) + | Cut "\coname\trm" "\name\trm" ("Cut <_>._ (_)._" [0,100,1000,100] 101) + | NotR "\name\trm" "coname" ("NotR (_)._ _" [100,100,100] 101) + | NotL "\coname\trm" "name" ("NotL <_>._ _" [0,100,100] 101) + | AndR "\coname\trm" "\coname\trm" "coname" ("AndR <_>._ <_>._ _" [0,100,0,100,100] 101) + | AndL1 "\name\trm" "name" ("AndL1 (_)._ _" [100,100,100] 101) + | AndL2 "\name\trm" "name" ("AndL2 (_)._ _" [100,100,100] 101) + | OrR1 "\coname\trm" "coname" ("OrR1 <_>._ _" [100,100,100] 101) + | OrR2 "\coname\trm" "coname" ("OrR2 <_>._ _" [100,100,100] 101) + | OrL "\name\trm" "\name\trm" "name" ("OrL (_)._ (_)._ _" [100,100,100,100,100] 101) + | ImpR "\name\(\coname\trm)" "coname" ("ImpR (_).<_>._ _" [100,100,100,100] 101) + | ImpL "\coname\trm" "\name\trm" "name" ("ImpL <_>._ (_)._ _" [100,100,100,100,100] 101) text \named terms\ @@ -1319,217 +1319,151 @@ lemma better_NotL_substn: assumes a: "y\M" shows "(NotL .M y){y:=.P} = fresh_fun (\x'. Cut .P (x').NotL .M x')" -using a -apply - -apply(generate_fresh "coname") -apply(subgoal_tac "NotL .M y = NotL .([(ca,a)]\M) y") -apply(auto simp: fresh_left calc_atm forget) -apply(generate_fresh "name") -apply(rule_tac f="fresh_fun" in arg_cong) -apply(simp add: fun_eq_iff) -apply(rule allI) -apply(simp add: trm.inject alpha fresh_prod fresh_atm) -apply(perm_simp add: trm.inject alpha fresh_prod fresh_atm fresh_left, auto) -done +proof (generate_fresh "coname") + fix ca :: coname + assume d: "ca \ (M, P, a, c, y)" + then have "NotL .M y = NotL .([(ca,a)]\M) y" + by (metis alpha(2) fresh_prod perm_fresh_fresh(2) trm.inject(4)) + with a d show ?thesis + apply(simp add: fresh_left calc_atm forget) + apply (metis trm.inject(4)) + done +qed lemma better_AndL1_substn: assumes a: "y\[x].M" shows "(AndL1 (x).M y){y:=.P} = fresh_fun (\z'. Cut .P (z').AndL1 (x).M z')" -using a -apply - -apply(generate_fresh "name") -apply(subgoal_tac "AndL1 (x).M y = AndL1 (ca).([(ca,x)]\M) y") -apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] -apply(generate_fresh "name") -apply(rule_tac f="fresh_fun" in arg_cong) -apply(simp add: fun_eq_iff) -apply(rule allI) -apply(simp add: trm.inject alpha fresh_prod fresh_atm) -apply(rule forget) -apply(simp add: fresh_left calc_atm) -apply(rule_tac f="fresh_fun" in arg_cong) -apply(simp add: fun_eq_iff) -apply(rule allI) -apply(simp add: trm.inject alpha fresh_prod fresh_atm) -apply(rule forget) -apply(simp add: fresh_left calc_atm) -apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) -apply(auto) -done +proof (generate_fresh "name") + fix d:: name + assume d: "d \ (M, P, c, x, y)" + then have \
: "AndL1 (x).M y = AndL1 (d).([(d,x)]\M) y" + by (metis alpha(1) fresh_prodD(1) perm_fresh_fresh(1) trm.inject(6)) + with d have "(\z'. Cut .P (z').AndL1 (d).([(d, x)] \ M){x:=.P} (z')) + = (\z'. Cut .P (z').AndL1 (x).M (z'))" + by (metis forget(1) fresh_bij(1) fresh_prodD(1) swap_simps(1) trm.inject(6)) + with d have "(\z'. Cut .P (z').AndL1 d.([(d, x)] \ M){y:=.P} z') + = (\z'. Cut .P (z').AndL1 (x).M (z'))" + apply(simp add: trm.inject alpha fresh_prod fresh_atm) + by (metis abs_fresh(1) assms forget(1) fresh_atm(1) fresh_aux(1) nrename_nfresh nrename_swap) + with d \
show ?thesis + by (simp add: fresh_left calc_atm) +qed lemma better_AndL2_substn: assumes a: "y\[x].M" shows "(AndL2 (x).M y){y:=.P} = fresh_fun (\z'. Cut .P (z').AndL2 (x).M z')" -using a -apply - -apply(generate_fresh "name") -apply(subgoal_tac "AndL2 (x).M y = AndL2 (ca).([(ca,x)]\M) y") -apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] -apply(generate_fresh "name") -apply(rule_tac f="fresh_fun" in arg_cong) -apply(simp add: fun_eq_iff) -apply(rule allI) -apply(simp add: trm.inject alpha fresh_prod fresh_atm) -apply(rule forget) -apply(simp add: fresh_left calc_atm) -apply(rule_tac f="fresh_fun" in arg_cong) -apply(simp add: fun_eq_iff) -apply(rule allI) -apply(simp add: trm.inject alpha fresh_prod fresh_atm) -apply(rule forget) -apply(simp add: fresh_left calc_atm) -apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) -apply(auto) -done +proof (generate_fresh "name") + fix d:: name + assume d: "d \ (M, P, c, x, y)" + then have \
: "AndL2 (x).M y = AndL2 (d).([(d,x)]\M) y" + by (metis alpha(1) fresh_prodD(1) perm_fresh_fresh(1) trm.inject(7)) + with d have "(\z'. Cut .P (z').AndL2 (d).([(d, x)] \ M){x:=.P} (z')) + = (\z'. Cut .P (z').AndL2 (x).M (z'))" + by (metis forget(1) fresh_bij(1) fresh_prodD(1) swap_simps(1) trm.inject(7)) + with d have "(\z'. Cut .P (z').AndL2 d.([(d, x)] \ M){y:=.P} z') + = (\z'. Cut .P (z').AndL2 (x).M (z'))" + apply(simp add: trm.inject alpha fresh_prod fresh_atm) + by (metis abs_fresh(1) assms forget(1) fresh_atm(1) fresh_aux(1) nrename_nfresh nrename_swap) + with d \
show ?thesis + by (simp add: fresh_left calc_atm) +qed lemma better_AndR_substc: - assumes a: "c\([a].M,[b].N)" + assumes "c\([a].M,[b].N)" shows "(AndR .M .N c){c:=(z).P} = fresh_fun (\a'. Cut .(AndR .M .N a') (z).P)" -using a -apply - -apply(generate_fresh "coname") -apply(generate_fresh "coname") -apply(subgoal_tac "AndR .M .N c = AndR .([(ca,a)]\M) .([(caa,b)]\N) c") -apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] -apply(rule trans) -apply(rule substc.simps) -apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1] -apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1] -apply(auto simp: fresh_prod fresh_atm)[1] -apply(simp) -apply(rule_tac f="fresh_fun" in arg_cong) -apply(simp add: fun_eq_iff) -apply(rule allI) -apply(simp add: trm.inject alpha fresh_prod fresh_atm) -apply(rule conjI) -apply(rule forget) -apply(auto simp: fresh_left calc_atm abs_fresh)[1] -apply(rule forget) -apply(auto simp: fresh_left calc_atm abs_fresh)[1] -apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) -apply(auto) -done +proof (generate_fresh "coname" , generate_fresh "coname") + fix d :: coname + and e :: coname + assume d: "d \ (M, N, P, a, b, c, z)" + and e: "e \ (M, N, P, a, b, c, z, d)" + then have "AndR .M .N c = AndR .([(d,a)]\M) .([(e,b)]\N) c" + by (perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) auto + with assms d e show ?thesis + apply (auto simp: fresh_left calc_atm fresh_prod fresh_atm) + by (metis (no_types, opaque_lifting) abs_fresh(2) forget(2) trm.inject(5)) +qed lemma better_OrL_substn: - assumes a: "x\([y].M,[z].N)" + assumes "x\([y].M,[z].N)" shows "(OrL (y).M (z).N x){x:=.P} = fresh_fun (\z'. Cut .P (z').OrL (y).M (z).N z')" -using a -apply - -apply(generate_fresh "name") -apply(generate_fresh "name") -apply(subgoal_tac "OrL (y).M (z).N x = OrL (ca).([(ca,y)]\M) (caa).([(caa,z)]\N) x") -apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] -apply(rule trans) -apply(rule substn.simps) -apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1] -apply(auto simp: fresh_left calc_atm fresh_prod fresh_atm)[1] -apply(auto simp: fresh_prod fresh_atm)[1] -apply(simp) -apply(rule_tac f="fresh_fun" in arg_cong) -apply(simp add: fun_eq_iff) -apply(rule allI) -apply(simp add: trm.inject alpha fresh_prod fresh_atm) -apply(rule conjI) -apply(rule forget) -apply(auto simp: fresh_left calc_atm abs_fresh)[1] -apply(rule forget) -apply(auto simp: fresh_left calc_atm abs_fresh)[1] -apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) -apply(auto) -done +proof (generate_fresh "name" , generate_fresh "name") + fix d :: name + and e :: name + assume d: "d \ (M, N, P, c, x, y, z)" + and e: "e \ (M, N, P, c, x, y, z, d)" + with assms have "OrL (y).M (z).N x = OrL (d).([(d,y)]\M) (e).([(e,z)]\N) x" + by (perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) auto + with assms d e show ?thesis + apply (auto simp: fresh_left calc_atm fresh_prod fresh_atm) + by (metis (no_types, lifting) abs_fresh(1) forget(1) trm.inject(10)) +qed lemma better_OrR1_substc: assumes a: "d\[a].M" shows "(OrR1 .M d){d:=(z).P} = fresh_fun (\a'. Cut .OrR1 .M a' (z).P)" -using a -apply - -apply(generate_fresh "coname") -apply(subgoal_tac "OrR1 .M d = OrR1 .([(c,a)]\M) d") -apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] -apply(rule_tac f="fresh_fun" in arg_cong) -apply(simp add: fun_eq_iff) -apply(rule allI) -apply(simp add: trm.inject alpha fresh_prod fresh_atm) -apply(rule forget) -apply(simp add: fresh_left calc_atm) -apply(rule_tac f="fresh_fun" in arg_cong) -apply(simp add: fun_eq_iff) -apply(rule allI) -apply(simp add: trm.inject alpha fresh_prod fresh_atm) -apply(rule forget) -apply(simp add: fresh_left calc_atm) -apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) -apply(auto) -done +proof (generate_fresh "coname") + fix c :: coname + assume c: "c \ (M, P, a, d, z)" + then have "OrR1 .M d = OrR1 .([(c,a)]\M) d" + by (perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) auto + with assms c show ?thesis + apply (auto simp: fresh_left calc_atm fresh_prod fresh_atm) + by (metis abs_fresh(2) forget(2) trm.inject(8)) +qed lemma better_OrR2_substc: assumes a: "d\[a].M" shows "(OrR2 .M d){d:=(z).P} = fresh_fun (\a'. Cut .OrR2 .M a' (z).P)" -using a -apply - -apply(generate_fresh "coname") -apply(subgoal_tac "OrR2 .M d = OrR2 .([(c,a)]\M) d") -apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] -apply(rule_tac f="fresh_fun" in arg_cong) -apply(simp add: fun_eq_iff) -apply(rule allI) -apply(simp add: trm.inject alpha fresh_prod fresh_atm) -apply(rule forget) -apply(simp add: fresh_left calc_atm) -apply(rule_tac f="fresh_fun" in arg_cong) -apply(simp add: fun_eq_iff) -apply(rule allI) -apply(simp add: trm.inject alpha fresh_prod fresh_atm) -apply(rule forget) -apply(simp add: fresh_left calc_atm) -apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) -apply(auto) -done +proof (generate_fresh "coname") + fix c :: coname + assume c: "c \ (M, P, a, d, z)" + then have "OrR2 .M d = OrR2 .([(c,a)]\M) d" + by (perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm) auto + with assms c show ?thesis + apply (auto simp: fresh_left calc_atm fresh_prod fresh_atm) + by (metis abs_fresh(2) forget(2) trm.inject(9)) +qed lemma better_ImpR_substc: - assumes a: "d\[a].M" + assumes "d\[a].M" shows "(ImpR (x)..M d){d:=(z).P} = fresh_fun (\a'. Cut .ImpR (x)..M a' (z).P)" -using a -apply - -apply(generate_fresh "coname") -apply(generate_fresh "name") -apply(subgoal_tac "ImpR (x)..M d = ImpR (ca)..([(c,a)]\[(ca,x)]\M) d") -apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] -apply(rule_tac f="fresh_fun" in arg_cong) -apply(simp add: fun_eq_iff) -apply(rule allI) -apply(simp add: trm.inject alpha fresh_prod fresh_atm abs_perm abs_fresh fresh_left calc_atm) -apply(rule forget) -apply(simp add: fresh_left calc_atm) -apply(rule_tac f="fresh_fun" in arg_cong) -apply(simp add: fun_eq_iff) -apply(rule allI) -apply(simp add: trm.inject alpha fresh_prod fresh_atm abs_perm fresh_left calc_atm abs_fresh) -apply(rule forget) -apply(simp add: fresh_left calc_atm) -apply(rule sym) -apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm abs_fresh abs_perm) -done +proof (generate_fresh "coname" , generate_fresh "name") + fix c :: coname + and c' :: name + assume c: "c \ (M, P, a, d, x, z)" + and c': "c' \ (M, P, a, d, x, z, c)" + have \: "ImpR (x)..M d = ImpR (c')..([(c,a)]\[(c',x)]\M) d" + apply (rule sym) + using c c' + apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm abs_fresh abs_perm) + done + with assms c c' have "fresh_fun + (\a'. Cut .ImpR (c')..(([(c, a)] \ [(c', x)] \ M)){d:=(z).P} a' (z).P) + = fresh_fun (\a'. Cut .ImpR (x)..M a' (z).P)" + apply(intro arg_cong [where f="fresh_fun"]) + by(fastforce simp add: trm.inject alpha fresh_prod fresh_atm abs_perm fresh_left calc_atm abs_fresh forget) + with assms c c' \ show ?thesis + by (auto simp: fresh_left calc_atm forget abs_fresh) +qed lemma better_ImpL_substn: - assumes a: "y\(M,[x].N)" + assumes "y\(M,[x].N)" shows "(ImpL .M (x).N y){y:=.P} = fresh_fun (\z'. Cut .P (z').ImpL .M (x).N z')" -using a -apply - -apply(generate_fresh "coname") -apply(generate_fresh "name") -apply(subgoal_tac "ImpL .M (x).N y = ImpL .([(ca,a)]\M) (caa).([(caa,x)]\N) y") -apply(auto simp: fresh_left calc_atm forget abs_fresh)[1] -apply(rule_tac f="fresh_fun" in arg_cong) -apply(simp add: fun_eq_iff) -apply(rule allI) -apply(simp add: trm.inject alpha fresh_prod fresh_atm abs_perm abs_fresh fresh_left calc_atm) -apply(rule forget) -apply(simp add: fresh_left calc_atm) -apply(auto)[1] -apply(rule sym) -apply(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm abs_fresh abs_perm) -done +proof (generate_fresh "coname" , generate_fresh "name") + fix ca :: coname + and caa :: name + assume d: "ca \ (M, N, P, a, c, x, y)" + and e: "caa \ (M, N, P, a, c, x, y, ca)" + have "ImpL .M (x).N y = ImpL .([(ca,a)]\M) (caa).([(caa,x)]\N) y" + apply(rule sym) + using d e + by(perm_simp add: trm.inject alpha fresh_left calc_atm fresh_prod fresh_atm abs_fresh abs_perm) + with d e assms show ?thesis + apply(simp add: fresh_left calc_atm forget abs_fresh) + apply(intro arg_cong [where f="fresh_fun"] ext) + apply(simp add: trm.inject alpha fresh_prod fresh_atm abs_perm abs_fresh fresh_left calc_atm) + by (metis forget(1) fresh_aux(1) fresh_bij(1) swap_simps(1)) +qed lemma freshn_after_substc: fixes x::"name" @@ -1556,170 +1490,124 @@ by (meson assms fresh_def subset_iff supp_subst6) lemma substn_crename_comm: - assumes a: "c\a" "c\b" + assumes "c\a" "c\b" shows "M{x:=.P}[a\c>b] = M[a\c>b]{x:=.(P[a\c>b])}" -using a -apply(nominal_induct M avoiding: x c P a b rule: trm.strong_induct) -apply(auto simp: subst_fresh rename_fresh trm.inject) -apply(subgoal_tac "\x'::name. x'\(P,x,c)") -apply(erule exE) -apply(subgoal_tac "Cut .P (x).Ax x a = Cut .P (x').Ax x' a") -apply(simp) -apply(rule trans) -apply(rule crename.simps) -apply(simp add: fresh_prod fresh_atm) -apply(simp) -apply(simp add: trm.inject) -apply(simp add: alpha trm.inject calc_atm fresh_atm) -apply(simp add: trm.inject) -apply(simp add: alpha trm.inject calc_atm fresh_atm) -apply(rule exists_fresh') -apply(rule fin_supp) -apply(rule trans) -apply(rule better_crename_Cut) -apply(simp add: fresh_atm) -apply(simp) -apply(simp add: crename_id) -apply(rule trans) -apply(rule better_crename_Cut) -apply(simp add: fresh_atm fresh_prod) -apply(simp add: rename_fresh fresh_atm) -apply(auto simp: fresh_atm)[1] -apply(rule trans) -apply(rule better_crename_Cut) -apply(simp add: fresh_atm) -apply(auto simp: fresh_atm)[1] -apply(drule crename_ax) -apply(simp add: fresh_atm) -apply(simp add: fresh_atm) -apply(simp) -apply(subgoal_tac "\x'::name. x'\(trm{x:=.P},P,P[a\c>b],x,trm[a\c>b]{x:=.P[a\c>b]})") -apply(erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_NotL) -apply(rule trans) -apply(rule better_crename_Cut) -apply(simp add: fresh_atm fresh_prod) -apply(simp add: rename_fresh fresh_atm) -apply(rule exists_fresh') -apply(rule fin_supp) -apply(subgoal_tac "\x'::name. x'\(trm{x:=.P},P,P[a\c>b],name1,trm[a\c>b]{x:=.P[a\c>b]})") -apply(erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_AndL1) -apply(rule trans) -apply(rule better_crename_Cut) -apply(simp add: fresh_atm fresh_prod) -apply(simp add: rename_fresh fresh_atm) -apply(rule exists_fresh') -apply(rule fin_supp) -apply(subgoal_tac "\x'::name. x'\(trm{x:=.P},P,P[a\c>b],name1,trm[a\c>b]{x:=.P[a\c>b]})") -apply(erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_AndL2) -apply(rule trans) -apply(rule better_crename_Cut) -apply(simp add: fresh_atm fresh_prod) -apply(simp add: rename_fresh fresh_atm) -apply(rule exists_fresh') -apply(rule fin_supp) -apply(subgoal_tac "\x'::name. x'\(trm1{x:=.P},trm2{x:=.P},P,P[a\c>b],name1,name2, - trm1[a\c>b]{x:=.P[a\c>b]},trm2[a\c>b]{x:=.P[a\c>b]})") -apply(erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_OrL) -apply(rule trans) -apply(rule better_crename_Cut) -apply(simp add: fresh_atm fresh_prod) -apply(simp add: rename_fresh subst_fresh fresh_atm) -apply(rule exists_fresh') -apply(rule fin_supp) -apply(subgoal_tac "\x'::name. x'\(trm1{name2:=.P},trm2{name2:=.P},P,P[a\c>b],name1, - trm1[a\c>b]{name2:=.P[a\c>b]},trm2[a\c>b]{name2:=.P[a\c>b]})") -apply(erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_ImpL) -apply(rule trans) -apply(rule better_crename_Cut) -apply(simp add: fresh_atm fresh_prod) -apply(simp add: rename_fresh subst_fresh fresh_atm) -apply(rule exists_fresh') -apply(rule fin_supp) -done +using assms +proof (nominal_induct M avoiding: x c P a b rule: trm.strong_induct) + case (Ax name coname) + then show ?case + by(auto simp: subst_fresh rename_fresh trm.inject better_crename_Cut fresh_atm) +next + case (Cut coname trm1 name trm2) + then show ?case + apply(simp add: rename_fresh better_crename_Cut fresh_atm) + by (meson crename_ax) +next + case (NotL coname trm name) + obtain x'::name where "x'\(trm{x:=.P},P,P[a\c>b],x,trm[a\c>b]{x:=.P[a\c>b]})" + by (meson exists_fresh(1) fs_name1) + with NotL show ?case + apply (simp add: subst_fresh rename_fresh trm.inject) + by (force simp: fresh_prod fresh_fun_simp_NotL better_crename_Cut fresh_atm) +next + case (AndL1 name1 trm name2) + obtain x'::name where "x'\(trm{x:=.P},P,P[a\c>b],name1,trm[a\c>b]{x:=.P[a\c>b]})" + by (meson exists_fresh(1) fs_name1) + with AndL1 show ?case + apply (simp add: subst_fresh rename_fresh trm.inject) + apply (force simp: fresh_prod fresh_fun_simp_AndL1 better_crename_Cut fresh_atm) + done +next + case (AndL2 name1 trm name2) + obtain x'::name where x': "x'\(trm{x:=.P},P,P[a\c>b],name1,trm[a\c>b]{x:=.P[a\c>b]})" + by (meson exists_fresh(1) fs_name1) + with AndL2 show ?case + apply (simp add: subst_fresh rename_fresh trm.inject) + apply (auto simp: fresh_prod fresh_fun_simp_AndL2 better_crename_Cut fresh_atm) + done +next + case (OrL name1 trm1 name2 trm2 name3) + obtain x'::name where x': "x'\(trm1{x:=.P},trm2{x:=.P},P,P[a\c>b],name1,name2, + trm1[a\c>b]{x:=.P[a\c>b]},trm2[a\c>b]{x:=.P[a\c>b]})" + by (meson exists_fresh(1) fs_name1) + with OrL show ?case + apply (simp add: subst_fresh rename_fresh trm.inject) + apply (auto simp: fresh_atm subst_fresh fresh_prod fresh_fun_simp_OrL better_crename_Cut) + done + next + case (ImpL coname trm1 name1 trm2 name2) + obtain x'::name where x': "x'\(trm1{x:=.P},trm2{x:=.P},P,P[a\c>b],name1,name2, + trm1[a\c>b]{x:=.P[a\c>b]},trm2[a\c>b]{x:=.P[a\c>b]})" + by (meson exists_fresh(1) fs_name1) + with ImpL show ?case + apply (simp add: subst_fresh rename_fresh trm.inject) + apply (auto simp: fresh_atm subst_fresh fresh_prod fresh_fun_simp_ImpL better_crename_Cut) + done +qed (auto simp: subst_fresh rename_fresh) + lemma substc_crename_comm: - assumes a: "c\a" "c\b" + assumes "c\a" "c\b" shows "M{c:=(x).P}[a\c>b] = M[a\c>b]{c:=(x).(P[a\c>b])}" -using a -apply(nominal_induct M avoiding: x c P a b rule: trm.strong_induct) -apply(auto simp: subst_fresh rename_fresh trm.inject) -apply(rule trans) -apply(rule better_crename_Cut) -apply(simp add: fresh_atm fresh_prod) -apply(simp add: rename_fresh fresh_atm) -apply(rule trans) -apply(rule better_crename_Cut) -apply(simp add: fresh_atm fresh_prod) -apply(simp add: rename_fresh fresh_atm) -apply(drule crename_ax) -apply(simp add: fresh_atm) -apply(simp add: fresh_atm) -apply(simp) -apply(subgoal_tac "\c'::coname. c'\(a,b,trm{coname:=(x).P},P,P[a\c>b],x,trm[a\c>b]{coname:=(x).P[a\c>b]})") -apply(erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_NotR) -apply(rule trans) -apply(rule better_crename_Cut) -apply(simp add: fresh_atm fresh_prod) -apply(simp add: rename_fresh fresh_atm) -apply(rule exists_fresh') -apply(rule fin_supp) -apply(subgoal_tac "\c'::coname. c'\(coname1,coname2,a,b,trm1{coname3:=(x).P},trm2{coname3:=(x).P}, - P,P[a\c>b],x,trm1[a\c>b]{coname3:=(x).P[a\c>b]},trm2[a\c>b]{coname3:=(x).P[a\c>b]})") -apply(erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_AndR) -apply(rule trans) -apply(rule better_crename_Cut) -apply(simp add: fresh_atm fresh_prod) -apply(simp add: rename_fresh subst_fresh fresh_atm) -apply(rule exists_fresh') -apply(rule fin_supp) -apply(subgoal_tac "\c'::coname. c'\(coname1,trm{coname2:=(x).P},P,P[a\c>b],a,b, - trm[a\c>b]{coname2:=(x).P[a\c>b]})") -apply(erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_OrR1) -apply(rule trans) -apply(rule better_crename_Cut) -apply(simp add: fresh_atm fresh_prod) -apply(simp add: rename_fresh fresh_atm) -apply(rule exists_fresh') -apply(rule fin_supp) -apply(subgoal_tac "\c'::coname. c'\(coname1,trm{coname2:=(x).P},P,P[a\c>b],a,b, - trm[a\c>b]{coname2:=(x).P[a\c>b]})") -apply(erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_OrR2) -apply(rule trans) -apply(rule better_crename_Cut) -apply(simp add: fresh_atm fresh_prod) -apply(simp add: rename_fresh fresh_atm) -apply(rule exists_fresh') -apply(rule fin_supp) -apply(subgoal_tac "\c'::coname. c'\(coname1,trm{coname2:=(x).P},P,P[a\c>b],a,b, - trm[a\c>b]{coname2:=(x).P[a\c>b]})") -apply(erule exE, simp add: fresh_prod) -apply(erule conjE)+ -apply(simp add: fresh_fun_simp_ImpR) -apply(rule trans) -apply(rule better_crename_Cut) -apply(simp add: fresh_atm fresh_prod) -apply(simp add: rename_fresh fresh_atm) -apply(rule exists_fresh') -apply(rule fin_supp) -done +using assms +proof (nominal_induct M avoiding: x c P a b rule: trm.strong_induct) + case (Ax name coname) + then show ?case + by(auto simp: subst_fresh rename_fresh trm.inject better_crename_Cut fresh_atm) +next + case (Cut coname trm1 name trm2) + then show ?case + apply(simp add: rename_fresh better_crename_Cut) + by (meson crename_ax) +next + case (NotR name trm coname) + obtain c'::coname where "c'\(a,b,trm{coname:=(x).P},P,P[a\c>b],x,trm[a\c>b]{coname:=(x).P[a\c>b]})" + by (meson exists_fresh' fs_coname1) + with NotR show ?case + apply(simp add: subst_fresh rename_fresh trm.inject) + apply(clarsimp simp: fresh_prod) + apply(simp add: fresh_fun_simp_NotR) + by (simp add: better_crename_Cut fresh_atm(2)) +next + case (AndR coname1 trm1 coname2 trm2 coname3) + obtain c'::coname where "c'\(coname1,coname2,a,b,trm1{coname3:=(x).P},trm2{coname3:=(x).P}, + P,P[a\c>b],x,trm1[a\c>b]{coname3:=(x).P[a\c>b]},trm2[a\c>b]{coname3:=(x).P[a\c>b]})" + by (meson exists_fresh' fs_coname1) + with AndR show ?case + apply(simp add: subst_fresh rename_fresh trm.inject) + apply(clarsimp simp: fresh_prod) + apply(simp add: fresh_fun_simp_AndR) + by (simp add: better_crename_Cut subst_fresh fresh_atm(2)) +next + case (OrR1 coname1 trm coname2) + obtain c'::coname where "c'\(coname1,trm{coname2:=(x).P},P,P[a\c>b],a,b, trm[a\c>b]{coname2:=(x).P[a\c>b]})" + by (meson exists_fresh' fs_coname1) + with OrR1 show ?case + apply(simp add: subst_fresh rename_fresh trm.inject) + apply(clarsimp simp: fresh_prod) + apply(simp add: fresh_fun_simp_OrR1) + by (simp add: better_crename_Cut fresh_atm(2)) +next + case (OrR2 coname1 trm coname2) + obtain c'::coname where "c'\(coname1,trm{coname2:=(x).P},P,P[a\c>b],a,b, trm[a\c>b]{coname2:=(x).P[a\c>b]})" + by (meson exists_fresh' fs_coname1) + with OrR2 show ?case + apply(simp add: subst_fresh rename_fresh trm.inject) + apply(clarsimp simp: fresh_prod) + apply(simp add: fresh_fun_simp_OrR2) + by (simp add: better_crename_Cut fresh_atm(2)) +next + case (ImpR name coname1 trm coname2) + obtain c'::coname where "c'\(coname1,trm{coname2:=(x).P},P,P[a\c>b],a,b, trm[a\c>b]{coname2:=(x).P[a\c>b]})" + by (meson exists_fresh' fs_coname1) + with ImpR show ?case + apply(simp add: subst_fresh rename_fresh trm.inject) + apply(clarsimp simp: fresh_prod) + apply(simp add: fresh_fun_simp_ImpR) + by (simp add: better_crename_Cut fresh_atm(2)) +qed (auto simp: subst_fresh rename_fresh trm.inject) + + lemma substn_nrename_comm: assumes a: "x\y" "x\z" @@ -2421,58 +2309,35 @@ equivariance fic lemma fic_Ax_elim: - assumes a: "fic (Ax x a) b" + assumes "fic (Ax x a) b" shows "a=b" -using a -apply(erule_tac fic.cases) -apply(auto simp: trm.inject) -done + using assms by (auto simp: trm.inject elim!: fic.cases) lemma fic_NotR_elim: - assumes a: "fic (NotR (x).M a) b" + assumes "fic (NotR (x).M a) b" shows "a=b \ b\M" -using a -apply(erule_tac fic.cases) -apply(auto simp: trm.inject) -apply(subgoal_tac "b\[xa].Ma") -apply(drule sym) -apply(simp_all add: abs_fresh) -done + using assms + by (auto simp: trm.inject elim!: fic.cases) (metis abs_fresh(6)) lemma fic_OrR1_elim: - assumes a: "fic (OrR1 .M b) c" + assumes "fic (OrR1 .M b) c" shows "b=c \ c\[a].M" -using a -apply(erule_tac fic.cases) -apply(auto simp: trm.inject) -done + using assms by (auto simp: trm.inject elim!: fic.cases) lemma fic_OrR2_elim: - assumes a: "fic (OrR2 .M b) c" + assumes "fic (OrR2 .M b) c" shows "b=c \ c\[a].M" -using a -apply(erule_tac fic.cases) -apply(auto simp: trm.inject) -done + using assms by (auto simp: trm.inject elim!: fic.cases) lemma fic_AndR_elim: - assumes a: "fic (AndR .M .N c) d" + assumes "fic (AndR .M .N c) d" shows "c=d \ d\[a].M \ d\[b].N" -using a -apply(erule_tac fic.cases) -apply(auto simp: trm.inject) -done + using assms by (auto simp: trm.inject elim!: fic.cases) lemma fic_ImpR_elim: assumes a: "fic (ImpR (x)..M b) c" shows "b=c \ b\[a].M" -using a -apply(erule_tac fic.cases) -apply(auto simp: trm.inject) -apply(subgoal_tac "c\[xa].[aa].Ma") -apply(drule sym) -apply(simp_all add: abs_fresh) -done + using assms by (auto simp: trm.inject elim!: fic.cases) (metis abs_fresh(6)) lemma fic_rest_elims: shows "fic (Cut .M (x).N) d \ False"