src/HOL/More_Set.thy
changeset 46147 2c4d8de91c4c
parent 46146 6baea4fca6bd
equal deleted inserted replaced
46146:6baea4fca6bd 46147:2c4d8de91c4c
     4 header {* Relating (finite) sets and lists *}
     4 header {* Relating (finite) sets and lists *}
     5 
     5 
     6 theory More_Set
     6 theory More_Set
     7 imports List
     7 imports List
     8 begin
     8 begin
     9 
       
    10 subsection {* Basic set operations *}
       
    11 
       
    12 lemma is_empty_set [code]:
       
    13   "Set.is_empty (set xs) \<longleftrightarrow> List.null xs"
       
    14   by (simp add: Set.is_empty_def null_def)
       
    15 
       
    16 lemma empty_set [code]:
       
    17   "{} = set []"
       
    18   by simp
       
    19 
       
    20 
       
    21 subsection {* Functorial set operations *}
       
    22 
       
    23 lemma union_set_fold:
       
    24   "set xs \<union> A = fold Set.insert xs A"
       
    25 proof -
       
    26   interpret comp_fun_idem Set.insert
       
    27     by (fact comp_fun_idem_insert)
       
    28   show ?thesis by (simp add: union_fold_insert fold_set_fold)
       
    29 qed
       
    30 
       
    31 lemma union_set_foldr:
       
    32   "set xs \<union> A = foldr Set.insert xs A"
       
    33 proof -
       
    34   have "\<And>x y :: 'a. insert y \<circ> insert x = insert x \<circ> insert y"
       
    35     by auto
       
    36   then show ?thesis by (simp add: union_set_fold foldr_fold)
       
    37 qed
       
    38 
       
    39 lemma minus_set_fold:
       
    40   "A - set xs = fold Set.remove xs A"
       
    41 proof -
       
    42   interpret comp_fun_idem Set.remove
       
    43     by (fact comp_fun_idem_remove)
       
    44   show ?thesis
       
    45     by (simp add: minus_fold_remove [of _ A] fold_set_fold)
       
    46 qed
       
    47 
       
    48 lemma minus_set_foldr:
       
    49   "A - set xs = foldr Set.remove xs A"
       
    50 proof -
       
    51   have "\<And>x y :: 'a. Set.remove y \<circ> Set.remove x = Set.remove x \<circ> Set.remove y"
       
    52     by (auto simp add: remove_def)
       
    53   then show ?thesis by (simp add: minus_set_fold foldr_fold)
       
    54 qed
       
    55 
       
    56 
       
    57 subsection {* Basic operations *}
       
    58 
       
    59 lemma [code]:
       
    60   "x \<in> set xs \<longleftrightarrow> List.member xs x"
       
    61   "x \<in> List.coset xs \<longleftrightarrow> \<not> List.member xs x"
       
    62   by (simp_all add: member_def)
       
    63 
       
    64 lemma UNIV_coset [code]:
       
    65   "UNIV = List.coset []"
       
    66   by simp
       
    67 
       
    68 lemma insert_code [code]:
       
    69   "insert x (set xs) = set (List.insert x xs)"
       
    70   "insert x (List.coset xs) = List.coset (removeAll x xs)"
       
    71   by simp_all
       
    72 
       
    73 lemma remove_code [code]:
       
    74   "Set.remove x (set xs) = set (removeAll x xs)"
       
    75   "Set.remove x (List.coset xs) = List.coset (List.insert x xs)"
       
    76   by (simp_all add: remove_def Compl_insert)
       
    77 
       
    78 lemma Ball_set [code]:
       
    79   "Ball (set xs) P \<longleftrightarrow> list_all P xs"
       
    80   by (simp add: list_all_iff)
       
    81 
       
    82 lemma Bex_set [code]:
       
    83   "Bex (set xs) P \<longleftrightarrow> list_ex P xs"
       
    84   by (simp add: list_ex_iff)
       
    85 
       
    86 lemma card_set [code]:
       
    87   "card (set xs) = length (remdups xs)"
       
    88 proof -
       
    89   have "card (set (remdups xs)) = length (remdups xs)"
       
    90     by (rule distinct_card) simp
       
    91   then show ?thesis by simp
       
    92 qed
       
    93 
       
    94 
     9 
    95 subsection {* Functorial operations *}
    10 subsection {* Functorial operations *}
    96 
    11 
    97 lemma inter_code [code]:
    12 lemma inter_code [code]:
    98   "A \<inter> set xs = set (List.filter (\<lambda>x. x \<in> A) xs)"
    13   "A \<inter> set xs = set (List.filter (\<lambda>x. x \<in> A) xs)"
   150 
    65 
   151 lemma pred_of_set_set_foldr_sup [code]:
    66 lemma pred_of_set_set_foldr_sup [code]:
   152   "pred_of_set (set xs) = foldr sup (map Predicate.single xs) bot"
    67   "pred_of_set (set xs) = foldr sup (map Predicate.single xs) bot"
   153   by (simp add: pred_of_set_set_fold_sup ac_simps foldr_fold fun_eq_iff)
    68   by (simp add: pred_of_set_set_fold_sup ac_simps foldr_fold fun_eq_iff)
   154 
    69 
   155 
       
   156 subsection {* Operations on relations *}
       
   157 
       
   158 lemma product_code [code]:
       
   159   "Product_Type.product (set xs) (set ys) = set [(x, y). x \<leftarrow> xs, y \<leftarrow> ys]"
       
   160   by (auto simp add: Product_Type.product_def)
       
   161 
       
   162 lemma Id_on_set [code]:
       
   163   "Id_on (set xs) = set [(x, x). x \<leftarrow> xs]"
       
   164   by (auto simp add: Id_on_def)
       
   165 
       
   166 lemma trancl_set_ntrancl [code]:
       
   167   "trancl (set xs) = ntrancl (card (set xs) - 1) (set xs)"
       
   168   by (simp add: finite_trancl_ntranl)
       
   169 
       
   170 lemma set_rel_comp [code]:
       
   171   "set xys O set yzs = set ([(fst xy, snd yz). xy \<leftarrow> xys, yz \<leftarrow> yzs, snd xy = fst yz])"
       
   172   by (auto simp add: Bex_def)
       
   173 
       
   174 lemma wf_set [code]:
       
   175   "wf (set xs) = acyclic (set xs)"
       
   176   by (simp add: wf_iff_acyclic_if_finite)
       
   177 
       
   178 end
    70 end
   179 
    71