src/HOL/More_Set.thy
changeset 46127 af3b95160b59
parent 46037 49a436ada6a2
child 46133 d9fe85d3d2cd
equal deleted inserted replaced
46126:bab00660539d 46127:af3b95160b59
    27   by (simp add: project_def)
    27   by (simp add: project_def)
    28 
    28 
    29 
    29 
    30 subsection {* Basic set operations *}
    30 subsection {* Basic set operations *}
    31 
    31 
    32 lemma is_empty_set:
    32 lemma is_empty_set [code]:
    33   "Set.is_empty (set xs) \<longleftrightarrow> List.null xs"
    33   "Set.is_empty (set xs) \<longleftrightarrow> List.null xs"
    34   by (simp add: Set.is_empty_def null_def)
    34   by (simp add: Set.is_empty_def null_def)
    35 
    35 
    36 lemma empty_set:
    36 lemma empty_set [code]:
    37   "{} = set []"
    37   "{} = set []"
    38   by simp
    38   by simp
    39 
    39 
    40 lemma insert_set_compl:
    40 lemma insert_set_compl:
    41   "insert x (- set xs) = - set (removeAll x xs)"
    41   "insert x (- set xs) = - set (removeAll x xs)"
    90 qed
    90 qed
    91 
    91 
    92 
    92 
    93 subsection {* Derived set operations *}
    93 subsection {* Derived set operations *}
    94 
    94 
    95 lemma member:
    95 lemma member [code]:
    96   "a \<in> A \<longleftrightarrow> (\<exists>x\<in>A. a = x)"
    96   "a \<in> A \<longleftrightarrow> (\<exists>x\<in>A. a = x)"
    97   by simp
    97   by simp
    98 
    98 
    99 lemma subset_eq:
    99 lemma subset [code]:
   100   "A \<subseteq> B \<longleftrightarrow> (\<forall>x\<in>A. x \<in> B)"
       
   101   by (fact subset_eq)
       
   102 
       
   103 lemma subset:
       
   104   "A \<subset> B \<longleftrightarrow> A \<subseteq> B \<and> \<not> B \<subseteq> A"
   100   "A \<subset> B \<longleftrightarrow> A \<subseteq> B \<and> \<not> B \<subseteq> A"
   105   by (fact less_le_not_le)
   101   by (fact less_le_not_le)
   106 
   102 
   107 lemma set_eq:
   103 lemma set_eq [code]:
   108   "A = B \<longleftrightarrow> A \<subseteq> B \<and> B \<subseteq> A"
   104   "A = B \<longleftrightarrow> A \<subseteq> B \<and> B \<subseteq> A"
   109   by (fact eq_iff)
   105   by (fact eq_iff)
   110 
   106 
   111 lemma inter:
   107 lemma inter [code]:
   112   "A \<inter> B = Set.project (\<lambda>x. x \<in> A) B"
   108   "A \<inter> B = Set.project (\<lambda>x. x \<in> A) B"
   113   by (auto simp add: project_def)
   109   by (auto simp add: project_def)
   114 
       
   115 
       
   116 subsection {* Theorems on relations *}
       
   117 
       
   118 lemma product_code:
       
   119   "Product_Type.product (set xs) (set ys) = set [(x, y). x \<leftarrow> xs, y \<leftarrow> ys]"
       
   120   by (auto simp add: Product_Type.product_def)
       
   121 
       
   122 lemma Id_on_set:
       
   123   "Id_on (set xs) = set [(x, x). x \<leftarrow> xs]"
       
   124   by (auto simp add: Id_on_def)
       
   125 
       
   126 lemma trancl_set_ntrancl: "trancl (set xs) = ntrancl (card (set xs) - 1) (set xs)"
       
   127   by (simp add: finite_trancl_ntranl)
       
   128 
       
   129 lemma set_rel_comp:
       
   130   "set xys O set yzs = set ([(fst xy, snd yz). xy \<leftarrow> xys, yz \<leftarrow> yzs, snd xy = fst yz])"
       
   131   by (auto simp add: Bex_def)
       
   132 
       
   133 lemma wf_set:
       
   134   "wf (set xs) = acyclic (set xs)"
       
   135   by (simp add: wf_iff_acyclic_if_finite)
       
   136 
   110 
   137 
   111 
   138 subsection {* Code generator setup *}
   112 subsection {* Code generator setup *}
   139 
   113 
   140 definition coset :: "'a list \<Rightarrow> 'a set" where
   114 definition coset :: "'a list \<Rightarrow> 'a set" where
   148 lemma [code]:
   122 lemma [code]:
   149   "x \<in> set xs \<longleftrightarrow> List.member xs x"
   123   "x \<in> set xs \<longleftrightarrow> List.member xs x"
   150   "x \<in> coset xs \<longleftrightarrow> \<not> List.member xs x"
   124   "x \<in> coset xs \<longleftrightarrow> \<not> List.member xs x"
   151   by (simp_all add: member_def)
   125   by (simp_all add: member_def)
   152 
   126 
   153 lemma [code_unfold]:
       
   154   "A = {} \<longleftrightarrow> Set.is_empty A"
       
   155   by (simp add: Set.is_empty_def)
       
   156 
       
   157 declare empty_set [code]
       
   158 
       
   159 declare is_empty_set [code]
       
   160 
       
   161 lemma UNIV_coset [code]:
   127 lemma UNIV_coset [code]:
   162   "UNIV = coset []"
   128   "UNIV = coset []"
   163   by simp
   129   by simp
   164 
   130 
   165 lemma insert_code [code]:
   131 lemma insert_code [code]:
   170 lemma remove_code [code]:
   136 lemma remove_code [code]:
   171   "Set.remove x (set xs) = set (removeAll x xs)"
   137   "Set.remove x (set xs) = set (removeAll x xs)"
   172   "Set.remove x (coset xs) = coset (List.insert x xs)"
   138   "Set.remove x (coset xs) = coset (List.insert x xs)"
   173   by (simp_all add: remove_def Compl_insert)
   139   by (simp_all add: remove_def Compl_insert)
   174 
   140 
   175 declare image_set [code]
       
   176 
       
   177 declare project_set [code]
       
   178 
       
   179 lemma Ball_set [code]:
   141 lemma Ball_set [code]:
   180   "Ball (set xs) P \<longleftrightarrow> list_all P xs"
   142   "Ball (set xs) P \<longleftrightarrow> list_all P xs"
   181   by (simp add: list_all_iff)
   143   by (simp add: list_all_iff)
   182 
   144 
   183 lemma Bex_set [code]:
   145 lemma Bex_set [code]:
   189 proof -
   151 proof -
   190   have "card (set (remdups xs)) = length (remdups xs)"
   152   have "card (set (remdups xs)) = length (remdups xs)"
   191     by (rule distinct_card) simp
   153     by (rule distinct_card) simp
   192   then show ?thesis by simp
   154   then show ?thesis by simp
   193 qed
   155 qed
   194 
       
   195 
       
   196 subsection {* Derived operations *}
       
   197 
       
   198 declare subset_eq [code]
       
   199 
       
   200 declare subset [code]
       
   201 
   156 
   202 
   157 
   203 subsection {* Functorial operations *}
   158 subsection {* Functorial operations *}
   204 
   159 
   205 lemma inter_code [code]:
   160 lemma inter_code [code]:
   271 hide_const (open) coset
   226 hide_const (open) coset
   272 
   227 
   273 
   228 
   274 subsection {* Operations on relations *}
   229 subsection {* Operations on relations *}
   275 
   230 
   276 text {* Initially contributed by Tjark Weber. *}
   231 lemma product_code [code]:
   277 
   232   "Product_Type.product (set xs) (set ys) = set [(x, y). x \<leftarrow> xs, y \<leftarrow> ys]"
   278 declare Domain_fst [code]
   233   by (auto simp add: Product_Type.product_def)
   279 
   234 
   280 declare Range_snd [code]
   235 lemma Id_on_set [code]:
   281 
   236   "Id_on (set xs) = set [(x, x). x \<leftarrow> xs]"
   282 declare trans_join [code]
   237   by (auto simp add: Id_on_def)
   283 
   238 
   284 declare irrefl_distinct [code]
   239 lemma trancl_set_ntrancl [code]: "trancl (set xs) = ntrancl (card (set xs) - 1) (set xs)"
   285 
   240   by (simp add: finite_trancl_ntranl)
   286 declare trancl_set_ntrancl [code]
   241 
   287 
   242 lemma set_rel_comp [code]:
   288 declare acyclic_irrefl [code]
   243   "set xys O set yzs = set ([(fst xy, snd yz). xy \<leftarrow> xys, yz \<leftarrow> yzs, snd xy = fst yz])"
   289 
   244   by (auto simp add: Bex_def)
   290 declare product_code [code]
   245 
   291 
   246 lemma wf_set [code]:
   292 declare Id_on_set [code]
   247   "wf (set xs) = acyclic (set xs)"
   293 
   248   by (simp add: wf_iff_acyclic_if_finite)
   294 declare set_rel_comp [code]
       
   295 
       
   296 declare wf_set [code]
       
   297 
   249 
   298 end
   250 end
   299 
   251