# HG changeset patch # User Cezary Kaliszyk # Date 1295356309 -32400 # Node ID eef49daac6c8644abc2af9a8120537d9f00c413c # Parent 3c493c9513880e61a96c58f9ee104588a58b0ce0 alpha_abs_set_stronger1 diff -r 3c493c951388 -r eef49daac6c8 Nominal/Nominal2_Abs.thy --- a/Nominal/Nominal2_Abs.thy Tue Jan 18 21:12:25 2011 +0900 +++ b/Nominal/Nominal2_Abs.thy Tue Jan 18 22:11:49 2011 +0900 @@ -344,7 +344,7 @@ lemma alpha_abs_res_stronger1: fixes x::"'a::fs" - assumes asm: "(as, x) \res (op =) supp p' (as', x')" + assumes asm: "(as, x) \res (op =) supp p' (as', x')" shows "\p. (as, x) \res (op =) supp p (as', x') \ supp p \ (supp x \ as) \ (supp x' \ as')" proof - from asm have 0: "(supp x - as) \* p'" by (auto simp only: alphas) @@ -377,6 +377,49 @@ show "\p. (as, x) \res (op =) supp p (as', x') \ supp p \ (supp x \ as) \ (supp x' \ as')" by blast qed +lemma alpha_abs_set_stronger1: + fixes x::"'a::fs" + assumes fin: "finite as" + and asm: "(as, x) \set (op =) supp p' (as', x')" + shows "\p. (as, x) \set (op =) supp p (as', x') \ supp p \ as \ as'" +proof - + from asm have 0: "(supp x - as) \* p'" by (auto simp only: alphas) + then have #: "p' \ (supp x - as) = (supp x - as)" + by (simp add: atom_set_perm_eq) + have za: "finite ((supp x) \ as)" using fin by (simp add: finite_supp) + obtain p where *: "\b \ ((supp x) \ as). p \ b = p' \ b" and **: "supp p \ ((supp x) \ as) \ p' \ ((supp x) \ as)" + using set_renaming_perm[OF za] by blast + from * have "\b \ supp x. p \ b = p' \ b" by blast + then have a: "p \ x = p' \ x" using supp_perm_perm_eq by auto + from * have "\b \ as. p \ b = p' \ b" by blast + then have zb: "p \ as = p' \ as" using supp_perm_perm_eq by (metis fin supp_finite_atom_set) + have zc: "p' \ as = as'" using asm by (simp add: alphas) + from 0 have 1: "(supp x - as) \* p" using * + by (auto simp add: fresh_star_def fresh_perm) + then have 2: "(supp x - as) \ supp p = {}" + by (auto simp add: fresh_star_def fresh_def) + have b: "supp x = (supp x - as) \ (supp x \ as)" by auto + have "supp p \ supp x \ as \ p' \ supp x \ p' \ as" using ** using union_eqvt by blast + also have "\ = (supp x - as) \ (supp x \ as) \ as \ (p' \ ((supp x - as) \ (supp x \ as))) \ p' \ as" + using b by simp + also have "\ = (supp x - as) \ (supp x \ as) \ as \ ((p' \ (supp x - as)) \ (p' \ (supp x \ as))) \ p' \ as" + by (simp add: union_eqvt) + also have "\ = (supp x - as) \ (supp x \ as) \ as \ (p' \ (supp x \ as)) \ p' \ as" + using # by auto + also have "\ = (supp x - as) \ (supp x \ as) \ as \ p' \ ((supp x \ as) \ as)" using union_eqvt + by auto + also have "\ = (supp x - as) \ (supp x \ as) \ as \ p' \ as" + by (metis Int_commute Un_commute sup_inf_absorb) + also have "\ = (supp x - as) \ as \ p' \ as" + by blast + finally have "supp p \ (supp x - as) \ as \ p' \ as" . + then have "supp p \ as \ p' \ as" using 2 by blast + moreover + have "(as, x) \set (op =) supp p (as', x')" using asm 1 a zb by (simp add: alphas) + ultimately + show "\p. (as, x) \set (op =) supp p (as', x') \ supp p \ as \ as'" using zc by blast +qed + section {* Quotient types *}