diff -r a37c65fe10de -r c8c2f83fadb4 Nominal/Nominal2_FSet.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Nominal/Nominal2_FSet.thy Fri Mar 19 09:40:57 2010 +0100 @@ -0,0 +1,107 @@ +theory Nominal2_FSet +imports FSet Nominal2_Supp +begin + +lemma permute_rsp_fset[quot_respect]: + "(op = ===> op \ ===> op \) permute permute" + apply (simp add: eqvts[symmetric]) + apply clarify + apply (subst permute_minus_cancel(1)[symmetric, of "xb"]) + apply (subst mem_eqvt[symmetric]) + apply (subst (2) permute_minus_cancel(1)[symmetric, of "xb"]) + apply (subst mem_eqvt[symmetric]) + apply (erule_tac x="- x \ xb" in allE) + apply simp + done + +instantiation FSet.fset :: (pt) pt +begin + +term "permute :: perm \ 'a list \ 'a list" + +quotient_definition + "permute_fset :: perm \ 'a fset \ 'a fset" +is + "permute :: perm \ 'a list \ 'a list" + +lemma permute_list_zero: "0 \ (x :: 'a list) = x" + by (rule permute_zero) + +lemma permute_fset_zero: "0 \ (x :: 'a fset) = x" + by (lifting permute_list_zero) + +lemma permute_list_plus: "(p + q) \ (x :: 'a list) = p \ q \ x" + by (rule permute_plus) + +lemma permute_fset_plus: "(p + q) \ (x :: 'a fset) = p \ q \ x" + by (lifting permute_list_plus) + +instance + apply default + apply (rule permute_fset_zero) + apply (rule permute_fset_plus) + done + +end + +lemma permute_fset[simp,eqvt]: + "p \ ({||} :: 'a :: pt fset) = {||}" + "p \ finsert (x :: 'a :: pt) xs = finsert (p \ x) (p \ xs)" + by (lifting permute_list.simps) + +lemma map_eqvt[eqvt]: "pi \ (map f l) = map (pi \ f) (pi \ l)" + apply (induct l) + apply (simp_all) + apply (simp only: eqvt_apply) + done + +lemma fmap_eqvt[eqvt]: "pi \ (fmap f l) = fmap (pi \ f) (pi \ l)" + by (lifting map_eqvt) + +lemma fset_to_set_eqvt[eqvt]: "pi \ (fset_to_set x) = fset_to_set (pi \ x)" + by (lifting set_eqvt) + +lemma supp_fset_to_set: + "supp (fset_to_set x) = supp x" + apply (simp add: supp_def) + apply (simp add: eqvts) + apply (simp add: fset_cong) + done + +lemma atom_fmap_cong: + shows "(fmap atom x = fmap atom y) = (x = y)" + apply(rule inj_fmap_eq_iff) + apply(simp add: inj_on_def) + done + +lemma supp_fmap_atom: + "supp (fmap atom x) = supp x" + apply (simp add: supp_def) + apply (simp add: eqvts eqvts_raw atom_fmap_cong) + done + +(*lemma "\ (memb x S) \ \ (memb y T) \ ((x # S) \ (y # T)) = (x = y \ S \ T)"*) + +lemma infinite_Un: + shows "infinite (S \ T) \ infinite S \ infinite T" + by simp + +lemma supp_insert: "supp (insert (x :: 'a :: fs) xs) = supp x \ supp xs" + oops + +lemma supp_finsert: + "supp (finsert (x :: 'a :: fs) S) = supp x \ supp S" + apply (subst supp_fset_to_set[symmetric]) + apply simp + (* apply (simp add: supp_insert supp_fset_to_set) *) + oops + +instance fset :: (fs) fs + apply (default) + apply (induct_tac x rule: fset_induct) + apply (simp add: supp_def eqvts) + (* apply (simp add: supp_finsert) *) + (* apply default ? *) + oops + +end