Nominal-General/Nominal2_Atoms.thy
changeset 1952 27cdc0a3a763
parent 1941 d33781f9d2c7
child 1962 84a13d1e2511
--- a/Nominal-General/Nominal2_Atoms.thy	Wed Apr 21 12:25:52 2010 +0200
+++ b/Nominal-General/Nominal2_Atoms.thy	Mon Apr 26 10:01:13 2010 +0200
@@ -5,6 +5,7 @@
 *)
 theory Nominal2_Atoms
 imports Nominal2_Base
+        Nominal2_Eqvt
 uses ("nominal_atoms.ML")
 begin
 
@@ -20,6 +21,8 @@
   assumes atom_eq_iff [simp]: "atom a = atom b \<longleftrightarrow> a = b"
   assumes atom_eqvt: "p \<bullet> (atom a) = atom (p \<bullet> a)"
 
+declare atom_eqvt[eqvt]
+
 class at = at_base +
   assumes sort_of_atom_eq [simp]: "sort_of (atom a) = sort_of (atom b)"
 
@@ -75,6 +78,107 @@
   thus ?thesis ..
 qed
 
+lemma atom_image_cong:
+  fixes X Y::"('a::at_base) set"
+  shows "(atom ` X = atom ` Y) = (X = Y)"
+  apply(rule inj_image_eq_iff)
+  apply(simp add: inj_on_def)
+  done
+
+lemma atom_image_supp:
+  "supp S = supp (atom ` S)"
+  apply(simp add: supp_def)
+  apply(simp add: image_eqvt)
+  apply(subst (2) permute_fun_def)
+  apply(simp add: atom_eqvt)
+  apply(simp add: atom_image_cong)
+  done
+
+lemma supp_finite_at_set:
+  fixes S::"('a::at) set"
+  assumes a: "finite S"
+  shows "supp S = atom ` S"
+  apply(rule finite_supp_unique)
+  apply(simp add: supports_def)
+  apply(rule allI)+
+  apply(rule impI)
+  apply(rule swap_fresh_fresh)
+  apply(simp add: fresh_def)
+  apply(simp add: atom_image_supp)
+  apply(subst supp_finite_atom_set)
+  apply(rule finite_imageI)
+  apply(simp add: a)
+  apply(simp)
+  apply(simp add: fresh_def)
+  apply(simp add: atom_image_supp)
+  apply(subst supp_finite_atom_set)
+  apply(rule finite_imageI)
+  apply(simp add: a)
+  apply(simp)
+  apply(rule finite_imageI)
+  apply(simp add: a)
+  apply(drule swap_set_in)
+  apply(assumption)
+  apply(simp)
+  apply(simp add: image_eqvt)
+  apply(simp add: permute_fun_def)
+  apply(simp add: atom_eqvt)
+  apply(simp add: atom_image_cong)
+  done
+
+lemma supp_finite_at_set_aux:
+  fixes S::"('a::at) set"
+  assumes a: "finite S"
+  shows "supp S = atom ` S"
+proof
+  show "supp S \<subseteq> ((atom::'a::at \<Rightarrow> atom) ` S)" 
+    apply(rule supp_is_subset)
+    apply(simp add: supports_def)
+    apply(rule allI)+
+    apply(rule impI)
+    apply(rule swap_fresh_fresh)
+    apply(simp add: fresh_def)
+    apply(simp add: atom_image_supp)
+    apply(subst supp_finite_atom_set)
+    apply(rule finite_imageI)
+    apply(simp add: a)
+    apply(simp)
+    apply(simp add: fresh_def)
+    apply(simp add: atom_image_supp)
+    apply(subst supp_finite_atom_set)
+    apply(rule finite_imageI)
+    apply(simp add: a)
+    apply(simp)
+    apply(rule finite_imageI)
+    apply(simp add: a)
+    done
+next 
+  have "supp ((atom::'a::at \<Rightarrow> atom) ` S) \<subseteq> supp ((op `) (atom::'a::at \<Rightarrow> atom)) \<union> supp S"
+    by (simp add: supp_fun_app)
+  moreover
+  have "supp ((op `) (atom::'a::at \<Rightarrow> atom)) = {}"
+    apply(rule supp_fun_eqvt)
+    apply(perm_simp)
+    apply(simp)
+    done
+  moreover 
+  have "supp ((atom::'a::at \<Rightarrow> atom) ` S) = ((atom::'a::at \<Rightarrow> atom) ` S)" 
+    apply(subst supp_finite_atom_set)
+    apply(rule finite_imageI)
+    apply(simp add: a)
+    apply(simp)
+    done
+  ultimately 
+  show "((atom::'a::at \<Rightarrow> atom) ` S) \<subseteq> supp S" by simp
+qed
+  
+
+lemma supp_at_insert:
+  fixes S::"('a::at) set"
+  assumes a: "finite S"
+  shows "supp (insert a S) = supp a \<union> supp S"
+  using a by (simp add: supp_finite_at_set supp_at_base)
+
 
 section {* A swapping operation for concrete atoms *}