diff -r d9c3cc271e62 -r 7ab36bc29cc2 Nominal/Ex/Classical.thy --- a/Nominal/Ex/Classical.thy Tue Jul 05 15:00:41 2011 +0200 +++ b/Nominal/Ex/Classical.thy Tue Jul 05 15:01:10 2011 +0200 @@ -47,7 +47,6 @@ thm trm.supp thm trm.supp[simplified] - nominal_primrec crename :: "trm \ coname \ coname \ trm" ("_[_\c>_]" [100,100,100] 100) where @@ -77,6 +76,7 @@ apply (simp_all add: fresh_star_def)[12] apply(metis)+ -- "compatibility" + apply(all_trivials) apply(simp_all) apply(rule conjI) apply(elim conjE) @@ -216,7 +216,229 @@ apply(blast) done +termination + by lexicographic_order +nominal_primrec + nrename :: "trm \ name \ name \ trm" ("_[_\n>_]" [100,100,100] 100) +where + "(Ax x a)[u\n>v] = (if x=u then Ax v a else Ax x a)" +| "atom x \ (u, v) \ (Cut .M (x).N)[u\n>v] = Cut .(M[u\n>v]) (x).(N[u\n>v])" +| "atom x \ (u, v) \ (NotR (x).M a)[u\n>v] = NotR (x).(M[u\n>v]) a" +| "(NotL .M x)[u\n>v] = (if x=u then NotL .(M[u\n>v]) v else NotL .(M[u\n>v]) x)" +| "(AndR .M .N c)[u\n>v] = AndR .(M[u\n>v]) .(N[u\n>v]) c" +| "atom x \ (u, v) \ (AndL1 (x).M y)[u\n>v] = + (if y=u then AndL1 (x).(M[u\n>v]) v else AndL1 (x).(M[u\n>v]) y)" +| "atom x \ (u, v) \ (AndL2 (x).M y)[u\n>v] = + (if y=u then AndL2 (x).(M[u\n>v]) v else AndL2 (x).(M[u\n>v]) y)" +| "(OrR1 .M b)[u\n>v] = OrR1 .(M[u\n>v]) b" +| "(OrR2 .M b)[u\n>v] = OrR2 .(M[u\n>v]) b" +| "\atom x \ (u, v); atom y \ (u, v)\ \ (OrL (x).M (y).N z)[u\n>v] = + (if z=u then OrL (x).(M[u\n>v]) (y).(N[u\n>v]) v else OrL (x).(M[u\n>v]) (y).(N[u\n>v]) z)" +| "atom x \ (u, v) \ (ImpR (x)..M b)[u\n>v] = ImpR (x)..(M[u\n>v]) b" +| "atom x \ (u, v) \ (ImpL .M (x).N y)[u\n>v] = + (if y=u then ImpL .(M[u\n>v]) (x).(N[u\n>v]) v else ImpL .(M[u\n>v]) (x).(N[u\n>v]) y)" + apply(simp only: eqvt_def) + apply(simp only: nrename_graph_def) + apply (rule, perm_simp, rule) + apply(rule TrueI) + -- "covered all cases" + apply(case_tac x) + apply(rule_tac y="a" and c="(b, c)" in trm.strong_exhaust) + apply (simp_all add: fresh_star_def)[12] + apply(metis)+ + -- "compatibility" + apply(simp_all) + apply(rule conjI) + apply(elim conjE) + apply(erule_tac c="(ua,va)" in Abs_lst1_fcb2) + apply(simp add: Abs_fresh_iff) + apply(simp add: fresh_at_base fresh_star_def fresh_Pair) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(elim conjE) + apply(erule_tac c="(ua,va)" in Abs_lst1_fcb2) + apply(simp add: Abs_fresh_iff) + apply(simp add: fresh_at_base fresh_star_def fresh_Pair) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(elim conjE) + apply(erule_tac c="(ua,va)" in Abs_lst1_fcb2) + apply(simp add: Abs_fresh_iff) + apply(simp add: fresh_at_base fresh_star_def fresh_Pair) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(elim conjE) + apply(subgoal_tac "eqvt_at nrename_sumC (M, ua, va)") + apply(subgoal_tac "eqvt_at nrename_sumC (Ma, ua, va)") + apply(erule Abs_lst1_fcb2) + apply(simp add: Abs_fresh_iff) + apply(simp add: fresh_at_base fresh_star_def fresh_Pair) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(blast) + apply(blast) + apply(elim conjE) + apply(rule conjI) + apply(subgoal_tac "eqvt_at nrename_sumC (M, ua, va)") + apply(subgoal_tac "eqvt_at nrename_sumC (Ma, ua, va)") + apply(erule Abs_lst1_fcb2) + apply(simp add: Abs_fresh_iff) + apply(simp add: fresh_at_base fresh_star_def fresh_Pair) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(blast) + apply(blast) + apply(subgoal_tac "eqvt_at nrename_sumC (N, ua, va)") + apply(subgoal_tac "eqvt_at nrename_sumC (Na, ua, va)") + apply(erule Abs_lst1_fcb2) + apply(simp add: Abs_fresh_iff) + apply(simp add: fresh_at_base fresh_star_def fresh_Pair) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(blast) + apply(blast) + apply(elim conjE) + apply(subgoal_tac "eqvt_at nrename_sumC (M, ua, va)") + apply(subgoal_tac "eqvt_at nrename_sumC (Ma, ua, va)") + apply(erule Abs_lst1_fcb2) + apply(simp add: Abs_fresh_iff) + apply(simp add: fresh_at_base fresh_star_def fresh_Pair) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(blast) + apply(blast) + apply(elim conjE)+ + apply(subgoal_tac "eqvt_at nrename_sumC (M, ua, va)") + apply(subgoal_tac "eqvt_at nrename_sumC (Ma, ua, va)") + apply(erule Abs_lst1_fcb2) + apply(simp add: Abs_fresh_iff) + apply(simp add: fresh_at_base fresh_star_def fresh_Pair) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(blast) + apply(blast) + apply(elim conjE)+ + apply(erule_tac c="(ua,va)" in Abs_lst1_fcb2) + apply(simp add: Abs_fresh_iff) + apply(simp add: fresh_at_base fresh_star_def fresh_Pair) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(elim conjE) + apply(erule_tac c="(ua,va)" in Abs_lst1_fcb2) + apply(simp add: Abs_fresh_iff) + apply(simp add: fresh_at_base fresh_star_def fresh_Pair) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(elim conjE) + apply(rule conjI) + apply(subgoal_tac "eqvt_at nrename_sumC (M, ua, va)") + apply(subgoal_tac "eqvt_at nrename_sumC (Ma, ua, va)") + apply(erule Abs_lst1_fcb2) + apply(simp add: Abs_fresh_iff) + apply(simp add: fresh_at_base fresh_star_def fresh_Pair) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(blast) + apply(blast) + apply(subgoal_tac "eqvt_at nrename_sumC (N, ua, va)") + apply(subgoal_tac "eqvt_at nrename_sumC (Na, ua, va)") + apply(erule Abs_lst1_fcb2) + apply(simp add: Abs_fresh_iff) + apply(simp add: fresh_at_base fresh_star_def fresh_Pair) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(blast) + apply(blast) + apply(erule conjE)+ + apply(erule Abs_lst_fcb2) + apply(simp add: Abs_fresh_star) + apply(simp add: fresh_at_base fresh_star_def fresh_Pair) + apply(simp add: fresh_at_base fresh_star_def fresh_Pair) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(erule conjE)+ + apply(rule conjI) + apply(subgoal_tac "eqvt_at nrename_sumC (M, ua, va)") + apply(subgoal_tac "eqvt_at nrename_sumC (Ma, ua, va)") + apply(erule Abs_lst1_fcb2) + apply(simp add: Abs_fresh_iff) + apply(simp add: fresh_at_base fresh_star_def fresh_Pair) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(blast) + apply(blast) + apply(subgoal_tac "eqvt_at nrename_sumC (N, ua, va)") + apply(subgoal_tac "eqvt_at nrename_sumC (Na, ua, va)") + apply(erule Abs_lst1_fcb2) + apply(simp add: Abs_fresh_iff) + apply(simp add: fresh_at_base fresh_star_def fresh_Pair) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(simp add: eqvt_at_def atom_eqvt fresh_star_Pair perm_supp_eq) + apply(blast) + apply(blast) + done + +termination + by lexicographic_order + +lemma crename_name_eqvt[eqvt]: + shows "p \ (M[d\c>e]) = (p \ M)[(p \ d)\c>(p \ e)]" +apply(nominal_induct M avoiding: d e rule: trm.strong_induct) +apply(auto) +done + +lemma nrename_name_eqvt[eqvt]: + shows "p \ (M[x\n>y]) = (p \ M)[(p \ x)\n>(p \ y)]" +apply(nominal_induct M avoiding: x y rule: trm.strong_induct) +apply(auto) +done + +nominal_primrec + substn :: "trm \ name \ coname \ trm \ trm" ("_{_:=<_>._}" [100,100,100,100] 100) +where + "(Ax x a){y:=.P} = (if x=y then Cut .P (y).Ax y a else Ax x a)" +| "\atom a \ (c, P); atom x \ (y, P)\ \ (Cut .M (x).N){y:=.P} = + (if M=Ax y a then Cut .P (x).(N{y:=.P}) else Cut .(M{y:=.P}) (x).(N{y:=.P}))" +| "atom x\ (y, P) \ (NotR (x).M a){y:=.P} = NotR (x).(M{y:=.P}) a" +| "\atom a\ (c, P); atom x' \ (M, y, P)\ \ (NotL .M x){y:=.P} = + (if x=y then Cut .P (x').NotL .(M{y:=.P}) x' else NotL .(M{y:=.P}) x)" +| "\atom a \ (c, P); atom b \ (c, P)\ \ + (AndR .M .N d){y:=.P} = AndR .(M{y:=.P}) .(N{y:=.P}) d" +| "atom x \ (y, P) \ (AndL1 (x).M z){y:=.P} = + (if z=y then Cut .P (z').AndL1 (x).(M{y:=.P}) z' else AndL1 (x).(M{y:=.P}) z)" +| "atom x \ (y, P) \ (AndL2 (x).M z){y:=.P} = + (if z=y then Cut .P (z').AndL2 (x).(M{y:=.P}) z' else AndL2 (x).(M{y:=.P}) z)" +| "atom a \ (c, P) \ (OrR1 .M b){y:=.P} = OrR1 .(M{y:=.P}) b" +| "atom a \ (c, P) \ (OrR2 .M b){y:=.P} = OrR2 .(M{y:=.P}) b" +| "\atom x \ (y, P); atom u \ (y, P)\ \ (OrL (x).M (u).N z){y:=.P} = + (if z=y then Cut .P (z').OrL (x).(M{y:=.P}) (u).(N{y:=.P}) z' + else OrL (x).(M{y:=.P}) (u).(N{y:=.P}) z)" +| "\atom a \ (c, P); atom x \ (y, P)\ \ (ImpR (x)..M b){y:=.P} = ImpR (x)..(M{y:=.P}) b" +| "\atom a \ (c, P); atom x \ (y, P)\ \ (ImpL .M (x).N z){y:=.P} = + (if y=z then Cut .P (z').ImpL .(M{y:=.P}) (x).(N{y:=.P}) z' + else ImpL .(M{y:=.P}) (x).(N{y:=.P}) z)" + apply(simp only: eqvt_def) + apply(simp only: substn_graph_def) + apply (rule, perm_simp, rule) + apply(rule TrueI) + -- "covered all cases" + apply(case_tac x) + apply(rule_tac y="a" and c="(b, c, d)" in trm.strong_exhaust) + apply (simp_all add: fresh_star_def fresh_Pair)[12] + apply(metis)+ + apply(subgoal_tac "\x'::name. atom x' \ (trm, b, d)") + apply(auto simp add: fresh_Pair)[1] + apply(metis)+ + apply(subgoal_tac "\x'::name. atom x' \ (trm, b, d)") + apply(auto simp add: fresh_Pair)[1] + apply(rule obtain_fresh) + apply(auto)[1] + apply(metis)+ + -- "compatibility" + apply(all_trivials) + apply(simp) + oops end