# HG changeset patch # User berghofe # Date 1175011025 -7200 # Node ID 1cbfb4066e47c3446bb421dd29614e6698bcbe97 # Parent c192c5d1a6f271c71dbda47ecb55c247acdc0bb9 Adapted to changes in nominal_inductive. diff -r c192c5d1a6f2 -r 1cbfb4066e47 src/HOL/Nominal/Examples/Crary.thy --- a/src/HOL/Nominal/Examples/Crary.thy Tue Mar 27 17:55:09 2007 +0200 +++ b/src/HOL/Nominal/Examples/Crary.thy Tue Mar 27 17:57:05 2007 +0200 @@ -261,7 +261,7 @@ v_nil[intro]: "valid []" | v_cons[intro]: "\valid \;a\\\ \ valid ((a,T)#\)" -nominal_inductive valid +nominal_inductive valid . inductive_cases2 valid_cons_elim_auto[elim]:"valid ((x,T)#\)" @@ -305,6 +305,7 @@ | t_Unit[intro]: "valid \ \ \ \ Unit : TUnit" nominal_inductive typing + by (simp_all add: abs_fresh) lemma typing_implies_valid: assumes a: "\ \ t : T" @@ -323,63 +324,6 @@ declare trm.inject [simp del] declare ty.inject [simp del] -lemma typing_induct_strong - [consumes 1, case_names t_Var t_App t_Lam t_Const t_Unit]: - fixes P::"'a::fs_name \ Ctxt \ 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) TBase" - and a5: "\\ c. valid \ \ P c \ Unit TUnit" - shows "P c \ e T" -proof - - from a have "\(pi::name prm) c. P c (pi\\) (pi\e) (pi\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)) (pi\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)) (pi\T\<^isub>2)" using a2 - by (simp only: eqvt) (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) (?pi'\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)) (pi\T\<^isub>1\T\<^isub>2)" by simp - next - case (t_Const \ n pi c) - thus "P c (pi\\) (pi\(Const n)) (pi\TBase)" using a4 by (simp, blast intro: valid_eqvt) - next - case (t_Unit \ pi c) - thus "P c (pi\\) (pi\Unit) (pi\TUnit)" using a5 by (simp, blast intro: valid_eqvt) - qed - then have "P c (([]::name prm)\\) (([]::name prm)\e) (([]::name prm)\T)" by blast - then show "P c \ e T" by simp -qed - section {* Definitional Equivalence *} inductive2 @@ -396,106 +340,13 @@ \ \ \ s \ t : T\<^isub>1 \ T\<^isub>2" nominal_inductive def_equiv + by (simp_all add: abs_fresh fresh_subst'') lemma def_equiv_implies_valid: assumes a: "\ \ t \ s : T" shows "valid \" using a by (induct) (auto elim: typing_implies_valid) -lemma def_equiv_strong_induct - [consumes 1, case_names Q_Refl Q_Symm Q_Trans Q_Abs Q_App Q_Beta Q_Ext]: - fixes c::"'a::fs_name" - assumes a0: "\ \ s \ t : T" - and a1: "\\ t T c. \ \ t : T \ P c \ t t T" - and a2: "\\ t s T c. \\d. P d \ t s T\ \ P c \ s t T" - and a3: "\\ s t T u c. \\d. P d \ s t T; \d. P d \ t u T\ - \ P c \ s u T" - and a4: "\x \ T\<^isub>1 s\<^isub>2 t\<^isub>2 T\<^isub>2 c. \x\\; x\c; \d. P d ((x,T\<^isub>1)#\) s\<^isub>2 t\<^isub>2 T\<^isub>2\ - \ P c \ (Lam [x].s\<^isub>2) (Lam [x].t\<^isub>2) (T\<^isub>1\T\<^isub>2)" - and a5: "\\ s\<^isub>1 t\<^isub>1 T\<^isub>1 T\<^isub>2 s\<^isub>2 t\<^isub>2 c. \\d. P d \ s\<^isub>1 t\<^isub>1 (T\<^isub>1\T\<^isub>2); \d. P d \ s\<^isub>2 t\<^isub>2 T\<^isub>1\ - \ P c \ (App s\<^isub>1 s\<^isub>2) (App t\<^isub>1 t\<^isub>2) T\<^isub>2" - and a6: "\x \ T\<^isub>1 s12 t12 T\<^isub>2 s\<^isub>2 t\<^isub>2 c. - \x\(\,s\<^isub>2,t\<^isub>2); x\c; \d. P d ((x,T\<^isub>1)#\) s12 t12 T\<^isub>2; \d. P d \ s\<^isub>2 t\<^isub>2 T\<^isub>1\ - \ P c \ (App (Lam [x].s12) s\<^isub>2) (t12[x::=t\<^isub>2]) T\<^isub>2" - and a7: "\x \ s t T\<^isub>1 T\<^isub>2 c. - \x\(\,s,t); \d. P d ((x,T\<^isub>1)#\) (App s (Var x)) (App t (Var x)) T\<^isub>2\ - \ P c \ s t (T\<^isub>1\T\<^isub>2)" - shows "P c \ s t T" -proof - - from a0 have "\(pi::name prm) c. P c (pi\\) (pi\s) (pi\t) (pi\T)" - proof(induct) - case (Q_Refl \ t T pi c) - then show "P c (pi\\) (pi\t) (pi\t) (pi\T)" using a1 by (simp only: eqvt) - next - case (Q_Symm \ t s T pi c) - then show "P c (pi\\) (pi\s) (pi\t) (pi\T)" using a2 by (simp only: def_equiv_eqvt) - next - case (Q_Trans \ s t T u pi c) - then show " P c (pi\\) (pi\s) (pi\u) (pi\T)" using a3 by (blast intro: def_equiv_eqvt) - next - case (Q_App \ s\<^isub>1 t\<^isub>1 T\<^isub>1 T\<^isub>2 s\<^isub>2 t\<^isub>2 pi c) - then show "P c (pi\\) (pi\App s\<^isub>1 s\<^isub>2) (pi\App t\<^isub>1 t\<^isub>2) (pi\T\<^isub>2)" using a5 - by (simp only: eqvt) (blast) - next - case (Q_Ext x \ s t T\<^isub>1 T\<^isub>2 pi c) - then show "P c (pi\\) (pi\s) (pi\t) (pi\T\<^isub>1\T\<^isub>2)" - by (auto intro!: a7 simp add: fresh_bij) - next - case (Q_Abs x \ T\<^isub>1 s\<^isub>2 t\<^isub>2 T\<^isub>2 pi c) - obtain y::"name" where fs: "y\(pi\x,pi\s\<^isub>2,pi\t\<^isub>2,pi\\,c)" by (rule exists_fresh[OF fs_name1]) - let ?sw="[(pi\x,y)]" - let ?pi'="?sw@pi" - have f1: "x\\" by fact - have f2: "(pi\x)\(pi\\)" using f1 by (simp add: fresh_bij) - have f3: "y\?pi'\\" using f1 by (auto simp add: pt_name2 fresh_left calc_atm perm_pi_simp) - have ih1: "\c. P c (?pi'\((x,T\<^isub>1)#\)) (?pi'\s\<^isub>2) (?pi'\t\<^isub>2) (?pi'\T\<^isub>2)" by fact - then have "\c. P c ((y,T\<^isub>1)#(?pi'\\)) (?pi'\s\<^isub>2) (?pi'\t\<^isub>2) T\<^isub>2" by (simp add: calc_atm) - then have "P c (?pi'\\) (?pi'\Lam [x].s\<^isub>2) (?pi'\Lam [x].t\<^isub>2) (T\<^isub>1\T\<^isub>2)" using a4 f3 fs - by (simp add: calc_atm) - then have "P c (?sw\pi\\) (?sw\Lam [(pi\x)].(pi\s\<^isub>2)) (?sw\Lam [(pi\x)].(pi\t\<^isub>2)) (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 f2) - moreover have "(?sw\(Lam [(pi\x)].(pi\s\<^isub>2))) = Lam [(pi\x)].(pi\s\<^isub>2)" - by (rule perm_fresh_fresh) (simp_all add: fs f2 abs_fresh) - moreover have "(?sw\(Lam [(pi\x)].(pi\t\<^isub>2))) = Lam [(pi\x)].(pi\t\<^isub>2)" - by (rule perm_fresh_fresh) (simp_all add: fs f2 abs_fresh) - ultimately have "P c (pi\\) (Lam [(pi\x)].(pi\s\<^isub>2)) (Lam [(pi\x)].(pi\t\<^isub>2)) (T\<^isub>1\T\<^isub>2)" by simp - then show "P c (pi\\) (pi\Lam [x].s\<^isub>2) (pi\Lam [x].t\<^isub>2) (pi\T\<^isub>1\T\<^isub>2)" by simp - next - case (Q_Beta x \ s\<^isub>2 t\<^isub>2 T\<^isub>1 s12 t12 T\<^isub>2 pi c) - obtain y::"name" where fs: "y\(pi\x,pi\s12,pi\t12,pi\s\<^isub>2,pi\t\<^isub>2,pi\\,c)" - by (rule exists_fresh[OF fs_name1]) - let ?sw="[(pi\x,y)]" - let ?pi'="?sw@pi" - have f1: "x\(\,s\<^isub>2,t\<^isub>2)" by fact - have f2: "(pi\x)\(pi\(\,s\<^isub>2,t\<^isub>2))" using f1 by (simp add: fresh_bij) - have f3: "y\(?pi'\(\,s\<^isub>2,t\<^isub>2))" using f1 - by (auto simp add: pt_name2 fresh_left calc_atm perm_pi_simp fresh_prod) - have ih1: "\c. P c (?pi'\((x,T\<^isub>1)#\)) (?pi'\s12) (?pi'\t12) (?pi'\T\<^isub>2)" by fact - then have "\c. P c ((y,T\<^isub>1)#(?pi'\\)) (?pi'\s12) (?pi'\t12) (?pi'\T\<^isub>2)" by (simp add: calc_atm) - moreover - have ih2: "\c. P c (?pi'\\) (?pi'\s\<^isub>2) (?pi'\t\<^isub>2) (?pi'\T\<^isub>1)" by fact - ultimately have "P c (?pi'\\) (?pi'\(App (Lam [x].s12) s\<^isub>2)) (?pi'\(t12[x::=t\<^isub>2])) (?pi'\T\<^isub>2)" - using a6 f3 fs by (force simp add: subst_eqvt calc_atm del: perm_ty) - then have "P c (?sw\pi\\) (?sw\(App (Lam [(pi\x)].(pi\s12)) (pi\s\<^isub>2))) - (?sw\((pi\t12)[(pi\x)::=(pi\t\<^isub>2)])) T\<^isub>2" - by (simp del: append_Cons add: calc_atm pt_name2 subst_eqvt) - moreover have "(?sw\(pi\\)) = (pi\\)" - by (rule perm_fresh_fresh) (simp_all add: fs[simplified] f2[simplified]) - moreover have "(?sw\(App (Lam [(pi\x)].(pi\s12)) (pi\s\<^isub>2))) = App (Lam [(pi\x)].(pi\s12)) (pi\s\<^isub>2)" - by (rule perm_fresh_fresh) (simp_all add: fs[simplified] f2[simplified] abs_fresh) - moreover have "(?sw\((pi\t12)[(pi\x)::=(pi\t\<^isub>2)])) = ((pi\t12)[(pi\x)::=(pi\t\<^isub>2)])" - by (rule perm_fresh_fresh) - (simp_all add: fs[simplified] f2[simplified] fresh_subst fresh_subst'') - ultimately have "P c (pi\\) (App (Lam [(pi\x)].(pi\s12)) (pi\s\<^isub>2)) ((pi\t12)[(pi\x)::=(pi\t\<^isub>2)]) T\<^isub>2" - by simp - then show "P c (pi\\) (pi\App (Lam [x].s12) s\<^isub>2) (pi\t12[x::=t\<^isub>2]) (pi\T\<^isub>2)" by (simp add: subst_eqvt) - qed - then have "P c (([]::name prm)\\) (([]::name prm)\s) (([]::name prm)\t) (([]::name prm)\T)" by blast - then show "P c \ s t T" by simp -qed - section {* Weak Head Reduction *} inductive2 @@ -520,7 +371,7 @@ declare trm.inject [simp del] declare ty.inject [simp del] -nominal_inductive whr_def +equivariance whr_def section {* Weak Head Normalisation *} @@ -600,107 +451,9 @@ | QAP_App[intro]: "\\ \ p \ q : T\<^isub>1 \ T\<^isub>2; \ \ s \ t : T\<^isub>1 \ \ \ \ App p s \ App q t : T\<^isub>2" | QAP_Const[intro]: "valid \ \ \ \ Const n \ Const n : TBase" -nominal_inductive alg_equiv - -lemma alg_equiv_alg_path_equiv_strong_induct - [case_names QAT_Base QAT_Arrow QAT_One QAP_Var QAP_App QAP_Const]: - fixes c::"'a::fs_name" - assumes a1: "\s p t q \ c. \s \ p; t \ q; \ \ p \ q : TBase; \d. P2 d \ p q TBase\ - \ P1 c \ s t TBase" - and a2: "\x \ s t T\<^isub>1 T\<^isub>2 c. - \x\\; x\s; x\t; x\c; (x,T\<^isub>1)#\ \ App s (Var x) \ App t (Var x) : T\<^isub>2; - \d. P1 d ((x,T\<^isub>1)#\) (App s (Var x)) (App t (Var x)) T\<^isub>2\ - \ P1 c \ s t (T\<^isub>1\T\<^isub>2)" - and a3: "\\ s t c. valid \ \ P1 c \ s t TUnit" - and a4: "\\ x T c. \valid \; (x,T) \ set \\ \ P2 c \ (Var x) (Var x) T" - and a5: "\\ p q T\<^isub>1 T\<^isub>2 s t c. - \\ \ p \ q : T\<^isub>1\T\<^isub>2; \d. P2 d \ p q (T\<^isub>1\T\<^isub>2); \ \ s \ t : T\<^isub>1; \d. P1 d \ s t T\<^isub>1\ - \ P2 c \ (App p s) (App q t) T\<^isub>2" - and a6: "\\ n c. valid \ \ P2 c \ (Const n) (Const n) TBase" - shows "(\ \ s \ t : T \P1 c \ s t T) \ (\' \ s' \ t' : T' \ P2 c \' s' t' T')" -proof - - have "(\ \ s \ t : T \ (\c (pi::name prm). P1 c (pi\\) (pi\s) (pi\t) T)) \ - (\' \ s' \ t' : T' \ (\c (pi::name prm). P2 c (pi\\') (pi\s') (pi\t') T'))" - proof(induct rule: alg_equiv_alg_path_equiv.induct) - case (QAT_Base s q t p \) - then show "\c (pi::name prm). P1 c (pi\\) (pi\s) (pi\t) TBase" - apply(auto) - apply(rule_tac p="pi\q" and q="pi\p" in a1) - apply(simp_all add: eqvt[simplified]) - done - next - case (QAT_Arrow x \ s t T\<^isub>1 T\<^isub>2) - show ?case - proof (rule allI, rule allI) - fix c::"'a::fs_name" and pi::"name prm" - obtain y::"name" where fs: "y\(pi\s,pi\t,pi\\,c)" by (rule exists_fresh[OF fs_name1]) - let ?sw="[(pi\x,y)]" - let ?pi'="?sw@pi" - have f1: "x\(\,s,t)" by fact - have f2: "(pi\x)\(pi\(\,s,t))" using f1 by (simp add: fresh_bij) - have f3: "y\?pi'\(\,s,t)" using f1 - by (simp only: pt_name2 fresh_left, auto simp add: perm_pi_simp calc_atm) - then have f3': "y\?pi'\\" "y\?pi'\s" "y\?pi'\t" by (auto simp add: fresh_prod) - have pr1: "(x,T\<^isub>1)#\ \ App s (Var x) \ App t (Var x) : T\<^isub>2" by fact - then have "?pi'\ ((x,T\<^isub>1)#\ \ App s (Var x) \ App t (Var x) : T\<^isub>2)" using perm_bool by simp - then have "(?pi'\((x,T\<^isub>1)#\)) \ (?pi'\(App s (Var x))) \ (?pi'\(App t (Var x))) : (?pi'\T\<^isub>2)" - by (auto simp add: eqvt) - then have "(y,T\<^isub>1)#(?pi'\\) \ (App (?pi'\s) (Var y)) \ (App (?pi'\t) (Var y)) : T\<^isub>2" - by (simp add: calc_atm) - moreover - have ih1: "\c (pi::name prm). P1 c (pi\((x,T\<^isub>1)#\)) (pi\App s (Var x)) (pi\App t (Var x)) T\<^isub>2" - by fact - then have "\c. P1 c (?pi'\((x,T\<^isub>1)#\)) (?pi'\App s (Var x)) (?pi'\App t (Var x)) T\<^isub>2" - by auto - then have "\c. P1 c ((y,T\<^isub>1)#(?pi'\\)) (App (?pi'\s) (Var y)) (App (?pi'\t) (Var y)) T\<^isub>2" - by (simp add: calc_atm) - ultimately have "P1 c (?pi'\\) (?pi'\s) (?pi'\t) (T\<^isub>1\T\<^isub>2)" using a2 f3' fs by simp - then have "P1 c (?sw\pi\\) (?sw\pi\s) (?sw\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[simplified] f2[simplified]) - moreover have "(?sw\(pi\s)) = (pi\s)" - by (rule perm_fresh_fresh) (simp_all add: fs[simplified] f2[simplified]) - moreover have "(?sw\(pi\t)) = (pi\t)" - by (rule perm_fresh_fresh) (simp_all add: fs[simplified] f2[simplified]) - ultimately show "P1 c (pi\\) (pi\s) (pi\t) (T\<^isub>1\T\<^isub>2)" by (simp) - qed - next - case (QAT_One \ s t) - then show "\c (pi::name prm). P1 c (pi\\) (pi\s) (pi\t) TUnit" - by (auto intro!: a3 simp add: valid_eqvt) - next - case (QAP_Var \ x T) - then show "\c (pi::name prm). P2 c (pi \ \) (pi \ Var x) (pi \ Var x) T" - apply(auto intro!: a4 simp add: valid_eqvt) - apply(simp add: set_eqvt[symmetric]) - apply(perm_simp add: pt_set_bij1a[OF pt_name_inst, OF at_name_inst]) - done - next - case (QAP_App \ p q T\<^isub>1 T\<^isub>2 s t) - then show "\c (pi::name prm). P2 c (pi\\) (pi\App p s) (pi\App q t) T\<^isub>2" - by (auto intro!: a5 simp add: eqvt[simplified]) - next - case (QAP_Const \ n) - then show "\c (pi::name prm). P2 c (pi\\) (pi\Const n) (pi\Const n) TBase" - by (auto intro!: a6 simp add: eqvt) - qed - then have "(\ \ s \ t : T \ P1 c (([]::name prm)\\) (([]::name prm)\s) (([]::name prm)\t) T) \ - (\' \ s' \ t' : T' \ P2 c (([]::name prm)\\') (([]::name prm)\s') (([]::name prm)\t') T')" - by blast - then show ?thesis by simp -qed - -(* post-processing of the strong induction principle proved above; *) -(* the code extracts the strong_inducts-version from strong_induct *) -(*<*) -setup {* - PureThy.add_thmss - [(("alg_equiv_alg_path_equiv_strong_inducts", - ProjectRule.projects (ProofContext.init (the_context())) [1,2] - (thm "alg_equiv_alg_path_equiv_strong_induct")), [])] #> snd -*} - +nominal_inductive alg_equiv + avoids QAT_Arrow: x + by simp_all declare trm.inject [simp add] declare ty.inject [simp add] @@ -787,7 +540,7 @@ lemma algorithmic_transitivity: shows "\ \ s \ t : T \ \ \ t \ u : T \ \ \ s \ u : T" and "\ \ s \ t : T \ \ \ t \ u : T \ \ \ s \ u : T" -proof (nominal_induct \ s t T and \ s t T avoiding: u rule: alg_equiv_alg_path_equiv_strong_inducts) +proof (nominal_induct \ s t T and \ s t T avoiding: u rule: alg_equiv_alg_path_equiv.strong_inducts) case (QAT_Base s p t q \ u) have "\ \ t \ u : TBase" by fact then obtain r' q' where b1: "t \ q'" and b2: "u \ r'" and b3: "\ \ q' \ r' : TBase" by auto @@ -827,14 +580,14 @@ lemma algorithmic_weak_head_closure: shows "\ \ s \ t : T \ s' \ s \ t' \ t \ \ \ s' \ t' : T" apply (nominal_induct \ s t T avoiding: s' t' - rule: alg_equiv_alg_path_equiv_strong_inducts(1) [of _ _ _ _ "%a b c d e. True"]) + rule: alg_equiv_alg_path_equiv.strong_inducts(1) [of _ _ _ _ "%a b c d e. True"]) apply(auto intro!: QAT_Arrow) done lemma algorithmic_monotonicity: shows "\ \ s \ t : T \ \ \ \' \ valid \' \ \' \ s \ t : T" and "\ \ s \ t : T \ \ \ \' \ valid \' \ \' \ s \ t : T" -proof (nominal_induct \ s t T and \ s t T avoiding: \' rule: alg_equiv_alg_path_equiv_strong_inducts) +proof (nominal_induct \ s t T and \ s t T avoiding: \' rule: alg_equiv_alg_path_equiv.strong_inducts) case (QAT_Arrow x \ s t T\<^isub>1 T\<^isub>2 \') have fs:"x\\" "x\s" "x\t" "x\\'"by fact have h2:"\\\'" by fact @@ -1063,7 +816,7 @@ and h3: "valid \'" shows "\' \ \ is \' : T" using h1 h2 h3 -proof (nominal_induct \ t T avoiding: \' \ \' rule: typing_induct_strong) +proof (nominal_induct \ t T avoiding: \' \ \' rule: typing.strong_induct) case (t_Lam x \ T\<^isub>1 t\<^isub>2 T\<^isub>2 \' \ \') have fs:"x\\" "x\\'" "x\\" by fact have h:"\' \ \ is \' over \" by fact @@ -1089,7 +842,7 @@ and h3: "valid \'" shows "\' \ \ is \' : T" using h1 h2 h3 -proof (nominal_induct \ s t T avoiding: \' \ \' rule: def_equiv_strong_induct) +proof (nominal_induct \ s t T avoiding: \' \ \' rule: def_equiv.strong_induct) case (Q_Refl \ t T \' \ \') have "\ \ t : T" and "valid \'" by fact @@ -1139,7 +892,7 @@ case (Q_App \ s\<^isub>1 t\<^isub>1 T\<^isub>1 T\<^isub>2 s\<^isub>2 t\<^isub>2 \' \ \') then show "\' \ \1 s\<^isub>2> is \'1 t\<^isub>2> : T\<^isub>2" by auto next - case (Q_Beta x \ T\<^isub>1 s12 t12 T\<^isub>2 s\<^isub>2 t\<^isub>2 \' \ \') + case (Q_Beta x \ s\<^isub>2 t\<^isub>2 T\<^isub>1 s12 t12 T\<^isub>2 \' \ \') have h: "\' \ \ is \' over \" and h': "valid \'" by fact have fs: "x\\" by fact diff -r c192c5d1a6f2 -r 1cbfb4066e47 src/HOL/Nominal/Examples/SN.thy --- a/src/HOL/Nominal/Examples/SN.thy Tue Mar 27 17:55:09 2007 +0200 +++ b/src/HOL/Nominal/Examples/SN.thy Tue Mar 27 17:57:05 2007 +0200 @@ -61,8 +61,8 @@ abbreviation "Beta_star" :: "lam\lam\bool" (" _ \\<^isub>\\<^sup>* _" [80,80] 80) where "t1 \\<^isub>\\<^sup>* t2 \ Beta\<^sup>*\<^sup>* t1 t2" -nominal_inductive Beta - +equivariance Beta + lemma beta_induct[consumes 1, case_names b1 b2 b3 b4]: fixes P :: "'a::fs_name\lam \ lam \bool" and t :: "lam" @@ -188,7 +188,7 @@ v1[intro]: "valid []" | v2[intro]: "\valid \;a\\\\ valid ((a,\)#\)" -nominal_inductive valid +nominal_inductive valid . (* typing judgements *) diff -r c192c5d1a6f2 -r 1cbfb4066e47 src/HOL/Nominal/Examples/SOS.thy --- a/src/HOL/Nominal/Examples/SOS.thy Tue Mar 27 17:55:09 2007 +0200 +++ b/src/HOL/Nominal/Examples/SOS.thy Tue Mar 27 17:57:05 2007 +0200 @@ -210,7 +210,7 @@ v_nil[intro]: "valid []" | v_cons[intro]: "\valid \;x\\\ \ valid ((x,T)#\)" -nominal_inductive valid +nominal_inductive valid . inductive_cases2 valid_cons_inv_auto[elim]:"valid ((x,T)#\)" @@ -266,26 +266,17 @@ (x\<^isub>1,Data(S\<^isub>1))#\ \ e\<^isub>1 : T; (x\<^isub>2,Data(S\<^isub>2))#\ \ e\<^isub>2 : T\ \ \ \ (Case e of inl x\<^isub>1 \ e\<^isub>1 | inr x\<^isub>2 \ e\<^isub>2) : T" +nominal_inductive typing + by (simp_all add: abs_fresh fresh_prod fresh_atm) + +lemmas typing_eqvt' = typing_eqvt [simplified] + lemma typing_implies_valid: assumes "\ \ t : T" shows "valid \" using assms by (induct) (auto) -lemma typing_eqvt: - fixes pi::"name prm" - assumes a: "\ \ t : T" - shows "(pi\\) \ (pi\t) : T" -using a -apply(induct) -apply(auto simp add: fresh_bij set_eqvt valid_eqvt) -apply(rule t_Var) -apply(drule valid_eqvt) -apply(assumption) -apply(drule in_eqvt) -apply(simp add: set_eqvt) -done - declare trm.inject [simp add] declare ty.inject [simp add] declare data.inject [simp add] @@ -463,12 +454,12 @@ by auto obtain c::name where f':"c \ (x\<^isub>1,x\<^isub>1',e\<^isub>1,e\<^isub>1',\)" by (erule exists_fresh[OF fs_name1]) have e1':"[(x\<^isub>1,c)]\e\<^isub>1 = [(x\<^isub>1',c)]\e\<^isub>1'" using e1 f' by (auto simp add: alpha' fresh_prod fresh_atm) - have "[(x\<^isub>1',c)]\((x\<^isub>1',Data \\<^isub>1)# \) \ [(x\<^isub>1',c)]\e\<^isub>1' : T" using h1 typing_eqvt by blast + have "[(x\<^isub>1',c)]\((x\<^isub>1',Data \\<^isub>1)# \) \ [(x\<^isub>1',c)]\e\<^isub>1' : T" using h1 typing_eqvt' by blast then have x:"(c,Data \\<^isub>1)#( [(x\<^isub>1',c)]\\) \ [(x\<^isub>1',c)]\e\<^isub>1': T" using f' by (auto simp add: fresh_atm calc_atm) have "x\<^isub>1' \ \" using h1 typing_implies_valid by auto then have "(c,Data \\<^isub>1)#\ \ [(x\<^isub>1 ,c)]\e\<^isub>1 : T" using f' x e1' by (auto simp add: perm_fresh_fresh) - then have "[(x\<^isub>1,c)]\((c,Data \\<^isub>1)#\) \ [(x\<^isub>1,c)]\[(x\<^isub>1 ,c)]\e\<^isub>1 : T" using typing_eqvt by blast + then have "[(x\<^isub>1,c)]\((c,Data \\<^isub>1)#\) \ [(x\<^isub>1,c)]\[(x\<^isub>1 ,c)]\e\<^isub>1 : T" using typing_eqvt' by blast then have "([(x\<^isub>1,c)]\(c,Data \\<^isub>1)) #\ \ [(x\<^isub>1,c)]\[(x\<^isub>1 ,c)]\e\<^isub>1 : T" using f f' by (auto simp add: perm_fresh_fresh) then have "([(x\<^isub>1,c)]\(c,Data \\<^isub>1)) #\ \ e\<^isub>1 : T" by perm_simp @@ -476,12 +467,12 @@ (* The second part of the proof is the same *) obtain c::name where f':"c \ (x\<^isub>2,x\<^isub>2',e\<^isub>2,e\<^isub>2',\)" by (erule exists_fresh[OF fs_name1]) have e2':"[(x\<^isub>2,c)]\e\<^isub>2 = [(x\<^isub>2',c)]\e\<^isub>2'" using e2 f' by (auto simp add: alpha' fresh_prod fresh_atm) - have "[(x\<^isub>2',c)]\((x\<^isub>2',Data \\<^isub>2)# \) \ [(x\<^isub>2',c)]\e\<^isub>2' : T" using h2 typing_eqvt by blast + have "[(x\<^isub>2',c)]\((x\<^isub>2',Data \\<^isub>2)# \) \ [(x\<^isub>2',c)]\e\<^isub>2' : T" using h2 typing_eqvt' by blast then have x:"(c,Data \\<^isub>2)#([(x\<^isub>2',c)]\\) \ [(x\<^isub>2',c)]\e\<^isub>2': T" using f' by (auto simp add: fresh_atm calc_atm) have "x\<^isub>2' \ \" using h2 typing_implies_valid by auto then have "(c,Data \\<^isub>2)#\ \ [(x\<^isub>2 ,c)]\e\<^isub>2 : T" using f' x e2' by (auto simp add: perm_fresh_fresh) - then have "[(x\<^isub>2,c)]\((c,Data \\<^isub>2)#\) \ [(x\<^isub>2,c)]\[(x\<^isub>2 ,c)]\e\<^isub>2 : T" using typing_eqvt by blast + then have "[(x\<^isub>2,c)]\((c,Data \\<^isub>2)#\) \ [(x\<^isub>2,c)]\[(x\<^isub>2 ,c)]\e\<^isub>2 : T" using typing_eqvt' by blast then have "([(x\<^isub>2,c)]\(c,Data \\<^isub>2))#\ \ [(x\<^isub>2,c)]\[(x\<^isub>2 ,c)]\e\<^isub>2 : T" using f f' by (auto simp add: perm_fresh_fresh) then have "([(x\<^isub>2,c)]\(c,Data \\<^isub>2)) #\ \ e\<^isub>2 : T" by perm_simp @@ -628,17 +619,7 @@ \ Case e of inl x\<^isub>1 \ e\<^isub>1 | inr x\<^isub>2 \ e\<^isub>2 \ e''" nominal_inductive big - -lemma big_eqvt[eqvt]: - fixes pi::"name prm" - assumes a: "t \ t'" - shows "(pi\t) \ (pi\t')" - using a - apply(induct) - apply(auto simp add: eqvt) - apply(rule_tac x="pi\x" in b_App) - apply(auto simp add: eqvt fresh_bij fresh_prod) - done + by (simp_all add: abs_fresh fresh_prod fresh_atm) lemma big_eqvt': fixes pi::"name prm"