src/HOL/Library/Fset.thy
changeset 39302 d7728f65b353
parent 39200 bb93713b0925
child 39380 5a2662c1e44a
equal deleted inserted replaced
39301:e1bd8a54c40f 39302:d7728f65b353
    49 code_datatype Set Coset
    49 code_datatype Set Coset
    50 
    50 
    51 lemma member_code [code]:
    51 lemma member_code [code]:
    52   "member (Set xs) = List.member xs"
    52   "member (Set xs) = List.member xs"
    53   "member (Coset xs) = Not \<circ> List.member xs"
    53   "member (Coset xs) = Not \<circ> List.member xs"
    54   by (simp_all add: ext_iff member_def fun_Compl_def bool_Compl_def)
    54   by (simp_all add: fun_eq_iff member_def fun_Compl_def bool_Compl_def)
    55 
    55 
    56 lemma member_image_UNIV [simp]:
    56 lemma member_image_UNIV [simp]:
    57   "member ` UNIV = UNIV"
    57   "member ` UNIV = UNIV"
    58 proof -
    58 proof -
    59   have "\<And>A \<Colon> 'a set. \<exists>B \<Colon> 'a fset. A = member B"
    59   have "\<And>A \<Colon> 'a set. \<exists>B \<Colon> 'a fset. A = member B"
   250   "inf A (Coset xs) = foldr remove xs A"
   250   "inf A (Coset xs) = foldr remove xs A"
   251 proof -
   251 proof -
   252   show "inf A (Set xs) = Set (List.filter (member A) xs)"
   252   show "inf A (Set xs) = Set (List.filter (member A) xs)"
   253     by (simp add: inter project_def Set_def)
   253     by (simp add: inter project_def Set_def)
   254   have *: "\<And>x::'a. remove = (\<lambda>x. Fset \<circ> More_Set.remove x \<circ> member)"
   254   have *: "\<And>x::'a. remove = (\<lambda>x. Fset \<circ> More_Set.remove x \<circ> member)"
   255     by (simp add: ext_iff)
   255     by (simp add: fun_eq_iff)
   256   have "member \<circ> fold (\<lambda>x. Fset \<circ> More_Set.remove x \<circ> member) xs =
   256   have "member \<circ> fold (\<lambda>x. Fset \<circ> More_Set.remove x \<circ> member) xs =
   257     fold More_Set.remove xs \<circ> member"
   257     fold More_Set.remove xs \<circ> member"
   258     by (rule fold_apply) (simp add: ext_iff)
   258     by (rule fold_apply) (simp add: fun_eq_iff)
   259   then have "fold More_Set.remove xs (member A) = 
   259   then have "fold More_Set.remove xs (member A) = 
   260     member (fold (\<lambda>x. Fset \<circ> More_Set.remove x \<circ> member) xs A)"
   260     member (fold (\<lambda>x. Fset \<circ> More_Set.remove x \<circ> member) xs A)"
   261     by (simp add: ext_iff)
   261     by (simp add: fun_eq_iff)
   262   then have "inf A (Coset xs) = fold remove xs A"
   262   then have "inf A (Coset xs) = fold remove xs A"
   263     by (simp add: Diff_eq [symmetric] minus_set *)
   263     by (simp add: Diff_eq [symmetric] minus_set *)
   264   moreover have "\<And>x y :: 'a. Fset.remove y \<circ> Fset.remove x = Fset.remove x \<circ> Fset.remove y"
   264   moreover have "\<And>x y :: 'a. Fset.remove y \<circ> Fset.remove x = Fset.remove x \<circ> Fset.remove y"
   265     by (auto simp add: More_Set.remove_def * intro: ext)
   265     by (auto simp add: More_Set.remove_def * intro: ext)
   266   ultimately show "inf A (Coset xs) = foldr remove xs A"
   266   ultimately show "inf A (Coset xs) = foldr remove xs A"
   275 lemma union_insert [code]:
   275 lemma union_insert [code]:
   276   "sup (Set xs) A = foldr insert xs A"
   276   "sup (Set xs) A = foldr insert xs A"
   277   "sup (Coset xs) A = Coset (List.filter (Not \<circ> member A) xs)"
   277   "sup (Coset xs) A = Coset (List.filter (Not \<circ> member A) xs)"
   278 proof -
   278 proof -
   279   have *: "\<And>x::'a. insert = (\<lambda>x. Fset \<circ> Set.insert x \<circ> member)"
   279   have *: "\<And>x::'a. insert = (\<lambda>x. Fset \<circ> Set.insert x \<circ> member)"
   280     by (simp add: ext_iff)
   280     by (simp add: fun_eq_iff)
   281   have "member \<circ> fold (\<lambda>x. Fset \<circ> Set.insert x \<circ> member) xs =
   281   have "member \<circ> fold (\<lambda>x. Fset \<circ> Set.insert x \<circ> member) xs =
   282     fold Set.insert xs \<circ> member"
   282     fold Set.insert xs \<circ> member"
   283     by (rule fold_apply) (simp add: ext_iff)
   283     by (rule fold_apply) (simp add: fun_eq_iff)
   284   then have "fold Set.insert xs (member A) =
   284   then have "fold Set.insert xs (member A) =
   285     member (fold (\<lambda>x. Fset \<circ> Set.insert x \<circ> member) xs A)"
   285     member (fold (\<lambda>x. Fset \<circ> Set.insert x \<circ> member) xs A)"
   286     by (simp add: ext_iff)
   286     by (simp add: fun_eq_iff)
   287   then have "sup (Set xs) A = fold insert xs A"
   287   then have "sup (Set xs) A = fold insert xs A"
   288     by (simp add: union_set *)
   288     by (simp add: union_set *)
   289   moreover have "\<And>x y :: 'a. Fset.insert y \<circ> Fset.insert x = Fset.insert x \<circ> Fset.insert y"
   289   moreover have "\<And>x y :: 'a. Fset.insert y \<circ> Fset.insert x = Fset.insert x \<circ> Fset.insert y"
   290     by (auto simp add: * intro: ext)
   290     by (auto simp add: * intro: ext)
   291   ultimately show "sup (Set xs) A = foldr insert xs A"
   291   ultimately show "sup (Set xs) A = foldr insert xs A"