# HG changeset patch # User urbanc # Date 1175015608 -7200 # Node ID bd4b954e85ee29288edfb54cb6cf9f84685ebb14 # Parent 62c76754da32598e5bd12fa1b4e88247e7da7376 adapted to nominal_inductive diff -r 62c76754da32 -r bd4b954e85ee src/HOL/Nominal/Examples/SOS.thy --- a/src/HOL/Nominal/Examples/SOS.thy Tue Mar 27 18:28:22 2007 +0200 +++ b/src/HOL/Nominal/Examples/SOS.thy Tue Mar 27 19:13:28 2007 +0200 @@ -9,7 +9,7 @@ (* termination-proof for evaluation. *) theory SOS - imports "Nominal" + imports "../Nominal" begin atom_decl name @@ -210,7 +210,7 @@ v_nil[intro]: "valid []" | v_cons[intro]: "\valid \;x\\\ \ valid ((x,T)#\)" -nominal_inductive valid . +equivariance valid inductive_cases2 valid_cons_inv_auto[elim]:"valid ((x,T)#\)" @@ -269,7 +269,7 @@ nominal_inductive typing by (simp_all add: abs_fresh fresh_prod fresh_atm) -lemmas typing_eqvt' = typing_eqvt [simplified] +lemmas typing_eqvt' = typing_eqvt[simplified] lemma typing_implies_valid: assumes "\ \ t : T" @@ -299,129 +299,7 @@ declare ty.inject [simp del] declare data.inject [simp del] -lemma typing_induct_strong - [consumes 1, case_names t_Var t_App t_Lam t_Const t_Pr t_Fst t_Snd t_InL t_InR t_Case]: - fixes P::"'a::fs_name \ (name\ty) list \ trm \ ty \bool" - and x :: "'a::fs_name" - assumes a: "\ \ e : T" - and a1: "\\ x T c. \valid \; (x,T)\set \\ \ P c \ (Var x) T" - and a2: "\\ e\<^isub>1 T\<^isub>1 T\<^isub>2 e\<^isub>2 c. \\c. P c \ e\<^isub>1 (T\<^isub>1\T\<^isub>2); \c. P c \ e\<^isub>2 T\<^isub>1\ \ P c \ (App e\<^isub>1 e\<^isub>2) T\<^isub>2" - and a3: "\x \ T\<^isub>1 t T\<^isub>2 c. \x\(\,c); \c. P c ((x,T\<^isub>1)#\) t T\<^isub>2\ \ P c \ (Lam [x].t) (T\<^isub>1\T\<^isub>2)" - and a4: "\\ n c. valid \ \ P c \ (Const n) (Data DNat)" - and a5: "\\ e\<^isub>1 S\<^isub>1 e\<^isub>2 S\<^isub>2 c. \\c. P c \ e\<^isub>1 (Data S\<^isub>1); \c. P c \ e\<^isub>2 (Data S\<^isub>2)\ - \ P c \ (Pr e\<^isub>1 e\<^isub>2) (Data (DProd S\<^isub>1 S\<^isub>2))" - and a6: "\\ e S\<^isub>1 S\<^isub>2 c. \\c. P c \ e (Data (DProd S\<^isub>1 S\<^isub>2))\ \ P c \ (Fst e) (Data S\<^isub>1)" - and a7: "\\ e S\<^isub>1 S\<^isub>2 c. \\c. P c \ e (Data (DProd S\<^isub>1 S\<^isub>2))\ \ P c \ (Snd e) (Data S\<^isub>2)" - and a8: "\\ e S\<^isub>1 S\<^isub>2 c. \\c. P c \ e (Data S\<^isub>1)\ \ P c \ (InL e) (Data (DSum S\<^isub>1 S\<^isub>2))" - and a9: "\\ e S\<^isub>2 S\<^isub>1 c. \\c. P c \ e (Data S\<^isub>2)\ \ P c \ (InR e) (Data (DSum S\<^isub>1 S\<^isub>2))" - and a10:"\x\<^isub>1 \ e e\<^isub>2 x\<^isub>2 e\<^isub>1 S\<^isub>1 S\<^isub>2 T c. - \x\<^isub>1\(\,e,e\<^isub>2,x\<^isub>2,c); x\<^isub>2\(\,e,e\<^isub>1,x\<^isub>1,c); - \c. P c \ e (Data (DSum S\<^isub>1 S\<^isub>2)); - \c. P c ((x\<^isub>1,Data S\<^isub>1)#\) e\<^isub>1 T; - \c. P c ((x\<^isub>2,Data S\<^isub>2)#\) e\<^isub>2 T\ - \ P c \ (Case e of inl x\<^isub>1 \ e\<^isub>1 | inr x\<^isub>2 \ e\<^isub>2) T" - shows "P c \ e T" -proof - - from a have "\(pi::name prm) c. P c (pi\\) (pi\e) T" - proof (induct) - case (t_Var \ x T pi c) - have "valid \" by fact - then have "valid (pi\\)" by (simp only: eqvt) - moreover - have "(x,T)\set \" by fact - then have "pi\(x,T)\pi\(set \)" by (simp only: pt_set_bij[OF pt_name_inst, OF at_name_inst]) - then have "(pi\x,T)\set (pi\\)" by (simp add: eqvt) - ultimately show "P c (pi\\) (pi\(Var x)) T" using a1 by simp - next - case (t_App \ e\<^isub>1 T\<^isub>1 T\<^isub>2 e\<^isub>2 pi c) - thus "P c (pi\\) (pi\(App e\<^isub>1 e\<^isub>2)) T\<^isub>2" using a2 by (simp, blast) - next - case (t_Lam x \ T\<^isub>1 t T\<^isub>2 pi c) - obtain y::"name" where fs: "y\(pi\x,pi\\,pi\t,c)" by (erule exists_fresh[OF fs_name1]) - let ?sw = "[(pi\x,y)]" - let ?pi' = "?sw@pi" - have f0: "x\\" by fact - have f1: "(pi\x)\(pi\\)" using f0 by (simp add: fresh_bij) - have f2: "y\?pi'\\" by (auto simp add: pt_name2 fresh_left calc_atm perm_pi_simp) - have ih1: "\c. P c (?pi'\((x,T\<^isub>1)#\)) (?pi'\t) T\<^isub>2" by fact - then have "P c (?pi'\\) (Lam [y].(?pi'\t)) (T\<^isub>1\T\<^isub>2)" using fs f2 a3 by (simp add: calc_atm) - then have "P c (?sw\pi\\) (?sw\(Lam [(pi\x)].(pi\t))) (T\<^isub>1\T\<^isub>2)" - by (simp del: append_Cons add: calc_atm pt_name2) - moreover have "(?sw\pi\\) = (pi\\)" - by (rule perm_fresh_fresh) (simp_all add: fs f1) - moreover have "(?sw\(Lam [(pi\x)].(pi\t))) = Lam [(pi\x)].(pi\t)" - by (rule perm_fresh_fresh) (simp_all add: fs f1 fresh_atm abs_fresh) - ultimately show "P c (pi\\) (pi\(Lam [x].t)) (T\<^isub>1\T\<^isub>2)" - by simp - next - case (t_Const \ n pi c) - thus "P c (pi\\) (pi\(Const n)) (Data DNat)" using a4 by (simp, blast intro: eqvt) - next - case (t_Pr \ e\<^isub>1 S\<^isub>1 e\<^isub>2 S\<^isub>2 pi c) - thus "P c (pi\\) (pi\(Pr e\<^isub>1 e\<^isub>2)) (Data (DProd S\<^isub>1 S\<^isub>2))" using a5 - by (simp) - next - case (t_Fst \ e S\<^isub>1 S\<^isub>2 pi c) - thus "P c (pi\\) (pi\(Fst e)) (Data S\<^isub>1)" using a6 by (simp, blast) - next - case (t_Snd \ e S\<^isub>1 S\<^isub>2 pi c) - thus "P c (pi\\) (pi\(Snd e)) (Data S\<^isub>2)" using a7 by (simp, blast) - next - case (t_InL \ e S\<^isub>1 S\<^isub>2 pi c) - thus "P c (pi\\) (pi\(InL e)) (Data (DSum S\<^isub>1 S\<^isub>2))" using a8 by (simp) - next - case (t_InR \ e S\<^isub>2 S\<^isub>1 pi c) - thus "P c (pi\\) (pi\(InR e)) (Data (DSum S\<^isub>1 S\<^isub>2))" using a9 by (simp) - next - case (t_Case x\<^isub>1 \ e e\<^isub>2 x\<^isub>2 e\<^isub>1 S\<^isub>1 S\<^isub>2 T pi c) - obtain y\<^isub>1::"name" where fs1: "y\<^isub>1\(pi\x\<^isub>1,pi\x\<^isub>2,pi\e,pi\e\<^isub>1,pi\e\<^isub>2,pi\\,c)" - by (erule exists_fresh[OF fs_name1]) - obtain y\<^isub>2::"name" where fs2: "y\<^isub>2\(pi\x\<^isub>1,pi\x\<^isub>2,pi\e,pi\e\<^isub>1,pi\e\<^isub>2,pi\\,c,y\<^isub>1)" - by (erule exists_fresh[OF fs_name1]) - let ?sw1 = "[(pi\x\<^isub>1,y\<^isub>1)]" - let ?sw2 = "[(pi\x\<^isub>2,y\<^isub>2)]" - let ?pi' = "?sw2@?sw1@pi" - have f01: "x\<^isub>1\(\,e,e\<^isub>2,x\<^isub>2)" by fact - have f11: "(pi\x\<^isub>1)\(pi\\,pi\e,pi\e\<^isub>2,pi\x\<^isub>2)" using f01 by (simp add: fresh_bij) - have f21: "y\<^isub>1\(?pi'\\,?pi'\e,?pi'\e\<^isub>2)" using f01 fs1 fs2 - by (simp add: fresh_atm fresh_prod fresh_left calc_atm pt_name2 perm_pi_simp) - have f02: "x\<^isub>2\(\,e,e\<^isub>1,x\<^isub>1)" by fact - have f12: "(pi\x\<^isub>2)\(pi\\,pi\e,pi\e\<^isub>1,pi\x\<^isub>1)" using f02 by (simp add: fresh_bij) - have f22: "y\<^isub>2\(?pi'\\,?pi'\e,?pi'\e\<^isub>1)" using f02 fs1 fs2 - by (auto simp add: fresh_atm fresh_prod fresh_left calc_atm pt_name2 perm_pi_simp) - have ih1: "\c. P c (?pi'\\) (?pi'\e) (Data (DSum S\<^isub>1 S\<^isub>2))" by fact - moreover - have ih2: "\c. P c (?pi'\((x\<^isub>1,Data S\<^isub>1)#\)) (?pi'\e\<^isub>1) T" by fact - then have "\c. P c ((y\<^isub>1,Data S\<^isub>1)#(?pi'\\)) (?pi'\e\<^isub>1) T" using fs1 fs2 - by (auto simp add: calc_atm fresh_prod fresh_atm) - moreover - have ih3: "\c. P c (?pi'\((x\<^isub>2,Data S\<^isub>2)#\)) (?pi'\e\<^isub>2) T" by fact - then have "\c. P c ((y\<^isub>2,Data S\<^isub>2)#(?pi'\\)) (?pi'\e\<^isub>2) T" using fs1 fs2 f11 f12 - by (simp add: calc_atm fresh_prod fresh_atm) - ultimately have "P c (?pi'\\) (Case (?pi'\e) of inl y\<^isub>1 \ (?pi'\e\<^isub>1) | inr y\<^isub>2 \ (?pi'\e\<^isub>2)) T" - using f21 f22 fs1 fs2 a10 by (force simp add: fresh_atm fresh_prod) - then have "P c (?sw2\?sw1\pi\\) - (?sw2\?sw1\(Case (pi\e) of inl (pi\x\<^isub>1) \ (pi\e\<^isub>1) | inr (pi\x\<^isub>2) \ (pi\e\<^isub>2))) T" - using fs1 fs2 f01 f02 f11 f12 - by (auto simp del: append_Cons simp add: pt_name2 fresh_atm fresh_prod calc_atm) - moreover have "(?sw1\pi\\) = (pi\\)" - by (rule perm_fresh_fresh) (simp_all add: fs1 f11) - moreover have "(?sw2\pi\\) = (pi\\)" - by (rule perm_fresh_fresh) (simp_all add: fs2 f12) - moreover have "?sw1\(Case (pi\e) of inl (pi\x\<^isub>1) \ (pi\e\<^isub>1) | inr (pi\x\<^isub>2) \ (pi\e\<^isub>2)) - = (Case (pi\e) of inl (pi\x\<^isub>1) \ (pi\e\<^isub>1) | inr (pi\x\<^isub>2) \ (pi\e\<^isub>2))" - by (rule perm_fresh_fresh) (simp_all add: fs1 fs2 f11 f12 abs_fresh) - moreover have "?sw2\(Case (pi\e) of inl (pi\x\<^isub>1) \ (pi\e\<^isub>1) | inr (pi\x\<^isub>2) \ (pi\e\<^isub>2)) - = (Case (pi\e) of inl (pi\x\<^isub>1) \ (pi\e\<^isub>1) | inr (pi\x\<^isub>2) \ (pi\e\<^isub>2))" - by (rule perm_fresh_fresh) (simp_all add: fs1 fs2 f11 f12 abs_fresh) - ultimately show "P c (pi\\) (pi\(Case e of inl x\<^isub>1 \ e\<^isub>1 | inr x\<^isub>2 \ e\<^isub>2)) T" - by (simp only:, simp) - qed - then have "P c (([]::name prm)\\) (([]::name prm)\e) T" by blast - then show "P c \ e T" by simp -qed - -lemma t_Lam_elim [elim] : +lemma t_Lam_elim[elim]: assumes a1:"\ \ Lam [x].t : T" and a2: "x\\" obtains T\<^isub>1 and T\<^isub>2 where "(x,T\<^isub>1)#\ \ t : T\<^isub>2" and "T=T\<^isub>1\T\<^isub>2" @@ -438,7 +316,7 @@ then show ?thesis using prems b4 by simp qed -lemma t_Case_elim[elim] : +lemma t_Case_elim[elim]: assumes "\ \ Case e of inl x\<^isub>1 \ e\<^isub>1 | inr x\<^isub>2 \ e\<^isub>2 : T" and "x\<^isub>1\\" and "x\<^isub>2\\" obtains \\<^isub>1 \\<^isub>2 where "\ \ e : Data (DSum \\<^isub>1 \\<^isub>2)" and "(x\<^isub>1, Data \\<^isub>1)#\ \ e\<^isub>1 : T" @@ -484,7 +362,7 @@ assumes "\\<^isub>1 \ e: T" and "valid \\<^isub>2" and "\\<^isub>1 \ \\<^isub>2" shows "\\<^isub>2 \ e: T" using assms -proof(nominal_induct \\<^isub>1 e T avoiding: \\<^isub>2 rule: typing_induct_strong) +proof(nominal_induct \\<^isub>1 e T avoiding: \\<^isub>2 rule: typing.strong_induct) case (t_Lam x \\<^isub>1 T\<^isub>1 t T\<^isub>2 \\<^isub>2) have ih: "\valid ((x,T\<^isub>1)#\\<^isub>2); (x,T\<^isub>1)#\\<^isub>1 \ (x,T\<^isub>1)#\\<^isub>2\ \ (x,T\<^isub>1)#\\<^isub>2 \ t : T\<^isub>2" by fact have H1: "valid \\<^isub>2" by fact @@ -657,164 +535,6 @@ declare ty.inject [simp del] declare data.inject [simp del] -lemma big_induct_strong - [consumes 1, case_names b_Lam b_App b_Const b_Pr b_Fst b_Snd b_InL b_InR b_CaseL b_CaseR]: - fixes P::"'a::fs_name \ trm \ trm \bool" - and x :: "'a::fs_name" - assumes a: "t \ t'" - and a1: "\x e c. P c (Lam [x].e) (Lam [x].e)" - and a2: "\x e\<^isub>1 e\<^isub>2 e\<^isub>2' e' e\<^isub>1' c. - \x\(e\<^isub>1,e\<^isub>2,e',c); \c. P c e\<^isub>1 (Lam [x].e\<^isub>1'); \c. P c e\<^isub>2 e\<^isub>2'; \c. P c (e\<^isub>1'[x::=e\<^isub>2']) e'\ - \ P c (App e\<^isub>1 e\<^isub>2) e'" - and a3: "\n c. P c (Const n) (Const n)" - and a4: "\e\<^isub>1 e\<^isub>1' e\<^isub>2 e\<^isub>2' c. \\c. P c e\<^isub>1 e\<^isub>1'; \c. P c e\<^isub>2 e\<^isub>2'\ - \ P c (Pr e\<^isub>1 e\<^isub>2) (Pr e\<^isub>1' e\<^isub>2')" - and a5: "\e e\<^isub>1 e\<^isub>2 c. \\c. P c e (Pr e\<^isub>1 e\<^isub>2)\ \ P c (Fst e) e\<^isub>1" - and a6: "\e e\<^isub>1 e\<^isub>2 c. \\c. P c e (Pr e\<^isub>1 e\<^isub>2)\ \ P c (Snd e) e\<^isub>2" - and a7: "\e e' c. \\c. P c e e'\ \ P c (InL e) (InL e')" - and a8: "\e e' c. \\c. P c e e'\ \ P c (InR e) (InR e')" - and a9: "\x\<^isub>1 e e\<^isub>2 e'' x\<^isub>2 e\<^isub>1 e' c. - \x\<^isub>1\(e,e\<^isub>2,e'',x\<^isub>2,c); x\<^isub>2\(e,e\<^isub>1,e'',x\<^isub>1,c); \c. P c e (InL e'); \c. P c (e\<^isub>1[x\<^isub>1::=e']) e''\ - \ P c (Case e of inl x\<^isub>1 \ e\<^isub>1 | inr x\<^isub>2 \ e\<^isub>2) e''" - and a10:"\x\<^isub>1 e e\<^isub>2 e'' x\<^isub>2 e\<^isub>1 e' c. - \x\<^isub>1\(e,e\<^isub>2,e'',x\<^isub>2,c); x\<^isub>2\(e,e\<^isub>1,e'',x\<^isub>1,c); \c. P c e (InR e'); \c. P c (e\<^isub>2[x\<^isub>2::=e']) e''\ - \ P c (Case e of inl x\<^isub>1 \ e\<^isub>1 | inr x\<^isub>2 \ e\<^isub>2) e''" - shows "P c t t'" -proof - - from a have "\(pi::name prm) c. P c (pi\t) (pi\t')" - proof (induct) - case (b_Lam x e pi c) - show "P c (pi\(Lam [x].e)) (pi\(Lam [x].e))" using a1 by simp - next - case (b_App x e\<^isub>1 e\<^isub>2 e' e\<^isub>1' e\<^isub>2' pi c) - obtain y::"name" where fs: "y\(pi\x,pi\e\<^isub>1,pi\e\<^isub>2,pi\e\<^isub>2',pi\e',pi\e\<^isub>1,c)" - by (erule exists_fresh[OF fs_name1]) - let ?sw = "[(pi\x,y)]" - let ?pi' = "?sw@pi" - have f0: "x\(e\<^isub>1,e\<^isub>2,e')" by fact - have f1: "(pi\x)\(pi\e\<^isub>1,pi\e\<^isub>2,pi\e')" using f0 by (simp add: fresh_bij) - have f2: "y\(?pi'\e\<^isub>1,?pi'\e\<^isub>2,?pi'\e')" using f0 - by (auto simp add: pt_name2 fresh_left calc_atm perm_pi_simp fresh_prod) - have ih1: "\c. P c (?pi'\e\<^isub>1) (?pi'\(Lam [x].e\<^isub>1'))" by fact - then have "\c. P c (?pi'\e\<^isub>1) (Lam [y].(?pi'\e\<^isub>1'))" by (simp add: calc_atm) - moreover - have ih2: "\c. P c (?pi'\e\<^isub>2) (?pi'\e\<^isub>2')" by fact - moreover - have ih3: "\c. P c (?pi'\(e\<^isub>1'[x::=e\<^isub>2'])) (?pi'\e')" by fact - then have "\c. P c ((?pi'\e\<^isub>1')[y::=(?pi'\e\<^isub>2')]) (?pi'\e')" by (simp add: calc_atm subst_eqvt) - ultimately have "P c (App (?pi'\e\<^isub>1) (?pi'\e\<^isub>2)) (?pi'\e')" using fs f2 - by (auto intro!: a2 simp add: calc_atm) - then have "P c (?sw\(App (pi\e\<^isub>1) (pi\e\<^isub>2))) (?sw\(pi\e'))" - by (simp del: append_Cons add: pt_name2) - moreover have "(?sw\(App (pi\e\<^isub>1) (pi\e\<^isub>2))) = App (pi\e\<^isub>1) (pi\e\<^isub>2)" - by (rule perm_fresh_fresh) (simp_all add: fs f1) - moreover have "(?sw\(pi\e')) = pi\e'" - by (rule perm_fresh_fresh) (simp_all add: fs f1) - ultimately show "P c (pi\(App e\<^isub>1 e\<^isub>2)) (pi\e')" - by simp - next - case (b_Const n pi c) - show "P c (pi\(Const n)) (pi\(Const n))" using a3 by simp - next - case (b_Pr e\<^isub>1 e\<^isub>1' e\<^isub>2 e\<^isub>2' pi c) - then show "P c (pi\(Pr e\<^isub>1 e\<^isub>2)) (pi\(Pr e\<^isub>1' e\<^isub>2'))" using a4 by simp - next - case (b_Fst e e\<^isub>1 e\<^isub>2 pi c) - then show "P c (pi\(Fst e)) (pi\e\<^isub>1)" using a5 by (simp, blast) - next - case (b_Snd e e\<^isub>1 e\<^isub>2 pi c) - then show "P c (pi\(Snd e)) (pi\e\<^isub>2)" using a6 by (simp, blast) - next - case (b_InL e e' pi c) - then show "P c (pi\(InL e)) (pi\(InL e'))" using a7 by (simp) - next - case (b_InR e e' pi c) - then show "P c (pi\(InR e)) (pi\(InR e'))" using a8 by (simp) - next - case (b_CaseL x\<^isub>1 e e\<^isub>2 e'' x\<^isub>2 e\<^isub>1 e' pi c) - obtain y\<^isub>1::"name" where fs1: "y\<^isub>1\(pi\x\<^isub>1,pi\e,pi\e\<^isub>1,pi\e\<^isub>2,pi\e'',pi\x\<^isub>2,c)" - by (rule exists_fresh[OF fin_supp]) - obtain y\<^isub>2::"name" where fs2: "y\<^isub>2\(pi\x\<^isub>2,pi\e,pi\e\<^isub>1,pi\e\<^isub>2,pi\e'',pi\x\<^isub>1,c,y\<^isub>1)" - by (rule exists_fresh[OF fin_supp]) - let ?sw1 = "[(pi\x\<^isub>1,y\<^isub>1)]" - let ?sw2 = "[(pi\x\<^isub>2,y\<^isub>2)]" - let ?pi' = "?sw2@?sw1@pi" - have f01: "x\<^isub>1\(e,e\<^isub>2,e'',x\<^isub>2)" by fact - have f11: "(pi\x\<^isub>1)\(pi\e,pi\e\<^isub>2,pi\e'',pi\x\<^isub>2)" using f01 by (simp add: fresh_bij) - have f21: "y\<^isub>1\(?pi'\e,?pi'\e\<^isub>2,?pi'\e'')" using f01 fs1 fs2 - by (simp add: fresh_atm fresh_prod fresh_left calc_atm pt_name2 perm_pi_simp) - have f02: "x\<^isub>2\(e,e\<^isub>1,e'',x\<^isub>1)" by fact - have f12: "(pi\x\<^isub>2)\(pi\e,pi\e\<^isub>1,pi\e'',pi\x\<^isub>1)" using f02 by (simp add: fresh_bij) - have f22: "y\<^isub>2\(?pi'\e,?pi'\e\<^isub>1,?pi'\e'')" using f02 fs1 fs2 - by (auto simp add: fresh_atm fresh_prod fresh_left calc_atm pt_name2 perm_pi_simp) - have ih1: "\c. P c (?pi'\e) (?pi'\(InL e'))" by fact - moreover - have ih2: "\c. P c (?pi'\(e\<^isub>1[x\<^isub>1::=e'])) (?pi'\e'')" by fact - then have "\c. P c ((?pi'\e\<^isub>1)[y\<^isub>1::=(?pi'\e')]) (?pi'\e'')" using fs1 fs2 - by (auto simp add: calc_atm subst_eqvt fresh_prod fresh_atm del: append_Cons) - ultimately have "P c (Case (?pi'\e) of inl y\<^isub>1 \ (?pi'\e\<^isub>1) | inr y\<^isub>2 \ (?pi'\e\<^isub>2)) (?pi'\e'')" - using f21 f22 fs1 fs2 by (auto intro!: a9 simp add: fresh_atm fresh_prod) - then have "P c (?sw2\?sw1\(Case (pi\e) of inl (pi\x\<^isub>1) \ (pi\e\<^isub>1) | inr (pi\x\<^isub>2) \ (pi\e\<^isub>2))) - (?sw2\?sw1\(pi\e''))" - using fs1 fs2 f01 f02 f11 f12 - by (auto simp del: append_Cons simp add: pt_name2 fresh_atm fresh_prod calc_atm) - moreover have "?sw1\(Case (pi\e) of inl (pi\x\<^isub>1) \ (pi\e\<^isub>1) | inr (pi\x\<^isub>2) \ (pi\e\<^isub>2)) - = (Case (pi\e) of inl (pi\x\<^isub>1) \ (pi\e\<^isub>1) | inr (pi\x\<^isub>2) \ (pi\e\<^isub>2))" - by (rule perm_fresh_fresh) (simp_all add: fs1 fs2 f11 f12 abs_fresh) - moreover have "?sw2\(Case (pi\e) of inl (pi\x\<^isub>1) \ (pi\e\<^isub>1) | inr (pi\x\<^isub>2) \ (pi\e\<^isub>2)) - = (Case (pi\e) of inl (pi\x\<^isub>1) \ (pi\e\<^isub>1) | inr (pi\x\<^isub>2) \ (pi\e\<^isub>2))" - by (rule perm_fresh_fresh) (simp_all add: fs1 fs2 f11 f12 abs_fresh) - moreover have "(?sw1\(pi\e'')) = (pi\e'')" - by (rule perm_fresh_fresh) (simp_all add: fs1 fs2 f11 f12) - moreover have "(?sw2\(pi\e'')) = (pi\e'')" - by (rule perm_fresh_fresh) (simp_all add: fs1 fs2 f11 f12) - ultimately show "P c (pi\(Case e of inl x\<^isub>1 \ e\<^isub>1 | inr x\<^isub>2 \ e\<^isub>2)) (pi\e'')" - by (simp only:, simp) - next - case (b_CaseR x\<^isub>1 e e\<^isub>2 e'' x\<^isub>2 e\<^isub>1 e' pi c) - obtain y\<^isub>1::"name" where fs1: "y\<^isub>1\(pi\x\<^isub>1,pi\e,pi\e\<^isub>1,pi\e\<^isub>2,pi\e'',pi\x\<^isub>2,c)" - by (rule exists_fresh[OF fin_supp]) - obtain y\<^isub>2::"name" where fs2: "y\<^isub>2\(pi\x\<^isub>2,pi\e,pi\e\<^isub>1,pi\e\<^isub>2,pi\e'',pi\x\<^isub>1,c,y\<^isub>1)" - by (rule exists_fresh[OF fin_supp]) - let ?sw1 = "[(pi\x\<^isub>1,y\<^isub>1)]" - let ?sw2 = "[(pi\x\<^isub>2,y\<^isub>2)]" - let ?pi' = "?sw2@?sw1@pi" - have f01: "x\<^isub>1\(e,e\<^isub>2,e'',x\<^isub>2)" by fact - have f11: "(pi\x\<^isub>1)\(pi\e,pi\e\<^isub>2,pi\e'',pi\x\<^isub>2)" using f01 by (simp add: fresh_bij) - have f21: "y\<^isub>1\(?pi'\e,?pi'\e\<^isub>2,?pi'\e'')" using f01 fs1 fs2 - by (simp add: fresh_atm fresh_prod fresh_left calc_atm pt_name2 perm_pi_simp) - have f02: "x\<^isub>2\(e,e\<^isub>1,e'',x\<^isub>1)" by fact - have f12: "(pi\x\<^isub>2)\(pi\e,pi\e\<^isub>1,pi\e'',pi\x\<^isub>1)" using f02 by (simp add: fresh_bij) - have f22: "y\<^isub>2\(?pi'\e,?pi'\e\<^isub>1,?pi'\e'')" using f02 fs1 fs2 - by (auto simp add: fresh_atm fresh_prod fresh_left calc_atm pt_name2 perm_pi_simp) - have ih1: "\c. P c (?pi'\e) (?pi'\(InR e'))" by fact - moreover - have ih2: "\c. P c (?pi'\(e\<^isub>2[x\<^isub>2::=e'])) (?pi'\e'')" by fact - then have "\c. P c ((?pi'\e\<^isub>2)[y\<^isub>2::=(?pi'\e')]) (?pi'\e'')" using fs1 fs2 f11 f12 - by (auto simp add: calc_atm subst_eqvt fresh_prod fresh_atm del: append_Cons) - ultimately have "P c (Case (?pi'\e) of inl y\<^isub>1 \ (?pi'\e\<^isub>1) | inr y\<^isub>2 \ (?pi'\e\<^isub>2)) (?pi'\e'')" - using f21 f22 fs1 fs2 by (auto intro!: a10 simp add: fresh_atm fresh_prod) - then have "P c (?sw2\?sw1\(Case (pi\e) of inl (pi\x\<^isub>1) \ (pi\e\<^isub>1) | inr (pi\x\<^isub>2) \ (pi\e\<^isub>2))) - (?sw2\?sw1\(pi\e''))" - using fs1 fs2 f01 f02 f11 f12 - by (auto simp del: append_Cons simp add: pt_name2 fresh_atm fresh_prod calc_atm) - moreover have "?sw1\(Case (pi\e) of inl (pi\x\<^isub>1) \ (pi\e\<^isub>1) | inr (pi\x\<^isub>2) \ (pi\e\<^isub>2)) - = (Case (pi\e) of inl (pi\x\<^isub>1) \ (pi\e\<^isub>1) | inr (pi\x\<^isub>2) \ (pi\e\<^isub>2))" - by (rule perm_fresh_fresh) (simp_all add: fs1 fs2 f11 f12 abs_fresh) - moreover have "?sw2\(Case (pi\e) of inl (pi\x\<^isub>1) \ (pi\e\<^isub>1) | inr (pi\x\<^isub>2) \ (pi\e\<^isub>2)) - = (Case (pi\e) of inl (pi\x\<^isub>1) \ (pi\e\<^isub>1) | inr (pi\x\<^isub>2) \ (pi\e\<^isub>2))" - by (rule perm_fresh_fresh) (simp_all add: fs1 fs2 f11 f12 abs_fresh) - moreover have "(?sw1\(pi\e'')) = (pi\e'')" - by (rule perm_fresh_fresh) (simp_all add: fs1 fs2 f11 f12) - moreover have "(?sw2\(pi\e'')) = (pi\e'')" - by (rule perm_fresh_fresh) (simp_all add: fs1 fs2 f11 f12) - ultimately show "P c (pi\(Case e of inl x\<^isub>1 \ e\<^isub>1 | inr x\<^isub>2 \ e\<^isub>2)) (pi\e'')" - by (simp only:, simp) - qed - then have "P c (([]::name prm)\t) (([]::name prm)\t')" by blast - then show "P c t t'" by simp -qed - lemma b_App_elim[elim]: assumes "App e\<^isub>1 e\<^isub>2 \ e'" and "x\(e\<^isub>1,e\<^isub>2,e')" obtains f\<^isub>1 and f\<^isub>2 where "e\<^isub>1 \ Lam [x]. f\<^isub>1" "e\<^isub>2 \ f\<^isub>2" "f\<^isub>1[x::=f\<^isub>2] \ e'" @@ -918,8 +638,8 @@ and b: "\ \ e : T" shows "\ \ e' : T" using a b -proof (nominal_induct avoiding: \ arbitrary: T rule: big_induct_strong) - case (b_App x e\<^isub>1 e\<^isub>2 e\<^isub>2' e' e \ T) +proof (nominal_induct avoiding: \ arbitrary: T rule: big.strong_induct) + case (b_App x e\<^isub>1 e\<^isub>2 e' e e\<^isub>2' \ T) have vc: "x\\" by fact have "\ \ App e\<^isub>1 e\<^isub>2 : T" by fact then obtain T' where @@ -957,12 +677,12 @@ and b: "e \ e\<^isub>2" shows "e\<^isub>1 = e\<^isub>2" using a b -proof (nominal_induct e e\<^isub>1 avoiding: e\<^isub>2 rule: big_induct_strong) +proof (nominal_induct e e\<^isub>1 avoiding: e\<^isub>2 rule: big.strong_induct) case (b_Lam x e t\<^isub>2) have "Lam [x].e \ t\<^isub>2" by fact thus "Lam [x].e = t\<^isub>2" by (cases, simp_all add: trm.inject) next - case (b_App x e\<^isub>1 e\<^isub>2 e\<^isub>2' e' e\<^isub>1' t\<^isub>2) + case (b_App x e\<^isub>1 e\<^isub>2 e' e\<^isub>1' e\<^isub>2' t\<^isub>2) have ih1: "\t. e\<^isub>1 \ t \ Lam [x].e\<^isub>1' = t" by fact have ih2:"\t. e\<^isub>2 \ t \ e\<^isub>2' = t" by fact have ih3: "\t. e\<^isub>1'[x::=e\<^isub>2'] \ t \ e' = t" by fact @@ -1002,7 +722,25 @@ then have "InR f' = InR e'" using ih1 by simp then have "e\<^isub>2[x\<^isub>2::=e'] \ t\<^isub>2" using h by (simp add: trm.inject) thus "e'' = t\<^isub>2" using ih2 by simp -qed (force simp add: trm.inject)+ +next + case b_Const + then show ?case by force +next + case b_Pr + then show ?case by blast +next + case b_Fst + then show ?case by (force simp add: trm.inject) +next + case b_Snd + then show ?case by (force simp add: trm.inject) +next + case b_InL + then show ?case by blast +next + case b_InR + then show ?case by blast +qed lemma not_val_App[simp]: shows