src/HOL/Library/Fset.thy
author haftmann
Wed, 09 Dec 2009 16:46:03 +0100
changeset 34044 369509057220
parent 33905 fcb50b497763
child 34963 06df18c9a091
permissions -rw-r--r--
using existing lattice classes
     1 
     2 (* Author: Florian Haftmann, TU Muenchen *)
     3 
     4 header {* Executable finite sets *}
     5 
     6 theory Fset
     7 imports List_Set
     8 begin
     9 
    10 declare mem_def [simp]
    11 
    12 subsection {* Lifting *}
    13 
    14 datatype 'a fset = Fset "'a set"
    15 
    16 primrec member :: "'a fset \<Rightarrow> 'a set" where
    17   "member (Fset A) = A"
    18 
    19 lemma member_inject [simp]:
    20   "member A = member B \<Longrightarrow> A = B"
    21   by (cases A, cases B) simp
    22 
    23 lemma Fset_member [simp]:
    24   "Fset (member A) = A"
    25   by (cases A) simp
    26 
    27 definition Set :: "'a list \<Rightarrow> 'a fset" where
    28   "Set xs = Fset (set xs)"
    29 
    30 lemma member_Set [simp]:
    31   "member (Set xs) = set xs"
    32   by (simp add: Set_def)
    33 
    34 definition Coset :: "'a list \<Rightarrow> 'a fset" where
    35   "Coset xs = Fset (- set xs)"
    36 
    37 lemma member_Coset [simp]:
    38   "member (Coset xs) = - set xs"
    39   by (simp add: Coset_def)
    40 
    41 code_datatype Set Coset
    42 
    43 lemma member_code [code]:
    44   "member (Set xs) y \<longleftrightarrow> List.member y xs"
    45   "member (Coset xs) y \<longleftrightarrow> \<not> List.member y xs"
    46   by (simp_all add: mem_iff fun_Compl_def bool_Compl_def)
    47 
    48 lemma member_image_UNIV [simp]:
    49   "member ` UNIV = UNIV"
    50 proof -
    51   have "\<And>A \<Colon> 'a set. \<exists>B \<Colon> 'a fset. A = member B"
    52   proof
    53     fix A :: "'a set"
    54     show "A = member (Fset A)" by simp
    55   qed
    56   then show ?thesis by (simp add: image_def)
    57 qed
    58 
    59 
    60 subsection {* Lattice instantiation *}
    61 
    62 instantiation fset :: (type) boolean_algebra
    63 begin
    64 
    65 definition less_eq_fset :: "'a fset \<Rightarrow> 'a fset \<Rightarrow> bool" where
    66   [simp]: "A \<le> B \<longleftrightarrow> member A \<subseteq> member B"
    67 
    68 definition less_fset :: "'a fset \<Rightarrow> 'a fset \<Rightarrow> bool" where
    69   [simp]: "A < B \<longleftrightarrow> member A \<subset> member B"
    70 
    71 definition inf_fset :: "'a fset \<Rightarrow> 'a fset \<Rightarrow> 'a fset" where
    72   [simp]: "inf A B = Fset (member A \<inter> member B)"
    73 
    74 definition sup_fset :: "'a fset \<Rightarrow> 'a fset \<Rightarrow> 'a fset" where
    75   [simp]: "sup A B = Fset (member A \<union> member B)"
    76 
    77 definition bot_fset :: "'a fset" where
    78   [simp]: "bot = Fset {}"
    79 
    80 definition top_fset :: "'a fset" where
    81   [simp]: "top = Fset UNIV"
    82 
    83 definition uminus_fset :: "'a fset \<Rightarrow> 'a fset" where
    84   [simp]: "- A = Fset (- (member A))"
    85 
    86 definition minus_fset :: "'a fset \<Rightarrow> 'a fset \<Rightarrow> 'a fset" where
    87   [simp]: "A - B = Fset (member A - member B)"
    88 
    89 instance proof
    90 qed auto
    91 
    92 end
    93 
    94 instantiation fset :: (type) complete_lattice
    95 begin
    96 
    97 definition Inf_fset :: "'a fset set \<Rightarrow> 'a fset" where
    98   [simp, code del]: "Inf_fset As = Fset (Inf (image member As))"
    99 
   100 definition Sup_fset :: "'a fset set \<Rightarrow> 'a fset" where
   101   [simp, code del]: "Sup_fset As = Fset (Sup (image member As))"
   102 
   103 instance proof
   104 qed (auto simp add: le_fun_def le_bool_def)
   105 
   106 end
   107 
   108 subsection {* Basic operations *}
   109 
   110 definition is_empty :: "'a fset \<Rightarrow> bool" where
   111   [simp]: "is_empty A \<longleftrightarrow> List_Set.is_empty (member A)"
   112 
   113 lemma is_empty_Set [code]:
   114   "is_empty (Set xs) \<longleftrightarrow> null xs"
   115   by (simp add: is_empty_set)
   116 
   117 lemma empty_Set [code]:
   118   "bot = Set []"
   119   by simp
   120 
   121 lemma UNIV_Set [code]:
   122   "top = Coset []"
   123   by simp
   124 
   125 definition insert :: "'a \<Rightarrow> 'a fset \<Rightarrow> 'a fset" where
   126   [simp]: "insert x A = Fset (Set.insert x (member A))"
   127 
   128 lemma insert_Set [code]:
   129   "insert x (Set xs) = Set (List_Set.insert x xs)"
   130   "insert x (Coset xs) = Coset (remove_all x xs)"
   131   by (simp_all add: Set_def Coset_def insert_set insert_set_compl)
   132 
   133 definition remove :: "'a \<Rightarrow> 'a fset \<Rightarrow> 'a fset" where
   134   [simp]: "remove x A = Fset (List_Set.remove x (member A))"
   135 
   136 lemma remove_Set [code]:
   137   "remove x (Set xs) = Set (remove_all x xs)"
   138   "remove x (Coset xs) = Coset (List_Set.insert x xs)"
   139   by (simp_all add: Set_def Coset_def remove_set remove_set_compl)
   140 
   141 definition map :: "('a \<Rightarrow> 'b) \<Rightarrow> 'a fset \<Rightarrow> 'b fset" where
   142   [simp]: "map f A = Fset (image f (member A))"
   143 
   144 lemma map_Set [code]:
   145   "map f (Set xs) = Set (remdups (List.map f xs))"
   146   by (simp add: Set_def)
   147 
   148 definition filter :: "('a \<Rightarrow> bool) \<Rightarrow> 'a fset \<Rightarrow> 'a fset" where
   149   [simp]: "filter P A = Fset (List_Set.project P (member A))"
   150 
   151 lemma filter_Set [code]:
   152   "filter P (Set xs) = Set (List.filter P xs)"
   153   by (simp add: Set_def project_set)
   154 
   155 definition forall :: "('a \<Rightarrow> bool) \<Rightarrow> 'a fset \<Rightarrow> bool" where
   156   [simp]: "forall P A \<longleftrightarrow> Ball (member A) P"
   157 
   158 lemma forall_Set [code]:
   159   "forall P (Set xs) \<longleftrightarrow> list_all P xs"
   160   by (simp add: Set_def ball_set)
   161 
   162 definition exists :: "('a \<Rightarrow> bool) \<Rightarrow> 'a fset \<Rightarrow> bool" where
   163   [simp]: "exists P A \<longleftrightarrow> Bex (member A) P"
   164 
   165 lemma exists_Set [code]:
   166   "exists P (Set xs) \<longleftrightarrow> list_ex P xs"
   167   by (simp add: Set_def bex_set)
   168 
   169 definition card :: "'a fset \<Rightarrow> nat" where
   170   [simp]: "card A = Finite_Set.card (member A)"
   171 
   172 lemma card_Set [code]:
   173   "card (Set xs) = length (remdups xs)"
   174 proof -
   175   have "Finite_Set.card (set (remdups xs)) = length (remdups xs)"
   176     by (rule distinct_card) simp
   177   then show ?thesis by (simp add: Set_def card_def)
   178 qed
   179 
   180 
   181 subsection {* Derived operations *}
   182 
   183 lemma subfset_eq_forall [code]:
   184   "A \<le> B \<longleftrightarrow> forall (member B) A"
   185   by (simp add: subset_eq)
   186 
   187 lemma subfset_subfset_eq [code]:
   188   "A < B \<longleftrightarrow> A \<le> B \<and> \<not> B \<le> (A :: 'a fset)"
   189   by (fact less_le_not_le)
   190 
   191 lemma eq_fset_subfset_eq [code]:
   192   "eq_class.eq A B \<longleftrightarrow> A \<le> B \<and> B \<le> (A :: 'a fset)"
   193   by (cases A, cases B) (simp add: eq set_eq)
   194 
   195 
   196 subsection {* Functorial operations *}
   197 
   198 lemma inter_project [code]:
   199   "inf A (Set xs) = Set (List.filter (member A) xs)"
   200   "inf A (Coset xs) = foldl (\<lambda>A x. remove x A) A xs"
   201 proof -
   202   show "inf A (Set xs) = Set (List.filter (member A) xs)"
   203     by (simp add: inter project_def Set_def)
   204   have "foldl (\<lambda>A x. List_Set.remove x A) (member A) xs =
   205     member (foldl (\<lambda>A x. Fset (List_Set.remove x (member A))) A xs)"
   206     by (rule foldl_apply_inv) simp
   207   then show "inf A (Coset xs) = foldl (\<lambda>A x. remove x A) A xs"
   208     by (simp add: Diff_eq [symmetric] minus_set)
   209 qed
   210 
   211 lemma subtract_remove [code]:
   212   "A - Set xs = foldl (\<lambda>A x. remove x A) A xs"
   213   "A - Coset xs = Set (List.filter (member A) xs)"
   214 proof -
   215   have "foldl (\<lambda>A x. List_Set.remove x A) (member A) xs =
   216     member (foldl (\<lambda>A x. Fset (List_Set.remove x (member A))) A xs)"
   217     by (rule foldl_apply_inv) simp
   218   then show "A - Set xs = foldl (\<lambda>A x. remove x A) A xs"
   219     by (simp add: minus_set)
   220   show "A - Coset xs = Set (List.filter (member A) xs)"
   221     by (auto simp add: Coset_def Set_def)
   222 qed
   223 
   224 lemma union_insert [code]:
   225   "sup (Set xs) A = foldl (\<lambda>A x. insert x A) A xs"
   226   "sup (Coset xs) A = Coset (List.filter (Not \<circ> member A) xs)"
   227 proof -
   228   have "foldl (\<lambda>A x. Set.insert x A) (member A) xs =
   229     member (foldl (\<lambda>A x. Fset (Set.insert x (member A))) A xs)"
   230     by (rule foldl_apply_inv) simp
   231   then show "sup (Set xs) A = foldl (\<lambda>A x. insert x A) A xs"
   232     by (simp add: union_set)
   233   show "sup (Coset xs) A = Coset (List.filter (Not \<circ> member A) xs)"
   234     by (auto simp add: Coset_def)
   235 qed
   236 
   237 context complete_lattice
   238 begin
   239 
   240 definition Infimum :: "'a fset \<Rightarrow> 'a" where
   241   [simp]: "Infimum A = Inf (member A)"
   242 
   243 lemma Infimum_inf [code]:
   244   "Infimum (Set As) = foldl inf top As"
   245   "Infimum (Coset []) = bot"
   246   by (simp_all add: Inf_set_fold Inf_UNIV)
   247 
   248 definition Supremum :: "'a fset \<Rightarrow> 'a" where
   249   [simp]: "Supremum A = Sup (member A)"
   250 
   251 lemma Supremum_sup [code]:
   252   "Supremum (Set As) = foldl sup bot As"
   253   "Supremum (Coset []) = top"
   254   by (simp_all add: Sup_set_fold Sup_UNIV)
   255 
   256 end
   257 
   258 
   259 subsection {* Misc operations *}
   260 
   261 lemma size_fset [code]:
   262   "fset_size f A = 0"
   263   "size A = 0"
   264   by (cases A, simp) (cases A, simp)
   265 
   266 lemma fset_case_code [code]:
   267   "fset_case f A = f (member A)"
   268   by (cases A) simp
   269 
   270 lemma fset_rec_code [code]:
   271   "fset_rec f A = f (member A)"
   272   by (cases A) simp
   273 
   274 
   275 subsection {* Simplified simprules *}
   276 
   277 lemma is_empty_simp [simp]:
   278   "is_empty A \<longleftrightarrow> member A = {}"
   279   by (simp add: List_Set.is_empty_def)
   280 declare is_empty_def [simp del]
   281 
   282 lemma remove_simp [simp]:
   283   "remove x A = Fset (member A - {x})"
   284   by (simp add: List_Set.remove_def)
   285 declare remove_def [simp del]
   286 
   287 lemma filter_simp [simp]:
   288   "filter P A = Fset {x \<in> member A. P x}"
   289   by (simp add: List_Set.project_def)
   290 declare filter_def [simp del]
   291 
   292 declare mem_def [simp del]
   293 
   294 
   295 hide (open) const is_empty insert remove map filter forall exists card
   296   Inter Union
   297 
   298 end