diff -r bdec4a82f385 -r f76f187c91f9 src/HOL/Nominal/Examples/Weakening.thy --- a/src/HOL/Nominal/Examples/Weakening.thy Fri Feb 02 15:47:58 2007 +0100 +++ b/src/HOL/Nominal/Examples/Weakening.thy Fri Feb 02 17:16:16 2007 +0100 @@ -32,7 +32,7 @@ v1[intro]: "valid []" | v2[intro]: "\valid \;a\\\\ valid ((a,\)#\)" -lemma eqvt_valid: +lemma eqvt_valid[eqvt]: fixes pi:: "name prm" assumes a: "valid \" shows "valid (pi\\)" @@ -40,6 +40,8 @@ by (induct) (auto simp add: fresh_bij) +thm eqvt + text{* typing judgements *} inductive2 typing :: "(name\ty) list\lam\ty\bool" (" _ \ _ : _ " [80,80,80] 80) @@ -48,22 +50,22 @@ | t_App[intro]: "\\ \ t1 : \\\; \ \ t2 : \\\ \ \ App t1 t2 : \" | t_Lam[intro]: "\a\\;((a,\)#\) \ t : \\ \ \ \ Lam [a].t : \\\" -lemma eqvt_typing: +lemma eqvt_typing[eqvt]: fixes pi:: "name prm" assumes a: "\ \ t : \" - shows "(pi\\) \ (pi\t) : \" + shows "(pi\\) \ (pi\t) : (pi\\)" using a proof (induct) case (t_Var \ a \) have "valid (pi\\)" by (rule eqvt_valid) moreover have "(pi\(a,\))\(pi\set \)" by (rule pt_set_bij2[OF pt_name_inst, OF at_name_inst]) - ultimately show "(pi\\) \ (pi\Var a) : \" + ultimately show "(pi\\) \ (pi\Var a) : (pi\\)" using typing.intros by (force simp add: pt_list_set_pi[OF pt_name_inst, symmetric]) next case (t_Lam a \ \ t \) moreover have "(pi\a)\(pi\\)" by (simp add: fresh_bij) - ultimately show "(pi\\) \ (pi\Lam [a].t) :\\\" by force + ultimately show "(pi\\) \ (pi\Lam [a].t) :(pi\\\\)" by force qed (auto) text {* the strong induction principle needs to be derived manually *} @@ -76,26 +78,26 @@ and x :: "'a::fs_name" assumes a: "\ \ t : \" and a1: "\\ a \ x. \valid \; (a,\) \ set \\ \ P x \ (Var a) \" - and a2: "\\ \ \ t1 t2 x. - \\ \ t1 : \\\; (\z. P z \ t1 (\\\)); \ \ t2 : \; (\z. P z \ t2 \)\ + and a2: "\\ \ \ t1 t2 x. \\z. P z \ t1 (\\\); \z. P z \ t2 \\ \ P x \ (App t1 t2) \" - and a3: "\a \ \ \ t x. \a\x; a\\; ((a,\)#\) \ t : \; (\z. P z ((a,\)#\) t \)\ + and a3: "\a \ \ \ t x. \a\x; a\\; \z. P z ((a,\)#\) t \\ \ P x \ (Lam [a].t) (\\\)" shows "P x \ t \" proof - - from a have "\(pi::name prm) x. P x (pi\\) (pi\t) \" + from a have "\(pi::name prm) x. P x (pi\\) (pi\t) (pi\\)" proof (induct) case (t_Var \ a \) have "valid \" by fact - then have "valid (pi\\)" by (rule eqvt_valid) + then have "valid (pi\\)" by (rule eqvt) moreover have "(a,\)\set \" by fact then have "pi\(a,\)\pi\(set \)" by (simp only: pt_set_bij[OF pt_name_inst, OF at_name_inst]) then have "(pi\a,\)\set (pi\\)" by (simp add: pt_list_set_pi[OF pt_name_inst]) - ultimately show "P x (pi\\) (pi\(Var a)) \" using a1 by simp + ultimately show "P x (pi\\) (pi\(Var a)) (pi\\)" using a1 by simp next case (t_App \ t1 \ \ t2) - thus "P x (pi\\) (pi\(App t1 t2)) \" using a2 by (simp, blast intro: eqvt_typing) + thus "P x (pi\\) (pi\(App t1 t2)) (pi\\)" using a2 + by (simp only: eqvt) (blast) next case (t_Lam a \ \ t \) obtain c::"name" where fs: "c\(pi\a,pi\t,pi\\,x)" by (rule exists_fresh[OF fs_name1]) @@ -104,22 +106,18 @@ have f1: "a\\" by fact have f2: "(pi\a)\(pi\\)" using f1 by (simp add: fresh_bij) have f3: "c\?pi'\\" using f1 by (auto simp add: pt_name2 fresh_left calc_atm perm_pi_simp) - have pr1: "((a,\)#\)\t:\" by fact - then have "(?pi'\((a,\)#\)) \ (?pi'\t) : \" by (rule eqvt_typing) - then have "((c,\)#(?pi'\\)) \ (?pi'\t) : \" by (simp add: calc_atm) - moreover - have ih1: "\x. P x (?pi'\((a,\)#\)) (?pi'\t) \" by fact - then have "\x. P x ((c,\)#(?pi'\\)) (?pi'\t) \" by (simp add: calc_atm) - ultimately have "P x (?pi'\\) (Lam [c].(?pi'\t)) (\ \ \)" using a3 f3 fs by simp - then have "P x (?sw\pi\\) (?sw\(Lam [(pi\a)].(pi\t))) (\ \ \)" + have ih1: "\x. P x (?pi'\((a,\)#\)) (?pi'\t) (?pi'\\)" by fact + then have "\x. P x ((c,\)#(?pi'\\)) (?pi'\t) (?pi'\\)" by (simp add: calc_atm) + then have "P x (?pi'\\) (Lam [c].(?pi'\t)) (\\\)" using a3 f3 fs by simp + then have "P x (?sw\pi\\) (?sw\(Lam [(pi\a)].(pi\t))) (\\\)" by (simp del: append_Cons add: calc_atm pt_name2) moreover have "(?sw\(pi\\)) = (pi\\)" by (rule perm_fresh_fresh) (simp_all add: fs f2) moreover have "(?sw\(Lam [(pi\a)].(pi\t))) = Lam [(pi\a)].(pi\t)" by (rule perm_fresh_fresh) (simp_all add: fs f2 abs_fresh) - ultimately show "P x (pi\\) (pi\(Lam [a].t)) (\ \ \)" by (simp only: , simp) + ultimately show "P x (pi\\) (pi\(Lam [a].t)) (pi\\\\)" by (simp) qed - hence "P x (([]::name prm)\\) (([]::name prm)\t) \" by blast + hence "P x (([]::name prm)\\) (([]::name prm)\t) (([]::name prm)\\)" by blast thus "P x \ t \" by simp qed