Nominal/Nominal2_Abs.thy
changeset 2669 1d1772a89026
parent 2668 92c001d93225
child 2671 eef49daac6c8
equal deleted inserted replaced
2668:92c001d93225 2669:1d1772a89026
   340   then have "(supp x' - set as') \<inter> (p \<bullet> (supp x \<inter> set as)) = {}" using a by (simp add: alphas)
   340   then have "(supp x' - set as') \<inter> (p \<bullet> (supp x \<inter> set as)) = {}" using a by (simp add: alphas)
   341   ultimately show "p \<bullet> (supp x \<inter> set as) = supp x' \<inter> set as'"
   341   ultimately show "p \<bullet> (supp x \<inter> set as) = supp x' \<inter> set as'"
   342     by (auto dest: disjoint_right_eq)
   342     by (auto dest: disjoint_right_eq)
   343 qed
   343 qed
   344 
   344 
       
   345 lemma alpha_abs_res_stronger1:
       
   346   fixes x::"'a::fs"
       
   347   assumes asm: "(as, x) \<approx>res (op =) supp p' (as', x')" 
       
   348   shows "\<exists>p. (as, x) \<approx>res (op =) supp p (as', x') \<and> supp p \<subseteq> (supp x \<inter> as) \<union> (supp x' \<inter> as')" 
       
   349 proof -
       
   350   from asm have 0: "(supp x - as) \<sharp>* p'" by  (auto simp only: alphas)
       
   351   then have #: "p' \<bullet> (supp x - as) = (supp x - as)" 
       
   352     by (simp add: atom_set_perm_eq)
       
   353   have "finite (supp x)" by (simp add: finite_supp)
       
   354   then obtain p where *: "\<forall>b \<in> supp x. p \<bullet> b = p' \<bullet> b" and **: "supp p \<subseteq> supp x \<union> p' \<bullet> supp x"
       
   355     using set_renaming_perm by blast
       
   356   from * have a: "p \<bullet> x = p' \<bullet> x" using supp_perm_perm_eq by auto
       
   357   from 0 have 1: "(supp x - as) \<sharp>* p" using *
       
   358     by (auto simp add: fresh_star_def fresh_perm)
       
   359   then have 2: "(supp x - as) \<inter> supp p = {}"
       
   360     by (auto simp add: fresh_star_def fresh_def)
       
   361   have b: "supp x = (supp x - as) \<union> (supp x \<inter> as)" by auto
       
   362   have "supp p \<subseteq> supp x \<union> p' \<bullet> supp x" using ** by simp
       
   363   also have "\<dots> = (supp x - as) \<union> (supp x \<inter> as) \<union> (p' \<bullet> ((supp x - as) \<union> (supp x \<inter> as)))" 
       
   364     using b by simp
       
   365   also have "\<dots> = (supp x - as) \<union> (supp x \<inter> as) \<union> ((p' \<bullet> (supp x - as)) \<union> (p' \<bullet> (supp x \<inter> as)))"
       
   366     by (simp add: union_eqvt)
       
   367   also have "\<dots> = (supp x - as) \<union> (supp x \<inter> as) \<union> (p' \<bullet> (supp x \<inter> as))" 
       
   368     using # by auto
       
   369   also have "\<dots> = (supp x - as) \<union> (supp x \<inter> as) \<union> (supp x' \<inter> as')" using asm
       
   370     by (simp add: supp_property_res)
       
   371   finally have "supp p \<subseteq> (supp x - as) \<union> (supp x \<inter> as) \<union> (supp x' \<inter> as')" .
       
   372   then 
       
   373   have "supp p \<subseteq> (supp x \<inter> as) \<union> (supp x' \<inter> as')" using 2 by auto
       
   374   moreover 
       
   375   have "(as, x) \<approx>res (op =) supp p (as', x')" using asm 1 a by (simp add: alphas)
       
   376   ultimately 
       
   377   show "\<exists>p. (as, x) \<approx>res (op =) supp p (as', x') \<and> supp p \<subseteq> (supp x \<inter> as) \<union> (supp x' \<inter> as')" by blast
       
   378 qed
       
   379 
   345 
   380 
   346 
   381 
   347 section {* Quotient types *}
   382 section {* Quotient types *}
   348 
   383 
   349 quotient_type 
   384 quotient_type